Comment lancer la recherche dhistorique en mode Vi en bash

Je veux trouver lalternative à ctrl + R pour rechercher lhistorique dans bash. Je peux activer le mode vi dans bash mais je ne peux pas le faire rechercher. Quand je fais /search ou ?search, rien ne se passe. Y a-t-il quelque chose de plus sur lequel je devrais appuyer? Jai essayé dappuyer sur Entrée et cela se produit:

$ set -o vi $ ls|grep f $ /gr -bash: /gr: No such file or directory $ 

Commentaires

  • Est <C-r> ne fonctionne vraiment pas pour vous en mode vi pour readline? Cela fonctionne bien pour moi avec la dernière version de bash.
  • @ D.BenKnoble Oui, mais je pense que <C-r> est le mode emacs et je veux apprendre mode vi.
  • <C-r> est juste une recherche récursive; pas sûr que cela ait quelque chose à voir avec emacs vs vi, dautant plus quil pourrait sagir dune extension spécifique à bash (ma mémoire est floue sur ce détail). Je ne vous décourage pas dutiliser /, juste que chacun a ses (différentes) utilisations.

Réponse

Il y a certainement une recherche de style Vim dans bash / readline. En fait, votre ligne de commande est essentiellement une version réduite de léditeur Vim avec un nombre important de commandes en mode normal à votre disposition. Plus dinformations à ce sujet dans une seconde mais première recherche. L’information clé dont vous avez besoin est que lorsque vous regardez ce curseur clignotant sur votre ligne de commande, vous êtes dans l’équivalent du mode d’insertion de Vim. Comment pouvons-nous donc passer en mode normal? En appuyant sur Echap , bien sûr.

À partir de là, appuyez sur / , entrez un terme de recherche et appuyez sur Entrée . Vous pouvez maintenant utiliser n et N pour aller et venir dans les résultats. (Vous allez effectivement chercher en arrière par défaut avec n … en recherchant vers lavant depuis le début ne donnerait aucun résultat car il ny a pas dhistorique dans le futur!) Pour exécuter le résultat actuel comme une commande, appuyez à nouveau sur Entrée .

Noubliez pas que vous  » Cependant, si vous ne trouvez pas ce que vous cherchez et que vous voulez revenir à la saisie de texte en mode Insertion, faites ce que vous faites habituellement dans Vim. Frapper i , par exemple, le fera. Ou vous pouvez utiliser la commande Vim C qui supprimera tout texte après le curseur et passera en mode Insertion, ce qui est pratique. (Vous pouvez faire précéder cela de 0 si vous avez déplacé le curseur au-delà de la première colonne.) Ou utilisez A, a, R, s, s, I, Ctrl-C … vous obtenez limage.

Outre les diverses commandes qui entrent en mode Insertion, vous pouvez naviguer avec b, B, e, E , w, W, 0, $, etc. Yank / delete / put sont là aussi, et vous pouvez les utiliser en action + commandes de navigation comme yB, c2e, d$, etc. 1 Enfin, u ndo fonctionne aussi bien! Allez-y et essayez vous-même dautres choses.

Oh, et si vous vous perdez un peu ou, comme cela marrive de temps en temps, un peu de funkiness avec le retour à la ligne brouille votre c / l, vous pouvez laisser tomber le semblant et appuyer sur v. Cela extrait le contenu de votre ligne de commande dans une instance réelle de Vim afin que vous puissiez le modifier avec un Éditeur de texte entièrement armé et opérationnel . Une fois fait, :wq pour soumettre ce que vous avez au shell pour exécution.

1 Hélas, lopérateur + Les commandes de mouvement (caw, dis, yap, etc.) ne sont pas prises en charge. Mais le commentaire de @EdNeville « ci-dessous contient un lien vers certains paramètres de lecture en ligne qui ajoutera apparemment toutes les commandes op-motion qui existent ainsi quun certain nombre dautres. Vous pouvez vraiment compléter votre expérience Vim basée sur la ligne de commande en les ajoutant à votre fichier .inputrc.


Informations supplémentaires : vous nêtes pas limité à utiliser uniquement ce que set -o vi ou set -o emacs vous le donne. Vous pouvez utiliser lune des commandes readline disponibles. Je pense que Ctrl-R devrait être disponible même en mode Vim, mais sinon, vous pouvez essayer mettre ceci dans votre ~/.inputrc

set editing-mode vi "\C-r": reverse-search-history "\C-s": forward-search-history 

Mieux encore, vous pouvez ajouter des commandes autrement indisponibles comme

"\C-o": operate-and-get-next 

Avec ceci, une fois que vous avez sélectionné une commande dans lhistorique (par exemplevia la recherche Vim) appuyez sur Ctrl-O au lieu de Enter et Bash exécutera la commande et insérera la commande suivante de lhistorique, prête à être exécutée.

Voir la section Readline Command Names dans la page de manuel Bash pour la liste complète.

(Vous pouvez également les configurer à partir de la ligne de commande avec le bind mais je » vais déjà trop loin ici.)

Commentaires

  • Sympa. Un moment d’apprentissage.
  • @niklas, voici votre réponse
  • @glennjackman Jutilise beaucoup cette fonctionnalité. Vraiment utile pour moi.
  • @NiklasRosencrantz Oui, jai compris. Nous essayez décrire des réponses qui sont généralement utiles plutôt que centrées uniquement sur le questionneur, jai donc ajouté des informations supplémentaires sur le mélange de commandes de différents modes.
  • Vous pouvez également ajouter des éléments tels que ciw si vous modifiez .inputrc: usenix.org.uk/content/bash.html#input

Réponse

ce que @ B-Layer a mentionné fonctionne plutôt bien dans bash et de même dans zsh.

Puisque vous utilisez déjà VIM , et si vous utilisez neovim ou vim8, vous pouvez également essayer :terminal, qui ouvrira le terminal par défaut dans vim.

Ensuite, vous pouvez utiliser la commande vim pour naviguer dans la sortie du termminal, ainsi que naviguer dans lhistorique des commandes du terminal.

Ref.

  1. http://vimcasts.org/episodes/neovim-terminal/
  2. https://neovim.io/doc/user/nvim_terminal_emulator.html
  3. https://github.com/vim/vim/blob/master/runtime/doc/terminal.txt

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *