Menekan output dari autocomand vim

13

Saya memiliki perintah otomatis yang ditentukan dalam vimrc saya:

au BufWritePost * !./make.sh

Script make.shmengkompilasi .texfile 3 kali dan saya tidak ingin output ditampilkan.

Apakah ada cara untuk menekan output?

Saya mencoba menambahkan silentsatu baris sebelum auperintah, tetapi tidak berhasil. Saya juga mencoba cara ini tanpa hasil.

Andre Herman Bezerra
sumber

Jawaban:

20

Diam harus pergi sebelum !./make.sh, bukan sebelumnya au. Menempatkan silentsebelum auberarti akan mendaftarkan perintah otomatis secara diam-diam. Seharusnya terlihat seperti ini:

au BufWritePost * silent! !./make.sh

Satu masalah dengan menjalankan perintah eksternal seperti ini dengan :silentperintah adalah bahwa layar tidak redraw, meninggalkan Anda dengan layar kosong. Namun, vim memang memiliki perintah yang menggambar ulang layar, yang dapat digunakan seperti:

au BufWritePost * silent! execute "!./make.sh >/dev/null 2>&1" | redraw!

Alasan saya perlu menggunakan perintah eksekusi adalah karena :!perintah tersebut menggunakan karakter apa pun yang ditemukan setelahnya, yang berarti saya tidak bisa melakukannya silent! !./make.sh | redraw!karena bash akan mencoba menginterpretasikan semua karakter setelahnya !.

Catatan

Perhatikan bahwa :silent!mengabaikan pesan kesalahan, sedangkan :silenttidak. Juga, >/dev/null 2>&1bagian ini mengalihkan semua output !./make.shke /dev/null. Anda dapat membaca lebih lanjut tentang saya / redirection di bash di sini .

Topik Bantuan yang Relevan

  • :help :execute
  • :help :silent
  • :help :!
  • :help :bar
Pohon cemara
sumber
Perintah kedua berhasil, meskipun masih mencetak output di layar. Selain itu, saya tidak perlu menekan Enter saat skrip berakhir lagi, ini bagus. Tapi saya ingin tahu apakah ada cara untuk benar-benar menekan output.
Andre Herman Bezerra
1
Apakah mengganti execute "!./make.sh"dengan execute "!./make.sh >/dev/null 2>&1"bantuan? Ini mengalihkan semua output dari perintah ke /dev/null. Baca tldp.org/LDP/abs/html/io-redirection.html untuk informasi lebih lanjut tentang pengalihan di bash.
EvergreenTree
Aku seharusnya memikirkan itu! Berhasil. Terima kasih!
Andre Herman Bezerra
7

Jawaban atas pertanyaan langsung Anda sama seperti yang dikirim oleh @EvergreenTree. Namun saya merasa seperti Anda kehilangan beberapa alat builtin Vim untuk membangun / mengkompilasi / proyek linting. Terutama :makedan daftar perbaikan cepat.

Apa gunanya :makemembuat kita?

Menggunakan :makememungkinkan Anda untuk mengumpulkan kesalahan Anda menjadi daftar yang dikenal sebagai daftar perbaikan cepat. Menggunakan perbaikan cepat, Anda dapat menavigasi antara kesalahan dalam file Anda, sehingga Anda melompat langsung ke tempat kompiler mengatakan kesalahan itu (berguna kan?).

:membuat

Menjalankan :makeakan menjalankan program make 'makeprg',. Kemudian parsing output dengan 'errorformat'dan masukkan setiap entri ke daftar perbaikan cepat.

Biasanya 'makeprg'default untuk makeperintah yang menjalankan a Makefile. Namun Anda dapat mengubah Anda 'makeprg'melalui :compilerperintah atau mengaturnya secara langsung.

Anda juga dapat memberikan argumen tambahan :make. misalnya:make clean

Catatan: menjalankan :makeakan sering menampilkan output dari perintah di bagian bawah layar dengan permintaan yang meminta untuk menekan enter. Cukup tekan enter karena semua output akan tersedia dalam daftar perbaikan cepat. Anda dapat menekan ini melalui :silent, mis :silent make.

Perintah khusus umum untuk make diam adalah:

command -nargs=* -bar Smake silent make <args> <bar> cwindow

daftar perbaikan cepat

Setelah Anda menjalankan :makedaftar perbaikan cepat Anda akan menahan output dari kompiler.

Gunakan perintah berikut untuk menavigasi daftar perbaikan cepat.

  • :copen untuk membuka jendela perbaikan cepat
  • :cclose untuk menutup jendela perbaikan cepat
  • :cnext/ :cprevuntuk pindah ke item berikutnya / sebelumnya
  • :ccuntuk mencetak di bagian bawah kesalahan saat ini atau :cc 3untuk menunjukkan kesalahan tertentu dalam contoh ini 3

Secara pribadi saya menggunakan plugin Tim Pope yang tidak rusak untuk menavigasi daftar perbaikan cepat.

Bagaimana dengan berlari :makesecara otomatis dan diam-diam?

Anda bisa melakukan ini dengan :autocmdsama seperti Anda di mana.

augroup auto_make
    autocmd!
    autocmd BufWritePost * silent make
    autocmd QuickFixCmdPost *make* cwindow
augroup END

Sebagai bonus saya menambahkan membuka jendela perbaikan cepat :cwindowjika ada kesalahan.

Catatan: Harus lebih spesifik dengan pola file pada BufWritePostautocmd sehingga file yang tidak terkait tidak dibuat.

Masih ada lagi ?!

Ini hanya menggunakan beberapa perintah built-in Vim plus beberapa autocmd untuk meyakinkan. Tentu saja ada plugin dan alat yang dapat membantu Anda

  • Dispatch.vim dapat digunakan untuk menjalankan :makepekerjaan secara tidak sinkron.
  • Syntastic pemeriksaan sintaks Plugin mengajukan setelah :write.
  • Ale.vim (Asynchronous Lint Engine) adalah sebuah plugin untuk menyediakan linting di NeoVim dan Vim 8 saat Anda mengedit file teks Anda.
  • Unimpaired.vim memudahkan pengelolaan daftar perbaikan cepat.
  • Makefiles tua polos. Kecuali jika Anda ./script.shsangat rumit, Anda mungkin ingin menggunakan make. Ini dapat skala melakukan lebih banyak tugas nanti dan merupakan alat bangunan umum.
  • Anda dapat menggunakan Vim Awesome untuk mencari lebih banyak plugin yang mungkin membantu.

Kesimpulan

Secara pribadi saya mengintegrasikan :makedan perbaikan cepat ke dalam alur kerja saya sendiri. Saya percaya menangkap output dari proses build Anda dan menangkap kesalahan agar bernilai investasi. Sebagai bonus tambahan, Anda mungkin akan lebih nyaman dengan daftar perbaikan cepat dan dapat menggunakan daftar untuk aplikasi lain seperti :grep.

Untuk bantuan lebih lanjut lihat:

:h :make
:h quickfix
:h 'makeprg'
:h 'errorformat'
:h :compiler
:h :copen
:h :cwindow
:h :cnext
:h :cc
Peter Rincker
sumber
Saya memikirkan :makesementara saya menjawab ini, tetapi saya tidak memasukkannya. Ini adalah ide yang lebih baik untuk menggunakan make foreompile things.
EvergreenTree
cara mengubah autocmd untuk hanya menjalankan makeprg pada file tertentu.
Ibn Saeed