我有一个软件项目,我正在尝试为其编写 zsh 补全。在安装了一个提供了许多预制完成的包后,我发现它们被放在这里:
/usr/share/zsh/site-functions
所以我写了我的完成脚本,并将其也放在那里。 ……并因失败而感到沮丧。我尝试过以下方法:
- 从上面的目录符号链接到原始脚本。
- 将脚本的副本直接放入上面的目录中。
- 将我的登录 shell 设置为 zsh(而不是从另一个 shell 切换到它)
- (可能)
compinit
和的所有排列rehash
。 - 简化我原来的脚本,这样就不会出错。
- 更改另一个脚本的内容。更改有效,因此目录是正确的,并且 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
则不会重新读取该文件。只要您不传递-C
给compinit
,它就会拾取新文件,但您必须#compdef
在下次启动 zsh 之前获取该行。如果没有,请删除缓存文件(rm ~/.zcompdump
)并再次启动 zsh(或更准确地说,运行compinit
)。