按编号从zsh完成菜单中选择

按编号从zsh完成菜单中选择,zsh,oh-my-zsh,zsh-completion,Zsh,Oh My Zsh,Zsh Completion,前几天我发现了这个小小的导航技巧,它允许我在输入“cd-”时按数字触发菜单完成 ~ cd - 0 -- ~/home 1 -- ~/home/stuff 2 -- ~/downloads 3 -- ~/wallpaper Shell脚本语法对我来说仍然像一门外语,但为了获得此功能,我的目录堆栈历史记录通过管道传输到下面的函数中 DIRSTACKSIZE=9 DIRSTACKFILE=~/.zdirs if [[ -f $DIRSTACKFILE ]] && [[ $#dirs

前几天我发现了这个小小的导航技巧,它允许我在输入“cd-”时按数字触发菜单完成

~ cd -
0 -- ~/home
1 -- ~/home/stuff
2 -- ~/downloads
3 -- ~/wallpaper
Shell脚本语法对我来说仍然像一门外语,但为了获得此功能,我的目录堆栈历史记录通过管道传输到下面的函数中

DIRSTACKSIZE=9
DIRSTACKFILE=~/.zdirs

if [[ -f $DIRSTACKFILE ]] && [[ $#dirstack -eq 0 ]]; 
   then dirstack=( ${(f)"$(< $DIRSTACKFILE)"} )
   [[ -d $dirstack[1] ]] && cd $dirstack[1] && cd $OLDPWD
fi
  chpwd() {
  print -l $PWD ${(u)dirstack} >$DIRSTACKFILE
}

神奇的部分是能够从列表中按数字进行选择,但我逐渐了解到这可能是 因为按编号导航的功能已嵌入到“cd-”命令中。尽管如此,我还是想在任何地方都使用它

任何编写包装器函数之类的技巧,我想对于完成菜单来说,当它被触发时,会从菜单中导入完成 并将它们显示在编号列表中,这些编号在其中选择相应的元素


我已经开始阅读手册什么的了,但一切都很模糊。谢谢

首先,您显示的代码片段与完成无关。相反,它所做的是将目录堆栈记录到一个文件中,以便在zsh会话之间保留它。就我个人而言,我甚至不确定这是个好主意

开始研究zsh完成的一个好地方是_complete_help ZLE小部件。在zsh的viins vi insert键盘映射中,默认情况下,它被绑定到^Xh,但在emacs键盘映射中,默认情况下它被解除绑定。如果要在emacs密钥映射中使用它(许多人的默认设置),则必须绑定它:

bindkey -M emacs "^Xh" _complete_help
现在,您可以键入cd-或cd+,然后按CTRL Xh键,而不是按TAB键。您应该看到以下输出:

tags in context :completion::complete:cd::
    directory-stack  (_directory_stack _cd)
在这一点上,我承认我们正接近我对zsh完成系统的知识极限

现在,您可以在这个特定上下文中看到目录堆栈标记的completer函数。您可能感兴趣的是_directory_stack,您可以通过以下内容查看该函数的内容:

functions _directory_stack
…这就是实际生成前导数字的地方

可以说,可以为其他完成上下文编写类似的完成函数,并使用zstyle应用。然而,这是一个非平凡的完成魔法,超越了我所尝试的任何东西