Puis-je utiliser le mode d'édition Vim sur la ligne de commande sans perdre la recherche d'historique récursive?

8

J'utilise zsh et, parce que je suis un utilisateur passionné de Vim, je viens de passer à l'utilisation de l'édition de style Vim sur la ligne de commande. (Cela signifie que si je tape ls foo/baret décide que je veux à la cdplace, je peux frapper Esc ^pour revenir au début et cw cdpasser lsà cd.

C'est tout dandy, mais le problème est que je ne peux plus utiliser Ctrl+Rpour faire une recherche d'historique récursive. Existe-t-il une autre façon de le faire, ou puis-je outrepasser d'une manière ou d'une autre le raccourci clavier Vim pour le récupérer?

Nathan Long
la source
Un choix difficile! garyjohnmontre une manière Vim de le faire, et JdeBPmontre comment récupérer le raccourci clavier pour Ctrl + R! Je vais jouer avec les deux méthodes et accepter une réponse plus tard. Je déciderai en fonction de 1) quelle méthode me semble plus facile et 2) qui obtient plus de votes positifs. Merci à vous deux!
Nathan Long

Réponses:

6

Bien sûr, vous ne pouvez plus utiliser Ctrl+ R. Si vous consultez le manuel de Z Shell, vous verrez qu'il n'y a qu'une liaison de clé pour le history-incremental-search-backwardwidget dans le emacsclavier. Il n'y a pas de raccourcis clavier pour cela dans les keymaps vi.

Mais comme vous le constaterez également à la lecture du manuel (c'est le chapitre 18.), l'ajout d'une liaison de touches est un exercice assez simple dans l'utilisation de la bindkeycommande:

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

Vous n'avez même pas besoin d'utiliser la zlecommande pour mapper le widget sur une fonction shell, car il s'agit d'un widget standard.

Si vous consultez la réponse à cette même question qui se trouve sur le wiki Z Shell , vous verrez les commandes pour l'ajouter spécifiquement aux keymaps vi "command" et "insert mode":

bindkey -M viins '^R' history-incremental-search-backward
bindkey -M vicmd '^R' history-incremental-search-backward

Notez également que, comme le souligne garyjohn , dans la table de touches vi "command", le /caractère est lié au vi-history-search-backwardwidget. La différence entre ce widget et le history-incremental-search-backwardwidget est le comportement du widget qui s'applique une fois que l'on est en mode de recherche d'historique. Voici quelques différences que vous remarquerez:

  • Changement de modes vi:
    • Le mode de recherche history-incremental-search-backwardbascule entre les images clés mainet vicmdlorsque vous invoquez le vi-cmd-modewidget tout en restant en mode de recherche. c'est-à-dire depuis le emacsmode en appuyant sur la Esctouche ou sur les touches Ctrl+ XCtrl+ pour Vbasculer le mode de recherche entre les touches emacset vicmd. (L'invocation à history-incremental-search-backwardpartir du vicmdclavier est donc gênante, à moins que vous ne liez également quelque chose vi-cmd-modedans le vicmdclavier.)
    • Le mode de recherche dans vi-history-search-backwardtraite le vi-cmd-modewidget comme accept-lineet mettra fin à la recherche, en rentrant dans le mode de commande à partir duquel vous êtes entré dans la recherche. c'est-à-dire (avec les liaisons par défaut) /entre en mode de recherche à partir du mode de commande et Escrevient au mode de commande.
  • Répéter une recherche:
    • Dans history-incremental-search-backward, history-incremental-search-backwardles vi-rev-repeat-searchwidgets et sont reconnus. c'est-à-dire (en supposant que vous avez modifié les liaisons comme ci-dessus) Ctrl+ Ret Nrecherchera une ligne correspondante précédente.
    • Dans vi-history-search-backward, seul le vi-rev-repeat-searchwidget est reconnu. c'est-à-dire (en supposant que vous avez modifié les liaisons comme ci-dessus) Ctrl+ Rprovoquera un bip et sera ignoré.
JdeBP
la source
Ma mémoire musculaire vous bénit!
Nathan Long
4

En mode vi de bash, la saisie <Esc>/<string><Enter>recherchera l'historique des commandes <string>. ncherchera plus loin dans l'histoire; Nrecherchera en avant. zshell peut être le même.

garyjohn
la source
1
C'est intéressant, cependant - j'utilise souvent la recherche comme un mouvement dans Vim. Je suppose que je ne peux pas l'utiliser pour me déplacer dans la commande que je suis en train de modifier, car elle est liée à la recherche dans l'historique, hein?
Nathan Long
Droite. Mais vous pouvez (au moins en bash) utiliser les f, F, t, T, ';' (point-virgule) et ',' (virgule) pour avancer et reculer vers des caractères particuliers de la ligne.
garyjohn
1

Je préfère utiliser:

bindkey -M vicmd '/' history-incremental-search-backward

De cette façon, je peux taper ESC /textet voir la ligne de commande. Si je veux aller au match suivant, je tapeESC n

Jonas Fagundes
la source