:!<command>
dapat digunakan untuk menjalankan perintah di shell. Tapi ini "mengambil alih" terminal saya dan mengisinya dengan stdout
perintah khusus itu.
Bagaimana cara menjalankan perintah di latar belakang yang hanya memberi tahu saya tentang kode keluar yang tidak nol?
external-command
OrangeTux
sumber
sumber
Jawaban:
:silent exec "!command"
Perhatikan bahwa sesi vim Anda masih akan ditempati saat perintah Anda dijalankan. Ini karena sifat sinkron Vim. Anda masih dapat kembali ke shell Anda dengan menekan CTRL + z (untuk mengirim Vim ke latar belakang) dan kemudian melanjutkan vim dengan perintah
fg
seperti biasa.Untuk melakukan berbagai hal secara tidak sinkron, lihatlah plugin vim-dispatch Tim Pope atau proyek NeoVim yang memiliki dukungan asli untuk eksekusi perintah asinkron, yang dapat Anda manfaatkan dengan mudah menggunakan plugin NeoMake. Versi terbaru Vim juga memiliki dukungan untuk tugas yang tidak sinkron.
Lihat : h: diam
sumber
:silent !ls
) ... Itu juga tidak dapat memberikan output yang tepat pada kode keluar non-0 ... Jadi saya khawatir ini sedikit lebih terlibat daripada hanya menggunakan:silent
...:silent exec "!ls"
atau tidak:silent !ls
menampilkan output sama sekali pada versi saya Vim, 7.4 dengan tambalan 1-213.:silent !ls
: i.stack.imgur.com/1XvS6.png ... Saya perlu menekan^L
untuk memperbaikinya lagi ...Untuk menjalankan perintah tanpa memicu pesan Enter, seperti:
coba contoh sederhana berikut ini:
Kemudian tekan Ctrl+ L(atau
:redraw!
) untuk menyegarkan layar saat kembali ke Vim.Untuk menghindari perlunya penyegaran, Anda dapat menentukan perintah khusus Anda sendiri, seperti:
Sekarang, Anda dapat menggunakan perintah Vim baru untuk menjalankan perintah shell (catatan: tanpa ! Dan dengan huruf kapital S ):
Sumber: Menghindari permintaan "Hit ENTER to continue" di situs Vim Wikia
sumber
:Silent ctags -R . > /dev/null &
dijalankan di latar belakang. Mengirim stdout ke / dev / null mencegah output muncul di buffer vim.Solusi cepat dan kotor (dalam Vimscript murni)
Ini dapat memulai proses di latar belakang:
Tetapi Vim membutuhkan cara untuk mengetahui kapan prosesnya telah selesai, dan bagaimana, jadi mari kita gunakan file marker:
Sekarang kita dapat meminta Vim untuk memeriksa sesering mungkin apakah proses telah selesai:
Hei itu tidak cantik, tapi itu semacam bekerja!
Kekurangan
Sayangnya autocmd di atas tidak akan memicu sampai Anda memindahkan kursor. Dan jika Anda ingin menjalankan lebih dari satu proses latar belakang sekaligus, Anda perlu menambahkan ID unik ke file-file itu, dan ke nama grup autocmd.
Jadi, jika Anda dapat menangani ketergantungan ekstra, Anda mungkin lebih baik menggunakan solusi yang telah dicoba dan diuji seperti plugin vim-dispatch yang disebutkan dalam jawaban lain.
Menampilkan output
Jika Anda ingin melihat output dari proses, bukan hanya kode keluar , ganti final di
echo
atas dengan:Itu akan membuka jendela pratinjau. Untuk menggunakan daftar kesalahan perbaikan cepat sebagai gantinya:
Daftar perbaikan cepat memungkinkan Anda dengan mudah menavigasi ke kesalahan menggunakan
:cnext
. Namuncopen
memindahkan kursor Anda ke jendela perbaikan cepat ketika terbuka, yang mungkin akan mengejutkan / mengganggu.(Solusi untuk itu adalah dengan membuka jendela QF dengan
:copen
ketika awalnya memulai proses, jadi Anda tidak perlu menyebutnya di akhir.)sumber
Menjalankan perintah di latar belakang
Saya menjalankan perintah yang sedikit diblokir, dan saya tidak terlalu peduli dengan hasilnya. Ini dapat diatasi dengan memulai proses yang dilampirkan bukan ke terminal / emulator melainkan ke sistem dan mengarahkan semua output ke / dev / null. Sebagai contoh:
yang
(...&)
berjalan di latar belakang dan> /dev/null
pengalihan semua output ke/dev/null
(tidak).Tanda kurung menjebak output ke dalam subkulit (atau sesuatu seperti itu), tetapi memiliki efek samping karena tidak melekat pada shell saat ini (bukan masalah besar).
Menjalankan perintah secara diam-diam di latar belakang dengan pemetaan
Aku baru sadar bahwa jika Anda berada , pada kenyataannya, pemetaan itu, Anda dapat melakukan sesuatu seperti
Di atas tidak akan menampilkan apa pun di bilah perintah dan juga tidak akan menampilkan apa pun di terminal di luar vim. Ini akan dipetakan ke
<leader>
e, yang secara \ edefault.Menjalankan perintah, menangkap outputnya, menampilkan isinya
(Suntingan lain - dan mungkin yang paling rapi). Satu ini akan menampilkan yang keluaran dari perintah jika Anda memilih demikian:
DALAM TAB BARU:
DI DALAM LAMARAN VERTIKAL:
DI DALAM KECEPATAN HORIZONTAL:
... melakukan apapun yang Anda inginkan
sumber
Jika Anda tidak peduli dengan kode keluar, Anda bisa menggunakan ini:
sumber
v:shell_error
variabel akan memberi tahu AndaTidak yakin apakah ini sesuai dengan kebutuhan Anda, (tidak menangani proses latar belakang seperti dalam
foo &
- tidak yakin apakah itu yang Anda maksud dengan "di latar belakang" ), tetapi perintah khusus dapat digunakan seperti pada:Kemudian gunakan sebagai contoh:
Jika Anda tidak perlu / ingin pesan kesalahan yang cukup sederhana
system()
, maka periksav:shell_error
dan laporkan dengan misalnyaecho Error!
.Dari bantuan v: shell_error :
sumber
foo &
..." . Dari teks Q secara keseluruhan saya menafsirkannya sebagai salah satu atau. Baik "Jalankan sebagai latar belakang perintah eksternal AKA" atau "Jalankan sebagai perintah eksternal _and_ sebagai proses latar belakang." . Saya menjawab terutama berdasarkan judul Q dll. - dan menambahkan komentar pada "Tidak yakin ..." - dan menyerahkannya ke OP untuk mengklarifikasi apakah ada atau.Vim 8 memperkenalkan dukungan pekerjaan. Seseorang dapat menjalankan perintah eksternal di latar belakang tanpa bergantung pada plugin. Misalnya, untuk menjalankan server markdown ( markserv ) di lokasi saat ini dan tidak memblokir sesi vim:
Ini memulai proses markserv sebagai sub-proses dari proses vim saat ini. Anda dapat memverifikasi ini dengan
pstree
.Lihat job_start
sumber
Saya menggunakan kode berikut:
Sekarang Anda bisa mengetik yang berikut ini
Ini hampir seperti
silent !
perintah bawaan Vim , kecuali untuk ibukotaS
. Bahkan memungkinkan untuk opsional!
untuk membuatnya terlihat lebih mirip. Panggilan untuksystem()
membuat perintah shell benar-benar diam: tidak ada layar berkedip dan tidak ada gambar ulang.(dan jika Anda memerlukan kode status, Anda dapat memeriksa
v:shell_error
variabel, lihat bantuan untuk info lebih lanjut)sumber
The AsyncRun Plugin jika dirancang untuk ini, memungkinkan Anda untuk menjalankan perintah shell di latar belakang di Vim8 / NeoVim dan menampilkan output di jendela quickfix.
Sama seperti penggantian
!
perintah:Anda juga dapat menyembunyikan output di jendela perbaikan cepat sepenuhnya:
Saat pekerjaan selesai, AsyncRun akan memberi tahu Anda dengan memberikan opsi
-post
:Script vim yang ditentukan oleh
-post
akan dieksekusi setelah pekerjaan selesai.sumber