Bagaimana cara menampilkan penyelesaian string ke stdout?

15

Beberapa gitperintah memiliki banyak opsi, dan sering kali berguna untuk mencari yang saya butuhkan - saya hanya mencari opsi yang mengontrol TABlebar git-gui, tetapi ada sekitar 200 penyelesaian untuk git config. Solusi yang jelas adalah menyalin semua penyelesaian ke editor dan mencari melalui mereka, tapi saya lebih suka melakukannya

[something] | grep tab

Tidak ada manatau infohalaman untuk compgen, help compgenbahkan tidak menjelaskan pilihannya sendiri, dan tidak ada auto-complete untuk compgen(bagaimana itu untuk ironi?).

PS: compgen -Atidak berhasil.

PPS: Ini bukan pertanyaan tentang git-gui- Solusi untuk pertanyaan lebar tab ada di tempat lain.

PPPS: Ini bukan tentang perintah pelengkapan otomatis, hanya parameter perintah .

l0b0
sumber
Ini sangat mirip dengan Cara menyalurkan output "tab complete"? , tetapi jawaban yang diterima di sana khusus untuk menyelesaikan perintah, bukan argumen
Michael Mrozek

Jawaban:

10

Anda dapat menggunakan fungsi berikut, yang menggunakan cara sudopelengkapan otomatis yang sama menghasilkan daftar penyelesaian:

comp() {
    local COMP_LINE="$*"
    local COMP_WORDS=("$@")
    local COMP_CWORD=${#COMP_WORDS[@]}
    ((COMP_CWORD--))
    local COMP_POINT=${#COMP_LINE}
    local COMP_WORDBREAKS='"'"'><=;|&(:"
    # Don't really thing any real autocompletion script will rely on
    # the following 2 vars, but on principle they could ~~~  LOL.
    local COMP_TYPE=9
    local COMP_KEY=9
    _command_offset 0
    echo ${COMPREPLY[@]}
}
comp git config ''

di mana _command_offsetdidefinisikan dalam bash-completion (paket).

CATATAN: fungsi harus dijalankan dalam shell interaktif (yaitu jika itu ada dalam file, file harus bersumber bukan hanya dijalankan.) Atau aturan / fungsi penyelesaian yang diperlukan tidak akan ditentukan.

PS. compgen -Ahanya berfungsi untuk tindakan bawaan, apa yang seharusnya Anda coba (tetapi tidak berhasil) adalah compgen -F(atau sebenarnya compgen -o bashdefault -o default -o nospace -F _git). Alasan ini tidak bekerja (dan doc untuk perintah built-in bash termasuk compgen / complete) dapat ditemukan di bash (1) .

yuyichao
sumber
@ l0b0 semoga berhasil di semua kasus.
yuyichao
Luar biasa, ini berhasil! Saya melakukan beberapa perubahan kecil dan sekarang dalam .bash_aliases saya untuk selamanya. Anda mungkin ingin memangkas sehingga hanya solusinya yang tersisa, tetapi tidak ada keraguan Anda mendapatkan karunia. Saya akan menghapus komentar diskusi saya karena tidak relevan lagi.
l0b0
1
Saya telah menemukan bahwa menggunakan ini di shell interaktif dapat menghancurkan tab-completion yang sudah ada. Membuat masing-masing variabel lokal ke fungsi memecahkan masalah itu. (mis. local COMP_LINE="$*")
AL Flanagan
@ALFlanagan Poin bagus. Diperbarui.
yuyichao