Come posso cercare la cronologia con il testo già inserito al prompt in zsh?


59

In zsh, so che posso cercare la cronologia con Ctrl+ r. Tuttavia, spesso inizio a digitare un comando direttamente al prompt, ma poi mi rendo conto che dovrei cercare la cronologia. Quando premo Ctrl+ r, viene visualizzato un prompt di ricerca della cronologia vuoto come questo:

prompt di ricerca della cronologia non precompilato

Notare come è presente il messaggio al mio prompt ma non al prompt di ricerca della cronologia. Come faccio ad avviare la ricerca della cronologia con il testo già nel prompt, quindi è simile al seguente:

prompt di ricerca della cronologia precompilato

Risposte:


44

Puoi usare lahistory-search funzionalità di zle :

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

Questo si lega Upe Down(si adatta alle proprie sequenze di escape) a una ricerca della cronologia, avanti e indietro, in base a ciò che è già stato inserito nel prompt.

Quindi, se dovessi inserire "vim" e colpire Up, zsh attraverserà all'indietro la tua storia solo per quei comandi che iniziano con "vim".

È inoltre possibile posizionare il cursore alla fine della riga dopo aver selezionato il comando desiderato dalla cronologia di zsh utilizzando la funzione di cronologia-ricerca-fine (in genere situata in /usr/share/zsh/functions/Zle/) e aggiungendo -endalla fine di ogni riga, in questo modo:

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

Ottimo grazie. Ho dovuto rimuovere "-end" per entrambi i comandi bindkey per farli funzionare comunque. Non ho modificato la tua risposta perché forse c'è qualche situazione in cui sono necessari?
Sean Mackesey,

Nessun problema: aggiornata la risposta con i dettagli che si desidera chiarire.
Jasonwryan,

Funzionava per me fino alla fine di novembre, dicembre 2015, quando ho eseguito l'aggiornamento all'ultima versione di oh my zsh. Qualche idea? suggerimento? qualcun altro sta vedendo questo? come eseguire il debug?
hani elabed il

2
@hanielabed Oh-my-Zsh è un clusterfsck; Non mi sorprende affatto che ciò rompa qualcosa di così fondamentale come la ricerca della storia ...
jasonwryan,

1
C'è un modo per il cursore di saltare alla fine da una ricerca della cronologia vuota, ma rimanere nella stessa posizione per una ricerca parziale? Questo è ciò che accade attualmente in bash.
CMCDragonkai,

19

Un'altra opzione utile è history | grep

Assegna un alias, ad es

alias hg='history | grep'

quindi puoi digitare hg whateverper cercare i comandi che hai usato, ad es

$ 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 

Ho inserito questo alias nei miei file dot.


17
Cosa hgmi ricorda ... Oh sì, Mercurial!

12

Se stai usando oh-my-zsh , aggiungi history-substring-searchalla plugins=(...)riga.

Quindi aggiungere

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

da qualche parte sotto la riga che legge source $ZSH/oh-my-zsh.sh. Salvare e accendere un nuovo terminale o eseguirlo source ~/.zshrcnel terminale corrente.

Nota: ^[[A è la sequenza di escape per la freccia su nel terminale che uso (gattino) e molti altri. Per effettuare il check-in nel terminale prescelto, digitare showkey -ae quindi premere il tasto per il quale si desidera trovare la sequenza di escape.


Non è chiaro cosa faccia questo keymapping, la risposta sopra spiega "Questo vincola Su e Giù (adeguati alle tue sequenze di escape) a una ricerca della cronologia, avanti e indietro, in base a ciò che è già stato inserito al prompt."
Colin D,

@ColinD Aggiunta di una nota per chiarire
joelostblom il

1
la ricerca per sottostringa è la migliore, è un superset di comando che inizia con. per implementare senza essere un utente oh-my-zsh che ho fatto brew install zsh-history-substring-search, ho controllato il readme del repository per istruzioni, andrò avanti e creerò una risposta Sono davvero contento del risultato.
Merlin,


4

Consiglio vivamente di usare "$terminfo[kcuu1]"o "$key[Up]"piuttosto di cose hardcoded come quelle "^[[A"che potrebbero o meno funzionare su un particolare sistema.

Scopri /etc/zsh/zshrcaltre chiavi. Ecco come appare sul mio sistema. Penso che le terminfochiavi abbiano maggiori probabilità di essere definite.

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

Che ne dici di usare zsh-autosuggestions?

Il fatto è che per ogni comando che digiti questo plugin ti mostrerà alcuni suggerimenti che potrebbero essere accettati o meno. Provalo e dacci un feedback.

Senza plug-in possiamo premere Ctrlrper eseguire una ricerca inversa sulla cronologia, non appena inizierai a digitare i comandi corrispondenti appariranno come suggerimenti.


2

Uso il plug -in vi-mode . E poi nel mio ~ / .zshrc ho i seguenti collegamenti:

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

Questo mi permette di utilizzare l' ^Pe ^Ncome normale avanti e indietro la ricerca se non entro qualsiasi testo, e come filtrato di ricerca se lo faccio.


1

Concordo con cheflo sul fatto che la ricerca "sottostringa" sia più utile. Non posso commentare lì, quindi ho iniziato una nuova risposta. Uso oh-my-zsh e aggiungo "history-substring-search" ai plugin = (...) di ~ / .zshrc. Quindi fonte ~ / .zshrc. Non è necessario aggiungere altro. Utilizzare "bindkey" per verificare:

"^ [OA" history-substring-search-up
"^ [OB" history-substring-search-down

Successivamente, digiti "to" e freccia in alto, apparirà "history" e "to" evidenziato (se hai usato prima il comando "history").


1

Puoi invece usare zaw , che sostituisce completamente la tua ricerca con una super ricerca multi parola chiave molto migliore e risolve anche il tuo problema: la cronologia delle ricerche è solo una delle cose che zaw può cercare.

Piccola introduzione / discussione qui


0

Poiché utilizzo oh-my-zsh e utilizzo la soluzione di sottostringa di joelostblom, James, modifico il file .zshrc in questo modo: (che alla riga 13 trova la riga "source $ ZSH / oh-my-zsh.sh" , quindi modifica il codice attorno ad esso.)

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 -vinterromperà ctrl-a, ctrl-e. Molto probabilmente tutti i comandi ctrl.
Michael Ozeryansky,

0

Risposta non-Oh-My-Zsh

Questo ha funzionato per me (su macOS) per rendere la cronologia della sottostringa facilmente accessibile tramite la freccia su / giù. L'associazione dei tasti dipende da te.

La cronologia delle ricerche di sottostringa è meglio che accedere ai comandi che iniziano con una stringa. Questo è più simile a ctrl-r nella maggior parte dei casi, quelli senza globs o regex matching.

A partire dalle istruzioni 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

Ora mi sto divertendo molto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.