web-dev-qa-db-fra.com

Le plus rapide des moyens pour déplacer le curseur sur une ligne de commande de terminal?

Quel est le meilleur moyen 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 

Maintenant, je dois déplacer (à partir du début ou de la fin de la ligne) le curseur sur --option25 pour y modifier quelque chose.

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

144
Frank

Puisque cela n'a pas encore été fermé, voici quelques options supplémentaires.

  • Utilisation Ctrl+x suivi par Ctrl+e pour ouvrir la ligne en cours dans l'éditeur spécifié par $FCEDIT ou $EDITOR ou emacs (essayé dans cet ordre).
  • Si vous avez exécuté la commande plus tôt, appuyez sur Ctrl+r pour une recherche d’historique inversé et tapez option25 (dans ce cas). La ligne sera affichée. Frappé Tab pour commencer l'édition à ce stade.
  • Utilisez le développement de l'historique avec le modificateur s///. Par exemple. !-2:s/--option25/--newoption/ réexécutera l'avant-dernière commande, mais remplacera option25. Pour modifier la dernière commande ./cmd, utilisez la syntaxe !string: !./cmd:s/--option25/--newoption/
    Tout délimiteur peut être utilisé à la place de/dans la substitution.
  • Si vous modifiez la ligne précédente, vous pouvez utiliser la substitution rapide: ^--option25^--newoption
  • Recherche de personnage. 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 arrière.

Je recommande la deuxième option. Ctrl+r est vraiment pratique et rapide, pas besoin de bricoler avec les éditeurs, et vous voyez les résultats avant que la commande ne soit exécutée (contrairement aux extensions d’historique).

100
Pianosaurus

Pour être clair, vous ne voulez pas de "moyen rapide de déplacer le curseur sur une ligne de commande terminal" . Ce que vous voulez réellement est un moyen rapide de naviguer sur la ligne de commande dans vous Shell programme.

Bash est un shell très courant, par exemple . Il utilise Readline library pour implémenter la saisie en ligne de commande. Et pour ainsi dire, il est très pratique de connaître les liaisons Readline car elles ne sont pas utilisées uniquement en bash. Par exemple, gdb utilise également Readline pour traiter les entrées.

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

Copier-coller court si le lien ci-dessus tombe en panne:

Strict minimum

  • Ctrl-b Recule d'un caractère.
  • Ctrl-f Avance d'un caractère.
  • [DEL] ou [Backspace] Supprime le caractère à gauche du curseur.
  • Ctrl-d Supprime le caractère sous le curseur.
  • Ctrl-_ ou C-x C-u Annule la dernière commande d'édition. Vous pouvez annuler tout le chemin pour revenir à une ligne vide.

Mouvement

  • Ctrl-a Déplace le curseur au début de la ligne.
  • Ctrl-e Aller à la fin de la ligne.
  • Meta-f Avance un mot, un mot étant composé de lettres et de chiffres.
  • Meta-b Recule d'un mot en arrière.
  • Ctrl-l Efface l'écran en réimprimant la ligne actuelle en haut.

Tuer et tirer

  • Ctrl-k Supprime le texte de la position actuelle du curseur à la fin de la ligne. 
  • M-d Tuer depuis le curseur jusqu'à la fin du mot actuel ou, s'il s'agit d'un mot, jusqu'à la fin du mot suivant. Les limites de mots sont les mêmes que celles utilisées par M-f. 
  • M- [DEL] Supprime du curseur le début du mot actuel ou, s'il se trouve entre deux mots, jusqu'au début du mot précédent. Les limites de mots sont les mêmes que celles utilisées par M-b. 
  • Ctrl-w Tue du curseur jusqu'au blanc précédent. Ceci est différent de M- parce que les limites de Word diffèrent.
  • Ctrl-y Revient le dernier texte tué dans la mémoire tampon du curseur. 
  • M-y Faites pivoter la bague de mise à mort et tirez sur le nouveau sommet. Vous ne pouvez le faire que si la commande précédente est C-y ou M-y.

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

Mettre à jour

Notez également que Readline peut fonctionner dans deux modes:

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

Pour basculer Bash en mode vi:

$ set -o vi

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

Prime

Dans l'application MacOS Terminal (et dans iTerm également), vous pouvez Option-Cliquer pour déplacer le curseur (le curseur se placera sur la position cliquée). Cela fonctionne même dans vim.

180
wonder.mice

Maintenez la touche Option enfoncée et cliquez à l'endroit où vous souhaitez que le curseur se déplace. Le terminal se précipite à cet endroit précis. 

J'ai tendance à préférer le mode d'édition vi (puisque ces touches sont maintenant intégrées dans la moelle épinière (le cerveau n'est pas utilisé du tout), avec 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).

Dans Vi, ce serait (ESC-K pour obtenir la ligne en premier bien sûr) "f5;;B" (sans les guillemets).

Bien sûr, vous devez comprendre ce qui est en jeu pour vous en sortir. Fondamentalement, 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 proposer une meilleure solution, moins de 5 frappes de touche (bien que je ne veuille pas déclencher une guerre de religion).

Avez-vous réfléchi à la question de savoir si vous aimeriez peut-être mettre cette commande extrêmement 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.

10
paxdiablo

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

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

..mais, comme Pax l'a dit - la ligne de commande n'est pas particulièrement efficace pour l'édition de lignes absurdement longues - pourquoi ne pas transformer la commande en script?

8
dbr

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

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

Mais alternativement, vous pouvez ouvrir les préférences du terminal -> paramètres -> profil -> clavier et cocher "utiliser option comme clé méta"

8
Edson Medina

Si vous voulez avancer d'un certain nombre de mots, appuyez sur M-<n> (M- est pour Meta et c'est généralement la touche d'échappement) puis tapez un nombre. Ceci envoie un argument de répétition à readline, vous pouvez donc répéter la commande que vous voulez. Si vous voulez avancer, cliquez sur M-<n> M-f et le curseur avancera <n> nombre de mots.

Par exemple. 

 $|echo "two three four five six seven"
 $ M-4
 (arg: 4) echo "two three four five six seven"
 $ M-f
 $ echo "two three four| five six seven"

Donc pour votre exemple du curseur au début de la ligne que vous frapperiez, M-26 M-f et votre curseur seraient à --option25| - à partir de la fin de la ligne M-26 M-b placerait votre curseur à --|option25

4
user4401178

Recherche incrémentielle dans l'histoire

dans le terminal entrez:

gedit  ~/.inputrc

puis copier coller et sauvegarder

"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char

tout ce que vous devez faire pour trouver une commande précédente est d'entrer, dites les 2 ou 3 premières lettres et la flèche dirigée vers le haut vous y conduira rapidement pour dire que je veux:

for f in *.mid ; do timidity "$f"; done

tout ce que j'ai à faire est d'entrer 

fo

et appuyez sur la flèche vers le haut commande va bientôt apparaître

2
Alexandr

Une option consiste à utiliser M-x Shell dans emacs. Cela fournit toutes les fonctions d'édition et les combinaisons de touches que emacs a, donc C-s peut être utilisé pour rechercher le texte option25, par exemple. 

(Mais je préférerais quand même être dans le vrai terminal Shell si quelqu'un peut m'indiquer de bonnes fonctions de recherche et d'édition.) 

1
Frank

Dans Cygwin, vous pouvez activer cette fonctionnalité en cliquant avec le bouton droit de la souris sur la fenêtre. Dans la fenêtre contextuelle, sélectionnez Options ... -> Souris -> activer Cliquez sur le curseur de la ligne de commande -> Appliquer.

A partir de maintenant, un simple clic sur le bouton gauche de la souris à un endroit de la ligne de commande y placera le curseur.

0
Abdull

Utiliser la souris

Parfois, le moyen le plus simple de modifier une ligne de commande consiste à utiliser une souris. Certaines réponses précédentes donnent une commande pour ouvrir votre ligne actuelle dans votre $ EDITOR. Pour moi (zhs avec la configuration grml), cette combinaison est Alt+e. Si vous activez la souris dans votre éditeur, vous pouvez l'utiliser.

Pour activer la souris dans Vim, ajoutez ceci à votre ~/.vimrc

set mouse=a
set ttymouse=xterm2

Si vous voulez ensuite faire une sélection de texte dans le terminal (au lieu de passer le clic de souris à vim), maintenez la touche Maj enfoncée lorsque vous cliquez; ceci est spécifique au terminal, bien sûr.

Les administrateurs système ne doivent pas avoir peur de la souris.

0
user7610

d'abord: export EDITOR = 'nano -m'

puis: CTRL + X CTRL + E en séquence.

Votre ligne actuelle s’ouvrira dans nano editor avec la souris activée. Vous pouvez cliquer dans n’importe quelle partie du texte et le modifier.

puis CTRL + X pour quitter et y pour confirmer la sauvegarde.

0
Octavius

J'ai fait un script pour que la ligne de commande le curseur se déplace lorsque la souris est cliquée :

  1. Activer les rapports de suivi de la souris xterm
  2. Définir des liaisons readline pour utiliser la séquence d'échappement générée par des clics

On peut le trouver sur github

Plus d'infos sur un autre post

Cela fonctionnera si echo -e "\e[?1000;1006;1015h" # Enable tracking imprime les séquences d'échappement sur le terminal en cliquant avec la souris

0
tinmarino