summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLangLangBart <92653266+LangLangBart@users.noreply.github.com>2024-05-31 03:43:58 +0200
committerJunegunn Choi <junegunn.c@gmail.com>2024-05-31 16:57:35 +0900
commit2b6d600879278f771e0ae909b38ecaaab62bc9c1 (patch)
treeff782453b1ea84b0fb5958958ee712f0ca5fadc6
parent05c765d4429100d1bf06f6bef81ef34e6285dd4b (diff)
downloadfzf-2b6d600879278f771e0ae909b38ecaaab62bc9c1.tar.gz
[zsh] Enhance CTRL-R to display multi-line entires (#3823)
Co-authored-by: Junegunn Choi <junegunn.c@gmail.com>
-rw-r--r--shell/key-bindings.zsh20
1 files changed, 14 insertions, 6 deletions
diff --git a/shell/key-bindings.zsh b/shell/key-bindings.zsh
index 72430969..07f02bfd 100644
--- a/shell/key-bindings.zsh
+++ b/shell/key-bindings.zsh
@@ -108,14 +108,22 @@ fi
fzf-history-widget() {
local selected num
setopt localoptions noglobsubst noposixbuiltins pipefail no_aliases 2> /dev/null
- selected="$(fc -rl 1 | awk '{ cmd=$0; sub(/^[ \t]*[0-9]+\**[ \t]+/, "", cmd); if (!seen[cmd]++) print $0 }' |
- FZF_DEFAULT_OPTS=$(__fzf_defaults "" "-n2..,.. --scheme=history --bind=ctrl-r:toggle-sort --highlight-line ${FZF_CTRL_R_OPTS-} --query=${(qqq)LBUFFER} +m") \
- FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd))"
+ # Ensure the associative history array, which maps event numbers to the full
+ # history lines, is loaded, and that Perl is installed for multi-line output.
+ if zmodload -F zsh/parameter p:history 2>/dev/null && (( ${#commands[perl]} )); then
+ selected="$(printf '%1$s\t%2$s\000' "${(vk)history[@]}" |
+ perl -0 -ne 'if (!$seen{(/^\s*[0-9]+\**\s+(.*)/, $1)}++) { s/\n/\n\t/gm; print; }' |
+ FZF_DEFAULT_OPTS=$(__fzf_defaults "" "-n2..,.. --scheme=history --bind=ctrl-r:toggle-sort --highlight-line ${FZF_CTRL_R_OPTS-} --query=${(qqq)LBUFFER} +m --read0") \
+ FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd))"
+ else
+ selected="$(fc -rl 1 | awk '{ cmd=$0; sub(/^[ \t]*[0-9]+\**[ \t]+/, "", cmd); if (!seen[cmd]++) print $0 }' |
+ FZF_DEFAULT_OPTS=$(__fzf_defaults "" "-n2..,.. --scheme=history --bind=ctrl-r:toggle-sort --highlight-line ${FZF_CTRL_R_OPTS-} --query=${(qqq)LBUFFER} +m") \
+ FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd))"
+ fi
local ret=$?
if [ -n "$selected" ]; then
- num=$(awk '{print $1}' <<< "$selected")
- if [[ "$num" =~ '^[1-9][0-9]*\*?$' ]]; then
- zle vi-fetch-history -n ${num%\*}
+ if num=$(awk '{print $1; exit}' <<< "$selected" | grep -o '^[1-9][0-9]*'); then
+ zle vi-fetch-history -n $num
else # selected is a custom query, not from history
LBUFFER="$selected"
fi