Apakah mungkin untuk menjalankan skrip VIM dalam mode non-interaktif?

8

Pelacak bug Gnats memiliki perintah (edit-pr) yang membuka tiket dalam $ EDITOR. $ EDITOR saya adalah VIM, dan ketika perintah ini membuka tiket dalam $ EDITOR, saya ingin secara otomatis melakukan beberapa pengeditan naskah tanpa harus membuat penekanan tombol tambahan.

Apakah ada cara untuk menulis skrip VIM yang dapat dijalankan secara non-interaktif seperti ini?

Matt Pfefferle
sumber

Jawaban:

3

Saya tidak pernah menggunakan agas, jadi sulit untuk mengatakan apa sebenarnya edit-pryang diharapkan dilakukan. Tetapi dari apa yang Anda berikan kepada kami, Anda dapat mencoba mengubah variabel env EDITOR ke skrip shell kustom, atau bahkan mungkin skrip python atau sesuatu.

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

Tapi seperti yang saya katakan, saya tidak tahu pengeditan seperti apa yang diinginkan, atau apa yang perlu dilakukan di editor. Mungkin jika Anda memberi kami contoh apa yang ingin Anda otomatisasi?

Falmarri
sumber
Perintah Agas hanyalah sebuah contoh. Saya sedang mencari solusi umum dan saya pikir jawaban Anda adalah cara untuk pergi. Terima kasih!
Matt Pfefferle
20

Meskipun Anda sudah menerima jawaban untuk pertanyaan Anda, orang lain mungkin menemukan ini berguna.

Perintah Vim juga dapat ditentukan dalam file yang dieksekusi menggunakan -sopsi:

    vim -s commands.txt file

Contoh:

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

Ini akan menggunakan Vim untuk indentasi isi file, simpan dan keluar.

S. Christoffer Eliesen
sumber
14

Perintah Vim dapat ditentukan pada baris perintah saat Anda menjalankan program seperti ini:

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

Anda dapat terus menambahkan perintah dengan menambahkan "+[cmd]"argumen. Anda dapat mengakhiri di sana dan editor akan membuka, menjalankan perintah itu dan menunggu atau Anda, atau Anda dapat menambahkan "+:wq"untuk menyimpan dan menutup file.

Anda juga dapat menulis skrip menggunakan sintaks vimscript dan membungkusnya dalam fungsi untuk memanggil ketika file dibuka atau dalam skrip terpisah untuk mengimpor dan menerapkan buffer menggunakan sintaks di atas.

Caleb
sumber
5

Untuk melaksanakan vim dalam mode non-interaktif, Anda dapat menggunakan salah +{command}/ -c {command}atau -sparameter yang akan memungkinkan Anda untuk menjalankan perintah vim setelah file pertama sudah dibaca.

Lihat beberapa contoh di bawah ini.

Input dan output standar sederhana menggunakan pipa dapat dicapai dengan perintah:

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

Untuk mengedit satu file dan menyimpan perubahan ke yang lain:

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

Untuk mengedit file di tempat, Anda dapat menggunakannya -s {scriptin}agar file skrip dibaca, misalnya:

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

Untuk mem-parsing file dan mengirimkannya ke output pipeline, Anda dapat mencoba yang berikut:

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

atau:

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

Lihat lebih lanjut: Bagaimana cara mengedit file secara non-interaktif (mis. Dalam pipeline)? di Vim SE

kenorb
sumber
Sangat berguna! Ada yang tahu sumber daya apa yang mendukung pager Vim, mis. Di mana :hidapat digulir dan ditampilkan -- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit? Itu tidak muncul dalam daftar buffer, dan menulis dengan :wmenulis file kosong (dan keystroke 'enter' menyebabkan pager untuk menggulir atau keluar.) Saya dapat menggunakan :redir! >file | :hi | :redir END , yang menangkap sebanyak yang saya gulir. Saya pikir ini dapat bekerja secara mekanis seperti 2 arah more. Saya harus bertanya-tanya mengapa :helpdan :hitidak keduanya paged atau keduanya RO-buffered ...
John P