From 94999101e358385f3ca67a6ec9512f549196b802 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Fri, 5 May 2023 15:08:08 +0900 Subject: [PATCH] Fix the behavior of change-preview-window action (#3280) * change-preview-window restores the initial preview window options, and overrides the properties that are specified * However, 'hidden' property is treated differently. It is set to 'false' if the specified properties of the action is non-empty. * cf. toggle-preview takes the "current" preview window options and toggles the 'hidden' property. --- src/options.go | 18 +++++++++--------- src/terminal.go | 3 +++ test/test_go.rb | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/options.go b/src/options.go index 6f6b25e8..27e32d13 100644 --- a/src/options.go +++ b/src/options.go @@ -1969,25 +1969,25 @@ func postProcessOptions(opts *Options) { // Extend the default key map keymap := defaultKeymap() for key, actions := range opts.Keymap { - var lastChangePreviewWindow *action + reordered := []*action{} for _, act := range actions { switch act.t { case actToggleSort: // To display "+S"/"-S" on info line opts.ToggleSort = true - case actChangePreviewWindow: - lastChangePreviewWindow = act + case actTogglePreview, actShowPreview, actHidePreview, actChangePreviewWindow: + reordered = append(reordered, act) } } - // Re-organize actions so that we only keep the last change-preview-window - // and it comes first in the list. + // Re-organize actions so that we put actions that change the preview window first in the list. // * change-preview-window(up,+10)+preview(sleep 3; cat {})+change-preview-window(up,+20) - // -> change-preview-window(up,+20)+preview(sleep 3; cat {}) - if lastChangePreviewWindow != nil { - reordered := []*action{lastChangePreviewWindow} + // -> change-preview-window(up,+10)+change-preview-window(up,+20)+preview(sleep 3; cat {}) + if len(reordered) > 0 { for _, act := range actions { - if act.t != actChangePreviewWindow { + switch act.t { + case actTogglePreview, actShowPreview, actHidePreview, actChangePreviewWindow: + default: reordered = append(reordered, act) } } diff --git a/src/terminal.go b/src/terminal.go index 1b44bf3e..d108bfd9 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -3523,6 +3523,9 @@ func (t *Terminal) Loop() { // Split window options tokens := strings.Split(a.a, "|") + if len(tokens[0]) > 0 && t.initialPreviewOpts.hidden { + t.previewOpts.hidden = false + } parsePreviewWindow(&t.previewOpts, tokens[0]) if len(tokens) > 1 { a.a = strings.Join(append(tokens[1:], tokens[0]), "|") diff --git a/test/test_go.rb b/test/test_go.rb index 1c5c3de4..3a768744 100755 --- a/test/test_go.rb +++ b/test/test_go.rb @@ -2493,6 +2493,39 @@ class TestGoFZF < TestBase end end + def test_change_preview_window_rotate_hidden + tmux.send_keys "seq 100 | #{FZF} --preview-window hidden --preview 'echo =={}==' --bind '" \ + "a:change-preview-window(nohidden||down,1|)'", :Enter + tmux.until { |lines| assert_equal 100, lines.match_count } + tmux.until { |lines| refute_includes lines[1], '==1==' } + tmux.send_keys 'a' + tmux.until { |lines| assert_includes lines[1], '==1==' } + tmux.send_keys 'a' + tmux.until { |lines| refute_includes lines[1], '==1==' } + tmux.send_keys 'a' + tmux.until { |lines| assert_includes lines[-2], '==1==' } + tmux.send_keys 'a' + tmux.until { |lines| refute_includes lines[-2], '==1==' } + tmux.send_keys 'a' + tmux.until { |lines| assert_includes lines[1], '==1==' } + end + + def test_change_preview_window_rotate_hidden_down + tmux.send_keys "seq 100 | #{FZF} --bind '?:change-preview-window:up||down|' --preview 'echo =={}==' --preview-window hidden,down,1", :Enter + tmux.until { |lines| assert_equal 100, lines.match_count } + tmux.until { |lines| refute_includes lines[1], '==1==' } + tmux.send_keys '?' + tmux.until { |lines| assert_includes lines[1], '==1==' } + tmux.send_keys '?' + tmux.until { |lines| refute_includes lines[1], '==1==' } + tmux.send_keys '?' + tmux.until { |lines| assert_includes lines[-2], '==1==' } + tmux.send_keys '?' + tmux.until { |lines| refute_includes lines[-2], '==1==' } + tmux.send_keys '?' + tmux.until { |lines| assert_includes lines[1], '==1==' } + end + def test_ellipsis tmux.send_keys 'seq 1000 | tr "\n" , | fzf --ellipsis=SNIPSNIP -e -q500', :Enter tmux.until { |lines| assert_equal 1, lines.match_count }