Add support for negative --height

fzf --height=-1

Close #3487
This commit is contained in:
Junegunn Choi 2023-12-21 18:41:01 +09:00
parent 87fc1c84b8
commit d7b61ede07
No known key found for this signature in database
GPG Key ID: 254BC280FEF9C627
5 changed files with 44 additions and 9 deletions

View File

@ -1,8 +1,14 @@
CHANGELOG 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 - Added `accept-or-print-query` action that acts like `accept` but prints the
current query when there's no match for the query current query when there's no match for the query
```sh ```sh

View File

@ -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 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. 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 .SH NAME
fzf - a command-line fuzzy finder fzf - a command-line fuzzy finder
@ -192,9 +192,21 @@ Label characters for \fBjump\fR and \fBjump-accept\fR
.TP .TP
.BI "--height=" "[~]HEIGHT[%]" .BI "--height=" "[~]HEIGHT[%]"
Display fzf window below the cursor with the given height instead of using 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 full screen.
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. 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 .TP
.BI "--min-height=" "HEIGHT" .BI "--min-height=" "HEIGHT"
Minimum height when \fB--height\fR is given in percent (default: 10). Minimum height when \fB--height\fR is given in percent (default: 10).

View File

@ -200,7 +200,7 @@ func Run(opts *Options, version string, revision string) {
padHeight := 0 padHeight := 0
heightUnknown := opts.Height.auto heightUnknown := opts.Height.auto
if heightUnknown { if heightUnknown {
maxFit, padHeight = terminal.MaxFitAndPad(opts) maxFit, padHeight = terminal.MaxFitAndPad()
} }
deferred := opts.Select1 || opts.Exit0 deferred := opts.Select1 || opts.Exit0
go terminal.Loop() go terminal.Loop()

View File

@ -57,6 +57,8 @@ const usage = `usage: fzf [options]
Layout Layout
--height=[~]HEIGHT[%] Display fzf window below the cursor with the given --height=[~]HEIGHT[%] Display fzf window below the cursor with the given
height instead of using fullscreen. 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 If prefixed with '~', fzf will determine the height
according to the input size. according to the input size.
--min-height=HEIGHT Minimum height when --height is given in percent --min-height=HEIGHT Minimum height when --height is given in percent
@ -157,6 +159,7 @@ type heightSpec struct {
size float64 size float64
percent bool percent bool
auto bool auto bool
inverse bool
} }
type sizeSpec struct { type sizeSpec struct {
@ -1386,6 +1389,13 @@ func parseHeight(str string) heightSpec {
heightSpec.auto = true heightSpec.auto = true
str = str[1:] 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") size := parseSize(str, 100, "height")
heightSpec.size = size.size heightSpec.size = size.size

View File

@ -594,10 +594,17 @@ func makeSpinner(unicode bool) []string {
} }
func evaluateHeight(opts *Options, termHeight int) int { func evaluateHeight(opts *Options, termHeight int) int {
size := opts.Height.size
if opts.Height.percent { 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 int(opts.Height.size) return util.Max(int(size*float64(termHeight)/100.0), opts.MinHeight)
}
if opts.Height.inverse {
size = float64(termHeight) - size
}
return int(size)
} }
// NewTerminal returns new Terminal object // NewTerminal returns new Terminal object
@ -819,7 +826,7 @@ func (t *Terminal) extraLines() int {
return extra return extra
} }
func (t *Terminal) MaxFitAndPad(opts *Options) (int, int) { func (t *Terminal) MaxFitAndPad() (int, int) {
_, screenHeight, marginInt, paddingInt := t.adjustMarginAndPadding() _, screenHeight, marginInt, paddingInt := t.adjustMarginAndPadding()
padHeight := marginInt[0] + marginInt[2] + paddingInt[0] + paddingInt[2] padHeight := marginInt[0] + marginInt[2] + paddingInt[0] + paddingInt[2]
fit := screenHeight - padHeight - t.extraLines() fit := screenHeight - padHeight - t.extraLines()