我有一个目录,其中有一个名为 的子目录src
。我希望在输入cd s
并点击TAB
目录时能够完成。相反,zsh
尝试完成系统上以以下开头的所有用户s
:
Completing local directory
src/
Completing user
saeumair sbrg scan-nix schlosse sdwoods shutdown
sis-user smmsp snitch srabhina sshd sterpeni sushid sync
我猜我的罪过.zshrc
是:
zstyle ':completion:*:directory-stack' list-colors '=(#b) \
#([0-9]#)*( *)==95=38;5;12'
我用它来完成cd
历史记录。知道如何在不为用户完成的情况下保留此功能吗?
答案1
该cdablevars
选项负责创建命名目录,因此用户成为 cd 的有效参数。如果您不使用它,请使用unsetopt cdablevars
.
要更改 cd 的完成内容,可以使用样式tag-order
。例如,要首先尝试仅本地目录,则为:
zstyle ':completion:*:cd:*' tag-order local-directories
在特定上下文中查看适用标签的一个方便的快捷键是按Ctrl-X h
而不是按tab
。
答案2
用户是命令的有效参数cd
,因此作为完成提供,因为您可以选择cdable_vars
打开。使用此选项,cd foo
可以使用 代替cd ~foo
,它允许foo
是任何可以波形符扩展,包括设置的用户名或目录名hash -d
(但不包括 shell 变量,尽管有选项的名称)。
完成代码中没有选项允许指定目录但不尝试完成它们。您可以使用 的完成函数的包装器来解决这个问题cd
。
unset -f _cd
autoload -U _cd
functions[_cd_orig]=_cd
_cd () {
setopt local_options no_cdable_vars
_cd_orig $@[@]
}