завершение zsh по параметру

Я довольно счастливый пользователь zsh и особенно ценю его подсистему завершения. В последнее время я пытаюсь улучшить некоторые команды завершения, особенно те, которые я часто использую (например, rm). В zsh следующая команда:

rm <TAB>

завершает zsh с файлами текущего каталога, как и ожидалось. То, что я пытаюсь сделать, это заставить zsh завершить следующий вариант:

rm -r <TAB>

только с каталогами.

Любой гуру zsh, который знает, как завершить параметр, чтобы он учитывал параметр (-r)?


person user2414029    schedule 12.09.2013    source источник
comment
Я не гуру, но замечу, что rmdir уже так настроен в zsh. :-)   -  person mjk    schedule 20.09.2013
comment
@mjk: но AFIAK rmdir удаляет только пустые каталоги, а это не та функциональность, которую предоставляет rm -r.   -  person mschilli    schedule 22.09.2013


Ответы (1)


Этого можно добиться, отредактировав функцию завершения zsh для rm в соответствии с желаемым поведением.

Все функции завершения Z-shell определены где-то в вашей системе. В OSX он находится под /usr/local/zsh/5.0.2/share/zsh/functions. В Linux, вероятно, есть что-то подобное.

Функция завершения для rm определена в файле с именем _rm. Он довольно маленький. (Если вам интересно, завершение для rmdir определено в _directories).

Чтобы установить завершение для rm -r, нам нужно изменить строку, которая выглядит примерно так:

'(-r -R --recursive)'{-r,-R,--recursive}'[remove directories and their contents recursively]'

Добавляем в конец этой строки, внутри цитаты:

:*:file:_directories

Я почти уверен, что это информирует zsh о том, что завершение при задании аргумента -r должно состоять из files, и мы получаем эти files с помощью функции _directories (которая возвращает только каталоги).

(Я не уверен на 100%, потому что zsh — зверь, над которым я все еще думаю).

Вот пример использования:

введите здесь описание изображения


Вот разница изменений, чтобы было понятнее :)

<   '(-r -R --recursive)'{-r,-R,--recursive}'[remove directories and their contents recursively]:*:file:_directories'
---
>   '(-r -R --recursive)'{-r,-R,--recursive}'[remove directories and their contents recursively]'
person simont    schedule 21.09.2013
comment
+1 и награда за этот отличный подробный ответ. Он отлично работал на gentoo linux (файл находился под /usr/share/zsh/5.0.2/functions/Completion/Unix/_rm). - person mschilli; 22.09.2013