我在 /etc/hosts 文件中增加了很多条目,用于拦截和跟踪互联网上的广告(我从 github 上获取了这些列表)https://github.com/StevenBlack/hosts)。
但是,zsh 现在在搜索自动完成时会整合 hosts 文件中的所有条目。这意味着我可以移动一个名称很长的简单文件,然后输入mv w<TAB>
,就会得到数百个自动完成条目,其中隐藏着我想要的文件名。
有没有办法限制 zsh 用于自动完成的源?
编辑:以下是我认为与我的 zshrc 相关的部分:
zstyle ':completion:*' completer _complete _ignored _approximate
zstyle ':completion:*' list-colors ''
zstyle ':completion:*' matcher-list ''
zstyle ':completion:*' menu select=1
zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s
autoload -Uz compinit
autoload -U zutil
autoload -U complist
compinit
答案1
默认情况下,zsh 会填充其hosts
补全列表从命令getent hosts
如果可用,或者来自某些文件,包括/ect/hosts
。
如果我们想跳过此部分,我们需要提供自己的完成逻辑。您可以通过将以下内容添加到您的来实现~/.zshrc
:
zstyle -e ':completion:*:hosts' hosts 'reply=(
${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) 2>/dev/null)"}%%[#| ]*}//,/ }
${=${${${${(@M)${(f)"$(cat ~/.ssh/config 2>/dev/null)"}:#Host *}#Host }:#*\**}:#*\?*}}
)'
灵感:Voku 在其点文件中的解决方案,省略该/ect/hosts
部分。