İkinci bir argüman (işlev) için Zsh otomatik tamamlama kurallarını varolan bir komutun kurallarına nasıl ayarlayabilirim?


9

Ben özel bir Zsh işlevig :

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

İçinde Git komutlarını yürüten kısa argümanları ele alıyorum. Örneğin:

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

Kısa argümanlar için Git'in kurallarına otomatik tamamlama kurallarını ayarlayabilmem gerekiyor, ancak bunu nasıl yapacağımdan emin değilim.

Örneğin, bana hangi için argümanlar verecek g ls <TAB>kuralları sekme-tamamlamanız gerekir :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...

Özel kısa komutlarımı Git komutlarıyla eşleştirdiğim giçin gitbu yalnızca otomatik tamamlama ayarı değildir .


1
İşleviniz git alt komutlarına yalnızca daha kısa adları eşlerse bunun için git takma adını da kullanabilirsiniz. Mapage bu konuda okuyun: man git-config.
Lucas

Yanıtlar:


3

Bunun /usr/share/zsh/functions/Completion/Unix/_gitgibi takma adlar için bazı ipuçları olan buldum ve takma adlar için bu işlevleri tanımladı:

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

Sonra bir düz yaptım compdef g=git. Otomatik tamamlama sistemi, örneğin çalıştığınızı görür g lsve _git-lsotomatik tamamlama işlevini kullanır.

Beni doğru yöne yönlendiren user67060 sayesinde.


2

Çok benzer bir şey yapmak zorunda kaldım, bu yüzden sorununuzu kabaca çözmesi gereken şey bu.

_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

Dikkat edilmesi gereken bir nokta, eğer argüman sayısını değiştirirseniz, $CURRENTdeğişkeni ayarlamanız gerekecektir .


1

Ben bunu yapardım:

_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

Ancak bu, zsh'ın tamamlanmasını değil, Git'in tamamlanmasını kullanıyor:

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


Teşekkürler, Git tamamlama kurallarını nerede bulacağımı bilmediğimden ve hatalar aldığından farklı bir rotaya gittim. Cevabımı gör.
Erik Nomitch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.