Bagaimana cara menjalankan perintah Vim dari shell?

12

Ini mungkin pertanyaan bodoh, tapi tetaplah bersamaku.

Saya mengotomatisasi beberapa hal yang biasa saya lakukan ketika mengatur lingkungan kerja baru, dan ingin mengotomatiskan perintah Vim :BundleInstall(untuk menginstal semua plugin Vim saya).

Apakah mungkin menjalankan ini dari shell?

Atau, apakah mungkin untuk menjalankan skrip Vim, mengeksekusi :BundleInstall, menunggu sampai selesai dan berhenti?

Terima kasih.

imiric
sumber

Jawaban:

14

Dari vim(1)halaman manual:

+ {perintah}

-c {command}

{command} akan dieksekusi setelah file pertama dibaca. {command} ditafsirkan sebagai perintah Ex. Jika {perintah} berisi spasi, spasi harus diapit dengan tanda kutip ganda (ini tergantung pada shell yang digunakan). Contoh: Vim "+ set si" main.c

Catatan: Anda dapat menggunakan hingga 10 perintah "+" atau "-c".

Ignacio Vazquez-Abrams
sumber
3
Terima kasih! Aku tahu aku akan merasa bodoh ...: - / Melayani aku dengan benar karena tidak membaca halaman manual dengan seksama. Saya akhirnya menggunakan vim +BundleInstall +qall!.
imiric
4

Anda dapat menjalankan perintah Anda seperti ini:

vim -E -c BundleInstall -c q

yang akan menghindari membuka jendela Vim di terminal Anda.

Catatan: Jawaban pertama saya termasuk -sopsi yang saya perlukan untuk aplikasi lain tetapi tidak benar di sini karena itu mencegah banyak dari Vim's intizationization termasuk sumber plugin yang mendefinisikan BundleInstallperintah.

garyjohn
sumber
1
Terima kasih, tetapi untuk beberapa alasan itu tidak akan berhasil untuk saya.
imiric
1
Sekarang saya mengerti mengapa. Saya lupa bahwa -stidak lebih dari menghambat pesan-pesan tertentu - itu juga menghambat komunikasi - jadi definisi BundleInstall tidak bersumber. Salah satu cara untuk memperbaiki yang akan menambahkan pilihan seperti ini sebelum pertama -c: --cmd 'runtime plugin/bundle.vim'. Edit nama file yang sesuai. Lihat :help -s-ex.
garyjohn
2

Sementara resep khusus vim di atas adalah cara yang tepat untuk melakukannya, Anda selalu dapat menggunakan pendekatan yang lebih umum seperti autoexpect .

AnonymousLurker
sumber
0

Untuk situasi di mana Anda membutuhkan vim untuk dimuat penuh seolah-olah Anda memulainya secara manual, ini berfungsi:

vim -c "autocmd! CursorHold * <commands to run>"

Sebagai contoh, saya ingin mengarahkan output :mapke file dari shell, tetapi saya ingin menangkap pemetaan yang vim-airline ciptakan hanya setelah itu ditampilkan tabline-nya (baris di atas menunjukkan semua buffernames terbuka.) Karena sepertinya melakukan ini tidak sinkron, hanya menjalankan -credirect ke file tidak memberikan waktu untuk membuat pemetaan. Mungkin ada cara yang lebih baik, tetapi ini bekerja untuk saya, terutama karena saya sudah updatetimemenetapkan ke 100(0,1 detik), yang mempengaruhi berapa lama sampai CursorHoldacara tersebut menyala. Secara default, vim menetapkannya menjadi 4 detik.

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
pengguna1902689
sumber