Schnellste Möglichkeit, den Cursor auf einer Terminal-Befehlszeile zu bewegen?

155

Was ist der beste Weg, um sich auf einer bestimmten sehr langen Befehlszeile im Terminal zu bewegen?

Angenommen, ich habe die Pfeiltaste oder Ctrl- verwendet R, um diese lange Befehlszeile abzurufen:

./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 

Jetzt muss ich den Cursor bewegen (beginnend am Anfang oder am Ende der Zeile) --option25, um dort etwas zu ändern.

Was ist der schnellste Weg dorthin? Was ich normalerweise mache, ist Ctrl- Azum Anfang und dann wiederholt zu kommen Alt- Fmich Wort für Wort vorwärts zu bewegen (oder Ctrl- Edas Ende zu gehen und Alt- Bdann rückwärts zu gehen). Aber auf einer langen Linie dauert das zu lange. Es muss eine Möglichkeit geben, direkt zu dem Teil zu suchen und zu springen, den ich ändern muss, z option25.

Frank
quelle

Antworten:

107

Da dies noch nicht geschlossen wurde, sind hier einige weitere Optionen.

  • Verwenden Sie Ctrl+ xgefolgt von Ctrl+ e, um die aktuelle Zeile in dem durch $FCEDIToder $EDITORoder emacs(in dieser Reihenfolge versucht) angegebenen Editor zu öffnen .
  • Wenn Sie den Befehl zuvor ausgeführt haben, drücken Sie Ctrl+ rfür eine Reverse-History-Suche und geben Sie option25(in diesem Fall) ein. Die Zeile wird angezeigt. Drücken Sie Tab, um an dieser Stelle mit der Bearbeitung zu beginnen.
  • Verwenden Sie die Verlaufserweiterung mit dem s///Modifikator. ZB !-2:s/--option25/--newoption/würde der vorletzte Befehl erneut ausgeführt, aber Option25 ersetzt. ./cmdVerwenden Sie die folgende !stringSyntax, um den letzten Befehl zu ändern :!./cmd:s/--option25/--newoption/
    Anstelle von / in der Ersetzung kann ein beliebiges Trennzeichen verwendet werden.
  • Wenn Sie die vorherige Zeile bearbeiten, können Sie eine schnelle Ersetzung verwenden: ^--option25^--newoption
  • Zeichensuche. Dies wurde von Pax erwähnt und kann im regulären Emacs-Modus mit Ctrl+ ]für die Vorwärtssuche und Ctrl+ Alt+ ]für die Rückwärtssuche durchgeführt werden.

Ich empfehle die zweite Option. Ctrl+ rist sehr praktisch und schnell, ohne sich mit Editoren herumzuschlagen, und Sie sehen die Ergebnisse, bevor der Befehl ausgeführt wird (im Gegensatz zu den Verlaufserweiterungen).

Pianosaurus
quelle
203

Um klar zu sein, möchten Sie keine "schnelle Möglichkeit, den Cursor auf einer Terminal- Befehlszeile zu bewegen ". Was Sie eigentlich wollen, ist eine schnelle Möglichkeit, über die Befehlszeile in Ihrem Shell- Programm zu navigieren .

Bash ist zum Beispiel eine sehr verbreitete Shell. Es verwendet die Readline- Bibliothek, um die Befehlszeileneingabe zu implementieren. Und sozusagen ist es sehr praktisch, Readline-Bindungen zu kennen, da sie nicht nur in Bash verwendet werden. Beispielsweise verwendet gdb auch Readline, um Eingaben zu verarbeiten.

In der Readline-Dokumentation finden Sie alle navigationsbezogenen Bindungen (und mehr): http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

Kurzes Kopieren und Einfügen, wenn der obige Link ausfällt:

Das Wesentliche

  • Strg-b Ein Zeichen zurück verschieben.
  • Strg-f Ein Zeichen vorwärts bewegen.
  • [ENTF] oder [Rücktaste] Löschen Sie das Zeichen links vom Cursor.
  • Strg-d Löscht das Zeichen unter dem Cursor.
  • Strg-_ oder Cx Cu Machen Sie den letzten Bearbeitungsbefehl rückgängig. Sie können bis zu einer leeren Zeile rückgängig machen.

Bewegung

  • Strg-a Zum Zeilenanfang gehen.
  • Strg-e Zum Ende der Zeile gehen.
  • Meta-f Bewegen Sie ein Wort vorwärts, wobei ein Wort aus Buchstaben und Ziffern besteht.
  • Meta-b Ein Wort rückwärts bewegen.
  • Strg-l Löschen Sie den Bildschirm und drucken Sie die aktuelle Zeile oben erneut.

Töte und ziehe

  • Strg-k Tötet den Text von der aktuellen Cursorposition bis zum Ende der Zeile.
  • Md Töte vom Cursor bis zum Ende des aktuellen Wortes oder, wenn zwischen den Wörtern, bis zum Ende des nächsten Wortes. Wortgrenzen sind die gleichen wie die von Mf verwendeten.
  • M- [DEL] Tötet den Cursor vom Anfang des aktuellen Wortes oder, wenn zwischen den Wörtern, vom Anfang des vorherigen Wortes ab. Wortgrenzen sind die gleichen wie die von Mb verwendeten.
  • Strg-w Töte vom Cursor zum vorherigen Leerzeichen. Dies unterscheidet sich von M-, da sich die Wortgrenzen unterscheiden.
  • Strg-y Zieht den zuletzt getöteten Text zurück in den Puffer am Cursor.
  • My Drehe den Kill-Ring und ziehe das neue Oberteil. Sie können dies nur tun, wenn der vorherige Befehl Cy oder My lautet.

M ist der Metaschlüssel. Für Max OS X Terminal können Sie dafür in den Einstellungen / Tastatur "Option als Metaschlüssel verwenden" aktivieren. Für Linux ist es komplizierter.

Aktualisieren

Beachten Sie auch, dass Readline in zwei Modi betrieben werden kann:

  • Emacs-Modus (Standardeinstellung)
  • vi- Modus

So schalten Sie Bash in den vi-Modus:

$ set -o vi

Persönlich bevorzuge ich den vi-Modus, da ich vim für die Textbearbeitung verwende.

Bonus

In der macOS Terminal App (und auch in iTerm) können Sie mit gedrückter Wahltaste den Cursor bewegen (der Cursor bewegt sich an die angeklickte Position). Das funktioniert sogar drinnen vim.

Wonder.mice
quelle
3
Ich bevorzuge diese Antwort, weil sie die [Essenz / Wurzel / Grund dahinter] aufzeigt, wie die Bash-Tastatureingabe funktioniert (woher sie kommt), dh Readline.
Eugenevd
6
Im Standard-Ubuntu-Terminal ist Meta (M) Alt + Umschalt, es sei denn, Sie deaktivieren die Tastenkombinationen für den Menüzugriff. In diesem Fall ist es nur Alt.
Brianpeiris
2
In Kde in Konsole ist die Meta (M) Alt-Taste
Pipo
Das Problem ist, dass Meta + F nicht funktioniert, wenn Meta ALT ist, da ALT Zugriff auf das Menü des laufenden Programms (in diesem Fall Terminal) gewährt. Gibt es eine Alternative?
Pithikos
1
Was ist Mf, also benutzt du hier keine Kontrolle, also was ist es?
PositiveGuy
33

Halten Sie die Wahltaste gedrückt und klicken Sie auf die Stelle, an der sich der Cursor bewegen soll. Terminal bewegt den Cursor genau an dieser Stelle.

Das Leben mit Android verbinden
quelle
2
Sie haben gerade meine Effizienz dupliziert
Lay González
In welchen Umgebungen funktioniert das? Ich denke nur unter Mac OS?
Abdull
Funktioniert unter Remote-SSH-Linux, auch über einen Jump-Server.
John Jiang
10

Ich bevorzuge den vi-Bearbeitungsmodus (da diese Tastenanschläge jetzt in mein Rückenmark eingebettet sind (das Gehirn wird überhaupt nicht verwendet), zusammen mit STRG-K, STRG-X von WordStar 3.3 :-). Sie können die Befehlszeile verwenden set -o vi, um sie zu aktivieren (undset -o emacs ).

In Vi wäre es (ESC-K, um zuerst die Aufstellung zu erhalten) " f5;;B" (ohne doppelte Anführungszeichen).

Natürlich muss man verstehen, was auf dem Spiel steht, um damit durchzukommen. Im Grunde ist es

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.

Mal sehen, ob die Emacs-Liebhaber eine bessere Lösung finden können, weniger als 5 Tastenanschläge (obwohl ich keinen Religionskrieg beginnen möchte).

Haben Sie darüber nachgedacht, ob Sie diesen schrecklich langen Befehl vielleicht in ein Skript einfügen möchten? :-)

Eigentlich kann ich eins besser machen als das: " 3f5B", um das dritte Vorkommen von "5" zu finden, dann zurück zum Wortanfang.

paxdiablo
quelle
Kein Skript erforderlich - drücken Sie einfach im vi-Modus "v" und öffnen Sie die Befehlszeile in einem Editor. Sie können die Befehlszeile, err, "script" besser mit Zeilenumbrüchen formatieren, und es wird kein Tempfile benötigt. :) Also, "v / 25" bringt dich in 4 Zeichen dorthin.
Dannysauer
Dann benötigen Sie jedoch mehr als die <Eingabetaste>, um es auszuführen. @dannysauer
CDR
9

Verwenden Sie Meta-b / Meta-f, um sich jeweils um ein Wort vorwärts / rückwärts zu bewegen.

In OSX übersetzt Meta als ESC, was scheiße ist.

Alternativ können Sie auch die Terminaleinstellungen -> Einstellungen -> Profil -> Tastatur öffnen und "Option als Metataste verwenden" aktivieren.

Edson Medina
quelle
8

Führen Sie den Befehl aus, nachdem Sie ihn einmal ausgeführt haben fc

Es wird $EDITORmit dem vorherigen Befehl gestartet. Anschließend können Sie den Befehl mit Ihrem regulären Editor ändern. Wenn Sie speichern und beenden, wird die Datei ausgeführt.

..aber wie Pax sagte - die Befehlszeile ist nicht besonders gut zum Bearbeiten von absurd langen Zeilen - warum nicht den Befehl in ein Skript verwandeln?

dbr
quelle
4

Wenn Sie eine bestimmte Anzahl von Wörtern vorwärts bewegen möchten, drücken Sie M-<n>( M-für Meta und normalerweise die Escape-Taste) und dann eine Zahl. Dies sendet ein Wiederholungsargument an readline, sodass Sie jeden gewünschten Befehl wiederholen können. Wenn Sie vorwärts gehen möchten, drücken Sie M-<n> M-fund der Cursor bewegt die <n>Anzahl der Wörter vorwärts .

Z.B

 $|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"

Für Ihr Beispiel vom Cursor am Anfang der Zeile, die Sie treffen würden, M-26 M-fund Ihr Cursor würde sich am --option25|Ende der Zeile auf -oder- befinden, auf den M-26 M-bSie den Cursor setzen würden--|option25


quelle
2

Inkrementelle Verlaufssuche

Geben Sie im Terminal Folgendes ein:

gedit  ~/.inputrc

dann kopieren, einfügen und speichern

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

Alles, was Sie tun müssen, um einen vorherigen Befehl zu finden, ist die Eingabe der ersten 2 oder 3 Buchstaben. Der Aufwärtspfeil bringt Sie schnell dorthin und sagt, ich möchte:

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

Alles was ich tun muss ist einzutreten

fo

und drücken Sie den Pfeil nach oben. Der Befehl wird bald angezeigt

Alexandr
quelle
1

Eine Option ist die Verwendung M-x shellin emacs. Damit stehen alle Bearbeitungsmöglichkeiten und Tastenanschläge zur Verfügung, emacsmit C-sdenen beispielsweise der Text durchsucht werden kann option25.

(Aber ich würde es trotzdem vorziehen, stattdessen in der realen Terminal-Shell zu sein, wenn mich jemand auf gute Such- und Bearbeitungsmöglichkeiten hinweisen kann.)

Frank
quelle
0

Benütze die Maus

Manchmal ist es am einfachsten, eine Befehlszeile mit einer Maus zu bearbeiten. Einige frühere Antworten geben einen Befehl zum Öffnen Ihrer aktuellen Zeile in Ihrem $ EDITOR. Für mich (zhs mit grml config) ist diese Kombination Alt+e. Wenn Sie die Maus in Ihrem Editor aktivieren, können Sie sie verwenden.

Um die Maus in Vim zu aktivieren, fügen Sie diese zu Ihrem ~ / .vimrc hinzu

set mouse=a
set ttymouse=xterm2

Wenn Sie dann eine Textauswahl im Terminal vornehmen möchten (anstatt den Mausklick an vim zu übergeben), halten Sie die Umschalttaste gedrückt, wenn Sie auf klicken. Dies ist natürlich terminalspezifisch.

Sysadmins sollten keine Angst vor der Maus haben.

user7610
quelle
0

In Cygwin können Sie diese Funktion aktivieren, indem Sie mit der rechten Maustaste auf das Fenster klicken. Wählen Sie im Popup-Fenster Optionen ... -> Maus -> Aktivieren Klicken Sie auf Befehlszeilencursor platzieren -> Übernehmen.

Von nun an wird der Cursor durch einfaches Klicken mit der linken Maustaste an einer beliebigen Stelle in der Befehlszeile dort platziert.

Abdull
quelle
0

Erstens: export EDITOR = 'nano -m'

dann: STRG + X STRG + E nacheinander.

Ihre aktuelle Zeile wird im Nano-Editor mit aktivierter Maus geöffnet. Sie können in einen beliebigen Teil des Textes klicken und ihn bearbeiten

dann STRG + X zum Beenden und y zum Bestätigen des Speicherns.

Sunfloro
quelle
0

Ich habe ein Skript erstellt, um den Befehlszeilencursor per Mausklick zu bewegen :

  1. Aktivieren Sie die xterm-Mausverfolgungsberichterstattung
  2. Legen Sie Readline-Bindungen fest, um die durch Klicks erzeugte Escape-Sequenz zu verbrauchen

Es kann auf Github gefunden werden

Weitere Infos zu einem anderen Beitrag

Funktioniert, wenn echo -e "\e[?1000;1006;1015h" # Enable trackingbeim Klicken mit der Maus Escape-Sequenzen auf dem Terminal gedruckt werden

Tinmarino
quelle
0

Es ist vielleicht nicht das schnellste, aber dies muss hier sein, um etwas über ANSI-Cursorbewegungen zu lesen

Mit ANSI-Escape-Sequenzen können Sie den Cursor nach Belieben über den Bildschirm bewegen. Dies ist nützlicher für Vollbild- Benutzeroberflächen, die von Shell-Skripten generiert werden, kann aber auch in Eingabeaufforderungen verwendet werden . Die Bewegungsfluchtsequenzen sind wie folgt:

- 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

(...)

Versuchen Sie, an der Eingabeaufforderung die folgende Codezeile einzugeben (es ist etwas klarer, was zu tun ist, wenn sich die Eingabeaufforderung beim Einfügen mehrere Zeilen weiter unten im Terminal befindet): echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"Dies sollte den Cursor sieben Zeilen nach oben bewegen und das Wort "BASH" drucken ", und kehren Sie dann dorthin zurück, wo eine normale Eingabeaufforderung erstellt wurde.


Beispiele :

Bewegen Sie den Cursor 7 Zeilen zurück:

echo -e "\033[7A"

Bewegen Sie den Cursor auf Zeile 10, Spalte 5:

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

Geben Sie schnell Farbcodes wieder , um ein Programm einzufärben:

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