Bisakah saya mengeluarkan shell interaktif di jendela Vim?

16

Saya tahu saya bisa :!atau :r!menjalankan perintah eksternal dan secara opsional memasukkan outputnya ke dalam teks. Saya bahkan dapat melakukan :!shdan saya akan menelurkan shell yang akan hidup sampai saya keluar - tetapi sementara shell aktif, Vim 'tertidur' dan tidak dapat diakses. Saya harus keluar dari shell, dan menelurkan yang baru jika saya ingin kembali ke Vim sejenak - tidak terlalu berguna.

Saya dapat mengakses shell di ujung yang berlawanan, dengan menangguhkan Vim dengan ^Zdan mengelola pekerjaan Vim melalui bg, fgdan jobs. Ini lebih masuk akal tetapi sangat rumit dalam jangka panjang. Saya dapat menggunakan Screenjika itu tersedia (sering tidak), atau membuka beberapa jendela manajer jendela saya (dan ssh untuk menargetkan host dari masing-masing secara berurutan, untuk memiliki vim dan shell pada host jarak jauh, rumit lagi.)

Akan lebih rapi jika Vim mengizinkan saya untuk membuka sesi shell dan menyimpannya, katakanlah, di salah satu jendela (internal), atau izinkan saya untuk beralih ke sana dan kembali. Apakah hal seperti ini mungkin?

SF.
sumber
1
Jadi pada dasarnya, Anda ingin membuka shell di :split, sambil mempertahankan file di jendela lain? ... Ini kedengarannya seperti pekerjaan untuk tmux atau layar bagi saya ...
Martin Tournoij
1
@Carpetsmoker: Saya sering tidak memiliki kendali atas apa yang diinstal pada sistem jarak jauh, dan lebih sering daripada keduanya, sedangkan Vim selalu ada.
SF.
Pertimbangkan beralih ke Neovim. Sekarang memiliki emulator terminal bawaan yang bekerja cukup baik dan dapat dibuka dalam buffer vim.
Zach

Jawaban:

16

Ada beberapa plugin vim yang memungkinkan untuk ini. Saya menggunakan Conque ( Github ).

Setelah meletakkannya di direktori plugin Anda, yang harus Anda lakukan adalah:

:ConqueTermSplit bash

Dan Anda akan memiliki bash shell interaktif di vim. Anda kemudian dapat menggunakan gerakan vim biasa untuk melakukan hal lain yang mungkin ingin Anda lakukan di jendela.

Plugin lainnya adalah vimshell .

Bambu
sumber
1
Tidak ada cara untuk melakukan hal seperti ini tanpa plugin?
SF.
3
@ SF Lihat :help shell-window. (Jawaban singkat: tidak.)
muru
3

Dengan VIM saya percaya plugin yang ada untuk melakukan ini tidak terlalu bagus, meskipun IMO vimshell datang paling dekat. Namun Anda perlu memahami bahwa ini adalah masalah 2 bagian.

  1. VIM tidak dirancang untuk dapat melakukan hal-hal seperti ini, terutama yang merepotkan adalah mampu menjalankan tugas yang berjalan lama dan berbicara secara asinkron tanpa memblokir VIM. Dalam hal ini bukan hanya shell itu sendiri tetapi juga tugas-tugas lain yang mungkin Anda jalankan dalam proses shell.
  2. Filosofi modal VIM tidak berjalan baik dengan cara kita berinteraksi dengan shell. Dalam sebuah shell, hanya baris saat ini yang dapat diedit, meskipun Anda dapat menggulir dan melihat teks lama dari histori Anda dengan shell, Anda tidak dapat mengeditnya. Ini tidak sesuai dengan filosofi VIM sama sekali, jika Anda menekan ESC dan kembali ke mode normal, itu akan menjadi sangat sulit untuk melarang pengguna untuk kembali dan mengedit bagian dari sejarah di atas.

Menurut pendapat saya ada 2 pendekatan yang bekerja jauh lebih baik dalam hal ini.

  1. Menggunakan TMUX / Layar dan jendela terminal multipleks untuk mendapatkan vim dan shell. Dengan begitu keduanya terpisah dengan rapi namun Anda dapat melihat keduanya dengan sedikit usaha dan keduanya dapat bekerja sebaik mungkin tanpa saling bertentangan dengan aliran masing-masing.
  2. Menggunakan plugin seperti tpope / vim-dispatch dan suka Anda dapat dengan mudah meluncurkan satu perintah shell dan menjalankannya secara tidak sinkron di latar belakang di shell terminal aktual dan menarik kembali hasilnya ke vim setelah selesai. Ini juga memberi Anda tingkat isolasi yang sama antara keduanya dan karenanya keduanya dapat kembali bekerja sesuai kemampuan mereka tanpa menginjak kaki masing-masing.

Saya harus menambahkan bahwa ada kemungkinan besar bahwa NeoVIM dapat membawa perubahan dalam aspek ini karena salah satu tujuan utamanya adalah mampu melakukan pekerjaan secara serempak. Tapi sampai saat ini inilah yang terbaik yang bisa kami dapatkan menurut saya.

Dhruva Sagar
sumber
3

Dalam :help shell-windowkita dapat membaca tentang mengeksekusi perintah shell di jendela:

Ada pertanyaan untuk kemungkinan mengeksekusi shell di jendela di dalam Vim.

Jawabannya: Anda tidak bisa!

Termasuk ini akan menambah banyak kode ke Vim, yang merupakan alasan bagus untuk tidak melakukan ini. Bagaimanapun, Vim adalah seorang editor , ia tidak seharusnya melakukan tugas-tugas non-editing. Namun, untuk mendapatkan yang seperti ini, Anda dapat mencoba memisahkan layar terminal atau jendela tampilan dengan program " splitvt ".

Alternatifnya adalah perintah " jendela ", ditemukan pada sistem BSD Unix, yang mendukung banyak jendela yang tumpang tindih. Atau program " layar ".

Namun ada beberapa solusi yang dapat Anda gunakan:

  • penggunaan screenyang dirancang khusus untuk hal-hal semacam itu, misalnya:

    • Ctrl+ a, Suntuk membagi jendela aktif secara horizontal
    • Ctrl+ a, Tabuntuk beralih antar windows
    • Ctrl+ a, Xuntuk menghapus wilayah saat ini
    • Ctrl+ a, Quntuk menghapus semua wilayah kecuali satu

    Lihat lebih lanjut di: Panduan Survival Layar GNU di stackoverflow SE

    Atau: Pemisahan Layar GNU , layar Referensi Cepat untuk detail lebih lanjut.

  • VIM-Shell - tambalan pihak ketiga

    VIM-shell adalah ekstensi untuk VIM yang memiliki fitur split windows, dan patch ini memungkinkan untuk memulai shell di windows tersebut. Ini hanya tersedia untuk sistem POSIX

  • vterm - Terminal emulator di dalam vim.

    Tujuan dari vterm adalah untuk menyediakan klon dari terminal unix di dalam vim yang bekerja langsung dari kotak tanpa ketergantungan.

  • Vimux - mudah berinteraksi dengan tmux dari vim.

    Terinspirasi oleh tslime.vim , sebuah plugin yang memungkinkan Anda mengirim input ke tmux, vimux adalah membuat interaksi dengan tmux dari vim dengan mudah.

  • lainnya telah disebutkan: Conque

Terkait: Bagaimana menjalankan terminal di dalam vim? di stackoverflow

kenorb
sumber
Bagaimana cara menyingkirkan perpecahan ?? : - /
0xc0de
Lihat: Pemisahan Layar GNU
kenorb