diff options
| author | LangLangBart <92653266+LangLangBart@users.noreply.github.com> | 2024-11-14 08:07:52 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-14 16:07:52 +0900 |
| commit | 03d6ba749647947935c237852860101f21c4782b (patch) | |
| tree | b53ebbb4f4f57c1175b4dde16050b256d4a23489 /shell | |
| parent | 71e4d5cc5129b912af33b239983545969970ccf4 (diff) | |
| download | fzf-03d6ba749647947935c237852860101f21c4782b.tar.gz | |
fix(zsh): handle backtick trigger edge case (#4090)
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/completion.zsh | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/shell/completion.zsh b/shell/completion.zsh index 171a1b2b..39e29a03 100644 --- a/shell/completion.zsh +++ b/shell/completion.zsh @@ -123,10 +123,10 @@ __fzf_comprun() { # Extract the name of the command. e.g. ls; foo=1 ssh **<tab> __fzf_extract_command() { setopt localoptions noksh_arrays - # Control completion with the "compstate" parameter, insert and list noting + # Control completion with the "compstate" parameter, insert and list nothing compstate[insert]= compstate[list]= - cmd_word="${words[1]}" + cmd_word="${(Q)words[1]}" } __fzf_generic_path_completion() { @@ -303,8 +303,9 @@ _fzf_complete_kill_post() { } fzf-completion() { + typeset -g cmd_word trap 'unset cmd_word' EXIT - local tokens prefix trigger tail matches lbuf d_cmds + local tokens prefix trigger tail matches lbuf d_cmds cursor_pos setopt localoptions noshwordsplit noksh_arrays noposixbuiltins # Check if at least one completion system (old or new) is active @@ -323,7 +324,7 @@ fzf-completion() { # Explicitly allow for empty trigger. trigger=${FZF_COMPLETION_TRIGGER-'**'} - [ -z "$trigger" -a ${LBUFFER[-1]} = ' ' ] && tokens+=("") + [[ -z $trigger && ${LBUFFER[-1]} == ' ' ]] && tokens+=("") # When the trigger starts with ';', it becomes a separate token if [[ ${LBUFFER} = *"${tokens[-2]-}${tokens[-1]}" ]]; then @@ -338,9 +339,16 @@ fzf-completion() { if [ ${#tokens} -gt 1 -a "$tail" = "$trigger" ]; then d_cmds=(${=FZF_COMPLETION_DIR_COMMANDS-cd pushd rmdir}) - # Make the 'cmd_word' global - zle __fzf_extract_command || : - [[ -z "$cmd_word" ]] && return + cursor_pos=$CURSOR + { + # Move the cursor before the trigger to preserve word array elements when + # trigger chars like ';' or '`' would otherwise reset the 'words' array. + CURSOR=$((cursor_pos - ${#trigger} - 1)) + # Assign the extracted command to the global variable 'cmd_word' + zle __fzf_extract_command + } always { + CURSOR=$cursor_pos + } [ -z "$trigger" ] && prefix=${tokens[-1]} || prefix=${tokens[-1]:0:-${#trigger}} if [[ $prefix = *'$('* ]] || [[ $prefix = *'<('* ]] || [[ $prefix = *'>('* ]] || [[ $prefix = *':='* ]] || [[ $prefix = *'`'* ]]; then @@ -348,7 +356,7 @@ fzf-completion() { fi [ -n "${tokens[-1]}" ] && lbuf=${lbuf:0:-${#tokens[-1]}} - if eval "type _fzf_complete_${cmd_word} > /dev/null"; then + if eval "noglob type _fzf_complete_${cmd_word} >/dev/null"; then prefix="$prefix" eval _fzf_complete_${cmd_word} ${(q)lbuf} zle reset-prompt elif [ ${d_cmds[(i)$cmd_word]} -le ${#d_cmds} ]; then |
