我有一个大型代码库,每个用户都会将其克隆到自己的系统中,然后在大型 HPC 集群上使用,而我没有 root 权限。其中一些脚本是 perl、python 和 bash 脚本,我很想为它们添加 ZSH 的自动完成功能。
但是我无法重写 .zshrc 来添加补全文件,因为 repo 可能会被克隆多次,并且只会存在很短的一段时间,然后它们就会自动删除。这会极大地扰乱 .zshrc 文件。我是否可以只在目录内添加自动补全,而无需重新加载 shell?假设我的脚本是sbatch.pl
并且具有选项--help
和--debug
和--project=NAME_OF_THE_PROJECT
。
我是否可以以某种方式创建一个._sbatch.pl.zsh_autocompletion
文件,让 ZSH 在执行操作时自动读取,perl sbatch.pl <TAB>
而无需在任何其他目录中写入任何内容或更改任何本地用户文件?
答案1
您可以在运行时添加命令完成,如下所示:
# First tell zsh where to find the function.
autoload -Uz /absolute/path/to/_sbatch.pl
# Then tell the completion system to use _sbatch.pl to complete for sbatch.pl
compdef _sbatch.pl sbatch.pl
将一个运行这些命令的脚本放在你的仓库根目录中很简单。然后你需要做的就是获取脚本以启用补全。
哎呀,如果你在每个 repo 中为每个脚本赋予完全相同的路径,比如说,.sh/zsh
那么你甚至可以通过将以下内容添加到你的.zshrc
文件中来自动运行它们:
autoload -Uz add-zsh-hook
add-zsh-hook chpwd .sh-zsh
.sh-zsh() {
local repo
repo="$( git rev-parse --show-toplevel 2> /dev/null )" ||
return
[[ -r $repo/.sh/zsh ]] &&
source $repo/.sh/zsh
}
每当你进入 Git 仓库中的任何目录时,这都会获取该文件<repo root>/.sh/zsh
。
(我选择为此使用目录,而不是将文件放在 repo 的根目录中,这样您就可以在同一目录中添加其他 shell 的支持文件。)
提示:要从脚本本身确定包含脚本的目录的绝对路径,请使用${${(%):-%x}:a:h}
。有关更多信息,请参阅: