切换到树状层次结构中某个目录

切换到树状层次结构中某个目录

我经常发现自己输入:

cd a/directory/I/use/a/lot

并且在该目录里面有很多我cd需要来回移动的文件夹。

是否有一个oh-my-zsh插件可以允许输入如下内容:

cd somd<TAB>

然后自动完成一个目录列表,其名称包含字符串somed, 并且可达从当前目录?例如,给定目录结构

somedirX
foo/bar/somedirY
baz/somedirZ/bum

输入cd somed<TAB>应该返回此完成列表

somedirX
somedirY
somedirZ

我还没有找到任何东西。

答案1

首先,您需要定义一个完成函数,如下所示:

_children_dirs() {
    find . -type d -name "${words[CURRENT]}*" -printf "%P\n" \
        | while read -r line; do
      compadd -U -X "Subdirectories: " "$line"
    done
    compstate[insert]=menu # no expand
}

此函数现在可以用作以下的完成器cd

compdef _children_dirs cd

但是,我认为使用最后一个命令不是一个好主意。事实上,尝试从你的主目录执行该命令,你的 shell 会暂时冻结(Ctrl+c停止)。 一个更好的解决方案可能是为这个完成分配一个键序列,并仅在需要且安全时使用它:

zstyle ':completion:children-dirs:*' completer _children_dirs
zle -C children-dirs menu-complete _generic
bindkey '^Y' children-dirs

接着就,随即,Ctrl+y将会触发children_dirs完成。

如果您准备使用其他命令,我认为还有另一个更好的解决方案。

function ccd { cd $1 }
compdef _children_dirs ccd

此块定义了一个新命令电荷耦合器件使用 _\children_dirs_ 作为完成符(因此用 TAB 触发)。

您可以在寻找使用以下命令在文件名中的任何位置搜索模式:"*${words[CURRENT]}*"

编辑:我创建了一个插入对于 zsh 来说。

相关内容