ZSH: yukarı ve aşağı tuşlarında arama geçmişi?


22

Şu anda benim .zshrc dosyasında aşağıdakiler var:

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

Ancak, bu yalnızca boşluk karakteri oluşmadan önce mevcut girişimin içeriğiyle eşleşiyor gibi görünüyor. Örneğin, sudo ls /geçmişimdeki her çizgiyle eşleşecek sudo, yalnızca girdilerimle eşleşen çizgileri eşleştirmek istiyorum. (yani sudo ls /etceşleşir, eşleşmez sudo cat /var/log/messages)

İstenilen davranışı kazanmak için neye ihtiyacım var?

İlgili olması durumunda tüm .zshrc İşte: https://gist.github.com/919566

Yanıtlar:


9

Bu belgelenmiş davranış :

down-line-or-search
Tampondaki bir çizgiyi aşağı kaydırın ya da en alt satırdaysa, arabellekte ilk kelimeyle başlayan bir satır için geçmişe doğru arama yapın.

İstediğinizi tam olarak yapan bir widget görünmüyor, bu yüzden kendiniz yapmak zorunda kalacaksınız. İşte, nasıl davranan bir widget tanımlayacağınız up-line-or-search, ancak satırın başlangıcını (imlecin üstüne) arama dizesi olarak değil, satırın başlangıcını kullanarak. Gerçekten test edilmemiş, özellikle çok hatlı girişlerde.

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

Alternatif bir yaklaşım kullanmaktır history-beginning-search-backward, ancak yalnızca imleç ilk satırdaysa onu arayın. Test edilmemiş.

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

Sağol Gilles, ilk çözümün gayet iyi çalışıyor, ama bir sorun var ve çözmeme yardım edebileceğini umuyorum. Boş bir girişte up-line-veya-search-prefix çağırdığımda, bana son çalıştırma komutunu veriyor - istenen davranış. Ancak, bir satır veya arama önekini yeniden çalıştırdığımda, girişimin ilk karakteri üzerinde bir satır veya arama yapılıyor. Bir şeyleri değiştirmek mümkün mü, böylece boş bir girişle yukarı oka basmak geçmişimde ilerler mi?
rps

@rps Ah, gotcha, argümanı eksik olduğu için ilk kelimeyi alıyordu (olması gerektiği gibi boş olmak yerine). Düzenlenmiş sürümümü kullan.
Gilles 'SO- kötü olmayı bırak'

33

zsh, bu işlevi kullanarak

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

Ör.

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

Tam Anahtar kodunu
ctrl+ ile bulunvKEY

Ör.
ctrl+ vUP
ctrl+ vDOWN
ctrl+ vPageUp
ctrl+ vPageDown
vb.


1
Farklı terminallerde çalışabilecek anahtar kodlara alternatif zprezto'da bulunabilir [ 1 ]. <kbd> Yukarı </kbd> $terminfo[kcuu1], <kbd> Aşağı </kbd> $terminfo[kcud1].
Justin C,

8

2013'teki bu blog yazısı , imleçten önceki tüm kelimelerle eşleşen birkaç anahtar kelime önerir.

# 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

(Bu yanıt önceki bir sürümünde, ben kullanmıştı $terminfoblog yazıya yorum birinde önerildiği gibi. Bazı terminfo'ya değerleri vardır burada listelenen .)


1
zsh aynı zamanda (ubuntu pakette en azından) bu dostça takma verir /etc/zsh/zshrcgibi $key[Up].
zzxyz

Eğer kullanıyorsanız $terminfo, terminal modlarını değiştirmeniz gerekecektir. Buraya bakınız .
Tom Hale,

Kullanmak $key[]yerine cevabı değiştirdim $terminfo[]. Umarım bu okuyucular için iyi çalışır!
joeytwiddle

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.