Запустить команду на завершение вкладки в Zsh

498
Josh Sherick

Я пытаюсь настроить функцию zsh, которая возвращает меня в каталог git верхнего уровня с необязательным аргументом для перемещения относительно этого каталога. В настоящее время у меня есть это, которое работает:

alias gitdir='git rev-parse --show-toplevel' cdgit() { cd $(gitdir)/$1 } 

Проблема в том, что завершение вкладки не работает должным образом, оно будет автоматически завершаться из любого каталога, в котором я сейчас нахожусь cdgit, но я хочу, чтобы оно завершалось из $(gitdir). Если я наберу следующую строку перед запуском cdgit, завершение будет работать правильно (с $(gitdir)):

compctl -W $(gitdir) -/ cdgit 

Тем не менее, я не хочу вводить эту команду каждый раз перед тем, как печатать, cdgitчтобы получить завершение табуляции. Есть ли способ, которым я могу сделать функцию завершения, cdgitкоторая будет каким-то образом запускать эту команду, чтобы мое завершение было правильным?

1
Почему отрицательный голос? Josh Sherick 7 лет назад 0
Почему вы не хотите придерживаться решения `compctl`? Это может перейти к файлу rc, где вы определяете функцию cdgit, не так ли ?! mpy 7 лет назад 0
Нет, потому что я не хочу, чтобы он запускался при запуске моей оболочки. Это изменит каталог, который `cdgit`завершает до того, что` $ (gitdir) `вычисляло до того момента, когда был запущен мой .zshrc. Тем не менее, я хочу, чтобы он автоматически завершал все, что вычисляет `$ (gitdir)`, во время ввода `cdgit`. Поэтому я хочу набрать `cdgit` и нажать tab, чтобы получить завершение из того места, куда он меня бы отправил, что может не совпадать с местом запуска оболочки. Josh Sherick 7 лет назад 1
Я полагаю, что он может выполняться при каждом изменении каталога. Не самое чистое решение, но это быстрая команда. Josh Sherick 7 лет назад 0
Конечно, я плохо понимаю, что `$ (gitdir)` будет статичным. Смотрите мой ответ для предложения. mpy 7 лет назад 0

1 ответ на вопрос

2
mpy

I'd suggest to write a completion function for your cdgit function.

Put this file named _cdgit into a directory which is in your $fpath, e.g. /usr/share/zsh/site-functions, then start a new shell instance:

#compdef cdgit local expl local ret=1 [[ CURRENT -eq 2 ]] && _wanted directories expl 'git toplevel directory' \ _path_files -/ -W $(git rev-parse --show-toplevel) && ret=0 return ret 

This is borrowed from one of the last lines in the _cd completion function itself, which is of course much more complex.

Demo:

/usr/src/linux-git/Documentation/x86> cd [TAB] local directory i386/ x86_64/ /usr/src/linux-git/Documentation/x86> cdgit [TAB] git toplevel directory Documentation/ crypto/ include/ lib/ scripts/ usr/ arch/ drivers/ init/ mm/ security/ virt/ block/ firmware/ ipc/ net/ sound/ certs/ fs/ kernel/ samples/ tools/