İstekte zsh'de önceden girilmiş metinlerle geçmişi nasıl arayabilirim?


58

Zsh'de Ctrl+ ile tarih arayabileceğimi biliyorum r. Ancak, çoğu zaman doğrudan komut istemine bir komut yazmaya başladım, ancak daha sonra tarih araştırmam gerektiğinin farkındayım. Ctrl+ ' Ya bastığımda r, şöyle bir boş geçmiş arama istemini getiriyor:

geçmiş arama istemi önceden doldurulmamış

İstediğimde metin olduğunu ancak geçmiş arama isteminde nasıl bulunmadığına dikkat edin. Geçmiş aramasını, istekte bulunan metinle nasıl başlatırım, şöyle görünür:

önceden doldurulmuş geçmiş arama istemi

Yanıtlar:


44

Zle'ninhistory-search işlevselliğini kullanabilirsiniz :

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

Bu , istemde daha önce girilmiş olana bağlı olarak geriye ve ileriye doğru bir geçmiş aramasına bağlanır Upve Down(kendi kaçış dizilerinizi ayarlar).

Eğer "vim" e girip vurursanız Up, zsh, sadece "vim" ile başlayan komutlar için geçmişinizde geriye doğru hareket eder.

Ayrıca, tarihçe arama-son işlevini (tipik olarak bulunur /usr/share/zsh/functions/Zle/) kullanarak ve -endher satırın sonuna ekleyerek zsh'nin geçmişinden istediğiniz komutu seçtikten sonra imlecin satırın sonuna yerleştirilmesini sağlayabilirsiniz :

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

Harika teşekkür ederim. Her iki bindkey komutunun çalışmasını sağlamak için "-end" komutunu kaldırmak zorunda kaldım. Cevabınızı düzenlemedim, çünkü gerekli olan bazı durumlar olabilir?
Sean Mackesey,

Hiç sorun değil: cevabını açıklığa kavuşturmak istediğiniz ayrıntılarla güncelledi.
jasonwryan

Bu benim için çalışıyordu. Kasım ayının sonlarına kadar, Aralık 2015’e kadar, benim zsh’imin son sürümüne geçtim. Herhangi bir fikir? öneri? bunu gören başka biri var mı? nasıl hata ayıklanır?
hani,

2
@hanielabed Oh-my-Zsh bir clusterfsck; Tarih araştırması kadar temel bir şeyi bozacağına hiç şaşırmadım ...
jasonwryan

1
İmlecin boş geçmiş aramasından sonuna kadar atlaması, ancak kısmi bir arama için aynı konumda kalması için bir yol var mı? Şu anda bash olur budur.
CMCDragonkai

19

Başka bir yararlı seçenek history | grep

Bir takma ad atama, örneğin

alias hg='history | grep'

daha sonra hg whateverkullandığınız komutları aramak için yazabilirsiniz , örneğin

$ 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 

Bu takma adı nokta dosyalarımın içine koydum.


17
hgBana neyi hatırlatıyor ... Ah evet, Mercurial!

12

Oh-my-zsh kullanıyorsanız history-substring-search, plugins=(...)satıra ekleyin .

Sonra Ekle

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

okuyan çizginin altında bir yerde source $ZSH/oh-my-zsh.sh. Yeni bir terminali kaydedin ve ateşleyin veya source ~/.zshrcmevcut terminalde çalıştırın .

Not: ^[[A kullandığım terminaldeki (kitty) yukarı ok için kaçış dizisi ve diğerleri. Tercih ettiğiniz terminali kontrol etmek için yazın showkey -ave kaçış sırasını bulmak istediğiniz tuşa basın.


Bu anahtar eşlemenin ne yaptığı açık değildir, yukarıdaki cevap "Bu, Yukarı ve Aşağı (kendi kaçış dizilerinizi ayarlayın) istemde girilmiş olana bağlı olarak geriye ve ileriye doğru bir geçmiş araştırmasına bağlanır."
Colin D

@ColinD Netleştirmek için bir not eklendi
joelostblom

1
substring search en iyisidir, komutun bir süpersetiyle başlar. Yaptığım bir oh-my-zsh kullanıcısı olmadan uygulamak brew install zsh-history-substring-search, talimatlar için repo benioku kontrol ettim, sadece devam edeceğim ve bir cevap oluşturacağım. Sonuçtan gerçekten memnunum.
Merlin


4

Belirli bir sistemde çalışabilecek ya da çalışmayacak şekilde kodlanmış şeylerin kullanılmasını "$terminfo[kcuu1]"ya da "$key[Up]"yerine kullanılmasını şiddetle tavsiye ederim "^[[A".

/etc/zsh/zshrcDaha fazla anahtar için göz atın . İşte sistemimde göründüğü gibi. Bence terminfotuşları tanımlanabilir olasılığı daha yüksektir.

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]}"
)

4

Peki ya kullanmak zsh-autosuggestions?

İşin aslı, bu eklentiyi yazdığınız her komut için size kabul edip etmeyeceğiniz bazı öneriler gösterecek. Deneyin ve bize biraz geri bildirimde bulunun.

Eklenti yokken Ctrlr, tarihe ters bir tarama yapmak için basabiliriz , eşleştirilen komutları yazmaya başladığınız anda öneriler olarak görünecektir.


2

Kullandığım vi mod eklentisi. Ve sonra benim ~ / .zshrc içinde aşağıdaki bağları var:

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

Yani kullanmak için bana sağlayan ^Pve ^Nben herhangi bir metin girmezseniz, normal geriye ve ileriye arama gibi ve aramayı süzülür gibi yaparsan.


1

"Substring" aramasının daha faydalı olduğu için cheflo ile aynı fikirdeyim. Orada yorum yapamam, bu yüzden yeni bir cevap başlattım. Oh-my-zsh kullanıyorum ve ~ / .zshrc eklentilerine = (...) "history-substring-search" ekliyorum. Sonra kaynak ~ / .zshrc. Daha fazla bir şey eklemenize gerek yok. Doğrulamak için "bindkey" kullanın:

"^ [OA" geçmişi-alt-arama-arama
"^ [OB" tarih-alt-arama-aşağı

Daha sonra, "to" ve yukarı okunu yazarsınız, "history" belirir ve "to" vurgulanır (eğer daha önce "history" komutunu kullandıysanız).


1

Bunun yerine kullanabilirsiniz zaw geçmişini arıyor sadece zaw arama yapabilirsiniz şeylerden biri - tamamen çok daha iyi bir çoklu kelime süper arama ile aramanızı değiştirir ve aynı zamanda sorununuzun çözülüp.

Küçük giriş / tartışma burada


0

Oh-my-zsh kullandığım ve joelostblom, substring çözümünü kullandığım için, James, .zshrc'yi şu şekilde değiştiriyorum: , daha sonra etrafındaki kodu değiştirin.)

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

bindkey -vctrl-a'yı kıracak, ctrl-e. Büyük olasılıkla tüm ctrl komutları.
Michael Ozeryansky

0

Oh-My-Zsh olmayan cevap

Bu benim için (macOS'ta) alt-tabaka geçmişinin yukarı / aşağı oklar yoluyla kolayca erişilebilir olmasını sağladı. Anahtar bağlama size kalmış.

Arama geçmişini alt dizinlere eklemek, yalnızca bir dize ile başlayan komutlara erişmekten daha iyidir. Bu daha çok ctrl-r'ye, küre veya regex eşleşmesine sahip olmayanlara benzer.

Zsh-users / zsh-history-substring-search'deki talimatlardan başlayarak

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

Şimdi bunun iyice tadını çıkarın.

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.