Moyen (s) le plus rapide (s) pour déplacer le curseur sur une ligne de commande de terminal?

157

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

Disons que j'ai utilisé la touche fléchée ou Ctrl- Rpour 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 (en commençant par le début ou la fin de la ligne) le curseur pour --option25y modifier quelque chose.

Quel est le moyen le plus rapide pour y arriver? Ce que je fais habituellement, c'est Ctrl- Aaller au début puis à plusieurs reprises Alt- Favancer, mot par mot (ou Ctrl- Ealler à la fin et Alt- Brevenir ensuite en arrière). Mais sur une longue file qui prend trop de temps. Il doit y avoir un moyen de rechercher et de passer directement à la partie que je dois modifier, par exemple option25?

Franc
la source

Réponses:

108

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

  • Utilisez Ctrl+ xsuivi de Ctrl+ epour ouvrir la ligne courante dans l'éditeur spécifié par $FCEDITou $EDITORou emacs(essayé dans cet ordre).
  • Si vous avez exécuté la commande plus tôt, appuyez sur Ctrl+ rpour une recherche d'historique inversée et tapez option25(dans ce cas). La ligne sera affichée. Appuyez sur Tabpour commencer l'édition à ce stade.
  • Utilisez l'expansion de l'historique avec le s///modificateur. Par exemple !-2:s/--option25/--newoption/, réexécuterait l'avant-dernière commande, mais remplacerait option25. Pour modifier la dernière ./cmdcommande, utilisez la !stringsyntaxe: !./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. Cela a été mentionné par Pax, et peut être fait en mode emacs régulier avec Ctrl+ ]pour la recherche vers l'avant et Ctrl+ Alt+ ]pour la recherche vers l'arrière.

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

Pianosaurus
la source
203

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

Bash est un shell très courant, par exemple. Il utilise la bibliothèque Readline pour implémenter l'entrée de ligne de commande. Et pour ainsi dire, il est très pratique de connaître les liaisons Readline car il n'est pas utilisé uniquement dans bash. Par exemple, gdb utilise également Readline pour traiter les entrées.

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

Court copier-coller si le lien ci-dessus tombe en panne:

Strict minimum

  • Ctrl-b Reculer 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 Cx Cu Annule la dernière commande d'édition. Vous pouvez annuler jusqu'à une ligne vide.

Mouvement

  • Ctrl-a Déplacement au début de la ligne.
  • Ctrl-e Se déplacer à la fin de la ligne.
  • Meta-f Avance d'un mot, où un mot est composé de lettres et de chiffres.
  • Meta-b Recule d'un mot.
  • Ctrl-l Efface l'écran, réimprimant la ligne actuelle en haut.

Tuer et tirer

  • Ctrl-k Tue le texte de la position actuelle du curseur à la fin de la ligne.
  • Md Tuer du curseur à la fin du mot en cours ou, si entre les mots, à la fin du mot suivant. Les limites des mots sont les mêmes que celles utilisées par Mf.
  • M- [DEL] Supprime à partir du curseur le début du mot actuel, ou, si entre les mots, le début du mot précédent. Les limites des mots sont les mêmes que celles utilisées par Mb.
  • Ctrl-w Tuer du curseur à l'espace blanc précédent. Ceci est différent de M- parce que les limites des mots diffèrent.
  • Ctrl-y Copie le texte le plus récemment tué dans la mémoire tampon au niveau du curseur.
  • Faites pivoter l'anneau de destruction et tirez sur le nouveau sommet. Vous ne pouvez le faire que si la commande précédente est Cy ou My.

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

Mettre à jour

Notez également que Readline peut fonctionner selon deux modes:

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

Pour basculer Bash en mode vi:

$ set -o vi

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

Prime

Dans l'application macOS Terminal (et dans iTerm aussi), 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 vim.

merveille.
la source
3
Je préfère cette réponse parce qu'elle décrit [l'essence / la racine / la raison derrière] comment la saisie au clavier bash fonctionne (d'où elle vient), c'est-à-dire Readline.
eugenevd
6
Dans le terminal Ubuntu standard, Meta (M) est Alt + Shift, sauf si vous désactivez les raccourcis clavier d'accès au menu, auquel cas il s'agit simplement de Alt.
brianpeiris
2
Dans Kde à Konsole, le Meta (M) est la touche alt
Pipo
Le problème est que Meta + F ne fonctionne pas si Meta est ALT puisque ALT donne accès au menu du programme en cours d'exécution (dans ce cas terminal). Y a-t-il une alternative?
Pithikos
1
qu'est-ce que Mf, donc vous n'utilisez pas de contrôle ici alors qu'est-ce que c'est?
PositiveGuy
33

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

Connecter la vie avec Android
la source
2
Vous venez de dupliquer mon efficacité
Lay González
Dans quels environnements cela fonctionne-t-il? Je suppose que sous Mac OS uniquement?
Abdull
Fonctionne sur Linux ssh distant, même via un serveur de saut.
John Jiang
10

J'ai tendance à préférer le mode d'édition vi (puisque ces frappes sont maintenant intégrées dans ma moelle épinière (le cerveau n'est pas du tout utilisé), avec les touches CTRL-K, CTRL-X de WordStar 3.3 :-). Vous pouvez utiliser la ligne de commande set -o vipour l'activer (et set -o emacspour 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 trouver une meilleure solution, moins de 5 frappes (même si je ne veux pas déclencher une guerre de religion).

Avez-vous pensé si vous aimeriez peut-être mettre cette commande horriblement longue dans un script? :-)

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

paxdiablo
la source
Pas besoin de script - appuyez simplement sur "v" en mode vi et ouvrez la ligne de commande dans un éditeur. Vous pouvez formater la ligne de commande, err, "script" plus joliment avec des retours à la ligne, et aucun fichier temporaire n'est nécessaire. :) Donc, "v / 25" vous y emmène en 4 caractères.
dannysauer
Mais alors, vous avez besoin de plus que la touche <Entrée> pour l'exécuter. @dannysauer
CDR
9

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

Sous 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 l'option comme clé méta"

Edson Medina
la source
8

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

Il se lancera $EDITORavec la commande précédente, puis vous pourrez 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 bonne pour éditer des lignes absurdement longues - pourquoi ne pas transformer la commande en script?

dbr
la source
4

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 appuyez sur un nombre. Cela envoie un argument de répétition à readline, de sorte que vous pouvez répéter la commande que vous voulez - si vous voulez avancer, appuyez sur M-<n> M-fet le curseur avancera du <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 à partir du curseur au début de la ligne que vous frapperiez, M-26 M-fet votre curseur serait à --option25|-ou- de la fin de la ligne M-26 M-bplacerait votre curseur à--|option25


la source
2

Recherche d'historique incrémentielle

dans le terminal entrez:

gedit  ~/.inputrc

puis copiez-collez et enregistrez

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

tout ce que vous avez à faire pour trouver une commande précédente est d'entrer, disons les 2 ou 3 premières lettres et la flèche vers le haut vous y emmènera rapidement, dites je veux:

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

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

fo

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

Alexandr
la source
1

Une option consiste à utiliser M-x shelldans emacs. Cela fournit toutes les installations et les frappes de touches d' édition qui emacsa, donc C-speut être utilisé pour rechercher le texte option25, par exemple.

(Mais je préférerais toujours être dans le vrai shell du terminal à la place si quelqu'un peut me diriger vers de bonnes installations de recherche et d'édition.)

Franc
la source
0

Utilisez 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 souhaitez ensuite faire une sélection de texte dans le terminal (au lieu de passer le clic de souris à vim), maintenez Shift lorsque vous cliquez; ceci est bien sûr spécifique au terminal.

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

user7610
la source
0

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 Clics placez le curseur de ligne de commande -> Appliquer.

À partir de maintenant, il suffit de cliquer sur le bouton gauche de la souris à un endroit quelconque de la ligne de commande pour y placer le curseur.

Abdull
la source
0

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

puis: CTRL + X CTRL + E dans l'ordre.

Votre ligne actuelle s'ouvrira dans l'éditeur nano avec l'activation de la souris. Vous pouvez cliquer dans n'importe quelle partie du texte et modifier

puis CTRL + X pour quitter et y pour confirmer l'enregistrement.

Sunfloro
la source
0

J'ai créé un script pour faire bouger le curseur de la ligne de commande sur un clic de souris :

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

Il peut être trouvé sur github

Plus d'informations sur un autre article

Fonctionnera si vous echo -e "\e[?1000;1006;1015h" # Enable trackingimprimez des séquences d'échappement sur le terminal en cliquant avec la souris

Tinmarino
la source
0

Ce n'est peut-être pas le plus rapide, mais cela doit être ici, quelques lectures sur les mouvements du curseur ANSI

Les séquences d'échappement ANSI vous permettent de déplacer le curseur sur l'écran à volonté. Ceci est plus utile pour les interfaces utilisateur plein écran générées par les scripts shell, mais peut également être utilisé dans les invites . Les séquences d'échappement de mouvement sont les suivantes:

- Position the Cursor:
  \033[<L>;<C>H
     Or
  \033[<L>;<C>f
  puts the cursor at line L and column C.
- Move the cursor up N lines:
  \033[<N>A
- Move the cursor down N lines:
  \033[<N>B
- Move the cursor forward N columns:
  \033[<N>C
- Move the cursor backward N columns:
  \033[<N>D

- Clear the screen, move to (0,0):
  \033[2J  or \033c
- Erase to end of line:
  \033[K

- Save cursor position:
  \033[s
- Restore cursor position:
  \033[u

(...)

Essayez de mettre la ligne de code suivante à l'invite (c'est un peu plus clair ce que cela fait si l'invite est de plusieurs lignes vers le bas du terminal lorsque vous mettez cela): echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"Cela devrait déplacer le curseur de sept lignes vers le haut de l'écran, imprimez le mot "BASH ", puis revenez à l'endroit où il a commencé à produire une invite normale.


Exemples :

Reculez le curseur de 7 lignes:

echo -e "\033[7A"

Déplacez le curseur sur la ligne 10, colonne 5:

echo -e "\033[10;5H"

Écho rapidement des codes couleurs , pour coloriser un programme:

echo -e "\033[35;42m" ; ifconfig
NVRM
la source