我的 zshrc 包含以下函数来创建一个目录,然后进入它:
function mcd () {
mkdir -p "$*" && cd "$*"
}
该函数本身工作正常,但完成后我得到奇怪的行为。如果我开始输入 egmcd ~/
然后按Tab,消息
_mtools_drives:3: command not found: mtoolstest
在插入点插入,没有完成。我想要的是像完成命令一样完成命令mkdir
:zsh 应该为我提供现有目录的名称。
我如何告诉 zsh 出于完成目的,它应该mcd
与mkdir
?
以下代码段导致
mcd
完成如下mkdir
:它的工作方式是查找
mkdir
. 函数的完成代码(通常是完成函数的名称)存储在关联数组中_comps
。因此compdef $_comps[mkdir] mcd
声明mcd
应该以与mkdir
现在完成相同的方式完成。上面的函数增加了一些细节:
(($+_comps[$1]))
确保如果$1
没有指定的完成方法,则没有为其他参数设置完成方法。${@[2,-1]}
是从第二个开始的函数参数列表,因此您可以指定多个命令名称来定义完成。这实际上${^@[a,-1]}
是为了为每个数组元素复制数组扩展周围的文本。=$1
设置要使用的服务名称。这只对完成函数处理几个密切相关的命令的少数命令很重要。例如,完成函数_gzip
同时处理gzip
andgunzip
以及pigz
andunpigz
;compdef _gzip foo
使用whilefoo
的默认行为使用完成时的行为for 。_gzip
compdef _gzip foo=pigz
foo
_gzip
pigz
谈到您的具体情况,默认完成
mkdir
不仅提供目录,还提供您的功能不支持的选项。因此,您实际上最好将其定义mcd
为仅完成现有目录。Zsh 附带了一个辅助函数(一个未记录的包装器_files
)。你得到这些看起来很奇怪的补全的原因
mcd
是它是一个来自曾经中等广泛使用的命令套件mtools的命令的名称。compdef
使用以下形式:所以一个想法是通过以下命令将
name
of指向函数:mcd
_mkdir
然而,这有点不正确,因为
mkdir
完成了可能不应该给的各种标志cd
。更直接的是在目录上完成: