Perintah Bash di dalam vi

33

Apakah mungkin untuk mengetikkan perintah bash di dalam vi dan mendapatkan stdout?

Saya merasa sering membosankan untuk menutup dan membuka kembali vi hanya karena saya ingin mencari sesuatu di shell.

harpa
sumber

Jawaban:

45

Ya, mis. Jika Anda ingin melakukannya ls, coba:

:!ls

Untuk menelurkan shell, gunakan

:shell

bunga aster
sumber
luar biasa, bagaimana saya bisa hidup tanpa ini?
Harpa
3
Sebenarnya sesuatu yang sering saya lakukan adalah lupa menjalankan vi sebagai root saat mengedit sesuatu. Perintah ini telah menyelamatkan saya dari penulisan ulang yang panjang lebih dari yang bisa saya ingat. :w !sudo tee %
Mark D
1
Saya berharap ada beberapa cara untuk melakukan ini di gnunano
ixtmixilix
1
dan kemudian bagaimana Anda kembali ke editor setelah menggunakan: shell?
VaTo
@VaTo: Untuk kembali, Anda dapat mengetik: keluar
Raman Kathpalia
12

Saya cenderung terbiasa ctrl+zdengan vi tidur, menjalankan apa yang saya butuhkan di shell, kemudian fguntuk 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+dAnda 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 auntuk membatalkan, dan menjalankan fg untuk kembali ke vi.

Rqomey
sumber
1
Ini bisa menjadi lengket jika Anda terjebak dalam apa yang Anda lakukan pada baris perintah, dan lupa bahwa Anda memiliki vim latar belakang.
Eliot Ball
1
Ya, itu mungkin, saya sudah melakukannya sendiri. Bagi saya itu layak untuk memiliki kekonstanan shell. Saya akan memperbarui jawaban saya untuk mempertimbangkan komentar Anda
Rqomey
1
Saya pikir Anda akan lebih baik menggunakan layar gnu.
user606723
1
Saya menggunakan tmux sendiri ... tetapi untuk kecepatan, dan jika masuk ke server tanpa tmux atau layar, ini berguna
Rqomey
11

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]

Random832
sumber
:%!commandterlihat cukup berguna
Eliot Ball
Saya sering menggunakan ini untuk menyortir garis [mis. :.,+20 !sort]
Walter A
5

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.

Liudvikas Bukys
sumber
2
Catatan untuk !}Anda harus diposisikan di awal paragraf, coba !ap. (Saya tidak tahu apakah ini ada di setiap vi atau hanya vim)
Random832
4

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.

Didi Kohen
sumber
4

Anda dapat melihat output dari suatu perintah dengan mengetik, misalnya, :!ls -lhdalam mode perintah.

Jika Anda ingin memasukkan output dari perintah ke file yang sedang Anda edit, tambahkan saja r. Sebagai contoh :r!which perl,.

Eliot Ball
sumber
1

Menggunakan !jelas merupakan jawaban yang benar, tetapi jika Anda sering bolak-balik, sesuatu seperti layar atau tmux mungkin juga membantu.

Ryan A.
sumber
0

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>
Clayton Stanley
sumber
0

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.

Harry Weston
sumber