Apakah ada cara menggunakan ctrl-r setelah mengetik bagian dari perintah di bash?

13

Dalam bash perintah Ctrl+ rsangat berguna, saya mengetik Ctrl+ r whateverdan mencari riwayat saya untuk perintah yang mengandung kata whatever. Tetapi jika saya mengetik whateverdan menyadari bahwa saya ingin mencari kata itu dan tekan Ctrl+ rtidak ada yang terjadi.

Apakah ada cara menekan kunci dan membuatnya berperilaku seolah-olah saya telah mengetik Ctrl+ r whateverbukan whatever Ctrl+ r?

Saya memiliki yang berikut ini di .inputrc:

"\C-p": history-search-backward

tetapi ini hanya berfungsi jika awal baris adalah sama.

Skeept
sumber

Jawaban:

12

Anda dapat mencari riwayat bash menggunakan apa yang sudah Anda ketikkan dengan mudah.

Misalkan Anda baru saja mengetik curl -I http://superuser.comdan Anda lupa mengetik Ctrl+r pertama:

$ curl -I http://superuser.com

Jika Anda ingin melakukan pencarian-i pada riwayat Anda, pergi ke awal baris terlebih dahulu ( Ctrl+ a), masukkan pencarian-i ( Ctrl+ r) dan ketik Ctrl+y . Ini harus mencari menggunakan isi dari seluruh teks yang sudah Anda ketik:

(reverse-i-search)`curl -I http://superuser.com': curl -I http://superuser.com/faq

Atau, Anda dapat menggunakan Ctrl+ walih-alih Ctrl+y untuk mencari menggunakan hanya kata pertama dari teks yang baru saja Anda ketik:

(reverse-i-search)`curl': curl -I http://superuser.com/faq

Mengikat semuanya menjadi satu tombol

Jika Anda ingin melakukan semua ini dalam satu penekanan tombol, Anda dapat mengikat satu tombol ke makro keyboard. Jika Anda ingin menggunakan, katakan, F12jalankan:

$ bind '"\e[24~":"\C-a\C-r\C-y"'

Itu akan berlangsung selama sesi.

Menjadikannya permanen

Cukup tentukan makro di Anda ~/.inputrc:

"\e[24~":"\C-a\C-r\C-y"

Perhatikan bahwa di sini kita menghilangkan tanda kutip tunggal.

Anda mungkin menemukan jawaban ini bermanfaat.

hso
sumber
1
Saya tidak yakin apakah ini merupakan masalah dengan konfigurasi saya, tetapi setelah saya c-rmengetik mengetik c-ytidak menempel apa pun di sana. Jika saya mengetik c-ysendiri hanya menempelkan teks, jadi saya tidak bisa menggabungkan dua perintah ...
skeept
Apakah Anda pergi ke awal baris terlebih dahulu? (Ca)
hso
1
Anda benar, saya tidak akan memulai garis. Sekarang saya miliki di .inputrc saya "\C-xr": "\C-a\C-r\C-y"dan berfungsi sangat bagus! Terima kasih atas jawaban ini.
skeept
Saya pikir ini adalah ketiga kalinya saya mencari informasi di Google control+a control+r control+y! Terima kasih, jawaban ini selalu ada di sini! :)
Dr Beco
2

Simpan empat teguran:

Hindari sedetik Ctrl-Rdengan menambahkan ke .bashrc(atau ke Anda .inputrcjika Anda mau):

bind '"\er":"\C-a\C-r\C-y\C-r"' # alt-r = ctr-a ctr-r ctr-y ctr-r

Ini akan memetakan ALT-R ke CTR-A CTR-R CTR-Y CTR-R

Deskripsi:

  • ALT-R : kunci yang mengikat. Pilihan bagus lainnya adalah \C-xr( CTR-X CTR-R )
  • CTR-A : Pergi ke awal baris (hafalkan apa yang tertulis)
  • CTR-R : Mulai pencarian terbalik
  • CTR-Y : Rekatkan apa yang diingat oleh CTR-A sebagai bagian dari pencarian
  • CTR-R : Memicu pencarian terbalik dengan karakter sejauh ini
Dr Beco
sumber
Masih belum jelas bagi saya mengapa Cy menempelkan perintah ke bidang pencarian (Ca tidak seharusnya menjadi perintah "copy", kan?) Dan mengapa Cw hanya menempelkan kata pertama.
marcus
ya, C-atidak hanya bergerak, tetapi menghafal (menyalin) konten yang dipindahkan.
Dr Beco
Saya tidak dapat mengkonfirmasi perilaku itu (coba saja Ca Cy), saya pikir itu lebih mungkin bahwa Cr yang memiliki beberapa kasus khusus dibangun, tetapi saya tidak tahu di mana mereka didokumentasikan.
marcus