it-swarm.com.de

Schnellste Methode (n), um den Cursor auf eine Terminalbefehlszeile zu bewegen?

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?

144
Frank

Da dies noch nicht abgeschlossen ist, gibt es hier einige weitere Optionen.

  • Benutzen Ctrl+x gefolgt von Ctrl+e um die aktuelle Zeile in dem durch $FCEDIT oder $EDITOR oder emacs angegebenen Editor zu öffnen (in dieser Reihenfolge versucht).
  • Wenn Sie den Befehl früher ausgeführt haben, drücken Sie Ctrl+r Für eine Rückwärtssuche geben Sie option25 ein (in diesem Fall). Die Zeile wird angezeigt. Schlagen Tab um an dieser Stelle mit der Bearbeitung zu beginnen.
  • Verwenden Sie die Verlaufserweiterung mit dem Modifikator 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/
    Anstelle der Substitution kann ein beliebiges Trennzeichen verwendet werden.
  • Wenn Sie die vorherige Zeile bearbeiten, können Sie eine schnelle Ersetzung verwenden: ^--option25^--newoption
  • Charaktersuche. Dies wurde von Pax erwähnt und kann im regulären Emacs-Modus mit durchgeführt werden Ctrl+] für die Vorwärtssuche und Ctrl+Alt+] für die Rückwärtssuche.

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

100
Pianosaurus

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

  • Strg-b Ein Zeichen zurückspringen.
  • Strg-f Ein Zeichen vorwärts gehen.
  • [ENTF] oder [Rücktaste] Löschen Sie das Zeichen links vom Cursor.
  • Strg-d Löscht das Zeichen unter dem Cursor.
  • Strg-_ oder C-x C-u Macht den letzten Bearbeitungsbefehl rückgängig. Sie können den gesamten Vorgang 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öscht den Bildschirm und druckt die aktuelle Zeile oben erneut.

Töte und reiße

  • Strg-k Tötet den Text von der aktuellen Cursorposition bis zum Zeilenende.
  • M-d Töte vom Cursor bis zum Ende des aktuellen Wortes oder, wenn zwischen Wörtern, bis zum Ende des nächsten Wortes. Wortgrenzen sind die gleichen wie die von M-f verwendeten.
  • M- [ENTF] Bringt den Cursor an den Anfang des aktuellen Wortes oder, wenn zwischen Wörtern, an den Anfang des vorherigen Wortes. Wortgrenzen sind die gleichen wie die von M-b verwendeten.
  • Strg-w Töte vom Cursor zum vorherigen Whitespace. Dies unterscheidet sich von M-, da sich die Wortgrenzen unterscheiden.
  • Strg-y Ruckt den zuletzt getöteten Text in den Puffer am Cursor zurück.
  • M-y Drehe den Killring und ziehe das neue Oberteil. Sie können dies nur tun, wenn der vorherige Befehl C-y oder M-y ist.

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:

  • emacs-Modus (das ist die Standardeinstellung)
  • vi mode

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.

189
wonder.mice

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.

10
paxdiablo

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?

8
dbr

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.

8
Edson Medina

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.

4
user4401178

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

2
Alexandr

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

1
Frank

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.

0
Abdull

Benütze die Maus

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.

0
user7610

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.

0
Octavius

Ich habe ein Skript erstellt, um die Befehlszeile Cursor bei Mausklick bewegen zu lassen :

  1. Aktivieren Sie das xterm mouse tracking Reporting
  2. Legen Sie Readline-Bindungen fest, um die durch Klicks generierte Escape-Sequenz zu verbrauchen

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

0
tinmarino