2014-10-28 7 views
1

Вот пример отрывок из моей текущей сессии ЗШ:только предложить исполнымых и не каталоги при вводе ./ (точка-слэш) в Zsh

[email protected]:...Code/cpp/KingOfTheCode$ make 
clang++ -std=c++11 -Iinclude src/*.cpp kothsrc/*.cpp -pthread -o KingOfTheCode 
[email protected]:...Code/cpp/KingOfTheCode$ ./ 
Completing executable file or directory 
include/  KingOfTheCode* kothsrc/  src/ 

(я напечатал ., /, а затем Tab знак для автозавершения.)

Почему zsh предлагает каталоги при вводе ./<tab>? Я явно хочу выполнить файл, и если бы я хотел что-то выполнить в подкаталоге, то часть ./ была бы бесполезной.

Как я могу предотвратить появление этого раздражающего поведения? Чтобы быть ясным, мое желаемое поведение заключается в том, что автозаполнение для ./<...> исключает каталоги и ищет только исполняемые файлы.

+0

Я думал, что '. /' Будет просто ссылаться на текущий каталог. Почему тогда подкаталог бесполезен? – tiguchi

+0

@NobuGames Когда я набираю '. /', Это обычно потому, что я хочу что-то выполнить в текущем каталоге (например, './Something.py'). Если бы я хотел выполнить, скажем, 'foo/bar/baz/something.py','./'Было бы бесполезно, потому что это подразумевалось. – Doorknob

+0

Я думаю, это было бы хорошо, если 'setout autocd' действует, поэтому мы можем ввести'./',' Tab', 'Tab' ... для подкаталога' cd'ing. Но я лично вообще не использую 'autocd'. – hchbaw

ответ

1

Я предполагаю, что есть 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 

Он должен завершить игнорированные подкаталоги в этом случае с вводом ./koВкладка./koshsrc/.


Обновление: пн, 29 декабря 2014 21:30:37 +0900 (Спасибо за ваше предложение, @Francisco)
Teach перескочить каталоги которых namestring имеет некоторые пробелы в нем.

zstyle -e ':completion::complete:-command-::executables' ignored-patterns ' 
    [[ "$PREFIX" == ./* ]] && { 
    local -a tmp; set -A tmp ./*(/) 
    : ${(A)tmp::=${tmp// /\\ }} 
    reply=(${(j:|:)tmp}) 
    } 
' 
+1

Почему этот ответ получил голос? Оно работает. (Хорошо, он не работает для каталогов с пространством в нем, но кроме этого он «работает для меня»). – Francisco

+0

Я обновил, чтобы попытаться правильно обрабатывать пространства. Большое спасибо за ваш отчет @Francisco! – hchbaw