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.

Jawaban:


45

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

:!ls

Untuk menelurkan shell, gunakan

:shell


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.


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]


:%!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.


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.


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,.


1

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


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>

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.