Inti masalah:
Saya menggunakan mac dengan bash v3.2.17, saya menggunakan git yang diinstal melalui macports dengan varian bash_completion.
Saat saya mengetik git checkout m<tab>
. misalnya, saya menyelesaikannya sampai master
.
Namun, saya punya alias untuk git checkout
, gco
. Saat saya mengetik gco m<tab>
, saya tidak mendapatkan nama cabang yang dilengkapi secara otomatis.
Idealnya saya ingin pelengkapan otomatis hanya berfungsi secara ajaib untuk semua alias saya. Apa itu mungkin? Jika gagal, saya ingin menyesuaikannya secara manual untuk setiap alias. Jadi, bagaimana caranya?
Jawaban:
Sebagaimana dinyatakan dalam komentar di atas,
tidak lagi berfungsi. Namun, ada
__git_complete
fungsi di git-completion.bash yang dapat digunakan untuk mengatur penyelesaian untuk alias seperti:sumber
__git_complete g __git_main
untuk menyelesaikan kode yang bekerja pada semua perintah git.git-completion.bash
dari<your git install folder>/etc/bash-completion.d/
ke~/.git-completion.bash
Langkah 2) tambahkansource ~/.git-completion.bash
ke.bash_profile
Langkah Anda 3) Tambahkan di__git_complete gco _git_checkout
mana saja setelah baris di atas di .bash_profile Anda. Langkah 4) Reboot shell dan nikmati penyelesaian otomatis Anda! :)Saya mengalami masalah ini juga dan muncul dengan potongan kode ini. Ini secara otomatis akan memberi Anda penyelesaian untuk semua alias. Jalankan setelah mendeklarasikan semua (atau apa saja) alias.
sumber
let COMP_CWORD+=$num_alias_arguments
tidak berfungsi pada Mac OS X karena alasan tertentu. Menggantinya dengan((COMP_CWORD+=$num_alias_arguments))
memperbaikinyawrap_alias
tersedak tanda kutip ganda dalam definisi alias, dan saya kira itu tidak masuk akal untuk alias multi-perintah (alias 'foo=bar; baz'
), jadi saya meletakkan tambahan| grep -v '[";|&]'
setelahalias -p
. Selain itu, agak lambat untuk ratusan definisi alias, tapi saya senang untuk mengonfirmasi bahwa menggunakan danecho
bukannyaeval
memipiskan output ke file cache (yang kemudian dapat dieval
-edit sekaligus) berfungsi dengan baik dan sangat cepat .wrap_alias
membutuhkan penyelesaian yang harus diatur, jadi saya harus bergeraksource /etc/bash_completion
di depanwrap_alias
kode.let COMP_CWORD+=$num_alias_arguments
kelet \"COMP_CWORD+=$num_alias_arguments\"
.Di
git-completion.bash
sana ada garis:Melihat baris itu (dan fungsi _git) Anda dapat menambahkan baris ini ke
.bash_profile
:sumber
Saya memiliki alias g = 'git', dan dikombinasikan dengan alias git, saya mengetikkan hal-hal seperti
Perbaikan yang lebih mudah untuk kasus penggunaan khusus saya adalah menambahkan satu baris ke git-completion.
Tepat di bawah garis ini:
Saya menambahkan baris ini untuk menangani alias 'g' tunggal saya:
sumber
git-completion
atau baris itu/etc/bash_completion.d/git
, tetapi saya menambahkancomplete -o default -o nospace -F _git g
setelah alias saya.bash_aliases
dan itu berhasil!/etc/bash-completion.d/
atau baru/usr/share/bash-completion/
, Anda akan kehilangan perubahan Anda setiap kali file itu diperbarui menggunakan manajer paket Anda.Ya, itu mungkin dengan proyek alias lengkap (di Linux). Dukungan untuk Mac bersifat eksperimental tetapi pengguna telah melaporkan keberhasilan.
sumber
Anda juga bisa mencoba menggunakan alias Git. Misalnya, dalam
~/.gitconfig
file saya , saya memiliki bagian yang terlihat seperti ini:Jadi Anda bisa mengetik
git co m<TAB>
, dan itu harus diperluas kegit co master
, yang merupakangit checkout
perintah.sumber
Halaman forum ini menunjukkan solusinya.
Masukkan baris-baris ini ke dalam
.bashrc
atau.bash_profile
:Solusi ini mirip dengan skrip balshetzer , tetapi hanya ini yang benar-benar berfungsi untuk saya. (Script balshetzer memiliki masalah dengan beberapa alias saya.)
sumber
-bash: eval: line 28: unexpected EOF while looking for matching '''
-bash: eval: line 29: syntax error: unexpected end of file
"
kutipan di dalamfunction
string harus dikutip sebagai\"
. Ini mungkin memakan salah satu'
kutipan Anda di suatu tempat di sepanjang garis.Satu lagi pilihan adalah menggunakan
~/.bash_completion
file. Untuk membuatgco
aliasgit checkout
hanya taruh ini di sana:Maka di dalam
~/.bashrc
kamu harus meletakkan hanya alias itu sendiri:Dua baris. Itu dia.
Penjelasan:
Sumber
~/bash_completion
diperoleh di akhir skrip bash_completion utama. Di gentoo saya menemukan skrip utama di/usr/share/bash-completion/bash_completion
.The
_xfunc git
bit mengurus sourcinggit-completion
file untuk Anda sehingga Anda tidak perlu menempatkan apa pun di~/.bashrc
.Jawaban yang diterima mengharuskan Anda untuk menyalin
.git-completion.sh
dan sumbernya dari~/.bashrc
file Anda yang saya temukan lumpuh.PS: Saya masih mencoba mencari cara untuk tidak memasukkan seluruh
git-completion
skrip ke lingkungan bash saya. Silakan komentar atau edit jika Anda menemukan cara.sumber
_xfunc git
diperlukan?source ~/.git-completion.sh
saya membiarkan_xfunc
melakukannya untuk saya. Rasanya lebih baik dan bersih untuk melakukannya semata-mata~/.bash_completion
. Tanpa_xfunc
(atau sumber)__git_complete
fungsi tidak ada.~/.bash_completion
berkas - yang_xfunc
garis bekerja untuk saya di.bashrc
.Anda hanya perlu menemukan
complete
perintah dan menduplikasi baris yang memiliki nama alias sebagai gantinya.Saya punya
alias d-m="docker-machine"
. Dengan kata lain,d-m
akan menjadi alias untukdocker-machine
.Jadi pada Mac (via minuman), file selesai dalam
cd `brew --prefix`/etc/bash_completion.d/
.Untuk kasus saya, saya mengedit file bernama
docker-machine
.Sepanjang jalan di bagian bawah ada:
Jadi saya baru saja menambahkan baris lain, dengan alias saya:
sumber
docker
aliasd
. Meskipun untuk contoh dalam pertanyaan,git checkout
aliasgco
lebih kompleks.Pertama, cari perintah penyelesaian asli. Contoh:
Sekarang tambahkan ini ke skrip startup Anda (mis. ~ / .Bashrc):
The
_completion_loader
garis mungkin tidak diperlukan. Tetapi untuk beberapa situasi, fungsi penyelesaian hanya dimuat secara dinamis setelah Anda mengetik perintah dan tekanTAB
pertama kali. Jadi jika Anda belum menggunakan perintah asli, dan coba alias +TAB
, Anda mungkin mendapatkan kesalahan seperti "bash: completion: function '_docker' not found".sumber
Ada banyak jawaban untuk pertanyaan ini dan seperti saya, saya bertaruh banyak pembaca yang bingung. Untuk kasus saya, saya juga memiliki persyaratan agar dotfile saya berfungsi pada beberapa platform dengan versi Git yang berbeda. Saya juga tidak
alias g=git
tetapi telahg
didefinisikan sebagai suatu fungsi.Untuk mencapai ini, saya harus menampar jawaban yang berbeda di sini menjadi satu solusi. Meskipun ini mengulangi jawaban yang sudah saya pikir seseorang di kapal saya mungkin menemukan kompilasi ini berguna seperti yang akan saya miliki ketika saya pertama kali datang ke pertanyaan ini.
Ini mengasumsikan penyelesaian Git yang lebih lama dan lebih baru, default Ubuntu, dan
brew install git
pada MacOS. Dalam kasus selanjutnya, kompilasi yang sudah selesai dibuat tidak diproses oleh bash (sesuatu yang akan saya diagnosa nanti).sumber
Jika Anda menggunakan
alias g='git'
, saya menambahkan baris kode ini di.bash_aliases
sumber