2013-09-12 3 views
6

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

rm <TAB> 

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

rm -r <TAB> 

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

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

+0

Я не гуру, но я Отметим, что rmdir уже настроен таким образом в zsh. :-) – mjk

+0

@mjk: но AFIAK 'rmdir' удаляет только пустые каталоги, которые не являются теми же функциями, что и' rm -r'. – mschilli

ответ

5

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

Функции завершения Z-оболочки определены где-то в вашей системе. В 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 - зверь, я все еще обволакиваю свой маленький разум).

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

enter image description here


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

< '(-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]' 
+0

+1 и щедрость за этот замечательный подробный ответ. Он отлично работал на gentoo linux (файл находился под '/ usr/share/zsh/5.0.2/functions/Completion/Unix/_rm'). – mschilli

Смежные вопросы