Предлагать только исполняемые файлы, а не каталоги при вводе ./ (точка-слэш) в zsh

Вот пример фрагмента из моего текущего сеанса 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 для автозаполнения.)

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

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


person tckmn    schedule 28.10.2014    source источник
comment
Я думал, что ./ будет просто ссылаться на текущий каталог. Почему тогда подкаталог бесполезен?   -  person tiguchi    schedule 29.10.2014
comment
@NobuGames Когда я набираю ./, обычно это происходит потому, что я хочу выполнить что-то в текущем каталоге (например, ./something.py). Если бы я хотел выполнить, скажем, foo/bar/baz/something.py, ./ был бы бесполезен, потому что он подразумевается.   -  person tckmn    schedule 29.10.2014
comment
Я думаю, было бы хорошо, если бы setout autocd действовало, поэтому мы можем ввести ./, Tab, Tab... для подкаталога cding. Но лично я все равно не использую autocd часто.   -  person hchbaw    schedule 25.12.2014
comment
Тьфу… Очень извиняюсь за комментарий выше, s/setout/setopt/.   -  person hchbaw    schedule 25.12.2014


Ответы (1)


Я предполагаю, что где-то в файле ~/.zshrc есть compinit.

Вы можете ограничить результаты завершения zstyleподобным образом:

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

Это добавляет записи zstyle ignored-patterns zstyle, когда введите ./<...> и нажмите Tab. Часть Abobe ./*(/) указывает каталоги в текущем каталоге. В результате любые подкаталоги будут удалены из результатов завершения при завершении «исполняемого файла или каталога».


Если вы хотите восстановить результаты завершения без ignored-patterns эффектов, если нет соответствующих завершений, вы можете добавить _ignored завершающий элемент:

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

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


Обновление: Пн, 29 декабря 2014 г. 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})
  }
'
person hchbaw    schedule 25.12.2014
comment
Почему этот ответ получил отрицательный голос? Оно работает. (Хорошо, это не работает для каталогов с пробелом в нем, но в остальном это «работает для меня»). - person Francisco; 29.12.2014
comment
Я обновил, чтобы попытаться правильно обрабатывать пробелы. Большое спасибо за ваш отчет, @Francisco! - person hchbaw; 29.12.2014