2

这是我当前 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/

(我输入了 a ., a /,然后输入了一个Tab用于自动完成的字符。)

为什么 zsh 在我键入时会建议目录./<tab>?我显然想执行一个文件,如果我想在子目录中执行某些东西,那./部分就没有用了。

如何防止这种烦人的行为发生?为了清楚起见,我想要的行为是自动完成./<...>排除目录并且只查找可执行文件。

4

1 回答 1

3

我 假设compinit.~/.zshrc

您可以通过以下方式限制完成结果zstyle

zstyle -e ':completion::complete:-command-::executables' ignored-patterns '
  [[ "$PREFIX" == ./* ]] && { reply=(./*(/)) }
'

这会在ignored-patterns输入时添加 zstyle 条目,./<...>然后点击Tab. Abobe./*(/)部分表示当前目录中的目录。因此,在完成“可执行文件或目录”时,所有子目录都将从完成结果中删除。


如果您想在ignored-patterns没有匹配完成的情况下恢复完成结果而不产生影响,您可以添加_ignored完成者:

# this is same as the zsh default behavior though.
zstyle ':completion:*' completer _complete _ignored

./koTab在这种情况下,它应该通过键入⇒来完成被忽略的子目录./koshsrc/


更新: 2014 年 12 月 29 日星期一 21:30:37 +0900(感谢您的建议,@Francisco)
教导跳过名称字符串中有一些空格的目录。

zstyle -e ':completion::complete:-command-::executables' ignored-patterns '
  [[ "$PREFIX" == ./* ]] && {
    local -a tmp; set -A tmp ./*(/)
    : ${(A)tmp::=${tmp// /\\ }}
    reply=(${(j:|:)tmp})
  }
'
于 2014-12-25T02:52:30.597 回答