Zsh

當我按 Tab 完成時,由“沒有此類小元件”導致的鍵綁定、功能/選項或完成不明確

  • February 19, 2022

我安裝了zplug

zplug "junegunn/fzf-bin", from:gh-r, as:command, rename-to:fzf, use:"*${(L)$(uname -s)}*amd64*"
zplug "junegunn/fzf", use:"shell/*.zsh", defer:2
zplug "peco/peco", as:command,     from:gh-r, use:"*${(L)$(uname -s)}*amd64*"

zplug "lincheney/fzf-tab-completion", use:"zsh/fzf-zsh-completion.sh"

請注意,我也有zsl-autosuggestionszsh-completions安裝了。

選項/功能 - 我試圖評論其中一個導致No such widget

autoload -Uz async && async             
autoload -Uz add-zsh-hook               
autoload -Uz compinit && compinit       
autoload -Uz url-quote-magic            
autoload -Uz vcs_info                   
setopt autocd                           
setopt append_history                   
setopt auto_list                        
setopt auto_menu                        
setopt auto_pushd                       
setopt extended_history                 
setopt hist_expire_dups_first           
setopt hist_find_no_dups                
setopt hist_ignore_dups                 
setopt hist_ignore_all_dups             
setopt hist_reduce_blanks               
setopt hist_save_no_dups                
setopt hist_ignore_space                
setopt inc_append_history               
setopt interactive_comments                               
setopt magic_equal_subst                                      
setopt print_eight_bit                  
setopt print_exit_value                 
setopt prompt_subst                     
setopt pushd_ignore_dups                
setopt share_history                    
setopt transient_rprompt

watch=(notme) 
LOGCHECK=60
REPORTTIME=5

鍵綁定 –bindkey '^I' fzf_completions是由No such widget. 但如果我評論它並按下Tab,它仍然會給出No such widget 1’`。

bindkey  "^[[H"   beginning-of-line
bindkey  "^[[F"   end-of-line
bindkey  '^I'     fzf_completions

KEYTIMEOUT=1
WORDCHARS='*?_-[]~=./&;!#$%^(){}<>'

檢查:

if zplug check "junegunn/fzf-bin"; then
   export FZF_DEFAULT_OPTS="--height 40% --reverse --border --inline-info --color=dark,bg+:235,hl+:10,pointer:5"
fi

if zplug check "zsh-users/zsh-autosuggestions"; then
   ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=#ACB31D,bg=#0087AF,bold,underline"
fi

if zplug check "junegunn/fzf-bin"; then
   alias base="base64"
   alias decode="decode64"
   alias encode="encode64"
fi

補全——我也試著評論每一個來解決,但問題還不清楚:

zstyle ':completion::complete:*' gain-privileges 1
zstyle ':completion:*:descriptions' format '%B%d%b'
zstyle ':completion:*:descriptions' format '%U%F{yellow}%d%f%u'
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*:warnings' format 'No matches for: %d'
zstyle ':completion:*' completer _expand _complete _ignored _approximate
zstyle ':completion:*' group-name ''
zstyle ':completion:*' menu select=2
zstyle ':completion:*' rehash true
zstyle ':completion:*' select-prompt '%SScrolling active: current selection at %p%s'
zstyle ':completion:*' verbose yes
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"

原因的起源仍不清楚。我不知道是什麼原因造成的。

No such widget您的按下Tab意味著您有一個bindkey聲明已綁定Tab到一個實際上不存在的小元件,或者您綁定到的小元件Tab正在嘗試呼叫另一個不存在的小元件。

要找出綁定到您的Tab密鑰的內容,請執行

bindkey '^I'

這將輸出類似

"^I" fzf-completion

要確定此小元件是否存在:

  1. 在您的~/.zshrc文件中,禁用 zsh-autosuggestions.
  2. 重啟你的終端。
  3. 然後做
zle -lL fzf-completion

如果小元件不存在,則上面的命令將不輸出任何內容。在這種情況下,您已經找到了問題所在。然後,您可以通過將Tab密鑰綁定到確實存在的小元件來修復它。

如果上面的命令輸出如下內容:sh zle -N fzf-completion 或者類似 sh zle -C complete-word .complete-word _main_complete 則該小元件存在。在這種情況下,輸出中的最後一個單詞會告訴您實現小元件的函式的名稱。

然後,您可以執行以下操作來找出函式的來源:

type fzf-completion

這將輸出類似

fzf-completion is a shell function from /path/to/fzf/completion/completion

然後,您可以打開文件以檢查程式碼。或者,如果您願意,可以打開該功能的跟踪,如下所示:

functions -t fzf-completion

在任一情況下,嘗試尋找類似的語句zle widget-name。然後,您可以嘗試以上述方式查看該小元件是否存在。

這樣,您可以找到出錯的確切位置,然後解決問題。

引用自:https://unix.stackexchange.com/questions/598964