Es scheint eine Menge Informationen darüber zu geben, wie Sie einen Befehl mit Ihrem Editor mithilfe des Befehls "Bearbeiten und Ausführen (Cx Ce)" bearbeiten und ausführen können. Ich möchte jedoch den aktuellen Shell-Befehl anwenden Bestimmte Filterung (mithilfe eines Skripts) und Rückgabe an die Eingabeaufforderung zur weiteren Genehmigung / manuellen Änderungen vor der Ausführung. Ist das mit Bash möglich?
13
edit-and-execute-command
.Escape
+V
, aber der Befehl wird trotzdem ausgeführt. Um die Problemumgehung zu umgehen, würde ichecho
vorne hinzufügen , um sie auszuführen, indem ich den Befehl zur Überprüfung auf die Konsole drucke.Antworten:
Letztes Update meiner Erfahrung
Der Teil
0"+y$dd
in der folgenden Zuordnung ist wirklich etwas, über das Sie sorgfältig nachdenken und ihn an Ihren Geschmack / Workflow / Ihre Erfahrung anpassen sollten.Zum Beispiel habe ich sehr häufig mehrere Zeilen im Puffer gefunden, in denen ich nur die ausführen möchte, auf der sich der Cursor befindet. in diesem Fall kann ich
0"+y$dd:%d<CR>
anstelle von verwenden0"+y$dd
.Und dies ist nur eines der möglichen Szenarien.
Endgültige Antwort für diejenigen, die mögen
vim
vim
alsEDITOR
/ festVISUAL
, damit Sie eine Befehlszeile beim Bearbeitenvim
bearbeiten können.au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>
Ihre~/.vimrc
Datei zur Zuordnung Leaderd(die Sie beim Bearbeiten eines Befehls selten verwenden) der Aktion "Löschen Sie die aktuelle Zeile+
ohne die nachfolgende EOL im Register" ein.+
oder das*
Register in der obigen Zuordnung verwenden. Die Möglichkeiten zum Einfügen in das Terminal sind wahrscheinlich unterschiedlich. Sie benötigen die+clipboard
Option, damit diese Register verfügbar sind .vim
Editor fertig sind , drücken Sie EscapeLeaderd.Ursprüngliche Antwort
Ich muss oft das Gleiche tun, und ich mache es wie folgt. (Normalerweise verwende ich das
set -o vi
Inbash
, daher unterscheiden sich die Punkte 1 und 2 im Folgenden, wenn Sieset -o emacs
die Standardeinstellung verwenden. Basierend auf Ihrer Frage sieht es so aus, als ob die Punkte 1 und 2 in Ctrl+ vereint sind, xgefolgt von Ctrl+ e, was imho schwieriger zu tippen ist .)(Hier stellen Sie die Frage.)
URxvt
.Dies ist eindeutig nur eine Problemumgehung, die darin besteht, den bearbeiteten Befehl in die Zwischenablage zu kopieren, bevor der gesamte Befehl gelöscht wird, sodass beim Beenden des Editors nichts ausgeführt wird. Es ist jedoch das Beste, was ich für mich selbst bekommen kann.
Aktualisieren
Da mein
EDITOR
(undVISUAL
) gleich istvim
, bearbeite ich den Befehl beim Bearbeiten invim
.In dieser Hinsicht habe ich festgestellt, dass der Puffer benannt ist
/tmp/bash-fc.random
, wobeirandom
es sich um eine 6-stellige alphanumerische Zufallszeichenfolge handelt.Dies bietet Platz für viele Möglichkeiten, wenn Sie
vim
als Editor verwenden, da Sie in Ihrem System eine Zuordnung definieren können.vimrc
, um die gesamte Sequenz auszuführen Escape0"+y$dd:wq. Ein Befehl, den Sie beim Bearbeiten einer Befehlszeile selten verwenden würden, ist beispielsweise Leaderd: Daher können Sie den folgendenmap
Ping in Ihre.vimrc
Datei einfügenso dass Schritt 4 im obigen Rezept wird
quelle
Dies ist in Bash / readline nicht möglich, in zsh jedoch mit dem folgenden
edit-command-line
Befehl:Drücken Sie nun Control- x Control- e, um Ihren Editor zu öffnen, die Zeile zu bearbeiten und den Editor zu verlassen. Sie sehen die aktualisierte Befehlszeile, die jedoch nicht automatisch ausgeführt wird.
quelle
Jetzt, wo ich darüber nachdenke, ist vielleicht eine Variation dessen, was @kenorb in einem Kommentar vorgeschlagen hat, die beste Problemumgehung (da es anscheinend keine Lösung gibt), wenn wir uns daran halten wollen
bash
.Sie können dem Befehl ein
#
(das Kommentarzeichen inbash
) voranstellen , anstattecho
. Wenn Sie dann den Exitor verlassen, ist der Befehl unwirksam und Sie müssen nur die Taste drücken arrow up(oder k, falls Sie sie verwendenset -o vi
), entfernen#
und bestätigen.Beachten Sie, dass diese Strategie nur wenige Tastenanschläge hinzufügt, sodass sie je nach Eingabeebene ziemlich effizient sein kann.
quelle
Diese Stücke könnten Sie näher bringen:
a) Ersetzen Sie die normale Bindung für Newline Newline (Strg-M).
bind -x '"\C-M":date"
b) Nehmen Sie die aktuelle Zeile aus dem Verlauf mit
!#
Ersetzen Sie das Datum durch ein beliebiges Skript.
c) manuell bearbeiten
d) wenn nötig, irgendwie einbinden
!!:p
den neuen Befehl die Befehlszeile ein, führen Sie ihn jedoch nicht aus, sodass Sie ihn manuell bearbeiten können.e) Verwenden von Strg-J Senden des bearbeiteten Befehls anstelle eines Zeilenumbruchs
oder sie könnten nicht ....
quelle
In bash gibt es eine Option, um Befehle aus dem Verlauf zu ändern, ohne sie auszuführen. Ich bin nicht sicher, ob es möglich ist, ein Skript dafür zu verwenden, scheint nicht wahrscheinlich zu sein. Sie können jedoch Änderungen mithilfe von Verlaufsmodifikatoren vornehmen.
So sieht es aus:
quelle
Ich möchte Sie auf das Composure- Framework für Bash verweisen (ich bin nicht damit verbunden): https://github.com/erichs/composure
Es bietet
draft
undrevise
Funktionen die klingen wie sie mit helfen könnte , was Sie versuchen zu tun. Hier ist ein (langes) Zitat aus der Readme-Datei des Projekts:quelle
Zumindest mit einer Tastenkombination scheint dies nicht möglich zu sein:
quelle