Shell mit besseren Bearbeitungsmöglichkeiten

11

Shells (zumindest was ich weiß) haben wirklich schlechte Befehlsbearbeitungsfunktionen.

Beispielsweise:

  • Ich kann den Cursor nicht auf einen Punkt des Befehls richten.
  • Ich kann im Befehl keinen Text auswählen und zurücksetzen / löschen / ersetzen.

Derzeit sind diese so ablenkend, dass ich Befehle mit gedit bearbeite, bevor ich sie in das Terminal einfüge.

Gibt es eine Lösung, die für diese gut ist?

UniversallyUniqueID
quelle
2
Sie verbinden ein Terminal mit einer Shell.
JdeBP

Antworten:

13

Bash ist eigentlich ziemlich gut darin. Sie müssen nur die Verknüpfungen lernen. Zum Beispiel (im Standard-Emacs-Modus):

  • Ctrl+ A: gehe zum Zeilenanfang.
  • Ctrl+ E: Gehe zum Ende der Zeile.
  • Ctrl+ B: Bewege ein Zeichen rückwärts.
  • Ctrl+ F: Bewege ein Zeichen vorwärts.
  • Alt+ B: ein Wort rückwärts bewegen.
  • Alt+ F: ein Wort vorwärts bewegen.
  • Ctrl+ K: lösche (schneide) alles bis zum Ende der Zeile.
  • Alt+ D: Lösche (schneide) das Wort nach dem Cursor.
  • Ctrl+ W: Lösche (schneide) das Wort vor dem Cursor.
  • Ctrl+ Y: Ziehen (Einfügen), was sich im Puffer befindet (was Sie zum Beispiel mit Ctrl+ Koder Alt+ ausschneiden D)

Und es gibt noch viel mehr. Lesen Sie, um man readlinezu sehen, was noch verfügbar ist. Sie können verschiedene Verknüpfungen zuweisen, indem Sie sie einfügen ~/.inputrc. Um beispielsweise Ctrl+ Leftein Wort zurück und Ctrl+ Rightein Wort vorwärts zu bringen, fügen Sie Folgendes zu Ihrem ~/.inputrc:

"\e[1;5D": backward-word 
"\e[1;5C": forward-word

Um herauszufinden, was diese seltsamen Codes bedeuten, drücken Sie Ctrl+ Vund dann die Taste, die Sie verwenden möchten. Wenn Sie es mit Ctrl+ versuchen Right, werden Sie sehen ^[[1;5C. Ersetzen Sie ^[durch \ein ~/.inputrc.


Vielleicht möchten Sie auch in andere Muscheln schauen. Beliebte "moderne", funktionsreiche Muscheln sind:

Terdon
quelle
Mit müssen gnome-terminalSie die ESCTaste verwenden, anstatt ALT ein Wort vorwärts und rückwärts zu navigieren. . .. oder wechseln Sie zu einem Terminal, das Alt nicht als Anwendungsmenü verwendet. . . wie xterm oder sakura
Sergiy Kolodyazhnyy
@Serg nicht auf meinem System, danke. Ich weiß nicht, ob Sie es so eingerichtet haben oder ob es sich um eine von Ubuntu optimierte Standardeinstellung handelt. Esc wird jedoch oft als Synonym für Alt verwendet.
Terdon
Keine gemeinsame Nutzung von Schnittpuffern zwischen Terminals.
Craig Hicks
7

Sie können einen leeren oder teilweise eingegebenen Befehl in den Editor Ihrer Wahl bearbeiten, indem Sie EDITORden Editor Ihrer Wahl aufrufen und CTRL+ X+ Eoder CTRL+ X/ CTRL+ drücken E, wodurch die aktuell bearbeitete Zeile geöffnet wirdEDITOR ;

Wenn Sie beispielsweise auf einstellen EDITOR, geditwerden CTRL+ X+ Eund CTRL+ X/ CTRL+ angezeigtE die aktuelle Zeile in Gedit geöffnet.

Um diese eine dauerhafte Lösung zu machen, können Sie einstellen , EDITORin~/.bashrc .

Auf diese Weise können Sie den Befehl auch mit einem vollwertigen grafischen Texteditor bearbeiten. Um den bearbeiteten Befehl auszuführen, speichern und schließen Sie einfach das Dokument.


Dieselbe Funktion kann in Zsh aktiviert werden, indem Folgendes hinzugefügt wird ~/.zshrc:

autoload -U edit-command-line
zle -N edit-command-line
bindkey '^xe' edit-command-line
bindkey '^x^e' edit-command-line
kos
quelle
2
Dies kann auch mit dem fcBefehl aufgerufen werden, wenn die Variable FCEDIT gesetzt ist. Gute Antwort !
Sergiy Kolodyazhnyy
1
@Serg Danke, fcöffnet jedoch den vorherigen Befehl (der in gewisser Weise sogar ordentlicher ist). Das wusste ich nicht, danke!
Kos
6

Terminals verfügen selbst über keine Textbearbeitungsfunktionen. Terminals bieten einen Textbereich und verbinden die Tastatur mit etwas. Aber das, was Sie im Terminal ausführen, bestimmt, was es tun kann.

Shells wie diese bashsind normalerweise das erste, was Sie in einem Terminal ausführen können. Da Shells auf Befehlen basieren, können Sie nur den aktuellen Befehl bearbeiten. bietet im Vergleich zur Bourne-Shell eine hervorragende Befehlsbearbeitungcsh oder kshist kaum etwas, mit dem Sie auch nur eine Kurzgeschichte bearbeiten möchten.

Texteditoren sind einer der Befehle, die Sie in der Shell aufrufen können. Die führenden Beispiele sind und . vimoder emacsgibt Ihnen die Möglichkeit, fast alles zu bearbeiten. Beide enthalten integrierte Programmierumgebungen, um ihre Fähigkeiten auf jedes Problem auszudehnen, mit dem Sie konfrontiert sind.

Die Lösung besteht also darin, besser zu verstehen, was diese Tools tun und tun sollen, und das richtige für den Job auszuwählen .

Küken
quelle
Ich kenne den Unterschied, aber kann etwas getan werden, um die Befehlsbearbeitung von Bash zu verbessern?
UniversallyUniqueID
1
in ein Skript schreiben?
Küken
0

Normalerweise erlauben Terminals die Textauswahl mit der Maus, aber die Shell wird nicht darauf aufmerksam gemacht. Also leider weder bash, zsh, fishnoches können Maus-basierte Bearbeitung unterstützen. Ich denke, um dies zu tun, müssten sie mehr Kontrolle über das Terminal übernehmen.

Allerdings (und das ist ein bisschen weit hergeholt) , wenn Sie öffnen Vim oder GVim, und geben Sie dann unter Verwendung von Shell - Kommandos:

:!...

Dann können Sie mit der Maus auf eine beliebige Stelle in der Zeile springen . (Sie müssen :set mouse=azuerst, wenn dies noch nicht aktiviert ist.) Die Bearbeitungstasten in diesem Modus können mit angezeigt werden:help cmdline-editing

Vim hat auch einen ziemlich mächtigen Befehlsverlaufsmodus, der durch Drücken erreicht werden kann q:. Von dort aus können Sie mit den Befehlen im Normalmodus von Vim ziehen, löschen und einfügen. In diesem Modus können Sie die gewünschte Mausauswahl treffen und dann die gewünschte Funktion löschen (durch Drücken von d).

Eine wesentliche Einschränkung hierbei ist, dass Vim eine Live-Shell-Sitzung nicht tatsächlich am Laufen hält. Jeder Befehl, den Sie ausführen, wird in einem untergeordneten Prozess ausgeführt. Alle Änderungen, die der untergeordnete Prozess an Umgebungsvariablen oder Shell-Optionen vorgenommen hat, gehen verloren.

Sie können jedoch Umgebungsvariablen innerhalb des Vim-Prozesses ändern und diese über die Befehlszeile von Vim verwenden. Sie werden sogar in untergeordnete Prozesse exportiert:

:let $FOO="bar"        " the $ and the quotes are mandatory here

:echo $FOO             " Vim's own echo command
bar

:!echo "$FOO"          " Passing the variable to a shell command
bar

:!bash                 " Opening a child shell
$ echo "$FOO"
bar

Wenn Sie also so tun möchten, als wäre Vim tatsächlich eine seltsame Hülle, können Sie die erweiterten Bearbeitungsfunktionen nutzen! Der wahrscheinlich größte Nachteil ist, dass Sie jeden Befehl durch Eingabe von entweder :!oder starten müssenq:

Übrigens, wenn Sie die Ausgabe des Shell-Befehls in Ihren aktuellen Vim-Puffer übertragen möchten, können Sie dies folgendermaßen tun (aber Vorsicht, es wird Ihre aktuelle Zeile überlasten):

:,!ls
joeytwiddle
quelle