Was ist der beste Weg, um sich auf einer bestimmten sehr langen Befehlszeile im Terminal zu bewegen?
Angenommen, ich habe die Pfeiltaste oder verwendet Ctrl-R um diese lange Kommandozeile zu bekommen:
./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 (beginnend am Anfang oder Ende der Zeile) auf --option25
bewegen, um dort etwas zu ändern.
Wie komme ich am schnellsten dorthin? Was ich normalerweise mache, ist Ctrl-A an den anfang kommen und dann immer wieder Alt-F Wort für Wort (oder Ctrl-E zum ende gehen und Alt-B um dann rückwärts zu gehen). Aber in einer langen Schlange dauert das zu lange. Es muss eine Möglichkeit geben, direkt zu dem zu ändernden Teil zu suchen und zu springen, z. option25
?
Da dies noch nicht abgeschlossen ist, gibt es hier einige weitere Optionen.
$FCEDIT
oder $EDITOR
oder emacs
angegebenen Editor zu öffnen (in dieser Reihenfolge versucht).option25
ein (in diesem Fall). Die Zeile wird angezeigt. Schlagen Tab um an dieser Stelle mit der Bearbeitung zu beginnen.s///
. Z.B. !-2:s/--option25/--newoption/
würde den vorletzten Befehl erneut ausführen, aber option25 ersetzen. Verwenden Sie zum Ändern des letzten Befehls ./cmd
die Syntax !string
: !./cmd:s/--option25/--newoption/
^--option25^--newoption
Ich empfehle die zweite Option. Ctrl+r Es ist sehr praktisch und schnell, es gibt keine Probleme mit den Editoren, und Sie sehen die Ergebnisse, bevor der Befehl ausgeführt wird (im Gegensatz zu den Verlaufserweiterungen).
Um es klar auszudrücken, möchten Sie nicht, dass der Cursor auf einer Terminalbefehlszeile schnell bewegt wird. Was Sie tatsächlich wollen, ist eine schnelle Möglichkeit, in Ihrem Shell-Programm über die Befehlszeile zu navigieren.
Bash ist beispielsweise eine sehr gebräuchliche Shell. Es verwendet die Bibliothek Readline , um die Eingabe über die Befehlszeile zu implementieren. Und sozusagen ist es sehr praktisch, Readline-Bindungen zu kennen, da sie nicht nur in Bash verwendet werden. Gdb verwendet beispielsweise 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-Einfügen, wenn der obige Link ausfällt:
Das Wesentliche
Bewegung
Töte und reiße
M ist Metaschlüssel. Für Max OS X Terminal können Sie unter Einstellungen/Tastatur die Option "Option als Metaschlüssel verwenden" aktivieren. Für Linux ist es komplizierter.
Update
Beachten Sie auch, dass Readline in zwei Modi betrieben werden kann:
So schalten Sie Bash in den vi-Modus um:
$ set -o vi
Ich persönlich bevorzuge 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 zur angeklickten Position). Dies funktioniert sogar in vim
.
Halten Sie die Wahltaste gedrückt, und klicken Sie an die Stelle, an der Sie den Cursor bewegen möchten. Das Terminal bewegt den Cursor an diese Stelle.
Ich neige dazu, den vi-Bearbeitungsmodus zu bevorzugen (da diese Tastatureingaben jetzt in mein Rückenmark eingebettet sind (das Gehirn wird überhaupt nicht verwendet), zusammen mit der STRG-K, der STRG-X von WordStar 3.3 :-). Sie können die Befehlszeile set -o vi
verwenden, um sie zu aktivieren (und set -o emacs
, um sie wiederherzustellen).
In Vi wäre es (ESC-K, um die Reihe zuerst zu bekommen) "f5;;B
" (ohne die doppelten Anführungszeichen).
Natürlich müssen Sie 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-Fans mit weniger als 5 Anschlägen eine bessere Lösung finden können (obwohl ich keinen Religionskrieg anfangen möchte).
Haben Sie darüber nachgedacht, ob Sie diesen schrecklich langen Befehl vielleicht in ein Skript einfügen möchten? :-)
Eigentlich kann ich besser gehen als das: "3f5B
", um das dritte Vorkommen von "5" zu finden, dann wieder bis zum Anfang des Wortes.
Nachdem Sie den Befehl einmal ausgeführt haben, führen Sie fc
aus.
Es wird $EDITOR
mit dem vorherigen Befehl gestartet. Anschließend können Sie den regulären Editor verwenden, um den Befehl zu ändern. Wenn Sie speichern und beenden, wird die Datei ausgeführt.
..aber, wie Pax sagte - die Kommandozeile ist nicht besonders gut für das Editieren absurd langer Zeilen - warum wird der Befehl nicht zu einem Skript?
Verwenden Sie Meta-b/Meta-f, um sich jeweils um ein Wort vorwärts/rückwärts zu bewegen.
In OSX wird Meta als ESC übersetzt, was nervt.
Alternativ können Sie jedoch die Terminaleinstellungen öffnen -> Einstellungen -> Profil -> Tastatur und die Option "Option als Metataste verwenden" aktivieren.
Wenn Sie eine bestimmte Anzahl von Wörtern vorwärts bewegen möchten, drücken Sie M-<n>
(M-
ist für Meta und normalerweise die Escape-Taste) und dann eine Zahl. Dadurch wird ein Wiederholungsargument an readline gesendet, sodass Sie den gewünschten Befehl wiederholen können. Wenn Sie vorwärts gehen möchten, drücken Sie M-<n> M-f
. Der Cursor bewegt sich <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 aus dem Cursor am Anfang der Zeile würden Sie M-26 M-f
drücken, und Ihr Cursor würde sich am --option25|
-oder- vom Zeilenende befinden. M-26 M-b
würde den Cursor auf --|option25
setzen.
Inkrementelle Verlaufssuche
im Terminal eingeben:
gedit ~/.inputrc
dann einfügen und speichern
"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char
um einen vorherigen Befehl zu finden, müssen Sie nur die ersten 2 oder 3 Buchstaben eingeben. Mit dem Aufwärtspfeil gelangen Sie schnell und sagen:
for f in *.mid ; do timidity "$f"; done
alles was ich tun muss, ist einzutreten
fo
der Befehl zum Aufwärtspfeil wird bald angezeigt
Eine Option ist die Verwendung von M-x Shell
in emacs
. Damit stehen alle Bearbeitungsmöglichkeiten und Tastatureingaben zur Verfügung, die emacs
enthält. Mit C-s
kann beispielsweise der Text option25
durchsucht werden.
(Aber ich würde es trotzdem vorziehen, im echten Terminal Shell zu sein, wenn mir jemand gute Such- und Bearbeitungsmöglichkeiten zeigen kann.)
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, um den Befehlszeilen-Cursor zu platzieren -> Übernehmen.
Wenn Sie nun mit der linken Maustaste an einer beliebigen Position in der Befehlszeile klicken, wird der Cursor dort positioniert.
Manchmal ist es am einfachsten, eine Befehlszeile mit einer Maus zu bearbeiten. Einige vorherige 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 davon Gebrauch machen.
Um die Maus in Vim zu aktivieren, fügen Sie dies zu ~/.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 beim Klicken die Umschalttaste gedrückt. Dies ist natürlich terminalspezifisch.
Sysadmins sollten keine Angst vor der Maus haben.
zuerst: 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 Speichervorgangs.
Ich habe ein Skript erstellt, um die Befehlszeile Cursor bei Mausklick bewegen zu lassen :
Es ist zu finden auf github
Weitere Informationen zu einem anderen Beitrag
Funktioniert, wenn beim Klicken mit der Maus echo -e "\e[?1000;1006;1015h" # Enable tracking
Escape-Sequenzen auf dem Terminal gedruckt werden