zsh 拒绝接受新的自动完成脚本

zsh 拒绝接受新的自动完成脚本

我有一个软件项目,我正在尝试为其编写 zsh 补全。在安装了一个提供了许多预制完成的包后,我发现它们被放在这里:

/usr/share/zsh/site-functions

所以我写了我的完成脚本,并将其也放在那里。 ……并因失败而感到沮丧。我尝试过以下方法:

  1. 从上面的目录符号链接到原始脚本。
  2. 将脚本的副本直接放入上面的目录中。
  3. 将我的登录 shell 设置为 zsh(而不是从另一个 shell 切换到它)
  4. (可能)compinit和的所有排列rehash
  5. 简化我原来的脚本,这样就不会出错。
  6. 更改另一个脚本的内容。更改有效,因此目录是正确的,并且 zsh 正在检测那里的完成脚本。

这是简化的脚本:

#compdef aura

_arguments -s \
  '-V[Version!]' \
  '-h[Helpppp]'

以及我的 .zshrc 的当前内容。我通常不是 zsh 用户。

autoload -U compinit
compinit
zstyle ':completion:*' rehash true

请并感谢您提供的任何见解。我缺少什么?

编辑: /usr/share/zsh/site-functions 的内容是:

_ack _adb _android _attach _aura _baselayout _bpython _brew _bundle _cap _choc _coffee _cower _cpanm _debuild _dhcpcd _ditz _emulator _eselect _fab _gas _gcc-config _geany _gem _genlop _gentoolkit _gentoo_packages _git-flow _github _git-pulls _git-wtf _google _gradle _heroku _jmeter _jmeter-plugins _jonas _knife _language_codes _layman _lein _lunar _lunchy _manage.py _mosh _mvn _node _optirun _pacman _pactree _pear _perf _periscope _pgsql_utils _pip _pkcon _play _port _portage _portage_utils _pygmentize _redis-cli _rvm _sbt _scala _sdd _setup.py _showoff _smartmontools _srm _ssh-copy-id _subliminal _symfony _systemd _teamocil _thor _tmuxinator _vagrant _virtualbox _vnstat _vpnc _yaourt

答案1

这是我认为可能出错的地方。

包含完成代码的文件必须位于fpath数组中列出的目录中。好的。请注意,您不应该将自己的文件放在/usr/share;下。 zsh 不在乎,但你的文件可能会被操作系统的包管理器删除或覆盖,并且你可能会忘记备份它,将其复制到另一台机器等。/usr/local如果你想让它们可供您系统上的所有用户使用,如果您只想让您的用户使用它们,则可以在您的主目录下使用它们。您可以fpath在您的目录中添加一个目录.zshrc(在调用之前compinit),例如

fpath=(~/lib/zsh $fpath)

文件的第一行后面必须#compdef跟一个空格,后跟一个或多个以空格分隔的命令名称。检查其中是否没有任何杂散字符,特别是该文件必须具有 unix 行结尾 (LF),而不是 Windows 行结尾(CRLF — 杂散 CR 可能会导致命令无法被拾取)。

compinit函数在第一次运行时会创建一个缓存文件,以便下次运行更快。此文件名为~/.zcompdump。它包含命令名称和完成函数(例如 )之间的关联aura _aura,而不是函数的代码。有时您可能需要重新生成它。特别是,如果您更改#compdef现有文件中的行,compinit则不会重新读取该文件。只要您不传递-Ccompinit,它就会拾取新文件,但您必须#compdef在下次启动 zsh 之前获取该行。如果没有,请删除缓存文件(rm ~/.zcompdump)并再次启动 zsh(或更准确地说,运行compinit)。

相关内容