如何在不编写文件和更改 .zshrc 的情况下为任何类型的脚本添加 ZSH 的自动完成功能?

如何在不编写文件和更改 .zshrc 的情况下为任何类型的脚本添加 ZSH 的自动完成功能?

我有一个大型代码库,每个用户都会将其克隆到自己的系统中,然后在大型 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}。有关更多信息,请参阅:

相关内容