更改默认的 Zsh 完成功能

Changing a default Zsh completion function

我注意到 Zsh 中 source 命令的制表符补全会尝试补全大量文件。也许一切都在 $PATH 中?我尝试使用空白 .zshrc 文件来确保其中没有任何内容。

ubuntu% source d
zsh: do you wish to see all 109 possibilities (16 lines)?

我确实找到了这个似乎可以控制的文件:/usr/share/zsh/functions/Completion/Zsh/_source

#compdef source .

if [[ CURRENT -ge 3 ]]; then
  compset -n 2
  _normal
else
  if [[ -prefix */ && ! -o pathdirs ]]; then
    _files
  elif [[ $service = . ]]; then
    _files -W path
  else
    _files -W "(. $path)"
  fi
fi

如果我将最后一个“else”语句中的行从 _files -W "(. $path)" 更改为 _files,它会按我希望的方式工作。 Tab 补全只查看当前目录中的文件和目录。

更改此文件似乎不是最好的方法。我宁愿更改 .zshrc 文件中的内容。但是我对 Zsh 完成的知识有点缺乏,到目前为止我所做的搜索并没有让我找到答案。

Maybe everything in $PATH?

是的,没错。它提供了这些,因为 source 将搜索您当前的目录 您的 $PATH 以查找您传递给它的任何文件名。

要在不修改原始文件的情况下应用您的更改,请将此添加到您的 .zshrc 文件 after 调用 compinit:

compdef '
if [[ CURRENT -ge 3 ]]; then
  compset -n 2
  _normal
else
  _files
fi
' source

这告诉完成系统使用您为命令指定的内联函数source(而不是默认函数)。

或者,要仅查看当前目录的文件补全,您可以键入

$ source ./<TAB>