Skip to content

Commit 9f8294d

Browse files
bitraidjunegunn
authored andcommitted
fish: Fixes and improvements to CTRL-R (#4703)
Fixes: - Commands with trailing newlines - Very long previews Improvements: - SHIFT-DELETE performance - Bind ALT-T: cycle command prefix (timestamp, date/time, none) - Set comment color for prefix
1 parent b7138e6 commit 9f8294d

2 files changed

Lines changed: 25 additions & 22 deletions

File tree

README.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -521,13 +521,17 @@ the following key bindings in bash, zsh, and fish.
521521
```
522522
- Can be disabled by setting `FZF_CTRL_T_COMMAND` to an empty string when
523523
sourcing the script
524-
- `CTRL-R` - Paste the selected command from history onto the command-line
524+
- `CTRL-R` - Paste the selected command from history onto the command-line. With fish shell, it is possible to select multiple commands.
525525
- If you want to see the commands in chronological order, press `CTRL-R`
526526
again which toggles sorting by relevance
527527
- Press `ALT-R` to toggle "raw" mode where you can see the surrounding items
528528
of a match. In this mode, you can press `CTRL-N` and `CTRL-P` to move
529529
between the matching items only.
530530
- Press `CTRL-/` or `ALT-/` to toggle line wrapping
531+
- Fish shell only:
532+
- Press `SHIFT-DELETE` to delete the selected commands
533+
- Press `ALT-ENTER` to reformat and insert the selected commands
534+
- Press `ALT-T` to cycle through command prefix (timestamp, date/time, none)
531535
- Set `FZF_CTRL_R_OPTS` to pass additional options to fzf
532536
```sh
533537
# CTRL-Y to copy the command into clipboard using pbcopy
@@ -536,6 +540,13 @@ the following key bindings in bash, zsh, and fish.
536540
--color header:italic
537541
--header 'Press CTRL-Y to copy command into clipboard'"
538542
```
543+
```fish
544+
# Fish shell: Set date/time as default prefix
545+
set -gx FZF_CTRL_R_OPTS "--with-nth 1,3.. --bind 'alt-t:change-with-nth(2..|3..|1,3..)'"
546+
547+
# Or display no prefix by default
548+
set -gx FZF_CTRL_R_OPTS "--with-nth 3.. --bind 'alt-t:change-with-nth(2..|1,3..|3..)'"
549+
```
539550
- Can be disabled by setting `FZF_CTRL_R_COMMAND` to an empty string when
540551
sourcing the script
541552
- Custom override via a non-empty `FZF_CTRL_R_COMMAND` is not yet supported and will emit a warning

shell/key-bindings.fish

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -182,36 +182,26 @@ function fzf_key_bindings
182182
set -l -- fzf_query (string escape -- $command_line[$current_line])
183183

184184
set -lx -- FZF_DEFAULT_OPTS (__fzf_defaults '' \
185-
'--nth=2..,.. --scheme=history --multi --no-multi-line --no-wrap --wrap-sign="\t\t\t↳ " --preview-wrap-sign="↳ "' \
186-
'--bind=\'shift-delete:execute-silent(for i in (string split0 -- <{+f}); eval builtin history delete --exact --case-sensitive -- (string escape -n -- $i | string replace -r "^\d*\\\\\\t" ""); end)+reload(eval $FZF_DEFAULT_COMMAND)\'' \
187-
'--bind="alt-enter:become(string join0 -- (string collect -- {+2..} | fish_indent -i))"' \
185+
'--with-nth=2.. --nth=2..,.. --scheme=history --multi --no-multi-line' \
186+
'--no-wrap --wrap-sign="\t\t\t↳ " --preview-wrap-sign="↳ " --freeze-left=1' \
187+
'--bind="alt-enter:become(set -g fzf_temp {+sf3..}; string join0 -- (string split0 -- <$fzf_temp | fish_indent -i); unlink $fzf_temp &>/dev/null)"' \
188+
'--bind="alt-t:change-with-nth(1,3..|3..|2..)"' \
189+
'--bind="shift-delete:execute-silent(eval builtin history delete -Ce -- (string escape -n -- (string split0 -- <{+sf3..})))+reload(eval $FZF_DEFAULT_COMMAND)"' \
188190
"--bind=ctrl-r:toggle-sort,alt-r:toggle-raw --highlight-line $FZF_CTRL_R_OPTS" \
189-
'--accept-nth=2.. --delimiter="\t" --tabstop=4 --read0 --print0 --with-shell='(status fish-path)\\ -c)
191+
'--accept-nth=3.. --delimiter="\t" --tabstop=4 --read0 --print0 --with-shell='(status fish-path)\\ -c)
190192

191193
# Add dynamic preview options if preview command isn't already set by user
192194
if string match -qvr -- '--preview[= ]' "$FZF_DEFAULT_OPTS"
193-
# Convert the highlighted timestamp using the date command if available
194-
set -l -- date_cmd '{1}'
195-
if type -q date
196-
if date -d @0 '+%s' 2>/dev/null | string match -q 0
197-
# GNU date
198-
set -- date_cmd '(date -d @{1} \\"+%F %a %T\\")'
199-
else if date -r 0 '+%s' 2>/dev/null | string match -q 0
200-
# BSD date
201-
set -- date_cmd '(date -r {1} \\"+%F %a %T\\")'
202-
end
203-
end
204-
205-
# Prepend the options to allow user customizations
195+
# Prepend the options to allow user overrides
206196
set -p -- FZF_DEFAULT_OPTS \
207-
'--bind="focus,resize:bg-transform:if test \\"$FZF_COLUMNS\\" -gt 100 -a \\\\( \\"$FZF_SELECT_COUNT\\" -gt 0 -o \\\\( -z \\"$FZF_WRAP\\" -a (string length -- {}) -gt (math $FZF_COLUMNS - 4) \\\\) -o (string collect -- {2..} | fish_indent | count) -gt 1 \\\\); echo show-preview; else echo hide-preview; end"' \
208-
'--preview="string collect -- (test \\"$FZF_SELECT_COUNT\\" -gt 0; and string collect -- {+2..}) \\"\\n# \\"'$date_cmd' {2..} | fish_indent --ansi"' \
197+
'--bind="focus,multi,resize:bg-transform:if test \\"$FZF_COLUMNS\\" -gt 100 -a \\\\( \\"$FZF_SELECT_COUNT\\" -gt 0 -o \\\\( -z \\"$FZF_WRAP\\" -a (string join0 -- <{f3..} | string length) -gt (math $FZF_COLUMNS - (switch $FZF_WITH_NTH; case 2..; echo 13; case 1,3..; echo 25; case 3..; echo 1; end)) \\\\) -o (string split0 -- <{sf3..} | fish_indent | count) -gt 1 \\\\); echo show-preview; else echo hide-preview; end"' \
198+
'--preview="test \\"$FZF_SELECT_COUNT\\" -gt 0; and string split0 -- <{+sf3..} | fish_indent --only-indent --ansi; and echo -n \\\\n; string collect -- \\\\#\\\\ {1} (string split0 -- <{sf3..}) | fish_indent --ansi"' \
209199
'--preview-window="right,50%,wrap-word,follow,info,hidden"'
210200
end
211201

212202
set -lx FZF_DEFAULT_OPTS_FILE
213203

214-
set -lx -- FZF_DEFAULT_COMMAND 'builtin history -z --show-time="%s%t"'
204+
set -lx -- FZF_DEFAULT_COMMAND 'builtin history -z'
215205

216206
# Enable syntax highlighting colors on fish v4.3.3 and newer
217207
if set -l -- v (string match -r -- '^(\d+)\.(\d+)(?:\.(\d+))?' $version)
@@ -220,7 +210,9 @@ function fzf_key_bindings
220210
\( -n "$v[4]" -a "$v[4]" -ge 3 \) \)
221211

222212
set -a -- FZF_DEFAULT_OPTS '--ansi'
223-
set -a -- FZF_DEFAULT_COMMAND '--color=always'
213+
set -a -- FZF_DEFAULT_COMMAND '--color=always --show-time=(set_color $fish_color_comment)"%F %a %T%t%s%t"(set_color $fish_color_normal)'
214+
else
215+
set -a -- FZF_DEFAULT_COMMAND '--show-time="%F %a %T%t%s%t"'
224216
end
225217

226218
# Merge history from other sessions before searching

0 commit comments

Comments
 (0)