不是重复的:
我不是在寻找一种方法来完成目录名称或从固定目录执行脚本。我试图解决的问题是完成当前的目录没有紧迫/
.
我希望 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 true
withsetopt 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注意最后一行后面的空格