Comment puis-je effectuer une recherche d'historique inversé dans le mode vi de ZSH?


47

J'utilise vimessentiellement pour tous mes besoins de montage, alors j'ai décidé d'essayer à nouveau vi-mode pour mon shell (actuellement ZSH avec oh-my-zsh sur OS X), mais je me suis retrouvé à essayer (et à ne pas utiliser) de façon Ctrl-Rconstante. Quelle est la clé équivalente? Et pour référence future, comment pourrais-je comprendre cela moi-même? Je suis sûr que je pourrais utiliser bind -Pbash.


2
Selon 'man zshzle', l'historique-incrémental-recherche-arrière n'est pas lié aux modes Vi (vicmd, viins) par défaut.
paul

Réponses:


56

Vous pouvez exécuter bindkeysans arguments pour obtenir une liste des liaisons existantes, par exemple:

# Enter vi mode
chopper:~> bindkey -v

# Search for history key bindings
chopper:~> bindkey | fgrep history
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[[A" up-line-or-history
"^[[B" down-line-or-history

En mode Emacs, la liaison souhaitée est history-incremental-search-backward, mais elle n’est pas liée par défaut en mode vi. Pour lier Ctrl-R vous-même, vous pouvez exécuter cette commande ou l'ajouter à votre ~/.zshrc:

bindkey "^R" history-incremental-search-backward

La zshzlepage de manuel ( man zshzle) contient plus d’informations sur l’éditeur de ligne de zsh, les méthodes bindkey et emacs / vi.


3
Merci, particulièrement pour zshzle. C'est assez informatif et utile.
Hank Gay

Je t'aime. Sérieusement. Après la mise à niveau vers OSX El Capitan, la recherche inversée avait disparu et elle me manquait plus que tout le reste dans mon flux de travail quotidien.
Christian

24

C'est une question ancienne, mais la seule réponse (et acceptée) indique en gros comment transplanter le mode “emacs-like” history-incremental-search-backwarden mode vi. Bien que cela soit parfaitement faisable et constitue peut-être la bonne solution pour vous, il est un peu étrange que personne n'ait mentionné la «méthode vi» de recherche de l'histoire.

Le mode vi dans zsh prend en charge la recherche dans l'historique à l'aide des touches standard vi / vim: /et les ?deux disponibles en mode commande. (Appuyez sur <Esc>pour passer du mode insertion au mode commande, comme dans vi ou vim.)

Cependant, leur sens est inversé: puisque vous souhaitez généralement rechercher l'historique de votre shell à l'envers, /effectuez une recherche inverse tout en effectuant ?une recherche en aval.

Une fois que le premier résultat est affiché, vous pouvez (comme dans vi / vim) utiliser npour continuer à rechercher plus de résultats dans la même direction, ou Npour inverser le sens de la recherche.

Les raccourcis clavier par défaut pertinents dans le vicmdclavier sont les suivants:

"/" vi-history-search-backward
"?" vi-history-search-forward
"n" vi-repeat-search
"N" vi-rev-repeat-search

2
C'est aussi bon à utiliser "^P" history-beginning-search-backwardet "^N" history-beginning-search-forwardpour l'auto-complétion de type vim (vous commencez à taper, puis appuyez sur ctrl+pou ctrl+n).
cprn

Pour moi, ?apporte bck-i-search, qui est exactement ce que je cherchais. Je vous remercie.
geowa4

@wjv l'avantage de l'historique-incrémental-recherche-arrière est qu'il prend en charge les modèles globaux. La valeur par défaut /ou "?" ne marche
alpha_989

@ alpha_989 La publication de blog que vous avez référencée est incorrecte. Il se peut que l'auteur ait un «framework» zsh installé qui surcharge le ^Rraccourci clavier. Le seul caractère «ressemblant à une expression régulière» pris en charge par les deux history-search-backwardet history-incremental-search-backwardconsiste ^à ancrer la chaîne de recherche au début de la ligne. Le vrai pouvoir de, history-incremental-search-backwardc'est qu'il effectue une recherche incrémentale, comme son nom l'indique. J'imagine que l'on pourrait vouloir le lier dans la vicmdtable de touches pour cette raison.
wjv

@wjv, vous avez raison .. j'aurais dû écrire history-incremental-pattern-search-backward, pas history-incremental-search-backward. history-incremental-pattern-search-backwardspeut-être un widget .. mais je pense qu'il est installé par défaut dans zsh. Il prend en charge des globmodèles qui ne correspondent pas à ce regexque vous avez indiqué correctement: zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Operators . Il y a bien une erreur dans le post ..
alpha_989
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.