zsh 选项卡完成。到 。/

zsh 选项卡完成。到 。/

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


.我希望 zsh能够像 bash 一样使用制表符完成./

使用 bash,我习惯.TABTAB按 来查看 中的所有文件当前工作目录因为它首先完成./然后显示该目录中的所有内容。我希望不惜/一切代价避免的原因是,这在我的德语键盘上比用 2 个手指加 Shift 或远离数字键盘要/困难得多,而且我宁愿切换回 bash 而不是输入 a 。我想要实现的目标,换句话说, bash 的作用是:TAB/

$ .               <TAB>
$ ./              <TAB>
foo.sh   somedir/
$ ./              <F><TAB>
$ ./foo.sh        <ENTER>

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

  • 使用zstyle ':completion:*' special-dirs truewith setopt auto_cd(这是 oh-my-zsh 默认值)给了我更不有用的 on top 选项../,所以我已经将其关闭了。我对完成感到高兴cd
  • 没有.打开$PATH,应该保持这种状态。尽管我不介意完成f<TAB>例如./foo.sh

我如何教 zsh 立即完成.甚至./更好地完成本地目录内容?或者是否有另一种方法可以以不涉及的有效方式处理本地脚本文件/

答案1

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

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

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

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

答案2

鉴于您的f<TAB>选择/解决方法,我提出:

$ function f(){ local x=$1; shift; ./"$x" "$@"; }
$ f foo<TAB>

f注意最后一行后面的空格

相关内容