diff --git a/shell/key-bindings.fish b/shell/key-bindings.fish index 37d3dc40..5083309f 100644 --- a/shell/key-bindings.fish +++ b/shell/key-bindings.fish @@ -116,10 +116,9 @@ function fzf_key_bindings set -l fzf_query (commandline | string escape) set -lx FZF_DEFAULT_OPTS (__fzf_defaults '' \ - '--nth=2..,.. --scheme=history --bind=ctrl-r:toggle-sort --wrap-sign="\t↳ "' \ - "--highlight-line --no-multi $FZF_CTRL_R_OPTS --read0 --print0" \ - "--bind='enter:become:string replace -a -- \n\t \n {2..} | string collect'" \ - '--with-shell='(status fish-path)\\ -c) + '--nth=2..,.. --scheme=history --multi --wrap-sign="\t↳ "' \ + "--bind=ctrl-r:toggle-sort --highlight-line $FZF_CTRL_R_OPTS" \ + '--accept-nth=2.. --read0 --print0 --with-shell='(status fish-path)\\ -c) set -lx FZF_DEFAULT_OPTS_FILE set -lx FZF_DEFAULT_COMMAND @@ -138,8 +137,12 @@ function fzf_key_bindings # Merge history from other sessions before searching test -z "$fish_private_mode"; and builtin history merge - set -l result (eval $FZF_DEFAULT_COMMAND \| (__fzfcmd) --query=$fzf_query) - and commandline -- $result + if set -l result (eval $FZF_DEFAULT_COMMAND \| (__fzfcmd) --query=$fzf_query | string split0) + commandline -- (string replace -a -- \n\t \n $result[1]) + test (count $result) -gt 1; and for i in $result[2..-1] + commandline -i -- (string replace -a -- \n\t \n \n$i) + end + end commandline -f repaint end diff --git a/test/test_shell_integration.rb b/test/test_shell_integration.rb index 4c38b76b..239dc258 100644 --- a/test/test_shell_integration.rb +++ b/test/test_shell_integration.rb @@ -482,4 +482,36 @@ class TestFish < TestBase tmux.send_keys "set -g #{name} '#{val}'", :Enter tmux.prepare end + + def test_ctrl_r_multi + tmux.send_keys ':', :Enter + tmux.send_keys 'echo "foo', :Enter, 'bar"', :Enter + tmux.prepare + tmux.send_keys 'echo "bar', :Enter, 'foo"', :Enter + tmux.prepare + tmux.send_keys 'C-l', 'C-r' + block = <<~BLOCK + echo "foo + bar" + echo "bar + foo" + BLOCK + tmux.until do |lines| + block.lines.each_with_index do |line, idx| + assert_includes lines[-6 + idx], line.chomp + end + end + tmux.send_keys :BTab, :BTab + tmux.until { |lines| assert_includes lines[-2], '(2)' } + tmux.send_keys :Enter + block = <<~BLOCK + echo "bar + foo" + echo "foo + bar" + BLOCK + tmux.until do |lines| + assert_equal block.lines.map(&:chomp), lines + end + end end