Support preview scroll offset relative to window height

Related: https://github.com/junegunn/fzf.vim/issues/1092
This commit is contained in:
Junegunn Choi 2020-08-23 15:57:49 +09:00
parent 1ab4289ad6
commit 1cb19dbf65
No known key found for this signature in database
GPG Key ID: 254BC280FEF9C627
4 changed files with 32 additions and 7 deletions

View File

@ -1,6 +1,16 @@
CHANGELOG CHANGELOG
========= =========
0.22.1
------
- Support preview scroll offset relative to window height
```sh
git grep --line-number '' |
fzf --delimiter : \
--preview 'bat --style=numbers --color=always --highlight-line {2} {1}' \
--preview-window +{2}-/2
```
0.22.0 0.22.0
------ ------
- Added more options for `--bind` - Added more options for `--bind`

View File

@ -394,7 +394,8 @@ execute the command in the background.
window. \fBSCROLL\fR can be either a numeric integer or a single-field index window. \fBSCROLL\fR can be either a numeric integer or a single-field index
expression that refers to a numeric integer. The optional \fB-OFFSET\fR part is expression that refers to a numeric integer. The optional \fB-OFFSET\fR part is
for adjusting the base offset so that you can see the text above it. It should for adjusting the base offset so that you can see the text above it. It should
be given as a numeric integer. be given as a numeric integer (\fB-INTEGER\fR), or as a denominator form
(\fB-/INTEGER\fR) for specifying a fraction of the preview window height.
.RS .RS
.B POSITION: (default: right) .B POSITION: (default: right)
@ -411,9 +412,15 @@ e.g.
fzf --preview="file {}" --preview-window=down:1 fzf --preview="file {}" --preview-window=down:1
# Initial scroll offset is set to the line number of each line of # Initial scroll offset is set to the line number of each line of
# git grep output *minus* 5 lines # git grep output *minus* 5 lines (-5)
git grep --line-number '' | git grep --line-number '' |
fzf --delimiter : --preview 'nl {1}' --preview-window +{2}-5\fR fzf --delimiter : --preview 'nl {1}' --preview-window +{2}-5
# Preview with bat, matching line in the middle of the window (-/2)
git grep --line-number '' |
fzf --delimiter : \\
--preview 'bat --style=numbers --color=always --highlight-line {2} {1}' \\
--preview-window +{2}-/2\fR
.RE .RE
.SS Scripting .SS Scripting

View File

@ -995,7 +995,7 @@ func parsePreviewWindow(opts *previewOpts, input string) {
tokens := strings.Split(input, ":") tokens := strings.Split(input, ":")
sizeRegex := regexp.MustCompile("^[1-9][0-9]*%?$") sizeRegex := regexp.MustCompile("^[1-9][0-9]*%?$")
offsetRegex := regexp.MustCompile("^\\+([0-9]+|{-?[0-9]+})(-[0-9]+)?$") offsetRegex := regexp.MustCompile("^\\+([0-9]+|{-?[0-9]+})(-[0-9]+|-/[1-9][0-9]*)?$")
for _, token := range tokens { for _, token := range tokens {
switch token { switch token {
case "": case "":

View File

@ -1374,7 +1374,7 @@ func atopi(s string) int {
return n return n
} }
func (t *Terminal) evaluateScrollOffset(list []*Item) int { func (t *Terminal) evaluateScrollOffset(list []*Item, height int) int {
offsetExpr := t.replacePlaceholder(t.preview.scroll, false, "", list) offsetExpr := t.replacePlaceholder(t.preview.scroll, false, "", list)
nums := strings.Split(offsetExpr, "-") nums := strings.Split(offsetExpr, "-")
switch len(nums) { switch len(nums) {
@ -1387,6 +1387,13 @@ func (t *Terminal) evaluateScrollOffset(list []*Item) int {
} else if len(nums) == 1 { } else if len(nums) == 1 {
return base - 1 return base - 1
} }
if nums[1][0] == '/' {
denom := atopi(nums[1][1:])
if denom == 0 {
return base
}
return base - height/denom
}
return base - atopi(nums[1]) - 1 return base - atopi(nums[1]) - 1
default: default:
return 0 return 0
@ -1676,11 +1683,12 @@ func (t *Terminal) Loop() {
// We don't display preview window if no match // We don't display preview window if no match
if items[0] != nil { if items[0] != nil {
command := t.replacePlaceholder(commandTemplate, false, string(t.Input()), items) command := t.replacePlaceholder(commandTemplate, false, string(t.Input()), items)
offset := t.evaluateScrollOffset(items) height := t.pwindow.Height()
offset := t.evaluateScrollOffset(items, height)
cmd := util.ExecCommand(command, true) cmd := util.ExecCommand(command, true)
if t.pwindow != nil { if t.pwindow != nil {
env := os.Environ() env := os.Environ()
lines := fmt.Sprintf("LINES=%d", t.pwindow.Height()) lines := fmt.Sprintf("LINES=%d", height)
columns := fmt.Sprintf("COLUMNS=%d", t.pwindow.Width()) columns := fmt.Sprintf("COLUMNS=%d", t.pwindow.Width())
env = append(env, lines) env = append(env, lines)
env = append(env, "FZF_PREVIEW_"+lines) env = append(env, "FZF_PREVIEW_"+lines)