mirror of
https://github.com/Llewellynvdm/fzf.git
synced 2024-11-28 15:56:27 +00:00
Support preview scroll offset relative to window height
Related: https://github.com/junegunn/fzf.vim/issues/1092
This commit is contained in:
parent
1ab4289ad6
commit
1cb19dbf65
10
CHANGELOG.md
10
CHANGELOG.md
@ -1,6 +1,16 @@
|
||||
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
|
||||
------
|
||||
- Added more options for `--bind`
|
||||
|
@ -394,7 +394,8 @@ execute the command in the background.
|
||||
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
|
||||
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
|
||||
.B POSITION: (default: right)
|
||||
@ -411,9 +412,15 @@ e.g.
|
||||
fzf --preview="file {}" --preview-window=down:1
|
||||
|
||||
# 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 '' |
|
||||
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
|
||||
.SS Scripting
|
||||
|
@ -995,7 +995,7 @@ func parsePreviewWindow(opts *previewOpts, input string) {
|
||||
|
||||
tokens := strings.Split(input, ":")
|
||||
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 {
|
||||
switch token {
|
||||
case "":
|
||||
|
@ -1374,7 +1374,7 @@ func atopi(s string) int {
|
||||
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)
|
||||
nums := strings.Split(offsetExpr, "-")
|
||||
switch len(nums) {
|
||||
@ -1387,6 +1387,13 @@ func (t *Terminal) evaluateScrollOffset(list []*Item) int {
|
||||
} else if len(nums) == 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
|
||||
default:
|
||||
return 0
|
||||
@ -1676,11 +1683,12 @@ func (t *Terminal) Loop() {
|
||||
// We don't display preview window if no match
|
||||
if items[0] != nil {
|
||||
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)
|
||||
if t.pwindow != nil {
|
||||
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())
|
||||
env = append(env, lines)
|
||||
env = append(env, "FZF_PREVIEW_"+lines)
|
||||
|
Loading…
Reference in New Issue
Block a user