以下是我当前zsh会话的示例摘录:
llama@llama:...Code/cpp/KingOfTheCode$ make
clang++ -std=c++11 -Iinclude src/*.cpp kothsrc/*.cpp -pthread -o KingOfTheCode
llama@llama:...Code/cpp/KingOfTheCode$ ./
Completing executable file or directory
include/ KingOfTheCode* kothsrc/ src/
(我输入.
,/
,然后输入 Tab 字符进行自动完成。)
为什么当我输入./<tab>
时zsh建议目录?我显然想要执行一个文件,如果我想在子目录中执行某些操作,那么./
部分就没用了。
如何防止这种令人讨厌的行为发生?为了清楚起见,我希望的行为是./<...>
的自动完成排除了目录,只查找可执行文件。
答案 0 :(得分:1)
我假设~/.zshrc
中某处有compinit
。
您可以按照以下zstyle
限制完成结果:
zstyle -e ':completion::complete:-command-::executables' ignored-patterns '
[[ "$PREFIX" == ./* ]] && { reply=(./*(/)) }
'
这会在键入./<...>
然后点击标签时添加ignored-patterns
zstyle条目。 Abobe ./*(/)
部分表示当前目录中的目录。因此,在完成“可执行文件或目录”时,任何子目录都将从完成结果中删除。
如果您想要在没有ignored-patterns
效果的情况下恢复完成结果,如果没有匹配的完成次数,您可以添加_ignored
完成者:
# this is same as the zsh default behavior though.
zstyle ':completion:*' completer _complete _ignored
在这种情况下,它应该通过键入./ko
Tab ⇒./koshsrc/
来完成被忽略的子目录。
更新:2014年12月29日星期一21:30:37 +0900(感谢您的建议,@ Frankc)
教导跳过其中namestring有一些空格的目录。
zstyle -e ':completion::complete:-command-::executables' ignored-patterns '
[[ "$PREFIX" == ./* ]] && {
local -a tmp; set -A tmp ./*(/)
: ${(A)tmp::=${tmp// /\\ }}
reply=(${(j:|:)tmp})
}
'