Bagaimana cara melakukan pencarian riwayat terbalik dalam mode-ZSH?

47

Saya menggunakan vimdasarnya semua kebutuhan editing saya, jadi saya memutuskan untuk sekali lagi mencoba mode-vi untuk shell saya (saat ini ZSH w / oh-my-zsh di OS X), tetapi saya menemukan diri saya mencoba (dan gagal) untuk menggunakan Ctrl-Rterus-menerus. Apa yang mengikat kunci setara? Dan untuk referensi di masa mendatang, bagaimana saya mencari tahu sendiri? Saya cukup yakin saya bisa menggunakannya bind -Pdi bash.

Hank Gay
sumber
2
Menurut 'man zshzle', history-incremental-search-backward tidak terikat dalam mode Vi (vicmd, viins) secara default.
paul

Jawaban:

56

Anda dapat menjalankan bindkeytanpa argumen untuk mendapatkan daftar binding yang ada, misalnya:

# Enter vi mode
chopper:~> bindkey -v

# Search for history key bindings
chopper:~> bindkey | fgrep history
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[[A" up-line-or-history
"^[[B" down-line-or-history

Dalam mode emacs, pengikatan yang Anda inginkan adalah history-incremental-search-backward, tetapi itu tidak terikat secara default dalam mode vi. Untuk mengikat Ctrl-R sendiri, Anda dapat menjalankan perintah ini, atau menambahkannya ke ~/.zshrc:

bindkey "^R" history-incremental-search-backward

The zshzlemanualnya ( man zshzle) memiliki informasi lebih lanjut tentang zsh line Editor, bindkey, dan emacs / vi mode.

mrb
sumber
3
Terima kasih, terutama untuk zshzle. Itu cukup informatif dan bermanfaat.
Hank Gay
Aku cinta kamu. Serius. Setelah memutakhirkan ke OSX El Capitan pencarian terbalik hilang dan saya melewatkan lebih dari segalanya dalam alur kerja harian saya.
Christian
24

Ini adalah pertanyaan kuno, tetapi satu-satunya jawaban (dan yang diterima) pada dasarnya memberi tahu seseorang cara mentransplantasikan "mirip emacs" history-incremental-search-backwardke mode vi. Meskipun ini sangat bisa dilakukan dan mungkin solusi yang tepat untuk Anda, agak aneh bahwa tidak ada yang menyebutkan "vi cara" dalam mencari sejarah.

Mode vi di zsh mendukung riwayat pencarian menggunakan tombol vi / vim standar: /dan ?, keduanya tersedia dalam mode perintah. (Tekan <Esc>untuk beralih dari mode insert ke command, seperti di vi atau vim.)

Namun, indra mereka terbalik: Karena Anda biasanya ingin mencari riwayat shell Anda secara terbalik, /lakukan pencarian terbalik sedangkan ?pencarian maju.

Setelah klik pertama ditampilkan, Anda dapat (seperti di vi / vim) gunakan nuntuk terus menemukan lebih banyak klik di arah yang sama, atau Nuntuk membalikkan arah pencarian.

Ikatan kunci default yang relevan dalam vicmdkeymap adalah:

"/" vi-history-search-backward
"?" vi-history-search-forward
"n" vi-repeat-search
"N" vi-rev-repeat-search
wjv
sumber
2
Ini juga baik untuk digunakan "^P" history-beginning-search-backwarddan "^N" history-beginning-search-forwarduntuk pelengkapan otomatis seperti vim (Anda mulai mengetik, lalu tekan ctrl+patau ctrl+n).
cprn
Bagi saya, ?membuka bck-i-search, itulah yang saya cari. Terima kasih.
geowa4
@wjv keuntungan dari history-incremental-search-backward adalah mendukung pola glob. Default /atau `? ' tidak: coderwall.com/p/-jvcag/zsh-reverse-history-search-with-regex
alpha_989
@ alpha_989 Posting blog yang Anda rujuk salah. Mungkin saja penulis memiliki beberapa "kerangka" zsh yang diinstal yang membebani ^Rkeybinding. Satu-satunya "regex-like" karakter yang didukung oleh keduanya history-search-backwarddan history-incremental-search-backwardadalah ^, untuk menjangkar string pencarian ke awal baris. Kekuatan sebenarnya history-incremental-search-backwardadalah bahwa ia melakukan pencarian tambahan, seperti namanya. Saya dapat membayangkan bahwa seseorang mungkin ingin mengikatnya di papan vicmdtombol karena alasan itu.
wjv
@ wjv, Anda benar .. Saya seharusnya menulis history-incremental-pattern-search-backward, bukan history-incremental-search-backward. history-incremental-pattern-search-backwardsmungkin widget .. tapi saya pikir itu diinstal secara default di zsh. Ini mendukung globpola tidak regexseperti yang Anda tunjukkan dengan benar: zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Operators . Memang ada kesalahan dalam posting ..
alpha_989