summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2023-12-21 18:41:01 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2023-12-21 18:42:23 +0900
commitd7b61ede07ab20ba106191968f12aaf600b6ede4 (patch)
treef86613d7e0ef3ec06aa44890d81bd5ab991e6b67
parent87fc1c84b8700e694ec341b36ac3ce29a7a30e6b (diff)
Add support for negative --height
fzf --height=-1 Close #3487
-rw-r--r--CHANGELOG.md8
-rw-r--r--man/man1/fzf.120
-rw-r--r--src/core.go2
-rw-r--r--src/options.go10
-rw-r--r--src/terminal.go13
5 files changed, 44 insertions, 9 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 378238d6..fec32d97 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,14 @@
CHANGELOG
=========
-0.44.2
+0.45.0
------
+- Added support for negative height
+ ```sh
+ # Terminal height minus 1, so you can still see the command line
+ fzf --height=-1
+ ```
+ - This handles a terminal resize better than `--height=$(($(tput lines) - 1))`
- Added `accept-or-print-query` action that acts like `accept` but prints the
current query when there's no match for the query
```sh
diff --git a/man/man1/fzf.1 b/man/man1/fzf.1
index 0205d0ad..c4fe788c 100644
--- a/man/man1/fzf.1
+++ b/man/man1/fzf.1
@@ -21,7 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
..
-.TH fzf 1 "Nov 2023" "fzf 0.44.1" "fzf - a command-line fuzzy finder"
+.TH fzf 1 "Dec 2023" "fzf 0.45.0" "fzf - a command-line fuzzy finder"
.SH NAME
fzf - a command-line fuzzy finder
@@ -192,9 +192,21 @@ Label characters for \fBjump\fR and \fBjump-accept\fR
.TP
.BI "--height=" "[~]HEIGHT[%]"
Display fzf window below the cursor with the given height instead of using
-the full screen. When prefixed with \fB~\fR, fzf will automatically determine
-the height in the range according to the input size. Note that adaptive height
-is not compatible with top/bottom margin and padding given in percent size.
+the full screen.
+
+If a negative value is specified, the height is calculated as the terminal
+height minus the given value.
+
+ fzf --height=-1
+
+When prefixed with \fB~\fR, fzf will automatically determine the height in the
+range according to the input size. Note that adaptive height is not compatible
+with top/bottom margin and padding given in percent size. It is also not
+compatible with a negative height value.
+
+ # Will not take up 100% of the screen
+ seq 5 | fzf --height=~100%
+
.TP
.BI "--min-height=" "HEIGHT"
Minimum height when \fB--height\fR is given in percent (default: 10).
diff --git a/src/core.go b/src/core.go
index e21e8c0a..ed56a879 100644
--- a/src/core.go
+++ b/src/core.go
@@ -200,7 +200,7 @@ func Run(opts *Options, version string, revision string) {
padHeight := 0
heightUnknown := opts.Height.auto
if heightUnknown {
- maxFit, padHeight = terminal.MaxFitAndPad(opts)
+ maxFit, padHeight = terminal.MaxFitAndPad()
}
deferred := opts.Select1 || opts.Exit0
go terminal.Loop()
diff --git a/src/options.go b/src/options.go
index 57f2f1e1..ca8b2476 100644
--- a/src/options.go
+++ b/src/options.go
@@ -57,6 +57,8 @@ const usage = `usage: fzf [options]
Layout
--height=[~]HEIGHT[%] Display fzf window below the cursor with the given
height instead of using fullscreen.
+ A negative value is calcalated as the terminal height
+ minus the given value.
If prefixed with '~', fzf will determine the height
according to the input size.
--min-height=HEIGHT Minimum height when --height is given in percent
@@ -157,6 +159,7 @@ type heightSpec struct {
size float64
percent bool
auto bool
+ inverse bool
}
type sizeSpec struct {
@@ -1386,6 +1389,13 @@ func parseHeight(str string) heightSpec {
heightSpec.auto = true
str = str[1:]
}
+ if strings.HasPrefix(str, "-") {
+ if heightSpec.auto {
+ errorExit("negative(-) height is not compatible with adaptive(~) height")
+ }
+ heightSpec.inverse = true
+ str = str[1:]
+ }
size := parseSize(str, 100, "height")
heightSpec.size = size.size
diff --git a/src/terminal.go b/src/terminal.go
index 4a4498bb..394be4fc 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -594,10 +594,17 @@ func makeSpinner(unicode bool) []string {
}
func evaluateHeight(opts *Options, termHeight int) int {
+ size := opts.Height.size
if opts.Height.percent {
- return util.Max(int(opts.Height.size*float64(termHeight)/100.0), opts.MinHeight)
+ if opts.Height.inverse {
+ size = 100 - size
+ }
+ return util.Max(int(size*float64(termHeight)/100.0), opts.MinHeight)
+ }
+ if opts.Height.inverse {
+ size = float64(termHeight) - size
}
- return int(opts.Height.size)
+ return int(size)
}
// NewTerminal returns new Terminal object
@@ -819,7 +826,7 @@ func (t *Terminal) extraLines() int {
return extra
}
-func (t *Terminal) MaxFitAndPad(opts *Options) (int, int) {
+func (t *Terminal) MaxFitAndPad() (int, int) {
_, screenHeight, marginInt, paddingInt := t.adjustMarginAndPadding()
padHeight := marginInt[0] + marginInt[2] + paddingInt[0] + paddingInt[2]
fit := screenHeight - padHeight - t.extraLines()