Bagaimana cara menjalankan perintah shell di dalam Vim seperti yang dilakukan Gary Bernhardt di screencastnya?
Saya sedang menonton screencast Destroy All Software karya Gary Bernhardt , khususnya A Compiler from Scratch . Di sana, dia menjalankan perintah shell tanpa meninggalkan Vim. Saya hampir yakin dia hanya menggunakan sintaks Vim normal, misalnya pada tanda 1 menit: :!chmod u+x compiler.rb
. Jika saya melakukan itu di komputer saya, jendela akan beralih untuk menjalankan perintah shell dan kemudian saya harus menekan Enter untuk kembali ke editor. Menurut saya, ini adalah perilaku normal Vim, dan orang lain telah menanyakan hal ini sebelumnya, tetapi menurut saya jawaban apa pun tidak seperti yang dilakukan Gary.
Saya melihat .vimrcfile- nya , khususnya versi terakhir sebelum screencast diunggah, tetapi tidak tahu apa yang mungkin dia ubah untuk mendapatkan perilaku yang saya cari. Saya telah mengunduhnya tetapi perilaku saya masih belum benar, jadi saya jelas melewatkan sesuatu. Sepertinya tidak ada pluginnya yang terkait dengan ini, jadi kebanyakan saya mengabaikannya.
Saya hampir yakin bahwa aku tidak mencari solusi yang menggunakan tmux, atau hal-hal seperti :split
, :term
, :below terminal
, atau :silent
. Saya juga tidak mencari jawaban yang menggunakan sesuatu selain Vim, saya yakin Gary hanya menggunakan Vim dan beberapa plugin.
Saya menonton screencast Gary di mana dia secara khusus berbicara tentang Vim tetapi dia tidak menjawab pertanyaan ini (atau saya tidak memahaminya), jadi jika seseorang telah mengetahui cara menggunakan :! <shell command>
tanpa meninggalkan editor teks, saya akan sangat menghargai jika Anda dapat membantu saya menyelesaikan ini. Saya telah menguji opsi yang saya sebutkan sebelumnya baik di Mac dan Linux tetapi tidak ada yang berhasil seperti yang saya inginkan, dan saya akan senang dengan solusi yang berfungsi di kedua platform.
Jawaban
Videonya berlalu dengan cepat, tetapi saya menghentikannya dan sepertinya saya melihatnya mengetik yang berikut ini:
:!chmod u+x %
Yang kemudian menghasilkan keluaran ini:
:!chmod u+x compiler.rb
[No write since last change]
"compiler.rb" 5L, 42C
Press ENTER or type command to continue
Jadi, sebenarnya, Vim tidak cepat untuk "tekan ENTER" setelah perintah selesai, tetapi tampaknya dia ditekan begitu cepat (mungkin dia mengharapkan itu sudah? Atau mungkin dia mulai menekan perintah berikut?) Bahwa tampaknya pesan itu dilewati.
Ada dua pengaturan yang relevan di sini, yang pertama untuk mencegah peralihan dari layar alternatif saat menjalankan perintah dan yang kedua untuk memuat ulang file secara otomatis setelah diubah oleh perintah eksternal (meskipun hanya izin yang diubah.)
Melihat repositori dotfiles GitHub-nya, kita sebenarnya dapat melihat kedua pengaturan di vimrc pada 2017-06-29 (saat video itu diterbitkan.)
- Mengonfigurasi Vim agar tidak beralih dari layar alternatif dikonfigurasi dengan cuplikan ini :
" Prevent Vim from clobbering the scrollback buffer. See
" http://www.shallowsky.com/linux/noaltscreen.html
set t_ti= t_te=
- Konfigurasi Vim untuk memuat ulang file secara otomatis setelah operasi eksternal dilakukan dengan pengaturan ini :
set autoread
Dengan kedua pengaturan ini aktif, saya hampir dapat mereproduksi efek yang sama, kecuali saya tidak mendapatkan [No write since last change]
pesannya. Saya tidak begitu yakin dari mana asalnya, karena sejauh yang saya tahu dia baru saja menulis file tepat sebelum chmod
perintah. (Sebagai bukti, baris status tidak menunjukkan di [+]
samping nama file, yang akan menunjukkan buffer yang telah dimodifikasi.)
Mungkin itu sesuatu yang lain dari vimrc-nya ... Secara teori, seharusnya mungkin untuk mendapatkannya dari GitHub dan mencoba hal yang sama. Sepertinya video tersebut menggunakan Vim 7.4, jadi itu mungkin bagian darinya juga.
Masih melihat repo dotfiles GitHub-nya, sepertinya dia kembali mengizinkan Vim untuk memanjat buffer scrollback , jadi dia berubah pikiran pada bagian itu.
Jika bagian itu masih menarik minat Anda, Anda dapat melihat plug-in vim-altscreen , yang mengimplementasikan perilaku itu, dengan beberapa kontrol di sekitarnya. Lihat juga diskusi tentang pertanyaan "Perbedaan antara :!{cmd}dan :w !{cmd}tentang layar alternatif" , khususnya jawaban luar biasa @ user938271 .