Ist es möglich, ein VIM-Skript in einem nicht interaktiven Modus auszuführen?

8

Der Gnats Bug Tracker verfügt über einen Befehl (edit-pr), der ein Ticket in $ EDITOR öffnet. Mein $ EDITOR ist VIM, und wenn dieser Befehl das Ticket in $ EDITOR öffnet, möchte ich automatisch einige Skriptänderungen vornehmen, ohne zusätzliche Tastenanschläge vornehmen zu müssen.

Gibt es eine Möglichkeit, ein VIM-Skript zu schreiben, das so nicht interaktiv ausgeführt werden kann?

Matt Pfefferle
quelle

Antworten:

3

Ich habe noch nie Mücken benutzt, daher ist es schwer zu sagen, was genau edit-prerwartet wird. Aber von dem, was Sie uns gegeben haben, könnten Sie versuchen, die EDITOR-env-Variable in ein benutzerdefiniertes Shell-Skript oder vielleicht sogar ein Python-Skript oder etwas anderes zu ändern.

EDITOR=/path/to/script.(sh|py) edit-pr <args>

Aber wie gesagt, ich weiß nicht, welche Art von Änderungen gewünscht werden oder was im Editor vorgenommen werden muss. Vielleicht, wenn Sie uns ein Beispiel geben würden, was Sie automatisieren möchten?

Falmarri
quelle
Der Befehl gnats war nur ein Beispiel. Ich habe nach einer allgemeinen Lösung gesucht und ich denke, Ihre Antwort ist der richtige Weg. Vielen Dank!
Matt Pfefferle
20

Obwohl Sie bereits eine Antwort auf Ihre Frage erhalten haben, finden andere dies möglicherweise hilfreich.

Vim-Befehle können auch in einer Datei angegeben werden, die mit der folgenden -sOption ausgeführt wird:

    vim -s commands.txt file

Beispiel:

    echo 'gg=G' > indent.txt
    echo ':wq' >> indent.txt
    vim -s indent.txt file

Dadurch wird Vim verwendet, um den Inhalt der Datei einzurücken, zu speichern und zu beenden.

S. Christoffer Eliesen
quelle
13

Vim-Befehle können in der Befehlszeile angegeben werden, wenn Sie das Programm wie folgt ausführen:

vim file.txt "+:s/foo/bar/g"

Sie können weiterhin Befehle hinzufügen, indem Sie "+[cmd]"Argumente hinzufügen . Sie können entweder dort enden und der Editor wird geöffnet, diese Befehle ausführen und warten oder Sie, oder Sie können ein hinzufügen "+:wq", um die Datei zu speichern und zu schließen.

Sie können ein Skript auch mit der Vimscript-Syntax schreiben und es entweder in eine Funktion einbinden, die beim Öffnen der Datei aufgerufen wird, oder in ein separates Skript, um es mithilfe der obigen Syntax zu importieren und auf den Puffer anzuwenden.

Caleb
quelle
5

Um vim im nicht interaktiven Modus auszuführen, können Sie entweder +{command}/ -c {command}oder einen -sParameter verwenden, mit dem Sie die vim-Befehle ausführen können, nachdem die erste Datei gelesen wurde.

Überprüfen Sie einige Beispiele unten.

Eine einfache Standardeingabe und -ausgabe über Pipes kann mit dem folgenden Befehl erreicht werden:

$ echo Example | vim -es '+:wq! /dev/stdout' /dev/stdin | cat

So bearbeiten Sie eine Datei und speichern die Änderungen in einer anderen:

$ vim -es '+:0,$s/127/128/g' '+:wq! new_file' /etc/hosts
$ cat file1 file2 | vim - -es '+:0,$s/foo/test/g' '+:wq! file3'

Um die Datei direkt zu bearbeiten, können Sie Folgendes verwenden, -s {scriptin}damit die Skriptdatei gelesen wird. Beispiel:

$ echo ':0,$s/foo/test/ge' > cmds.txt
$ echo ':wq' >> cmds.txt
$ vim -s cmds.txt -es file

Um die Datei zu analysieren und an die Ausgabe der Pipeline zu senden, können Sie Folgendes versuchen:

$ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+%print' '+:q!' /dev/stdin | cat

oder:

$ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+:wq! /dev/stdout' /dev/stdin | cat

Weitere Informationen: Wie bearbeite ich Dateien nicht interaktiv (z. B. in der Pipeline)? bei Vim SE

Kenorb
quelle
Sehr praktisch! Irgendeine Idee, welche Ressource Vims Pager unterstützt, z. B. wo :hiist scrollbar und zeigt -- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit? Es wird nicht in der Pufferliste angezeigt, und beim Schreiben mit wird :weine leere Datei geschrieben (und durch Drücken der Eingabetaste wird der Pager gescrollt oder beendet.) Ich kann verwenden :redir! >file | :hi | :redir END , wodurch so viel erfasst wird, wie ich scrolle. Ich denke, es kann mechanisch wie eine 2-Richtung funktionieren more. Ich muss mich fragen, warum :helpund :hisind nicht beide ausgelagert oder beide RO-gepuffert ...
John P