Pencarian riwayat pesta, sebagian + panah atas


146

Saya telah mencari, tetapi tidak menemukan apa pun di sini. Saya mencari fungsi dalam bash, menggunakan terminal.

Jauh ketika, saya memiliki pengguna di sistem debian, dan seorang teman mengatur saya dengan fitur pencarian riwayat yang nyaman (saya percaya saya menggunakan tcsh saat itu), di mana saya akan mengetikkan awal dari perintah sebelumnya, tekan panah atas, dan itu akan melakukan pencarian, berdasarkan string parsial.

Misal jika sejarah saya adalah:

./script.pl
./script.pl arg1
cat output
cat output | grep yada

Dan saya ketik ., dan tekan panah-, itu akan menunjukkan: ./script.pl arg1. Tekan lagi dan itu akan ditampilkan ./script.pl, dll.

Sangat mirip itu akan tampil grepdi .bash_history. Apakah ada cara untuk mendapatkan fungsi ini?



1
@ Marccel Sepertinya itu jawaban yang sama, saya melihat itu dalam pencarian, tetapi tidak menghubungkannya dengan pertanyaan saya, dengan kata kunci iPython dan Shell.
TLP

Kedengarannya seperti ini - github.com/zsh-users/zsh-autosuggestions .
slm

Jawaban:


197

Masukkan baris berikut di ~/.inputrc:

## arrow up
"\e[A":history-search-backward
## arrow down
"\e[B":history-search-forward

Baris yang dimulai dengan #adalah komentar. Saya tidak ingat apa yang terbelakang dan apa yang maju. Percobaan dengan itu. Mungkin Anda harus beralih mundur dan maju.


Informasi latar belakang sedikit:

Bash menggunakan readline untuk menangani prompt. ~/.inputrcadalah file konfigurasi untuk readline. Perhatikan bahwa ini juga akan berlaku di perangkat lunak lain menggunakan pustaka readline, misalnya IPython .

Baca manual bash untuk informasi lebih lanjut tentang readline. Di sana Anda juga dapat menemukan lebih banyak perintah readline terkait riwayat .

Untuk mendapatkan kode pelarian untuk tombol panah, Anda dapat melakukan hal berikut:

  1. Mulai catdi terminal (hanya cat, tidak ada argumen lebih lanjut).
  2. Ketik tombol pada keyboard, Anda akan mendapatkan hal-hal seperti ^[[Apanah atas dan ^[[Bpanah bawah.
  3. Ganti ^[dengan \e.

1
Hebat, tetapi solusi ini menonaktifkan pintasan ctrl-left / ctrl-right.
Eyal

Adakah yang bisa memberi tahu saya bagaimana saya dapat mencapai hal yang sama untuk make
Hitesh Kumar

@lesmana, saya akan memberikan poin ekstra untuk bagian kucing saja
Mike D

Menekan @Eyal, ada yang punya saran tentang bagaimana saya bisa memiliki ini tetapi mempertahankan pintasan ctrl-left / ctrl-right?
kbrose

6
Untuk mempertahankan semua default tambahkan $include /etc/inputrc, sebaiknya di baris pertama.
Tulio Casagrande

31

Buat file bernama setup_readline.sh dengan mode 644 di /etc/profile.d/ dengan konten berikut, masuk dan periksa kunci pilihan Anda:

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

Saya pikir adalah cara terbaik untuk melakukan ini. Terutama jika Anda menggunakan sistem manajemen konfigurasi seperti koki, boneka, dll

Dan konfigurasi sistem masih belum tersentuh!


4
Anehnya ~ / inputrc tidak bekerja untuk saya - tetapi menempatkan perintah-perintah ini ke .bash_profile berhasil.
Joe

1
.inputrc tidak ada di folder rumah saya dan saya lebih suka memiliki pengaturan seperti ini di .bashrc tetap jadi saya hanya bisa membawa sekitar satu file untuk pengaturan saya. Jadi ini mungkin jawaban yang lebih baik daripada jawaban yang diterima.
Shital Shah

.inputrc bekerja sangat baik untuk saya, tetapi tidak setelah saya memuat screen. Anehnya, cara pintas .inputrc lainnya berfungsi, tetapi tidak. Jadi saya menggunakan kedua solusi sekarang.
Orwellophile

Ini sangat membantu ketika, misalnya, Anda masuk ke server untuk melakukan hal-hal dan tidak melakukan ini dan tidak ingin mengedit dan memuat ulang ~ / .inputrc di server.
danmactough

13

Ctrl + R akan memberi Anda fungsionalitas semacam ini. Mulailah mengetik perintah parsial dan akan muncul dengan yang lama yang dapat Anda navigasikan dengan panah atas dan bawah. Info lebih lanjut: http://www.nuxified.org/blog/ctrl_r_in_the_bash_shell


2
Terima kasih untuk balasan Anda. Ya, saya sudah mencobanya, tapi saya merasa sedikit ... rewel. Itu tidak akan memungkinkan saya untuk menelusuri perintah yang dimulai dengan parsial, itu hanya menunjukkan yang pertama. Itu juga mencari seluruh perintah untuk karakter, yang semacam tidak berguna.
TLP

5
@TLP, ulangi memukulCtrl+r
akostadinov

4

Untuk melengkapi jawaban lesmana tentang "~ / .inputrc" yang harus saya buat di bawah Trusty 14.04 saya, verifikasi / tambahkan "~ / .bashrc" (baris pertama sudah ada di "~ / .bashrc") saya:

shopt -s histappend  
PROMPT_COMMAND='history -a'  

Ini sudah dijelaskan dalam bahasa Perancis di https://doc.ubuntu-fr.org/terminal?&#pour_completer_les_commandes_a_partir_de_l_historique .


2
Perintah ini pada dasarnya menginstruksikan bash untuk segera menambahkan perintah ke file histori alih-alih menunggu sesi berakhir. Ini berguna jika Anda memiliki banyak terminal terbuka dan tidak ingin kehilangan riwayat di satu terminal tetapi sebaliknya tidak perlu. digitalocean.com/community/tutorials/…
Shital Shah

3

Mungkin Anda mungkin ingin mencoba https://github.com/dvorka/hstr yang menyediakan penyaringan sederhana dan multi-baris dari riwayat Bash yang didasarkan pada metrik (kapan, seberapa sering dan berapa lama perintah penting) - Anda dapat menggunakan tombol panah untuk dengan mudah menavigasi riwayat:

masukkan deskripsi gambar di sini

Itu dapat dengan mudah terikat pada Ctrl-rdan / atauCtrl-s


0

Solusi berikut menggabungkan & memperluas beberapa pendekatan yang disebutkan di atas: tambahkan baris berikut ke ~/.bash_aliasesfile Anda (tidak perlu ~/.inputrc) untuk mencapai perilaku berikut:

  1. bergerak naik / turun dalam riwayat (hanya entri dengan awalan yang sama) dengan menekan CTRL + ATAS dan CTRL + BAWAH. Ini dapat hidup berdampingan dengan fungsionalitas standar untuk bergerak naik / turun dalam riwayat lengkap melalui ATAS dan BAWAH saja
  2. lompat ke kata berikutnya / sebelumnya dalam commandline dengan menekan CTRL + RIGHT dan CTRL + LEFT
bind '"\e[1;5A":history-search-backward'
bind '"\e[1;5B":history-search-forward'
bind '"\e[1;5C":forward-word'
bind '"\e[1;5D":backward-word'

Login ulang ke shell (atau jalankan source ./bash_aliases) untuk menerapkan perubahan.

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.