Як встановити правила автозаповнення Zsh для другого аргументу (функції) для існуючих правил команди?


9

У мене є спеціальна функція Zshg :

function g() {
  # Handle arguments [...]
}

У ньому я обробляю короткі аргументи, які виконують команди Git. Наприклад:

g ls # Executes git ls-files ...
g g  # Executes git grep ...

Мені потрібно мати змогу встановити правила автодоповнення до правил Гіта для коротких аргументів, але я не знаю, як це зробити.

Наприклад, мені потрібно g ls <TAB>виконати вкладку правил, щодо git ls-files <TAB>яких можна було б дати мені аргументи для git ls-files:

$ g ls --<TAB>
--abbrev                 -- set minimum SHA1 display-length
--cached                 -- show cached files in output
--deleted                -- show deleted files in output
# Etc...

Це не просто налаштування gдля автоматичного завершення, gitоскільки я відображаю свої власні короткі команди до команд Git.


1
Якщо ваша функція відображає лише короткі імена до підкоманд Git, ви також можете використовувати для цього систему псевдонімів git. Читайте про це в mapage: man git-config.
Лукас

Відповіді:


3

Я виявив, /usr/share/zsh/functions/Completion/Unix/_gitщо мав кілька порад щодо псевдонімів, як це, і, нарешті, визначив ці функції для псевдонімів:

_git-ls () {
  # Just return the _git-ls-files autocomplete function
  _git-ls-files
}

Потім я зробив пряму compdef g=git. Система автозаповнення побачить, що ви працюєте, наприклад, g lsі використовуєте функцію _git-lsавтозаповнення.

Завдяки user67060 за те, що він спрямовував мене в правильному напрямку.


2

Мені довелося зробити щось дуже схоже, так що приблизно це має вирішити вашу проблему.

_g () {
    case "${words[2]}" in
      ls) words[1,2]=(git ls-files);;
      g) words[1,2]=(git grep);;
      *) return 1;;
    esac

    _git # Delegate to completion
}
compdef _g g

Варто зазначити, що якщо ви зміните кількість аргументів, вам знадобиться відкоригувати $CURRENTзмінну.


1

Це я би робив:

_tg () {
    local _ret=1
    local cur cword prev

    cur=${words[CURRENT]}
    prev=${words[CURRENT-1]}
    cmd=${words[2]}
    let cword=CURRENT-1

    case "$cmd" in
    ls)
        emulate ksh -c _git_ls_files
        ;;
    g)
        emulate ksh -c _git_grep
        ;;
    esac

    let _ret && _default && _ret=0
    return _ret
}

compdef _tg tg

Однак для цього використовується доповнення Git, а не завершення zsh:

https://git.kernel.org/cgit/git/git.git/tree/contrib/completion/git-completion.zsh


Дякую, я пішов іншим маршрутом, оскільки не знав, де знайти правила завершення Git, і отримував помилки. Дивіться мою відповідь.
Ерік Номич
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.