ZSH: riwayat pencarian pada tombol naik dan turun?


22

Saat ini, saya memiliki yang berikut ini di .zshrc saya:

bindkey '^[[A' up-line-or-search
bindkey '^[[B' down-line-or-search

Namun, ini hanya cocok dengan konten input saya saat ini sebelum karakter spasi muncul. Misalnya, sudo ls /akan mencocokkan setiap baris dalam riwayat saya yang dimulai dengan sudo, sementara saya ingin hanya mencocokkan garis yang cocok dengan seluruh input saya. (Yaitu sudo ls /etcakan cocok, tetapi tidak sudo cat /var/log/messages)

Apa yang perlu saya ubah untuk mendapatkan perilaku yang diinginkan?

Ini seluruh .zshrc saya seandainya relevan: https://gist.github.com/919566

Jawaban:


9

Ini adalah perilaku yang didokumentasikan :

down-line-or-search
Turunkan baris di buffer, atau jika sudah di baris terbawah, cari maju dalam sejarah untuk baris yang dimulai dengan kata pertama di buffer.

Sepertinya tidak ada widget yang ada yang melakukan persis seperti yang Anda inginkan, jadi Anda harus membuatnya sendiri. Inilah cara mendefinisikan widget yang berperilaku seperti up-line-or-search, tetapi menggunakan awal baris (hingga kursor) daripada kata pertama sebagai string pencarian. Tidak benar-benar diuji, terutama pada input multi-line.

up-line-or-search-prefix () {
  local CURSOR_before_search=$CURSOR
  zle up-line-or-search "$LBUFFER"
  CURSOR=$CURSOR_before_search
}
zle -N up-line-or-search-prefix

Pendekatan alternatif adalah untuk digunakan history-beginning-search-backward, tetapi hanya menyebutnya jika kursor berada di baris pertama. Belum dicoba.

up-line-or-history-beginning-search () {
  if [[ -n $PREBUFFER ]]; then
    zle up-line-or-history
  else
    zle history-beginning-search-backward
  fi
}
zle -N up-line-or-history-beginning-search

Terima kasih, Gilles, solusi pertama Anda bekerja dengan sangat baik, tetapi ada satu masalah dan saya berharap Anda dapat membantu saya menyelesaikannya. Ketika saya memanggil awalan up-line-atau-cari pada input kosong, itu memberi saya perintah jalankan terakhir - perilaku yang diinginkan. Namun, ketika saya menjalankan kembali up-line-atau-pencarian-awalan, itu melakukan up-line-atau-pencarian pada karakter pertama dari input saya. Apakah mungkin untuk mengubah hal-hal tertentu sehingga menekan panah atas dengan input kosong akan menelusuri sejarah saya?
rps

@ rps Ah, mengerti, itu mengambil kata pertama karena argumennya hilang (bukannya kosong seperti seharusnya). Gunakan versi yang saya edit.
Gilles 'SO- berhenti bersikap jahat'

33

zsh menyediakan fungsionalitas ini dengan menggunakan

history-beginning-search-backward
history-beginning-search-forward

Ex.

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

Temukan kode kunci yang tepat dengan
ctrl+vKEY

Ex.
ctrl+ vUP
ctrl+ vDOWN
ctrl+ vPageUp
ctrl+ vPageDown
dll.


1
Alternatif untuk kode kunci yang dapat bekerja di terminal yang berbeda dapat ditemukan di zprezto [ 1 ]. <kbd> Naik </kbd> adalah $terminfo[kcuu1], <kbd> Turun </kbd> adalah $terminfo[kcud1].
Justin C

8

Posting blog ini dari tahun 2013 merekomendasikan beberapa keybinds yang cocok dengan semua kata sebelum kursor.

# Cycle through history based on characters already typed on the line
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "$key[Up]" up-line-or-beginning-search
bindkey "$key[Down]" down-line-or-beginning-search

(Dalam versi sebelumnya dari jawaban ini, saya telah menggunakan $terminfoseperti yang direkomendasikan dalam salah satu komentar di posting blog. Beberapa nilai terminfo tercantum di sini .)


1
zsh juga memberikan alias yang lebih ramah ini (setidaknya dalam paket ubuntu) di /etc/zsh/zshrc, seperti $key[Up].
zzxyz

Jika menggunakan $terminfoAnda harus mengubah mode terminal. Lihat di sini .
Tom Hale

Saya telah mengedit jawaban untuk digunakan $key[]alih-alih $terminfo[]. Saya harap ini bekerja dengan baik untuk pembaca!
joeytwiddle

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.