zsh 选项卡完成。到 。/

zap*_*apl 11 zsh oh-my-zsh

不是重复的:
我不是在寻找一种方法来完成目录名称或从固定目录执行脚本。我试图解决的问题是在按的情况下完成当前目录/


我希望 zsh 完成选项卡../喜欢 bash。

使用 bash,我习惯于按下.TABTAB以查看当前工作目录中的所有文件,因为它首先完成./并显示该目录中的所有内容。我希望/不惜一切代价避免的原因是,这/在我的德语键盘上要困难得多,TAB因为它要么用 2 个手指带 shift 要么在小键盘上远离,我宁愿切换回 bash 而不是键入 a /。我想实现什么,换句话说 bash 做什么:

$ .               <TAB>
$ ./              <TAB>
foo.sh   somedir/
$ ./              <F><TAB>
$ ./foo.sh        <ENTER>
Run Code Online (Sandbox Code Playgroud)

当我点击时使用 zsh / oh-my-zsh.TAB我得到.(点空间)这对我来说根本没有用。

  • 使用zstyle ':completion:*' special-dirs truewith setopt auto_cd(这是 oh-my-zsh 默认值)给了我一个更不实用的选项../on top,所以我已经把它关掉了。我很高兴完成cd.
  • 没有.打开$PATH,它应该保持这种状态。虽然我不介意完成 eg f<TAB>to./foo.sh例如。

我怎么能教zsh来完成.,以./甚至更好的本地目录中的内容,对吗?或者是否有另一种方式以不涉及的有效方式处理本地脚本文件/

and*_*ien 3

伟大的挑战!在命令行上尝试一下,如果有效,请将其添加到 ~/.zshrc

bindkey '^I' dotcomplete
zle -N dotcomplete
Run Code Online (Sandbox Code Playgroud)
function dotcomplete() {                                        
  if [[ $BUFFER =~ ^'\.'$ ]]; then
    BUFFER='./'
    CURSOR=2
    zle list-choices
  else
    zle expand-or-complete
  fi
}                    
Run Code Online (Sandbox Code Playgroud)

它添加了一个在每次按 TAB (^I) 时运行的函数。如果您当前输入的行仅包含一个点(^=行首,'\.'=超级转义点,$=行尾),则用 ./ 替换该点,然后继续正常完成。

它并不完全按照您的要求执行,即将点视为当前目录。但它会节省您想要保存的击键次数。