【问题标题】:Select from zsh completion menu by number按数字从 zsh 完成菜单中选择
【发布时间】:2018-10-31 05:30:56
【问题描述】:

前几天我发现了这个导航小技巧,它可以让我在输入“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 oh-my-zsh zsh-completion


    【解决方案1】:

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

    开始调查 zsh 补全的一个好地方是 _complete_help ZLE 小部件。这在 zsh 的 viins (vi insert) 键盘映射中默认绑定到 ^Xh,但在 emacs 键盘映射中默认未绑定。如果你想在emacs keymap(很多人默认)中使用它,你必须绑定它:

    bindkey -M emacs "^Xh" _complete_help
    

    现在您可以键入cd -(或cd +),然后按CTRL-Xh 而不是TAB。您应该会看到以下输出:

    tags in context :completion::complete:cd::
        directory-stack  (_directory_stack _cd)
    

    (在这一点上,我承认我们正在接近我对 zsh 补全系统的了解。)

    现在您可以在此特定上下文中看到 directory-stack 标记的完成函数。您可能感兴趣的是_directory_stack,您可以通过以下方式查看该函数的内容:

    functions _directory_stack
    

    ...这是实际生成这些领先数字的地方。

    可以说可能为其他完成上下文编写类似的完成函数,并应用 using zstyle。然而,这是不平凡的完成魔法,超出了我尝试过的任何东西

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 2014-12-19
      • 2021-02-13
      • 2013-06-23
      • 2011-07-12
      • 2012-05-17
      相关资源
      最近更新 更多