Ich möchte die folgende Shell ausführen.
wea-this is the end of the second word | vim j
exit 0
Was ich gehofft hatte, würde die Tastenanschläge w
(vorwärts bewegen eines Wortes) dann e
(Ende des Wortes) dann a
(anhängen) dann -this is the end of the second word
(Text) an das genannte Vim-Dokument leiten, j
das bereits Wörter enthält.
Der folgende Fehler ist aufgetreten, als ich das Shell-Skript ausgeführt habe.
/root/bin/tt.sh: line 1: wea-this: command not found
Vim: Warning: Input is not from a terminal
Ich verwende Ubuntu 14.04. Zwei Arten von Antworten werden geschätzt:
- Verwendung von Rohrleitungen, um dieses gewünschte Ergebnis zu erzielen.
- Eine andere Methode, mit der ich "Vim-Befehle" (keine ed- oder sed-Befehle) verwenden kann, um ein Textdokument aus einem Shell-Skript heraus zu bearbeiten.
invocation
Jason Basanese
quelle
quelle
|
Zeichen leitet die Ausgabe eines Befehls an einen anderen weiter.wea-this
ist kein Befehl. Piping kann nicht verwendet werden, um das zu erreichen, was Sie tun möchten. Dies führt dazu, dass Vims Standard die Anwendung für die linke Hand ist, nicht die Tastatur. Wenn Sie in einen Puffer in vim erhalten stdin wollen, starten Sie es mit einem Minus für die Dateinamen:echo Hello, world! | vim -
.Antworten:
Um die Zeichenfolge
"hello"
in die erste Zeile der Datei einzufügenj
, können Sie den folgenden Befehl in Ihre Shell eingeben:vim +"1 | put! ='hello'" j
:1
Bewegt den Cursor in die erste Zeile des Puffers:put! ='hello'
Fügt die Zeichenfolge "Hallo" über der aktuellen Zeile einSo fügen Sie die Zeichenfolge ein
"hello"
und speichern und beenden die Datei:vim +"1 | put! ='hello' | x" j
Wie zuvor haben wir gerade den Ex-Befehl hinzugefügt, der
:x
speichert und beendet.Im Allgemeinen können Sie eine beliebige Folge von Ex-Befehlen für eine Datei, eine interaktive Shell oder ein Bash-Skript wie folgt ausführen:
vim +'Ex command1 | Ex command2 | ...' file
Wenn Sie viele Ex-Befehle haben, können Sie sie alle in eine dedizierte Datei schreiben (beispielsweise
myExCommands.vim
einen Befehl pro Zeile) und sie dann über die Shell oder ein Skript (mit dem Ex-Befehl:source
oder der Kurzversion) ausgeben:so
) so was:Bearbeiten
Wie ich sehe, haben Sie Ihre Frage bearbeitet.
Ich denke, die vorherige Antwort gilt immer noch, weil Sie jeden normalen Befehl aus dem Ex-Modus mit den Ex-Befehlen
:normal
und ausführen können:execute
.Angenommen, Sie möchten:
1G
)_
)w
)e
)a
)hello
:x
)Geben Sie dazu in der Datei
j
Folgendes in die Shell ein:Weitere Informationen finden Sie unter:
quelle
:normal
und:execute
mache was du willst?Hier ist eine Möglichkeit, einen Stream, der Vim von stdin präsentiert wird, nicht nur mit ex-Befehlen, sondern mit Befehlen im normalen Modus zu bearbeiten. Dies ist kein sehr nützliches Beispiel, aber es veranschaulicht die beteiligten Techniken. Es wird davon ausgegangen, dass Ihre Shell bash ist.
Das
-
am Ende weist Vim an, Text (nicht Befehle) von stdin zu lesen. Das-s
weist Vim an, Tastatureingaben aus der angegebenen Datei auszuführen. In diesem Fall ist die Datei die Ausgabe einer Bash-Prozessersetzung. Das<(...)
wird durch den Namen einer Named Pipe ersetzt. Die Ausgabe der Pipe ist die Ausgabe des Befehls in Klammern. Daswcwred\e
bewegt den Cursor um ein Wort und ändert das nächste Wort inred
. Das:wq! foo\n
speichert das Ergebnis in die Dateifoo
selbst wenn die Datei bereits vorhanden. Das Endergebnis ist eine Dateifoo
mit dem Namen, die den Text enthältThe red fox jumped.
Weitere Informationen zu einigen dieser Themen finden Sie unter
Siehe auch den
Process Substitution
Abschnitt derbash(1)
Manpage.quelle
vimx () { vi -s <(echo "$1"':wq') "$2" &> /dev/null; }
. Jetzt kann ichvimx 'iThe brow fox jumped.\e' foo; vimx 'wcwred\efjdwiclimbed\e' foo; cat foo
. Ordentlich!Ich fand die Methode, die Ausgabe eines Programms als von der Sub-Shell umgeleitet zu betrachten, sehr einfach:
Beispiel:
quelle
Ich hatte genau den gleichen Wunsch wie Sie: Ich wollte normale vim-Befehle schreiben und diese einen Pipeline-Stream bearbeiten lassen. Ich war enttäuscht über die Schwierigkeit, normales Vim auf diese Weise zu verwenden (so viele Flags!), Wie es die vim-Standardoptionen bieten.
Deshalb habe ich auf vim einen kleinen Wrapper geschrieben: https://github.com/MilesCranmer/vim-stream/ . Es heißt
vims
.Das Herzstück des Wrappers ist der folgende Befehl:
Wenn ich das benutze, funktioniert es bei der Befehlsgenerierung ziemlich präzise, und da vim ein Modal-Editor ist, habe ich
vims
einen Modal-Stream-Editor erstellt. Es gibt drei Hauptmodi, die für das Bearbeiten von Pipelines nützlich sind:Schau dir das an:
Geht also
e
zum EndeHello
unda
fängt dann an anzuhängen.Etwas ausgefalleneres im Exe-Modus, um Zeilen mit dem Inhalt zu kommentieren
my_bad_var
und die vorhergehende Zeile zu löschen.Das heißt
vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'
- derI
Befehl zum Starten des Einfügens am Zeilenanfang und//
die Kommentarsequenz.\<esc>kdd
drückt die Escape-Taste, rückt eine Zeile nach oben und löscht die Zeile.Ich habe insgesamt 11 Beispiele auf dem Repo. Ich ermutige Sie, sie zu überprüfen. Auch dies läuft auf vim, es ist nur eine Möglichkeit, vim für Streaming-Eingaben ähnlicher zu machen (aber all Ihre geliebten vim-Makros zu erhalten!)
quelle
Dies ist eine ziemlich alte Frage, aber ich war der Meinung, dass es sich lohnt, dazu beizutragen, dass
moreutils
Sie sie installieren und einfachvipe
als Standardzusatz verwenden können, umvim
:moreutils
ist auch für seine anderen Tools sehr praktisch und ich würde sie wärmstens empfehlen, wenn Sie ein ernsthafter Kommandozeilenbenutzer sind! :) Weitere Informationen finden Sie in der Einführung des Autors (vorheriger Link).moreutils
sollte für die meisten * nix-ähnlichen Distributionen generell über einen Paketmanager und über Homebrew auf dem Mac verfügbar sein . Beispielsweise...moreutils
ist auch Teil des MSYS2-Paket-Repositorys , sodass Sie es technisch auch unter Windows verwenden können. :)quelle