zsh cdpath 和自动完成

Pon*_*ars 4 zsh autocomplete

我在 zsh 中的 CDPATH 如下所示:

export CDPATH='.:..:../..'
Run Code Online (Sandbox Code Playgroud)

不幸的是,这意味着当我在输入 'cd' 后尝试自动完成时,有太多不相关的自动完成选项,这取决于我在哪里。例如,如果我在我的主目录中,输入 cd 会尝试自动完成系统上的每个用户,因为 CDPATH 有“..”

有没有办法让我的 CDPATH 如上所示,但让 cd、pushd 等的自动完成忽略 CDPATH 值,并且仅基于当前目录自动完成?

pet*_*eth 8

path-directories

一种方法是在您的建议源中添加以下完成设置以将.zshrc其删除path-directories

zstyle ':completion:*:complete:(cd|pushd):*' tag-order \
    'local-directories named-directories'
Run Code Online (Sandbox Code Playgroud)

组名

或者或另外,以下设置应显示所有相应完成建议组的标题,以便您可以查看哪些目录是本地目录,哪些是来自cdpath.

zstyle ':completion:*' group-name ''
zstyle ':completion:*:descriptions' format %d
Run Code Online (Sandbox Code Playgroud)

您可以对这些描述应用标准提示格式,使它们脱颖而出:

zstyle ':completion:*:descriptions' format %B%d%b        # bold
# zstyle ':completion:*:descriptions' format %S%d%s        # invert/standout
# zstyle ':completion:*:descriptions' format %U%d%u        # underline
# zstyle ':completion:*:descriptions' format %F{green}%d%f # green foreground
# zstyle ':completion:*:descriptions' format %K{blue}%d%k  # blue background
# etc.
Run Code Online (Sandbox Code Playgroud)

根据我的经验,这有助于理解不同的来源。


注 1zsh有两种表示数组变量的表示,例如PATHCDPATH,其中小写变体是实际数组。这意味着您可以:

cdpath=(path/to/dir /path/to/another/dir)
Run Code Online (Sandbox Code Playgroud)

或者,为了获得您想要的结果:

cdpath=(.. ../..)
Run Code Online (Sandbox Code Playgroud)

我个人认为它比冒号分隔的伪数组更具可读性。

注意 2CDPATH除非您有多个需要设置的程序,否则不需要导出。

  • 这很棒。感谢您不仅为我提供了我正在寻找的答案,而且还向我指出了非常有用的东西,例如分组和格式化(甚至是真正的数组技巧),我什至没有想到要探索! (2认同)