我在自定义脚本的 ZSH 完成方面遇到了奇怪的行为,需要一些想法、出了什么问题以及如何解决它。
我编写了一些自定义脚本myscript
,并创建了相应的完成脚本_myscript
。后者像往常一样以以下几行开头:(#compdef myscript
也尝试过#compdef _myscript myscript
相同的结果)。一开始,我的~/.local/bin
目录中有这两个文件,这是我的$PATH
.我还将它添加到我的中,$fpath
以便 ZSH 可以找到完成脚本。
到目前为止,一切都很好。命令完成后一切正常myscript
。但后来我将这两个文件移动到我的.dot文件通过相应的 git 存储库共享它们。我的点文件包含一个用于完成脚本的文件夹,它也是我的$fpath
.但是当移动到我的点文件的这个子目录时,补全停止工作......
我删除了.zcompdump
更新完成分配并测试了不同的语法以将目录添加到我的$fpath
,但没有任何帮助。我还在compinit
删除后手动调用.zcompdump
,以确保在执行所有分配后调用它。
rustup
第一个奇怪的事情是,dotfile 目录中的其他完成脚本可以被 ZSH 完成系统识别,因为它还包含 my和命令的完成脚本cargo
。当我尝试不同的步骤后 grep 时.zcompdump
,它总是显示这两个命令的分配,但不显示myscript
.
第二个奇怪的行为是,当我将完成脚本移回目录~/.local/bin
并重新启动 ZSH 时,它突然识别该脚本并且完成再次开始工作。现在我也可以在我的内部 grep 它.zcompdump
现在我已经不知道可能是什么原因了,特别是因为rustup
完成cargo
工作在同一目录中正常工作。让我的所有自定义完成都从我的点文件中工作会更舒服,因此我可以在不同的机器上使用它们,而无需太多手动配置。当然,我知道我可以在我的 内部对完成分配进行硬编码zshrc
,但这也不像常规那样可移植,fpath
这可能是我缺少的一个小方面,但希望有人知道解决方案。
我无法提供太多代码,因为它似乎不是由于我的脚本代码造成的。 JFYI:我正在运行 Manjaro Linux(具有预定义的 ZSH 设置,我已经检查过)。
答案1
好吧,绝对是我的错。
当我用 neovim 编辑zshrc
并创建一个保存点文件路径的变量时,neovim 自动补全/
在字符串末尾添加了一个额外的斜杠;我不认识什么。使用该变量作为子字符串来添加保存完成脚本的目录,并fpath
添加不必要的双斜杠。因此,ZSH 正在搜索错误的目录......
剩下的唯一奇怪的事情是,完成 forrustup
和cargo
仍然使用错误的路径。但这不是问题...