diff --git a/CHANGELOG.md b/CHANGELOG.md index e4d2219a..5cbbcdac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +0.73.0 +------ +- Bug fixes + - `change-preview-window` no longer resets `wrap` / `wrap-word` state set via `toggle-preview-wrap` / `toggle-preview-wrap-word`. Layout fields still snap to the preset, so cycling and the empty-token reset behave as before. The new spec can still override by including `wrap` or `nowrap` explicitly. (#4791) + 0.72.0 ------ _Release highlights: https://junegunn.github.io/fzf/releases/0.72.0/_ diff --git a/src/terminal.go b/src/terminal.go index 467ee577..c4b62914 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -7819,6 +7819,11 @@ func (t *Terminal) Loop() error { t.previewOpts = t.initialPreviewOpts t.previewOpts.command = currentPreviewOpts.command + // Carry over toggle-driven state so toggle-preview-wrap survives + // a change-preview-window. Tokens below can still override. + t.previewOpts.wrap = currentPreviewOpts.wrap + t.previewOpts.wrapWord = currentPreviewOpts.wrapWord + // Split window options tokens := strings.Split(a.a, "|") if len(tokens[0]) > 0 && t.initialPreviewOpts.hidden { diff --git a/test/test_preview.rb b/test/test_preview.rb index ac8919db..c35cdbe5 100644 --- a/test/test_preview.rb +++ b/test/test_preview.rb @@ -383,6 +383,49 @@ class TestPreview < TestInteractive end end + def test_change_preview_window_preserves_wrap_toggle + # https://github.com/junegunn/fzf/issues/4791 + tmux.send_keys "#{FZF} --preview 'for i in $(seq $FZF_PREVIEW_COLUMNS); do echo -n .; done; echo -n .; echo wrapped; echo 2nd line' " \ + "--preview-window 'right,nowrap,border-rounded' " \ + '--bind ctrl-w:toggle-preview-wrap ' \ + '--bind ctrl-r:change-preview-window:border-bold', :Enter + sleep 2 + # Initial: nowrap, rounded border. The long line is truncated; "wrapped" is hidden. + tmux.until do |lines| + assert_includes lines[2], '2nd line' + assert(lines.any? { it.include?('╭') }) + end + # Toggle wrap on. + tmux.send_keys 'C-w' + tmux.until do |lines| + assert_includes lines[2], 'wrapped' + assert_includes lines[3], '2nd line' + end + # change-preview-window swaps the border to bold; wrap state must persist. + tmux.send_keys 'C-r' + tmux.until do |lines| + assert(lines.any? { it.include?('┏') }) # border actually changed + refute(lines.any? { it.include?('╭') }) + assert_includes lines[2], 'wrapped' # wrap was preserved + assert_includes lines[3], '2nd line' + end + end + + def test_change_preview_window_overrides_wrap_explicitly + # When the new spec sets wrap/nowrap explicitly, it should still win. + tmux.send_keys "#{FZF} --preview 'for i in $(seq $FZF_PREVIEW_COLUMNS); do echo -n .; done; echo -n .; echo wrapped; echo 2nd line' " \ + "--preview-window 'right,wrap' " \ + '--bind ctrl-r:change-preview-window:nowrap', :Enter + # Initial: wrap is on. + tmux.until do |lines| + assert_includes lines[2], 'wrapped' + assert_includes lines[3], '2nd line' + end + # Explicit nowrap in the spec must override the (initially wrapped) state. + tmux.send_keys 'C-r' + tmux.until { |lines| assert_includes lines[2], '2nd line' } + end + def test_preview_follow_wrap tmux.send_keys "seq 1 | #{FZF} --preview 'seq 1000' --preview-window right,2,follow,wrap", :Enter tmux.until { |lines| assert_equal 1, lines.match_count }