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.


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.


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.


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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.