È possibile eseguire uno script VIM in modalità non interattiva?


8

Il bug tracker di Gnats ha un comando (edit-pr) che apre un ticket in $ EDITOR. Il mio $ EDITOR è VIM e quando questo comando apre il ticket in $ EDITOR, mi piacerebbe eseguire automaticamente alcune modifiche con script senza dover effettuare ulteriori battiture.

C'è un modo per scrivere uno script VIM che può essere eseguito in modo non interattivo in questo modo?

Risposte:


3

Non ho mai usato moscerini, quindi è difficile dire cosa edit-prsi aspetta esattamente da fare. Ma da quello che ci hai dato, potresti provare a cambiare la variabile env EDITOR in uno script di shell personalizzato, o forse anche uno script di Python o qualcosa del genere.

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

Ma come ho detto, non so che tipo di modifiche voglia o cosa debba essere fatto nell'editor. Forse se ci fornissi un esempio di ciò che vorresti automatizzare?


Il comando gnats era solo un esempio. Stavo cercando una soluzione generale e penso che la tua risposta sia la strada da percorrere. Grazie!
Matt Pfefferle,

20

Anche se hai già ricevuto una risposta alla tua domanda, altri potrebbero trovarlo utile.

I comandi di Vim possono anche essere specificati in un file che viene eseguito usando l' -sopzione:

    vim -s commands.txt file

Esempio:

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

Questo utilizzerà Vim per indentare il contenuto del file, salvare ed uscire.


14

I comandi di Vim possono essere specificati sulla riga di comando quando si esegue il programma in questo modo:

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

Puoi continuare ad aggiungere comandi aggiungendo "+[cmd]"argomenti. Puoi finire lì e l'editor si aprirà, eseguirà quei comandi e attendi o tu, oppure puoi aggiungere un "+:wq"per salvare e chiudere il file.

Puoi anche scrivere uno script usando la sintassi di vimscript e racchiuderlo in una funzione da chiamare quando il file si apre o in uno script separato da importare e applicare al buffer usando la sintassi sopra.


5

Per eseguire vim in modalità non interattiva, è possibile utilizzare uno dei parametri +{command}/ -c {command}o -sche consente di eseguire i comandi vim dopo aver letto il primo file.

Controlla alcuni esempi di seguito.

Tramite il comando è possibile ottenere semplici input e output standard tramite pipe:

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

Per modificare un file e salvare le modifiche in un altro:

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

Per modificare il file sul posto, è possibile utilizzare in -s {scriptin}modo da leggere il file di script, ad esempio:

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

Per analizzare il file e inviarlo all'output della pipeline, è possibile provare quanto segue:

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

o:

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

Vedi di più: Come modificare i file in modo non interattivo (ad es. In pipeline)? a Vim SE


Molto maneggevole! Hai idea di quale risorsa supporti il ​​cercapersone di Vim, ad es. Dove :hiè scorrevole e mostra -- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit? Non viene visualizzato nell'elenco dei buffer e la scrittura con :wscrive un file vuoto (e la sequenza di tasti 'invio' fa scorrere o uscire dal cercapersone.) Posso usare :redir! >file | :hi | :redir END , che cattura tanto quanto faccio scorrere. Penso che potrebbe funzionare meccanicamente come un bidirezionale more. Devo chiedermi perché :helpe :hinon sono entrambi cercapersone o entrambi con buffer RO ...
John P
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.