Come navigare all'interno della ricerca inversa di bash?


40

Bash offre la funzionalità per invertire la ricerca tramite Ctrl+ R. Quindi si può digitare una parte di un comando che mostrerà una voce adatta dalla cronologia.

Supponiamo che questa sia la mia storia:

vim foo1
vim foo2 # I want to go here
vim foo3 # this is where I land, how to go back?

Io cerco foo. Colpire Ctrl+ di Rnuovo mostra la successiva voce di ricerca adatta. Spesso mi capita di essere troppo veloce e di navigare oltre il risultato previsto e vim foo3viene mostrato e ora voglio tornare a vim foo2.

Quindi la mia domanda è: come posso navigare all'interno della ricerca inversa?


Quale terminale usi? Per esempio. gnome-terminal, konsole, ecc ...
varesa,

1
Beh, non ne ho troppa familiarità ... La chiave dovrebbe essere ctrl + S, ma alcuni terminali sembrano mangiare la chiave, prima che raggiunga la ricerca inversa
varesa

Ctrl + maiusc + R - ricerca in avanti mentre ctrl + R
devansvd il


Risposte:


36

È possibile accedervi tramite la forward-search-historyfunzione che è associata per impostazione predefinita a ctrl+s. Sfortunatamente ctrl+sviene utilizzato per segnalare xoffper impostazione predefinita, il che significa che non è possibile utilizzarlo per cambiare la direzione della ricerca. Esistono due soluzioni per risolvere il problema, una disabilita l'invio della xoff/xonsegnalazione e l'altra cambia la combinazione di tastiforward-search-history

Disabilita xon / xoff

Esegui stty -ixonnel tuo terminale o aggiungilo al tuo ~/.bashrc. Ciò consente di utilizzare ctrl+sper utilizzare la forward-search-historyfunzione cronologia.

Per ulteriori informazioni sul flusso di controllo, dai un'occhiata a Come sbloccare dopo aver premuto Ctrl-S in un terminale? e alcune delle risposte

Cambia l'associazione dei tasti

Se non si desidera modificare il comportamento predefinito, ctrl+sè possibile modificare la funzione di associazione dei tasti forward-search-historycon bind. Poiché la maggior parte delle chiavi sono già definite in bash, potresti dover essere creativo:

bind "\C-t":forward-search-history

Questo si legherà ctrl+talla cronologia di ricerca ctrl+tdiretta , ma tieni presente che per impostazione predefinita viene eseguitotranspose-chars


Ho cercato il tuo prima soluzione stty -ixonin zshe funziona molto bene. Tuttavia ci sono effetti collaterali eventualmente indesiderati nel disabilitare la xoff/xonsegnalazione?
studente

@student Non è più possibile utilizzare ctrl+sper mettere in pausa l'uscita del terminale. Se non l'hai mai usato prima, questo non è un problema
Ulrich Dangel,

1
Per quello che vale, sono andato con la seconda soluzione. Roba fantastica! Non ho mai saputo che avresti potuto congelare la console premendo C-s... molto utile quando si utilizza tail sui log del server. Pulito! (Vorrei avere un altro voto :))
Ashutosh Jindal,

Impossibile ottenere l'opzione n. 2 per funzionare su OSX. Ho dovuto invece fare questo:bind '"\C-t": history-search-forward'
stiemannkj1,

0

In alternativa alla ricerca inversa di base e alla ricerca in avanti fornita da bash, potresti voler esaminare:

fzf , un "fuzzy finder" da riga di comando auto-descritto.

Può sostituire la ricerca inversa predefinita di bash (e di altri terminali).

I suoi vantaggi sono che:

  • stampa un elenco dei tuoi comandi dalla cronologia
    • attiva / disattiva l'ordinamento cronologico o di pertinenza premendo nuovamente Ctrl + R
  • può essere navigato tramite i tasti freccia (o Ctrl + J / Ctrl + K)
  • consente di cercare più aghi

Il mio flusso di lavoro ora si basa completamente su fzf sulla ricerca inversa di base su macchine su cui ho il controllo.

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.