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
?
Puisque cela n'a pas encore été fermé, voici quelques options supplémentaires.
$FCEDIT
ou $EDITOR
ou emacs
(essayé dans cet ordre).option25
(dans ce cas). La ligne sera affichée. Frappé Tab pour commencer l'édition à ce stade.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/
^--option25^--newoption
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).
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
Mouvement
Tuer et tirer
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:
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
.
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.
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?
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"
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
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
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.)
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.
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.
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.
J'ai fait un script pour que la ligne de commande le curseur se déplace lorsque la souris est cliquée :
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