Ich möchte Inhalte in vim bearbeiten, die dynamisch über die Befehlszeile generiert wurden, ohne dass die Datei noch vorhanden ist.
Zum Beispiel:
$ echo This is example. | vim /dev/stdin
$ cat /etc/hosts | vim /dev/stdin
aber es scheitert mit den Fehlern:
Vim: Warnung: Die Eingabe erfolgt nicht über ein Terminal
Vim: Fehler beim Lesen der Eingabe, beim Beenden ...
Ist es möglich, das zu erreichen?
command-line
invocation
unix
Kenorb
quelle
quelle
:help stdin
... Es ist erstaunlich, wie schnell man die Antworten finden kann, wenn man die Frage nach der eingebauten Dokumentation stellt.Antworten:
Sie müssen
-
anstelle des Dateinamens in der Befehlszeile Folgendes verwenden:Der obige Befehl öffnet einen unbenannten Puffer, der mit dem aus der Standardeingabe gelesenen Text gefüllt ist.
quelle
-
für stdin ist für Befehlszeilentools so ziemlich Standard.Dies ist meistens nur eine spaßige Notiz über
bash
undreadline
, aber wenn Sie IhreEDITOR
Umgebungsvariable auf setzenvim
, wird durch Drücken von Ctrl+ x+ edie aktuelle Zeile in geöffnetvim
. Wenn Sie Meta(Alt/Opt/Esc)++ Ctrleingeben e, führt bash außerdem eine direkte Erweiterung der aktuellen Befehlszeile durch, dh:mit Meta(Alt/Opt/Esc)+ Ctrl+ ewürde werden
mit Ctrl+ x+ ewürde werden
Beachten Sie, dass beim Beenden von vim der Inhalt des vim-Puffers in der Befehlszeile ausgeführt wird.
Diese Funktionen sind für mich sehr nützlich, wenn ich mehrzeilige Befehle in bash ausführen möchte, z. B. für Schleifen oder Programme, die diese Anweisungen erfordern, und sie bieten eine interessante Möglichkeit, einen Teil des Befehlszeilenverlaufs zur späteren Verwendung in einer Datei zu speichern.
Um die ursprüngliche Frage zu beantworten, können Sie auch schreiben:
und drücke dann Ctrl+ x+ e, um es zu laden
vim
. Sie könnten auch haben,und do Meta(Alt/Opt/Esc)+ Ctrl+ ethen Ctrl+ x+ e, wodurch alle Hosts-Dateien in eine Zeile geschrieben und geladen werden
vim
(wahrscheinlich nicht die beste Verwendung dieser Funktionen - die Nützlichkeit dieser Methoden kann jedoch aus den wenigen diskutierten Beispielen extrapoliert werden Hier).Beachten Sie, dass ich davon ausgehen , dass Ihr
readline
gesetzt istemacs
Modus. Wenn Ihr Modus aktiviertreadline
ist,vim
können Sie die relevanten Bindungen mit dem folgenden Befehl leicht ermitteln:und Suchen nach
edit-and-execute-command
odershell-expand-line
, die wurden jeweils in Verbindung mit den Bindungen Ctrl+ x+ eund Meta(Alt/Opt/Esc)+ Ctrl+ e.quelle
set -o vi
um es einzuschalten. Dann können Sie dasv
Mapping einfach im normalen Modus verwenden, um den aktuellen Befehl in Ihrem Editor zu bearbeiten.shell-expand-line
, wenn Sie mit dieser Methode Text aus stdin lesen: 1. Entfernen Sie Zeilenumbrüche aus dem erweiterten Text und 2.edit-and-execute-command
Versuchen Sie, den im Puffer geschriebenen Befehl auszuführen , was auch immer gespeichert wird oder nicht, wenn Sie vi beenden.In Bash fand ich es nützlich, die Prozessersetzung mithilfe der
<(command)
Syntax zu verwenden. Beispiel:Siehe auch:
quelle
bash
undzsh
(und nichtsh
,ksh
,dash
,fish
,csh
,tcsh
, etc.)/proc/PID/fd/FD
. Wenn Sie den Puffer schreiben und beenden, beschwert sich Vim nicht, aber die Datei, in die Sie geschrieben haben, wird vom Betriebssystem entfernt. Wenn Sie-
als Dateinamen für den geöffneten Puffer keine Datei angeben, werden Sie gewarnt, wenn Sie versuchen, den Vorgang zu beenden, ohne Vim zu speichern (sofern Sie keinen Bang-Befehl oder ähnliches verwenden).vimdiff <(echo foo) <(echo bar)
.:next
und:prev
erneut lesen und nichts erhalten. Es ist auch erwähnenswert, dass die Prozesse nicht parallel zueinander sind - z. B.cat <(sleep 3; echo a) <(echo b)
Drucke in der richtigen Reihenfolge - und währendcat
Interleaves schreiben und lesen, daraufvim
warten, dass die Datei "fertig gelesen" wird, bevor alle außer dem äußeren Frame angezeigt werden.Wenn die Verwendung einer Pipeline für ein neues Vim nicht erforderlich ist, können Sie die Fähigkeit von Vim verwenden, die Ausgabe von Befehlen in den aktuellen Puffer zu ziehen, zusammen mit einem nicht dateibasierten Puffer (wie bei
:new
oder dem Bearbeiten einer nicht vorhandenen Datei).:read!cat /etc/hosts
Im Befehlsmodus wird die Ausgabe in Ihrem aktuellen Puffer unterhalb der aktuellen Cursorposition platziert.Abgesehen davon, dass die leere erste Zeile gelöscht werden muss, wenn dies in einem leeren Puffer erfolgt, funktioniert dies gut und ist besonders praktisch, wenn Vim bereits ausgeführt wird.
quelle