Comment naviguer dans la recherche inversée de bash?

40

Bash offre la fonctionnalité pour inverser la recherche via Ctrl+ R. Ensuite, on peut taper une partie d’une commande qui affichera une entrée appropriée de l’historique.

Supposons que ceci soit mon histoire:

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

Je recherche foo. Un nouvel appui sur Ctrl+ Raffiche la prochaine recherche de raccord. Il m'est souvent arrivé que je sois trop rapide et que je dépasse le résultat escompté. Le résultat vim foo3est affiché et je souhaite maintenant y revenir vim foo2.

Ma question est donc la suivante: comment naviguer dans la recherche inversée?

k0pernikus
la source
Quel terminal utilisez-vous? Par exemple. gnome-terminal, konsole, etc.
varesa
1
Eh bien, je ne suis pas trop familier avec elle ... La clé devrait être ctrl + S, mais certains terminaux semblent manger la clé, avant qu'elle n'atteigne la recherche inversée
varesa
Ctrl + Maj + R - recherche en avant tandis que Ctrl + R
devansvd

Réponses:

36

Vous pouvez y accéder via la forward-search-historyfonction qui est bind par défaut ctrl+s. Malheureusement, il ctrl+sest utilisé pour signaler xoffpar défaut ce qui signifie que vous ne pouvez pas l'utiliser pour changer le sens de la recherche. Il existe deux solutions pour résoudre le problème, l’une en désactivant l’envoi de la xoff/xonsignalisation et l’autre en modifiant le raccourci clavier.forward-search-history

Désactiver xon / xoff

Courez stty -ixondans votre terminal ou ajoutez-le à votre ~/.bashrc. Cela vous permet d'utiliser ctrl+spour utiliser la forward-search-historyfonction d'historique.

Pour plus d'informations sur le flux de contrôle, consultez Comment dégeler après une pression accidentelle sur Ctrl-S dans un terminal? et certaines des réponses

Changer le raccourci clavier

Si vous ne souhaitez pas modifier le comportement par défaut de, ctrl+svous pouvez modifier le raccourci clavier pour forward-search-historyavec bind. Comme la plupart des clés sont déjà définies dans bash, vous devrez peut-être faire preuve de créativité:

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

Cela liera l’ ctrl+thistorique de la recherche en aval, mais sachez que, par défaut, il est ctrl+texécuté.transpose-chars

Ulrich Dangel
la source
J'ai essayé votre première solution stty -ixondans zshet il fonctionne très bien. Cependant, la désactivation de la xoff/xonsignalisation peut-elle avoir des effets secondaires indésirables ?
étudiant
@student Vous ne pouvez plus utiliser ctrl+spour suspendre la sortie du terminal. Si vous ne l'avez jamais utilisé auparavant, ce n'est pas un problème
Ulrich Dangel
1
Pour ce que ça vaut, je suis allé avec la deuxième solution. Super truc! Je ne savais jamais que vous pouviez figer la console en appuyant sur C-s.. très utile pour utiliser tail sur les journaux du serveur. Soigné ! (J'aimerais avoir un autre vote positif :))
Ashutosh Jindal
Je ne pouvais pas obtenir l'option n ° 2 pour fonctionner sur OSX. Je devais le faire à la place:bind '"\C-t": history-search-forward'
stiemannkj1
0

En guise d'alternative à la recherche inversée et à la recherche avancée fournie par votre bash, vous souhaiterez peut-être examiner:

fzf , un "chercheur flou en ligne de commande".

Il peut remplacer la recherche inversée par défaut de votre bash (et d’autres terminaux).

Ses avantages sont que cela:

  • imprime une liste de vos commandes de l'historique
    • fait basculer le tri chronologique ou par pertinence en appuyant à nouveau sur Ctrl + R
  • peut être navigué à l'aide des touches fléchées (ou Ctrl + J / Ctrl + K)
  • permet de rechercher plusieurs aiguilles

Mon flux de travail repose maintenant complètement sur fzf sur la recherche inversée de base sur les machines que je contrôle.

k0pernikus
la source