Jawaban:
Ya, mis. Jika Anda ingin melakukannya ls
, coba:
:!ls
Untuk menelurkan shell, gunakan
:shell
:w !sudo tee %
nano
Saya cenderung terbiasa ctrl+z
dengan vi tidur, menjalankan apa yang saya butuhkan di shell, kemudian fg
untuk melanjutkan vi. Bukan jawaban tepat untuk pertanyaan Anda, tetapi saya merasa ini cara yang sangat cepat untuk bekerja.
Jika Anda lupa bahwa Anda memiliki vi terbuka di latar belakang (ini bisa terjadi ketika Anda sedang sibuk), ketika Anda mencoba untuk keluar dari shell menggunakan ctrl+d
Anda akan diperingatkan bahwa Anda memiliki pekerjaan latar belakang yang sedang berjalan, dan Anda dapat menutupnya, atau tekan ctrl + d lagi untuk keluar. Juga, jika Anda mencoba membuka kembali file yang sama dua kali, Anda mendapat peringatan pemulihan, sehingga Anda dapat menekan a
untuk membatalkan, dan menjalankan fg untuk kembali ke vi.
Karena Anda menyebutkan "dapatkan stdout", perhatikan bahwa Anda dapat melakukannya
:r! command
dan output dari perintah akan ditambahkan ke file, atau
:<range>!command
agar konten rentang difilter melalui perintah [misalnya :1,$!wc
]
:%!command
terlihat cukup berguna
:.,+20 !sort
]
Idiom pilihan saya adalah
!!command
yang merupakan singkatan
:.!command
yang menyalurkan baris saat ini melalui perintah dan memasukkan output ke dalam file. Kasus paling umum bagi saya adalah mengedit perintah dengan vi dan menjalankan:
!!sh
Atau
!<motion>command
seperti (misalnya)
!apsh
untuk menjalankan seluruh paragraf saat ini melalui shell.
!}
Anda harus diposisikan di awal paragraf, coba !ap
. (Saya tidak tahu apakah ini ada di setiap vi atau hanya vim)
Dengan menggunakan titik dua dan tanda seru, Anda dapat menjalankan perintah apa pun di path shell dan skrip shell, perlu diingat bahwa perintah tersebut dijalankan di bawah pengguna yang menjalankan program vi / vim, dan menggunakan lingkungannya.
:!<command>
Karena vi menggunakan lingkungan yang berlaku saat dijalankan, ia menggunakan jalur yang sama dengan yang ada di perintah induk. Ingatlah bahwa beberapa shell menyimpan cache dari program-program di path, dan vi mungkin tidak bekerja dengan cache ini (tergantung pada shell yang digunakan dan versinya), jadi Anda mungkin menjalankan biner yang salah jika Anda memiliki lebih banyak dari satu biner dengan nama yang sama.
Anda dapat melihat output dari suatu perintah dengan mengetik, misalnya, :!ls -lh
dalam mode perintah.
Jika Anda ingin memasukkan output dari perintah ke file yang sedang Anda edit, tambahkan saja r
. Sebagai contoh :r!which perl
,.
Saya memiliki ini di .vimrc saya. Ditemukan di Stack Overflow beberapa waktu lalu:
" Executes the current line in a bash shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>
Saya akan, dan melakukan, menyelesaikan ini dengan mudah di Linux dengan membuka dua jendela baris perintah terminal, menjalankan vi dalam satu dan lainnya tersedia untuk pekerjaan lain pada saat yang sama.