在zsh中键入./(dot-slash)时,只建议可执行文件而不是目录

时间:2014-10-28 21:34:07

标签: zsh zsh-completion

以下是我当前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建议目录?我显然想要执行一个文件,如果我想在子目录中执行某些操作,那么./部分就没用了。

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

1 个答案:

答案 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})
  }
'