Bagaimana saya bisa mencari riwayat dengan teks yang sudah dimasukkan pada prompt di zsh?

59

Di zsh, saya tahu bahwa saya dapat mencari riwayat dengan Ctrl+ r. Namun, seringkali saya mulai mengetik perintah langsung pada prompt, tetapi kemudian menyadari bahwa saya harus mencari sejarah. Ketika saya menekan Ctrl+ r, akan muncul prompt pencarian riwayat kosong seperti ini:

permintaan pencarian riwayat tidak diisi sebelumnya

Perhatikan bagaimana ada teks pada prompt saya tetapi tidak pada prompt pencarian riwayat. Bagaimana cara memulai pencarian riwayat dengan teks yang sudah ada di prompt, sehingga terlihat seperti ini:

permintaan pencarian riwayat sudah diisi sebelumnya

Sean Mackesey
sumber

Jawaban:

44

Anda dapat menggunakan fungsionalitas zlehistory-search :

bindkey "^[[A" history-beginning-search-backward
bindkey "^[[B" history-beginning-search-forward

Ini mengikat Updan Down(menyesuaikan untuk urutan pelarian Anda sendiri) ke pencarian riwayat, mundur dan maju, berdasarkan apa yang telah dimasukkan pada prompt.

Jadi, jika Anda memasukkan "vim" dan menekan Up, zsh akan menelusuri mundur sejarah Anda untuk hanya perintah yang dimulai dengan "vim".

Anda juga dapat menempatkan kursor di akhir baris setelah Anda memilih perintah yang diinginkan dari sejarah zsh dengan menggunakan fungsi histori-pencarian-akhir (biasanya terletak di /usr/share/zsh/functions/Zle/) dan menambahkan -endke akhir setiap baris, seperti:

autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[[A" history-beginning-search-backward-end
bindkey "^[[B" history-beginning-search-forward-end
jasonwryan
sumber
Terima kasih banyak. Saya harus menghapus "-end" untuk kedua perintah bindkey untuk membuatnya bekerja. Saya belum mengedit jawaban Anda karena mungkin ada beberapa situasi di mana itu diperlukan?
Sean Mackesey
Tidak masalah: perbarui jawabannya dengan detail yang ingin Anda perjelas.
jasonwryan
Ini digunakan untuk saya sampai akhir November, Desember 2015 ketika saya memutakhirkan ke versi terbaru dari oh my zsh. Ada ide? saran? Adakah yang melihat ini? bagaimana cara debug?
hani elabed
2
@hanielabed Oh-my-Zsh adalah sebuah clusterfsck; Saya sama sekali tidak terkejut itu akan merusak sesuatu yang mendasar seperti pencarian sejarah ...
jasonwryan
1
Apakah ada cara bagi kursor untuk melompat ke akhir dari pencarian riwayat kosong, tetapi tetap pada posisi yang sama untuk pencarian parsial? Inilah yang terjadi di bash saat ini.
CMCDragonkai
19

Opsi lain yang bermanfaat adalah history | grep

Tetapkan alias, mis

alias hg='history | grep'

maka Anda dapat mengetik hg whateveruntuk mencari perintah yang telah Anda gunakan, misalnya

$ hg chmod                                                                                                       
 1309  chmod +x rotate_files.sh 
 1385  chmod +x rotate_files_270.sh 
 1512  chmod +x testy.sh 
 1528  chmod +x act_on_2_numbers.sh 
 2142  chmod +x ~/bin/display_tmux_pane_pwd.sh
 4532  chmod +x cat_files.rb 

Saya memasukkan alias ini ke file dot saya.

Michael Durrant
sumber
17
Apa yang hgmengingatkan saya pada ... Oh yeah, Mercurial!
12

Jika Anda menggunakan oh-my-zsh , tambahkan history-substring-searchke plugins=(...)baris.

Lalu tambahkan

bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

suatu tempat di bawah garis yang bertuliskan source $ZSH/oh-my-zsh.sh. Simpan dan jalankan terminal baru atau jalankan source ~/.zshrcdi terminal saat ini.

Catatan: ^[[A adalah urutan keluar untuk panah atas di terminal yang saya gunakan (kitty) dan banyak lainnya. Untuk memeriksa terminal pilihan Anda, ketik showkey -adan kemudian tekan tombol yang Anda ingin temukan urutan pelariannya.

joelostblom
sumber
Tidak jelas apa yang dilakukan penekanan tombol ini, jawaban di atas menjelaskan "Ini mengikat Atas dan Bawah (sesuaikan dengan urutan pelarian Anda sendiri) ke pencarian riwayat, mundur dan maju, berdasarkan pada apa yang telah dimasukkan pada prompt."
Colin D
@ColinD Menambahkan catatan untuk menjelaskan
joelostblom
1
pencarian substring adalah yang terbaik, itu superset dari perintah dimulai dengan. untuk mengimplementasikan tanpa menjadi pengguna oh-my-zsh yang saya lakukan brew install zsh-history-substring-search, memeriksa repo readme untuk instruksi, saya hanya akan melanjutkan dan membuat jawaban saya sangat senang dengan hasilnya.
Merlin
7

Anda mungkin ingin menggunakan skrip di https://github.com/zsh-users/zsh-history-substring-search

Di mana Anda dapat mengetik di bagian mana pun dari perintah yang dimasukkan sebelumnya dan tekan tombol Updan Downuntuk menelusuri perintah yang cocok.

nomor 5
sumber
4

Saya sangat merekomendasikan menggunakan "$terminfo[kcuu1]"atau "$key[Up]"daripada hal-hal yang dikode keras seperti "^[[A"yang mungkin atau mungkin tidak bekerja pada sistem tertentu.

Lihat /etc/zsh/zshrclebih banyak kunci. Begini tampilannya di sistem saya. Saya pikir terminfokuncinya lebih cenderung didefinisikan.

key=(
    BackSpace  "${terminfo[kbs]}"
    Home       "${terminfo[khome]}"
    End        "${terminfo[kend]}"
    Insert     "${terminfo[kich1]}"
    Delete     "${terminfo[kdch1]}"
    Up         "${terminfo[kcuu1]}"
    Down       "${terminfo[kcud1]}"
    Left       "${terminfo[kcub1]}"
    Right      "${terminfo[kcuf1]}"
    PageUp     "${terminfo[kpp]}"
    PageDown   "${terminfo[knp]}"
)
zzxyz
sumber
4

Bagaimana dengan menggunakan zsh-autosuggestions?

Masalahnya, untuk setiap perintah yang Anda ketik, plugin ini akan menunjukkan kepada Anda beberapa saran yang bisa diterima atau tidak. Cobalah dan beri kami umpan balik.

Tanpa plugin, kami dapat menekan Ctrlruntuk melakukan pencarian terbalik pada histori, segera setelah Anda mulai mengetik perintah yang cocok akan muncul sebagai saran.

SergioAraujo
sumber
2

Saya menggunakan plugin mode-vi . Dan kemudian di ~ / .zshrc saya memiliki binding berikut:

bindkey "^P" history-beginning-search-backward
bindkey "^N" history-beginning-search-forward

Yang memungkinkan saya untuk menggunakan ^Pdan ^Nsebagai mundur normal dan maju pencarian jika saya tidak memasukkan teks apapun, dan disaring pencarian jika saya lakukan.

Slobodan Ilic
sumber
1

Saya setuju dengan cheflo bahwa pencarian "substring" lebih bermanfaat. Saya tidak dapat berkomentar di sana, jadi saya memulai jawaban baru. Saya menggunakan oh-my-zsh, dan menambahkan "search-history-substring" ke plugins = (...) dari ~ / .zshrc. Kemudian sumber ~ / .zshrc. Tidak perlu menambahkan apa-apa lagi. Gunakan "bindkey" untuk memverifikasi:

"^ [OA" pencarian riwayat substring
"^ [OB" riwayat-pencarian-pencarian-bawah

Kemudian, Anda mengetik "ke" dan panah ke atas, "histori" akan muncul dan "ke" disorot (jika Anda menggunakan perintah "histori" sebelumnya).

James
sumber
1

Sebagai gantinya, Anda dapat menggunakan zaw , yang sepenuhnya menggantikan pencarian Anda dengan pencarian super multi kata kunci yang jauh lebih baik, dan memperbaiki masalah Anda juga - riwayat pencarian hanya salah satu hal yang dapat dicari zaw.

Intro kecil / diskusi di sini

Taman Brad
sumber
0

Karena saya menggunakan oh-my-zsh, dan saya menggunakan solusi substring dari joelostblom, James, saya memodifikasi .zshrc seperti ini: (yang pada baris 13, temukan baris "source $ ZSH / oh-my-zsh.sh" , lalu modifikasi kode di sekitarnya.)

plugins=(
  git
  history-substring-search
)

source $ZSH/oh-my-zsh.sh

bindkey -v
bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down
pengguna3633852
sumber
bindkey -vakan merusak ctrl-a, ctrl-e. Kemungkinan besar semua perintah ctrl.
Michael Ozeryansky
0

Non-Oh-My-Zsh menjawab

Ini berhasil bagi saya (pada macOS) untuk mendapatkan riwayat substring yang mudah diakses melalui panah atas / bawah. Ikatan kunci terserah Anda.

Substring histori pencarian lebih baik daripada hanya mengakses perintah yang dimulai dengan string. Ini lebih seperti ctrl-r dalam banyak kasus, yang tanpa glob atau pencocokan regex.

Mulai dari instruksi di zsh-users / zsh-history-substring-search

brew install zsh-history-substring-search

# add the following to .zshrc
source /usr/local/share/zsh-history-substring-search/zsh-history-substring-search.zsh
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down

Sekarang nikmati ini sepenuhnya.

Merlin
sumber