1

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

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

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

compctl -W $(gitdir) -/ cdgit

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

1 ответ1

2

Я бы предложил написать функцию завершения для вашей функции cdgit .

Поместите этот файл с именем _cdgit в каталог, который находится в вашем $fpath , например, /usr/share/zsh/site-functions , затем запустите новый экземпляр оболочки:

#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

Это заимствовано из одной из последних строк в самой функции завершения _cd , которая, конечно, намного сложнее.

Демо-версия:

/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/                                      

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .