Bagaimana cara menetapkan aturan pelengkapan otomatis Zsh untuk argumen kedua (fungsi) ke aturan perintah yang ada?

9

Saya memiliki fungsi Zsh khususg :

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

Di dalamnya, saya menangani argumen pendek yang mengeksekusi perintah Git. Sebagai contoh:

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

Saya harus bisa mengatur aturan pelengkapan otomatis ke aturan Git untuk argumen pendek tapi saya tidak yakin bagaimana melakukan ini.

Misalnya, saya perlu g ls <TAB>melengkapi tab aturan git ls-files <TAB>yang akan memberi saya argumen untuk 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...

Ini bukan hanya pengaturan guntuk pelengkapan otomatis gitkarena saya memetakan perintah pendek khusus saya ke perintah Git.

Erik Nomitch
sumber
1
Jika fungsi Anda hanya memetakan nama yang lebih pendek ke git sub-perintah, Anda juga dapat menggunakan sistem git alias untuk ini. Membacanya di mapage yang: man git-config.
Lucas

Jawaban:

3

Saya menemukan /usr/share/zsh/functions/Completion/Unix/_gitbeberapa tips untuk alias seperti ini dan akhirnya mendefinisikan fungsi-fungsi ini untuk alias:

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

Kemudian, saya melakukan yang lurus compdef g=git. Sistem autocomplete akan melihat bahwa Anda sedang menjalankan, misalnya, g lsdan menggunakan_git-ls fungsi autocomplete.

Terima kasih kepada user67060 untuk mengarahkan saya ke arah yang benar.

Erik Nomitch
sumber
2

Saya harus melakukan sesuatu yang sangat mirip sehingga kira-kira inilah yang seharusnya menyelesaikan masalah Anda.

_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

Satu hal yang perlu diperhatikan adalah bahwa jika Anda mengubah jumlah argumen, Anda perlu menyesuaikan $CURRENTvariabel.

Kevin Cox
sumber
1

Inilah yang akan saya lakukan:

_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

Namun, ini menggunakan penyelesaian Git, bukan penyelesaian zsh:

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

FelipeC
sumber
Terima kasih, saya akhirnya menempuh rute yang berbeda karena saya tidak tahu di mana menemukan aturan penyelesaian Git dan mendapatkan kesalahan. Lihat jawaban saya.
Erik Nomitch