203 votes

Quelle est la méthode la plus rapide pour déplacer le curseur sur la ligne de commande d'un terminal ?

Quelle est la meilleure façon de se déplacer sur une très longue ligne de commande dans le terminal ?

Disons que j'ai utilisé la touche fléchée ou Ctrl - R pour obtenir cette longue ligne de commande :

./cmd --option1 --option2 --option3 --option4 --option5 --option6 --option7 --option8 --option9 --option10 --option11 --option12 --option13 --option14 --option15 --option16 --option17 --option18 --option19 --option20 --option21 --option22 --option23 --option24 --option25 --option26 --option27 --option28 --option29 --option30 --option31 --option32 --option33 --option34 --option35 --option36 --option37 --option38 --option39 --option40 --option41 --option42 --option43 --option44 --option45 --option46 --option47 --option48 --option49 --option50 

Je dois maintenant déplacer (en commençant par le début ou la fin de la ligne) le curseur sur --option25 pour modifier quelque chose à cet endroit.

Quel est le moyen le plus rapide pour s'y rendre ? Ce que je fais habituellement, c'est Ctrl - A pour revenir au début, puis à plusieurs reprises Alt - F d'avancer, mot par mot (ou Ctrl - E pour aller au bout et Alt - B pour revenir en arrière). Mais sur une longue ligne, cela prend trop de temps. Il doit y avoir un moyen de rechercher et de sauter directement à la partie que je dois modifier, par ex. option25 ?

263voto

wonder.mice Points 1333

Pour être clair, vous ne voulez pas d'un "moyen rapide de déplacer le curseur sur un terminal ligne de commande". Ce que vous voulez en fait, c'est un moyen rapide de naviguer sur la ligne de commande dans votre ordinateur. coquille programme.

Le cambriolage est un coquillage très courant, par exemple. Il utilise Readline pour mettre en œuvre l'entrée de ligne de commande. Il est donc très pratique de connaître les liaisons Readline car elles ne sont pas seulement utilisées dans bash. Par exemple, gdb utilise également Readline pour traiter les entrées.

Dans la documentation Readline, vous trouverez tous les liens liés à la navigation (et plus encore) : http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

Petit copier-coller si le lien ci-dessus ne fonctionne pas :

L'essentiel à l'état brut

  • Ctrl-b Recule d'un caractère.
  • Ctrl-f Avancer d'un caractère.
  • [DEL] ou [Backspace] Supprimez le caractère à gauche du curseur.
  • Ctrl-d Supprime le caractère situé sous le curseur.
  • Ctrl-_ ou C-x C-u Annuler la dernière commande d'édition. Vous pouvez annuler jusqu'à une ligne vide.

Mouvement

  • Ctrl-a Déplacer au début de la ligne.
  • Ctrl-e Aller à la fin de la ligne.
  • Meta-f Faire avancer un mot, un mot étant composé de lettres et de chiffres.
  • Meta-b Recule d'un mot.
  • Ctrl-l Efface l'écran et réimprime la ligne en cours en haut de l'écran.

Tuer et arracher

  • Ctrl-k Met fin au texte depuis la position actuelle du curseur jusqu'à la fin de la ligne.
  • M-d Remonter du curseur à la fin du mot en cours ou, si l'on se trouve entre deux mots, à la fin du mot suivant. Les limites des mots sont les mêmes que celles utilisées par M-f.
  • M-[DEL] Déplace le curseur au début du mot en cours ou, si l'on se trouve entre deux mots, au début du mot précédent. Les limites des mots sont les mêmes que celles utilisées par M-b.
  • Ctrl-w Remplacer le curseur par l'espace blanc précédent. Cette fonction est différente de M- car les limites des mots sont différentes.
  • Ctrl-y Ramène le dernier texte tué dans la mémoire tampon au niveau du curseur.
  • M-y Tourner l'anneau d'abattage et retirer le nouveau sommet. Cette opération n'est possible que si la commande précédente est C-y ou M-y.

M est la clé Méta. Pour Max OS X Terminal, vous pouvez activer l'option "Utiliser l'option comme clé méta" dans Paramètres/Clavier. Pour Linux, c'est plus compliqué.

Mise à jour

Notez également que Readline peut fonctionner selon deux modes :

  • le mode emacs (qui est le mode par défaut)
  • vi mode

Pour passer du mode Bash au mode vi :

$ set -o vi

Personnellement, je préfère le mode vi car j'utilise vim pour l'édition de texte.

Bonus

Dans l'application Terminal de macOS (et dans iTerm également), vous pouvez cliquer sur Option pour déplacer le curseur (le curseur se déplacera à la position cliquée). Cela fonctionne même à l'intérieur de vim .

4 votes

Je préfère cette réponse parce qu'elle aborde [l'essence/la racine/la raison d'être] du fonctionnement de la saisie au clavier de bash (d'où elle vient), c'est à dire Readline.

7 votes

Dans le terminal Ubuntu standard, Meta (M) correspond à Alt+Shift, sauf si vous désactivez les raccourcis clavier d'accès au menu, auquel cas il s'agit simplement de Alt.

2 votes

Dans Kde, dans Konsole, la touche Meta (M) est la touche Alt.

122voto

Pianosaurus Points 1734

Puisque ce dossier n'a pas encore été clôturé, voici quelques options supplémentaires.

  • Utilisation Ctrl + x suivi de Ctrl + e pour ouvrir la ligne en cours dans l'éditeur spécifié par $FCEDIT o $EDITOR o emacs (essayés dans cet ordre).
  • Si vous avez exécuté la commande plus tôt, appuyez sur Ctrl + r pour une recherche historique inversée et tapez option25 (dans ce cas). La ligne s'affiche. Frapper Tab pour commencer l'édition à ce stade.
  • Utiliser l'extension de l'historique avec le s/// modificateur. Par exemple !-2:s/--option25/--newoption/ réexécuterait l'avant-dernière commande, mais remplacerait l'option25. Pour modifier la dernière commande ./cmd utiliser la commande !string syntaxe : !./cmd:s/--option25/--newoption/
    Tout délimiteur peut être utilisé à la place de / dans la substitution.
  • Si vous éditez la ligne précédente, vous pouvez utiliser la substitution rapide : ^--option25^--newoption
  • Recherche de caractères. Ceci a été mentionné par Pax, et peut être fait en mode emacs normal avec Ctrl + ] pour la recherche avancée, et Ctrl + Alt + ] pour la recherche en amont.

Je recommande la deuxième option. Ctrl + r est vraiment pratique et rapide, il n'y a pas besoin d'utiliser des éditeurs, et vous voyez les résultats avant que la commande ne soit exécutée (contrairement aux extensions de l'historique).

12voto

paxdiablo Points 341644

J'ai tendance à préférer le mode d'édition vi (puisque ces touches sont maintenant ancrées dans ma moelle épinière (le cerveau n'est pas utilisé du tout), ainsi que les touches CTRL-K, CTRL-X de WordStar 3.3 :-). Vous pouvez utiliser la ligne de commande set -o vi pour l'activer (et set -o emacs pour revenir en arrière).

En Vi, ce serait (ESC-K pour faire apparaître la ligne en premier bien sûr) " f5;;B "(sans les guillemets).

Bien sûr, il faut comprendre ce qui est en jeu pour s'en tirer. En gros, c'est

f5 to find the first occurrence of "5" (in --option5).
;  to find the next one (in --option15).
;  to find the next one (in --option25).
B  to back up to the start of the word.

Voyons si les aficionados d'emacs peuvent trouver une meilleure solution, en moins de 5 frappes (mais je ne veux pas déclencher une guerre de religion).

Vous êtes-vous demandé si vous ne souhaiteriez pas placer cette commande horriblement longue dans un script ? :-)

En fait, je peux faire mieux que cela : " 3f5B "pour trouver la troisième occurrence de "5", puis revenir au début du mot.

0 votes

Pas besoin d'un script - il suffit d'appuyer sur "v" en mode vi et d'ouvrir la ligne de commande dans un éditeur. Vous pouvez formater la ligne de commande, err, "script" plus joliment avec des nouvelles lignes, et il n'y a pas besoin de fichier tempfile :) Donc, "v/25" vous permet d'arriver à destination en 4 caractères.

0 votes

Mais alors, il faut plus que la touche <Enter> pour l'exécuter. @dannysauer

11voto

Edson Medina Points 2555

Utilisez Meta-b / Meta-f pour avancer ou reculer d'un mot respectivement.

Sous OSX, Meta se traduit par ESC, ce qui est nul.

Mais vous pouvez aussi ouvrir les préférences du terminal -> paramètres -> profil -> clavier et cocher "utiliser l'option comme touche méta"

9voto

dbr Points 66401

Après avoir exécuté la commande une fois, lancez fc

Elle lancera $EDITOR avec la commande précédente, vous pouvez alors utiliser votre éditeur habituel pour modifier la commande. Lorsque vous enregistrez et quittez, le fichier sera exécuté.

mais, comme l'a dit Pax, la ligne de commande n'est pas particulièrement adaptée à l'édition de lignes absurdes - pourquoi ne pas transformer la commande en un script ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X