Utilisation de touches VI pour modifier les commandes shell sous UNIX

28

J'avais l'habitude d'avoir un collègue qui était vraiment bon à UNIX.

Il m'a montré comment utiliser les raccourcis clavier Vi pour modifier mes commandes shell.

Il a placé la commande dans un fichier qui s'exécutait chaque fois que je me connectais.

Depuis lors, je suis passé à un autre projet.

Malheureusement, je ne me souviens pas comment procéder.

Y a-t-il quelqu'un ici qui sait comment utiliser les raccourcis clavier Vi pour modifier les commandes dans le terminal?

Comment puis-je rendre ce paramètre permanent?

user919860
la source

Réponses:

31

Vous parlez de la plus grande fonctionnalité de tous les temps!

Vous pouvez utiliser les commandes vi pour modifier les commandes shell (et l'historique des commandes) en ajoutant ceci à votre .bashrcfichier:

set -o vi

Vous pouvez également exécuter cette commande à partir de la ligne de commande pour affecter uniquement votre session en cours.

Si vous n'utilisez pas bash, remplacez le fichier rc approprié par votre shell.


Cela vous permet d'utiliser les commandes vi pour modifier n'importe quelle commande ...

Vous pouvez également utiliser jet kpour parcourir votre historique (après avoir appuyé sur ESC).

Vous pouvez également utiliser /(après avoir frappé ESC) pour rechercher d'anciennes commandes.

En d'autres termes, pour trouver cette cpcommande super longue que vous avez faite il y a dix minutes:

ESC/cpENTER

Ensuite, vous pouvez parcourir toutes les commandes correspondantes de votre historique avec net N.

Tout cela me rend 10 billions de fois plus productifs en ligne de commande!

jahroy
la source
4
Eh bien, il n'utilise pas vraiment vi, il utilise des commandes de clavier de style vi pour l'édition de ligne.
4
Bien sûr ... Je suppose que la terminologie appropriée est que ce vi bindings in the shellsont les meilleures fonctionnalités jamais inventées!
jahroy
Je passerais des liaisons emacs aux liaisons vi s'il y avait un moyen d'afficher le mode. Connaissez-vous un moyen de procéder?
iconoclaste
Ils, est - il un moyen de se lier jjavec ESCcomme nous le faisons habituellement dans vim?
steveyang
@yangchenyun - Peut-être que cette question vous aidera: stackoverflow.com/questions/844862/… Je ne lie / modifie personnellement aucune des commandes, donc je ne sais pas trop ce que vous demandez.
jahroy
12

Si vous utilisez bash, comme jahroy et evil otto l'ont déjà répondu, vous pouvez utiliser

set -o vi

pour que bash utilise des commandes d'édition de style vi.

Une fois que vous avez fait cela, vous pouvez taper Esc vpour lancer l'éditeur vi avec un fichier temporaire contenant une copie de la ligne de commande actuelle. Vous pouvez modifier la commande, même en la remplaçant par plusieurs lignes; lorsque vous enregistrez le fichier ( :wq), le shell exécute les commandes modifiées.

Si tu préfères

set -o emacs

vous pouvez utiliser Ctl-XCtl-Epour faire la même chose. Il utilisera votre éditeur préféré $EDITOR, pas nécessairement emacs.

(Personnellement, j'utilise vi (en fait vim) pour la plupart de mes modifications, mais je préfère set -o emacsdans le shell; basculer dans et hors du mode d'insertion est idéal pour éditer des fichiers, mais maladroit pour les commandes interactives. YMMV.)

Keith Thompson
la source
savez-vous comment revenir au mode d'édition normal en évitant le style vi? Je me souviens d'avoir réussi avec Bl Num, mais maintenant plus maintenant; Qu'est-ce que je rate?
piertoni du
@piertoni: Ne fait set -o emacspas ce que vous voulez?
Keith Thompson
Oui, cela fonctionne, j'ai raté le point, merci
piertoni
10

Vous pouvez utiliser set -o vipour changer vos commandes d'édition de ligne comme @jahroy a posté, mais vous pensez peut-être à la fccommande (disponible dans bash et je pense que ksh, mais probablement pas tcsh), qui mettra la commande précédente dans un éditeur (FCEDIT ou EDITOR , que vous avez probablement défini sur vi), puis exécute la commande lorsque vous quittez l'éditeur. Consultez la page de manuel ou help fcpour plus de détails, ou essayez-le.

otto maléfique
la source
5
alias r='fc -e -'est un alias précieux pour réexécuter les commandes précédentes. fcà lui seul est originaire de Korn shell, je crois. Vous pouvez spécifier des commandes par numéro ( fc 123 129pour modifier les numéros de commande 123 à 129 dans l'historique). Vous pouvez spécifier des nombres relatifs ( fc -10 -1pour modifier les 10 dernières commandes entrées). Vous pouvez lister les commandes précédentes avec fc -l. Vous pouvez spécifier une commande par préfixe avec l' ralias ( r makeexécute la dernière invocation de make; il en va de même r msi vous n'avez pas exécuté de mvcommande depuis votre dernière exécution make, etc.).
Jonathan Leffler
6

Pour éditer la dernière commande utilisée dans vim et invoquer une version éditée après que l'éditeur ait enregistré et quitté, utilisez le fcshell intégré. Sans aucun argument, il fera ce qui suit:

  1. Crée un fichier temporaire dans /tmpet le remplit avec la dernière commande tapée
  2. Une fois que l'éditeur se termine normalement (avec le code de sortie 0), il exécute la commande trouvée dans ce fichier temporaire et supprime ce fichier. La version modifiée est enregistrée dans l'historique en tant que commande habituelle (au moins dans zsh). Il n'exécute rien si l'éditeur se termine avec un code autre que zéro (dans vim, cela peut être réalisé en le tuant ou en utilisant :cquit).

La commande fonctionne à la fois dans bash et zsh.

ZyX
la source
5

En fait, c'est en fait la plus grande caractéristique de tous les temps. Mais il y a plus:

Créez un fichier nommé

.editrc

contenant la ligne

bind -v

Editline , est une bibliothèque de versions sous licence BSD qui fournit des services de type readline. Ce .editrc mettra vos raccourcis clavier en mode vi dans le shell de ligne de commande de MySQL, ou toute application qui n'utilise pas readline.

Je suis devenu un peu oublieux au fil des années, donc mon .zshrc source des wrappers pour le mode vi, pour me montrer dans quel mode je suis sur la ligne de commande. C'est bien.

Je sais qu'en zsh vous pouvez taper

bindkey -L

et obtenez la liste des raccourcis clavier. Je suis sûr que bash doit avoir quelque chose de similaire. Toutes les clés vi ne sont pas liées par défaut. Liez-les à votre guise et partez pour les courses.

chiggsy
la source
J'aimerais pouvoir voter 5 fois pour les liaisons vi dans MySQL!
jahroy
1

dans votre terminal, tapez export EDITOR=vi.

Pour enregistrer ce paramètre. mettre cette ligne dans le fichier ~ / .profile


la source
5
Cela définit votre éditeur par défaut (pour les commandes qui font attention $EDITOR) à vi. Il ne vous permet pas de modifier les commandes shell avec vi(du moins pas directement).
Keith Thompson
2
@KeithThompson Zsh utilise par défaut le mode d'édition vi s'il $EDITORcontient vi. Je pense que c'est le seul shell qui fait ça.
Gilles 'SO- arrête d'être méchant'