Penyelesaian kata-kata di layar seperti pada VIM (Bash atau Tmux)

10

Bagaimana saya bisa mengkonfigurasi Bash, Zsh atau Tmux untuk menyelesaikan pengidentifikasi cocok terakhir di layar ? Pertimbangkan skenario umum ini:

$ git fetch
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 9 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
From /opt/git/thunder
 * [new branch]      issue540   -> origin/issue547314
   e9204cf..4d42c3f  v2.1       -> origin/v2.1

Bagaimana saya bisa mendapatkan Bash / Zsh / Tmux untuk menyelesaikan issue547CLI dengan mudah? Ketika saya menekan Tabsetelah $ git checkout isGit membantu menyelesaikan issue, tetapi saya harus menyelesaikan digit sendiri karena semua digit sebelumnya benar-benar cocok dengan cabang Git yang ada .

Di VIM, menekan Ctrl+ Puntuk omnicomplete akan selesai seperti pertandingan sebelumnya, jadi dalam hal ini issue547314sebenarnya akan selesai. Bagaimana saya bisa mendapatkan perilaku ini di Bash, di Zsh atau di Tmux ?

Saat ini saya menggunakan Bash 4.2 dan Tmux 1.10 pada Server Ubuntu (biasanya 12,04 LTS). Saya dapat memperbarui ke Ubuntu Server LTS terbaru (14,04) jika diperlukan.

EDIT : Saya tidak keberatan solusi yang menggunakan Bash, Zsh, atau Tmux selama tidak sulit untuk digunakan. Jadi Tabatau Ctrl+ Patau cara pintas lainnya akan baik-baik saja, tetapi tidak Alt+ Meta+ Super+ Shift+ א.

dotancohen
sumber
Cukup yakin ini akan membutuhkan revisi yang cukup besar dari sumber bash.
Kevin
@ Kevin: Saya pikir banyak, tapi semoga zsh yang luar biasa bisa menanganinya, atau mungkin tmux.
dotancohen

Jawaban:

4

Saya pikir fitur yang dicari OP disebut dabbrev-expand di dunia Emacs:

Perluas kata dalam buffer sebelum titik sebagai singkatan dinamis, dengan mencari dalam buffer untuk kata-kata yang dimulai dengan singkatan itu (v-expand).

xtermjuga memiliki dabbrev-expandfitur tetapi itu sedikit kurang pintar dari rekan Emacs tetapi sangat berguna bagi saya dan salah satu alasan mengapa saya beralih xterm. Di dalam xtermjendela seseorang dapat menggunakan penjilidan kunci khusus yang ditentukan ~/.Xresourcesuntuk memohon dabbrev-expandpada string yang diberikan. Sebagai contoh, saya memiliki entri berikut di ~/.Xresources(saya menggunakan uxterm, versi Unicode xterm):

UXTerm*VT100.Translations: #override \n\
     Meta <Key>/:dabbrev-expand() \n\

Di dalam xtermjendela saya dapat menggunakan M-/( ALT + /) untuk memanggil dabbrev-expand. xtermakan mencari semua string yang terlihat di layar yang dimulai dengan huruf yang saya ketikkan. Contoh:

$ echo a_very_long_string bye by
$ a_v

Jika saya menekan M-/sekarang xtermakan berkembang a_vmenjadi a_very_long_string. Sayangnya, seperti yang saya katakan xtermtidak begitu pintar dan dabbrev-expandfitur ini hanya akan bekerja pada string penuh. Jadi, dalam kasus Anda isakan diperluas ke issue540dan bukan issue547314karena issue547314merupakan bagian dari origin/issue547314(pikirkan tentang hal itu seperti \bdalam ekspresi reguler, itu agak mirip meskipun kebanyakan mesin ekspresi reguler akan menangkap kedua kemunculan issuestring \bissue.+\b). Tapi , Anda bisa mengetik ordan kemudian pres M-/. xtermpertama akan memperluas orke origin/v2.1, ini bukan apa yang kita inginkan jadi tekan M-/lagi dan xtermakan memperluas ke origin/issue547314. Sekarang, jika Anda menggunakan Bash yang dapat Anda lakukan M-b,C-wdan C-euntuk menghapus origin/bagian. Singkatnya, dabbrev-expanddi dalam xtermtidak sebagus di Emacs (dan Vim saya kira) tapi itu masih lebih cepat daripada menulis ulang string panjang dengan tangan dan kurang rawan ketik. Dan dalam kebanyakan kasus itu akan berkembang langsung ke string yang diinginkan tanpa perlu menghapus bagian yang berlebihan. Anda hanya perlu membiasakan diri - lihat string yang ingin Anda miliki di kursor dan lihat apakah itu tidak diawali oleh sesuatu yang lain, dan jika itu adalah mengetik bagian sebelumnya dan menghapusnya setelah ekspansi.

Catatan yang xtermtidak dikompilasi dengan dabbrev-expandfitur secara default dan Anda harus mengaktifkannya secara eksplisit. Namun, versi xtermdalam repositori Ubuntu dikompilasi dabbrev-expanddan Anda dapat menggunakannya segera.

Arkadiusz Drabczyk
sumber
Terima kasih Arkadiusz, ini sepertinya cukup dekat dengan yang saya butuhkan. Perhatikan bahwa saya tidak dapat membuatnya berfungsi! Mungkin saya xtermdan uxtermtidak dikompilasi untuk dabbrev-expand, saya tidak dapat menemukan fitur di -help. Bagaimana saya bisa melihat flag kompilasi (seperti dengan vim --version)? Perhatikan bahwa saya juga mencoba garis config di ~/.Xresourcessebagai Meta <KeyPress> /: dabbrev-expand() \n\ seperti yang ditemukan di sini tapi itu tidak membantu, baik.
dotancohen
Mungkin xterm Anda telah dikompilasi tanpa dabbrev-expand. Bagaimana Anda menginstal xterm? Setelah memodifikasi ~ / .Xumber daya lakukan xrdb -merge .Xresourcesdalam xterm.
Arkadiusz Drabczyk
Yang pasti melakukannya, Arkadiusz! Terima kasih!
dotancohen
Saya akan memberikan pertanyaan beberapa jam lagi sampai periode hadiah berakhir, tetapi saya cukup yakin bahwa Anda adalah penyuka. Satu-satunya masalah adalah persyaratan untuk xterm, yang mengerikan! Tapi sekarang saya tahu nama yang tepat untuk fitur saya bisa google untuk aplikasi lain . Terima kasih!
dotancohen
Arkadiusz terima kasih! Meskipun saya tidak akan menggunakan solusi xterm, Anda tentu telah mengarahkan saya ke arah yang benar. Rupanya zshmemang memiliki fasilitas ini.
dotancohen
1

Bash sebagai fasilitas serupa yang disebut bash completetion. Anda dapat memanfaatkannya dengan menekan Tabtombol saat memberikan argumen pada perintah saat Anda mengetiknya.

Contoh

Jika saya mulai dengan mengetik lsdan kemudian menekan Tabdua kali Anda akan mendapatkan Bash untuk memberikan daftar file yang cocok (dan saklar baris perintah) ke perintah apa pun yang Anda coba gunakan:

$ ls <---- hit Tab x 2
Display all 232 possibilities? (y or n)

Dan inilah contohnya dengan sakelar:

$ ls -- <---- hit Tab x 2
--all                 --format=                                  --quote-name
--almost-all          --group-directories-first
....
....

Mendirikan?

Instalasi saya sudah termasuk aturan untuk git:

/etc/bash_completion.d/git

Instalasi file ini dilakukan ketika saya menginstal gitpaket. Saya menggunakan Fedora 19, tetapi distro lain harus melakukan ini juga.

$ rpm -qf /etc/bash_completion.d/git
git-1.8.3.1-1.fc19.x86_64

Melihat file aturan itu menjelaskan bahwa itu akan memfasilitasi penyelesaian otomatis dalam situasi berikut:

# The contained completion routines provide support for completing:
#
#    *) local and remote branch names
#    *) local and remote tag names
#    *) .git/remotes file names
#    *) git 'subcommands'
#    *) tree paths within 'ref:path/to/file' expressions
#    *) file paths within current working directory and index
#    *) common --long-options
#

Jadi ini seharusnya "hanya bekerja" untuk Anda.

slm
sumber
2
Penyelesaian bash dan penyelesaian Git bekerja (seperti yang saya sebutkan dalam OP). Perubahan yang ingin saya lakukan adalah menyelesaikannya di Tab pertama, tekan nilai hukum terakhir yang ditampilkan di layar. Inilah cara kerja VIM Omnicompletion.
dotancohen
@dotancohen - Saya tidak melihat sekarang bahwa hal itu mungkin melampaui apa yang saya jelaskan.
slm
1

Anda dapat melakukan sesuatu seperti ini dengan extrakto :

  • tekan tmux prefix + tabuntuk memulai extrakto
  • fuzzy menemukan teks / jalur / url
  • tekan
    • tab untuk memasukkannya ke panel saat ini,
    • enter untuk menyalinnya ke clipboard,
    • ctrl-o untuk membuka jalur / url atau
    • ctrl-e untuk mengedit $EDITOR
laktak
sumber