Ich habe manchmal versucht, Vim folgendermaßen aufzurufen xargs
:
find . -name '*.java' | xargs vim
… Welche Art von Arbeiten:
Beim Start von Vim wird die folgende Warnung kurz angezeigt:
Vim: Warning: Input is not from a terminal
- Das Bearbeiten funktioniert -
:files
listet alle.java
Dateien wie erwartet korrekt auf . - Ich kann sparen und kündigen.
Nach dem Verlassen von Vim ist mein Terminal jedoch nicht mehr erreichbar:
- Was auch immer ich an der Shell-Eingabeaufforderung eingebe, wird nicht wiedergegeben.
- Wagenrückläufe werden überhaupt nicht angezeigt, und Zeilenvorschübe werden nur manchmal angezeigt.
Dies geht so lange weiter, bis ich einen reset(1)
Befehl zum Reinitialisieren des Terminals erteile.
Ist dies ein Vim-Fehler oder gibt es eine zufriedenstellendere Erklärung für die Interaktion mit dem Terminal? Ich habe es auf Vim bis Version 7.3 (die Version scheint keine Rolle zu spielen) unter Linux und verschiedenen Unices gesehen.
Ich kenne eine Problemumgehung, nämlich vim $(find . -name '*.java')
. Andere Problemumgehungen wären willkommen, obwohl das nicht meine Hauptfrage ist.
terminal
invocation
unix
quit
200_erfolg
quelle
quelle
xargs
Verwendet einen Dummystdin
, der von Vim nicht verwendet werden kann, und bricht ab alles danach.Antworten:
Dies passiert, wenn vim aufgerufen wird und mit der Ausgabe der vorherigen Pipeline verbunden ist, anstatt mit dem Terminal, und wenn es andere unerwartete Eingaben empfängt (wie z. B. NULs). Das gleiche passiert , wenn Sie laufen:
vim < /dev/null
, soreset
Befehl in diesem Fall hilft. Dies erklärt sich auch durch die Grawity beim Superuser .Wenn Sie
find
zum Übergeben von Dateinamen zum Bearbeiten verwenden, müssen Sie nicht Folgendesxargs
verwenden-exec
:Wenn Sie verwenden möchten
xargs
, sollten Sie unter Unix / macOS-o
Parameter verwenden, wie:oder:
Hinweis: Die Verwendung von
-print0
/-0
unterstützt Dateinamen mit Leerzeichen.find
+ BSDxargs
Unter Unix / macOS können Sie die folgende Problemumgehung ausprobieren:
Sie können auch die Befehlssubstitutionssyntax verwenden , zum Beispiel:
Verwenden Sie alternativ GNU
parallel
anstelle vonxargs
, um die Zuweisung von tty zu erzwingen. Beispiel:Hinweis: Unter
parallel
Unix / OSX funktioniert es nicht, da es andere Parameter hat und tty nicht unterstützt.Viele andere beliebte Befehle bieten ebenfalls eine Pseudotty-Zuweisung (wie
-t
inssh
). Suchen Sie daher nach Hilfe.Ein anderer Vorschlag wäre:
ex
Befehlszeileneditor zum Parsen der Daten oder Verwenden des Ex-Modus. Weitere Informationen finden Sie unter:Wie bearbeite ich Dateien nicht interaktiv (zB in der Pipeline)?
vipe
(eine Vim-Kommando-Pipe)benutze das folgende einfache Skript:
Verbunden:
grep -l .. | xargs vim
generiert eine Warnung, warum? [dup] bei Unix SEquelle
xargs
hat nicht-J
. Dies scheint eine MacOS (BSD) -Option zu sein, die in der GNU-Version nicht vorhanden ist.Umgehungsvorschlag: Verwenden Sie einen Puffer als Dateisystemnavigator
Verwenden Sie den
vim -
Befehl, um eine Liste der Pfade von stdin zu lesen. Vims:help --
erklärt dies: 1Sie können dann gfoder verwenden Ctrl-wCtrl-f, um zu der Datei im selben Puffer oder in einem neuen geteilten Fenster zu navigieren.
Umgehungsvorschlag: Argumentliste
Eine andere gute Möglichkeit ist die Verwendung der Argumentliste des Vim. Der
:argadd **/*.java
Befehl füllt die Argumentliste von Vim rekursiv mit allen im aktuellen Verzeichnis gefundenen Java-Dateien. Sie können dann mit:next
und:prev
zwischen den Dateien wechseln.1 Der erste
-
teilt Vim mit, dass Sie in der Hilfe nach einer Befehlszeilenoption suchen möchten, der zweite ist das Befehlszeilenflag, nach dem Sie suchen. Lesen Sie:help help-context
weitere Tricks wie diese.quelle
Außerdem
reset
können Sie versuchen:Damit sollte Ihr Terminal auch wieder einsatzbereit sein.
Erläuterungen dazu finden Sie hier . Und irgendwie kann dies als vim Fehlverhalten angesehen werden, zumindest hat Neovim dieses Problem im Moment nicht.
quelle
reset
sollte auch.Der Grund dafür ist , dass
xargs
Sätzestdin
auf der/dev/null
Erwägung, dassvim
Bedürfnissestdin
zu sein/dev/tty
.BSD
xargs
(zB Mac) Lösung:-o
die Sätzestdin
Kind Prozess von xarg (vim
in diesem Fall)dev/tty
.GNU
xargs
(zB Linux) Lösung:GNU
xargs
hat keine-o
Option. Stattdessen müssen Sie eine kompliziertere Problemumgehung verwenden. (Hinweis: Es ist sehr wichtig, die nachfolgendezero
Zeichenfolge zu haben. Vergessen Sie sie nicht.)Sie können es auch zu einem Alias machen:
Detaillierte Erklärung der GNU xargs-Lösung
Lassen Sie es uns Schritt für Schritt aufschlüsseln:
1.
xargs
Hängt einfach dasstdin
an das Ende der Zeichenkette an undxargs
führt dies aus:2. Das Format für
bash -c
istbash -c 'COMMAND_STRING' $0 $1 $2 etc
."$@"
wird zu den Positionsparametern"$1", "$2"
usw. erweitert. "$ 0" ist nicht enthalten, da dies ein spezieller Parameter für den Skriptnamen und kein Positionsparameter ist. Aus diesem Grund müssen wir die Dummy-Zeichenfolge hinzufügenzero
(es kann sich um eine beliebige Zeichenfolge handeln), für die Platz genommen werden soll$0
. Andernfalls verlieren Sie die erste Datei.Nachdem Sie also expandiert haben
"$@"
, erhalten Sie:3.
bash -c
führt den COMMAND_STRING aus:</dev/tty
setzt dasstdin
auf,/dev/tty
damitvim
im interaktiven Modus gearbeitet werden kann.quelle
$0
Platzhalter (hier "Null") ist der Schlüssel.Ich habe festgestellt, dass all diese Antworten fehlen. Nach dem Durcharbeiten des xargs-Problems ist für mich der einfachste Weg, diese Such- und Öffnungsvorgänge für ein generisches Feld durchzuführen, der folgende:
Ich habe kein Problem
find
mitxargs
undgrep
, aber ich finde die Syntax ärgerlich. Und als täglicher Programmierer, dervim
und das Terminal als IDE verwendet und Dateien ständig nach Eigenschaften durchsucht, habe ich dies verwendet.Es gibt eine Zeit und einen Ort für das
find . -path ./node_modules -prune -o -name '*.js' | xargs grep -i mySearchTerm
Öffnen von Dateien über vim und andere Methoden. Für mich ist das selten.Hoffe das hilft jemandem.
quelle
$(...)
stattdessen zu verwenden . Es ist in Ihrer Befehlszeile nicht so wichtig wie in einem Skript, aber ich denke, es ist immer noch besser, dies in Ihren Antworten zu verwenden :) (Verweise hier und hier )