Bagaimana cara menjalankan terminal di dalam Vim?

306

Saya sudah terbiasa dengan Emacs, tetapi saya mencoba Vim untuk melihat mana yang saya sukai.

Satu hal yang saya sukai dari Emacs adalah kemampuan untuk menjalankan terminal di dalam Emacs. Apakah ini mungkin di dalam Vim? Saya tahu bahwa Anda dapat menjalankan perintah dari Vim, tetapi saya ingin dapat menjalankan terminal di dalam tab.

Evan
sumber
2
terkait: stackoverflow.com/q/1879219/1569
Factor Mystic
42
Adalah :! <command>apa yang Anda cari?
takeshin
48
Sejak Vim 8.0, ada :termperintah yang membuka terminal baru di jendela split baru. Jika tidak berhasil untuk Anda, periksa vim --version | grep -o .terminaluntuk melihat apakah fitur ini tersedia ( +terminal) atau tidak tersedia ( -terminal).
Susam Pal

Jawaban:

123

Saya pasti akan merekomendasikan screenuntuk hal seperti ini. Vim adalah editor teks, bukan shell.

Saya akan menggunakan Ctrl+ASuntuk membagi jendela saat ini secara horizontal, atau di layar Ubuntu dan versi tambalan lainnya, Anda dapat menggunakan Ctrl+A|(pipa) untuk membelah secara vertikal. Kemudian gunakan Ctrl+ATab(atau ekuivalen pada beberapa sistem, Ctrl+ACtrl+Iyang mungkin lebih mudah untuk mengetik) untuk beralih di antara windows. Ada perintah lain untuk mengubah ukuran dan pengaturan windows.

Atau penggunaan yang kurang canggih screenhanya untuk membuka beberapa jendela layar penuh dan beralih di antara mereka. Inilah yang biasanya saya lakukan, saya hanya menggunakan fitur layar terbagi sesekali.

The Survival Guide GNU Screen pertanyaan memiliki sejumlah tips yang baik jika Anda tidak terbiasa dengan penggunaannya.

Greg Hewgill
sumber
7
+1 Saya baru saja menerima Injil layar. Saya bertanya-tanya bagaimana saya hidup tanpanya.
senjata
118
saya lebih suka memilih tmux daripada layar.
tomaszkubacki
81
Ya, tentu saja seseorang dapat menjalankan layar, atau tmux, atau terminator, atau membuka jendela dan alt-tab lain, atau bahkan menggunakan sakelar KVM yang diaktifkan dengan footpedal. Tapi bukan itu intinya - semua solusi mengorbankan integrasi antara terminal dan VIM, itulah sebabnya orang akan repot mencari solusi di ruang ini. Saya tidak mengerti bagaimana jawaban ini bahkan merupakan jawaban, apalagi jawaban teratas atau diterima. Kurasa aku akan mencoba Conque.
Stabledog
33
bagaimana ini jawaban teratas ??? Anda perlu membatalkannya dan memilih jawaban berikutnya, yang sebenarnya menjawab pertanyaan Anda. Menggunakan layar tidak menjalankan shell dalam vim. Itu seperti memberi tahu seseorang untuk memulai shell lain. Dan bagi mereka yang terus membuang ":!" dia SUDAH BILANG dia tahu bagaimana menjalankan perintah, yang BUKAN apa yang dia minta ... sheesh. Kesombongan sangat tebal di sini sehingga Anda bisa memotongnya dengan pisau.
osirisgothra
6
Jawaban ini harus diperbarui karena Terminal Window
Alan Garrido
232

Sudah usang sejak Agustus 2011

Lihat Conque Shell (juga di GitHub ). Memungkinkan Anda menjalankan program interaktif apa pun di dalam vim, bukan hanya shell.

Kyle Simek
sumber
21
:ConqueTerm bash <CR>, vim <CR>, :ConqueTerm bash.... horor rekursif !!
keflavich
1
psihodelia tampaknya benar. Saya baru saja mengkompilasi vim dengan --enable-pythoninterp (cygwin tidak mendistribusikan vim dengan + python) dan setelah menginstal ConqueTerm, saya mendapatkan error dari #set_buffer_settings. Saya belum bisa melacak di mana fungsi itu hidup, atau mengetahui apa artinya kesalahan itu. Pesan tersebut menyertakan pernyataan tentang argumen yang tidak valid "edit ++ enc = utf-8 bash \ - \ 2". Argh.
Nate Kennedy
47
Untuk memahami rekursi, Anda harus terlebih dahulu memahami rekursi.
Stabledog
19
@ Łukasz Niemier VIMCEPTION
Sebastián Grignoli
1
Tampaknya ini tidak lagi didukung, ada yang punya alternatif?
tanggul
204

Saya tidak yakin apa yang ingin Anda capai (Saya belum pernah menggunakan Emacs), tetapi Anda dapat menjalankan perintah di Vim dengan mengetik:

:! somecommand [ENTER]

Dan jika Anda ingin mengetik beberapa perintah, atau bermain-main di shell untuk sementara waktu, Anda selalu dapat menggunakan:

:! bash (or your favourite shell) [ENTER]

Setelah perintah atau shell berakhir, Anda akan diberikan opsi untuk menekan Enteruntuk kembali ke jendela editor Anda

Vim sengaja ringan dan kurang memiliki kemampuan untuk melakukan hal-hal non-editorial, seperti menjalankan shell full-blown di dalam panel / tab Vim, tetapi seperti yang disebutkan di atas ada tambahan pihak ketiga seperti vim-shell yang memungkinkan Anda untuk melakukan hal semacam itu.

Biasanya jika saya ingin beralih antara Vim dan shell saya (Bash), saya hanya menekan CTRL+ Zuntuk menghentikan proses Vim, bermain-main di shell saya, lalu ketik 'fg' ketika saya ingin kembali ke Vim - menjaga editor saya dan saya shell bagus dan terpisah.

David Claridge
sumber
17
Dan jika Anda ingin menyalin output perintah ke buffer saat ini:: r! dir
Cyber ​​Oliveira
6
Saya menggunakan Emacs dan Vim (dan memiliki lebih banyak pengalaman dengan Vim). Tetapi saya telah menemukan bahwa sering kali lebih baik dan lebih mudah untuk bekerja dengan dua tampilan pada saat yang sama (satu untuk melihat apa yang Anda edit dan yang lainnya untuk bekerja dalam shell interaktif - misalnya untuk menguji efek dari perubahan konfigurasi yang Anda miliki baru diedit). Ini juga membantu dengan kognisi, retensi dan alur kerja mental saya ketika hal-hal penting yang perlu saya monitor dengan cermat tidak menghilang dari layar (seperti apa yang terjadi ketika Anda menggunakan Ctrl-Z atau: shell di Vim).
mvanle
Ini adalah jawaban yang bagus yang akan menghemat banyak waktu saya.
jerry_sjtu
Jawaban bagus! Untuk lebih memujinya, saya juga akan menambahkan yang :r! command [ENTER]disebutkan dalam komentar.
Jeach
152

Cara saya menyiasati ini adalah:

  • jeda Vim dengan Ctrl+ Z,
  • bermain di terminal,
  • lalu kembali ke tempat Anda pergi dengan Vim hanya dengan mengetikkan perintah fg.
ptrin
sumber
14
:!bashadalah cara yang lebih baik untuk melakukan itu
0atman
Saya pikir dia ingin semacam fungsi seperti dreampie
Adam Miller
10
@Oatman. Mengapa :!bashlebih baik daripada Ctrl+z? (Hanya ingin tahu)
Sebastián Grignoli
2
@ SebastiánGrignoli karena dengan Ctrl+Z, misalnya, Anda dapat pindah ke folder lain, lslalu git status, dll. Ctrl+ZAdalah "jeda", Anda dapat "melanjutkan" dengan fg. Tetapi dengan:! Bash, sejauh yang saya tahu sejauh ini, Anda hanya dapat menjalankan satu perintah sekaligus, atau bahkan jika Anda dapat menjalankan lebih dari satu perintah sekaligus, itu masih tidak nyaman. Jadi secara keseluruhan, 'Ctrl + Z' jauh lebih baik
Leo
+1 karena ini berfungsi di hampir semua lingkungan. Bekerja pada sistem asing yang tidak dapat saya sesuaikan, dan melalui cangkang PuTTY yang murah, ini bekerja dengan sangat baik.
t3sture
121

Jika diaktifkan di versi Vim Anda, terminal dapat dimulai dengan :termperintah.

Dukungan jendela terminal ditambahkan ke Vim 8. Ini adalah fitur opsional yang dapat diaktifkan ketika mengkompilasi Vim dengan fitur + terminal. Jika versi Vim Anda memiliki dukungan terminal, :echo has('terminal')akan menampilkan "1".

Masuk :termakan menempatkan Anda dalam mode Terminal-Job , di mana Anda dapat menggunakan terminal seperti yang diharapkan.

Dalam mode Terminal-Job , menekan Ctrl-W Natau Ctrl-\ Ctrl-Nmengalihkan mode ke Terminal-Normal , yang memungkinkan kursor dipindahkan dan perintah dijalankan sama dengan mode Normal Vim . Untuk beralih kembali ke mode Terminal-Job , tekan i.

Jawaban lain menyebutkan fungsi serupa di Neovim.

Daniel S.
sumber
5
+1 untuk cara beralih kembali ke mode Terminal cmd dengan isetelah beralih dari mode browse ctrl-wN. Ini adalah fitur pembunuh bahkan lebih dari tmux dan berfungsi pada Windows juga.
Radke
1
Apakah mungkin menggunakan split vertikal :term?
Vitaly Zdanevich
1
super! Bagus bahwa terminal dibangun sehingga kita tidak perlu repot dengan lebih banyak plugin. Ditingkatkan ke vim 8 via brew install vim --override-system-vidan :termberfungsi dengan baik. Terima kasih telah berbagi!
LeOn - Han Li
18
@VitalyZdanevich, :vertical :termakan terpecah secara vertikal dengan terminal di jendela kiri. :vertical :botright :termakan terpecah secara vertikal dengan terminal di jendela kanan. Atau, Anda dapat secara manual menata jendela, dan kemudian gunakan :term ++curwinuntuk membuka terminal di jendela aktif.
Daniel S.
esc ctrl-w w memungkinkan Anda untuk beralih di antara windows
user1869582
87

:shkemudian ctrl+dkembali (bash)

Perbarui :

Anda dapat memetakan ctrl+ddalam vim untuk dijalankan :sh, yang memungkinkan Anda untuk beralih antara bash dan vim dengan cepat.

noremap <C-d> :sh<cr>

penguji
sumber
1
Saya pikir ctrl+zdan fgsedikit lebih cepat, mengingat Anda tidak harus mengetikkan :shkasing itu.
Alex
@Alex tidak, Anda tidak perlu mengetik :shjika Anda melakukan peta. Setelah noremap, Anda bisa saja Ctrl+Ddari vim ke sh, dan karena ^DEOF, yang mengakhiri sh, jadi Anda akan kembali ke vim. Tombol satu dapat beralih antara shdan vim.
no1xsyzy
42

Fitur baru utama Vim 8.1 adalah dukungan untuk menjalankan terminal di jendela Vim.

:term akan membuka terminal di jendela lain di dalam Vim.

Yossarian42
sumber
2
ini bekerja dengan baik, terima kasih! jawaban Anda jauh lebih dalam semangat pertanyaan aslinya
subelsky
Hai, apakah Anda tahu cara keluar dari mode ini?
user3289737
2
seperti di terminal normal, exitakan berhenti dari terminal, kemudian gunakan :quntuk menutup jendela
Yossarian42
2
@ user3289737 Atau, Anda dapat menekan Ctrl + W dua kali berturut-turut untuk berganti antar windows. Ini tidak spesifik untuk windows terminal, tetapi berfungsi dengan baik.
flarn2006
39

Akhirnya :terminalperintah asli ditambahkan ke vim pada 2017.

Berikut ini kutipan dari : terminal readme:

Fitur ini untuk menjalankan emulator terminal di jendela Vim. Pekerjaan dapat mulai terhubung ke emulator terminal. Misalnya, untuk menjalankan shell:

 :term bash

Atau untuk menjalankan perintah build:

 :term make myprogram

Pekerjaan berjalan secara asinkron dari Vim, jendela akan diperbarui untuk menampilkan output dari pekerjaan, juga saat mengedit di jendela lain.

fjardon
sumber
Terminal beroperasi dalam buffer di tab yang sama. jadi jika Anda terbiasa menggunakan banyak file dalam vim, Anda mungkin menghadapi beberapa kesulitan. beralih buffer pada akhirnya akan datang ke terminal dari tempat itu adalah titik tidak dapat kembali, Anda harus membunuh terminal. selama Anda menyadari hal ini, itu akan baik-baik saja. berharap para pengembang datang dengan solusi untuk ini.
ArunMKumar
1
@ArunMKumar Gunakan [Ctrl + W] untuk "melarikan diri" dari terminal, dan kemudian lakukan :bnseperti biasa. Tidak perlu mematikan terminal dan itu bukan titik tidak bisa kembali :)
fjardon
Terima kasih, sobat, sangat merindukannya. Saya telah keymapped : bn ke kunci dan itu berhenti bekerja, itu bekerja kembali. Itu salahku.
ArunMKumar
2017? Maksudmu 2018?
flarn2006
1
@ flarn2006, mengenai 2017 versus 2018, Vim 8.1 diumumkan di vim.org pada 18 Mei 2018, dengan "dukungan untuk menjalankan terminal di jendela Vim" terdaftar sebagai "fitur baru utama". Fitur ini pertama kali tersedia sebelumnya, pada 7 Juli 2017, di patch 8.0.0693. github.com/vim/vim/commit/…
Daniel S.
32

Pertanyaan ini agak lama, tetapi bagi mereka yang menemukannya, ada solusi baru yang mungkin: Neovim berisi emulator terminal kelas penuh, yang melakukan persis seperti yang dicoba ConqueTerm. Cukup jalankan :term <your command here>.

<C-\><C-n>akan keluar dari mode term kembali ke mode normal. Jika Anda seperti saya dan lebih suka pelarian itu masih keluar dari mode term, Anda dapat menambahkan ini ke nvimrc Anda:

tnoremap <ESC><ESC> <C-\><C-N>

Dan kemudian menekan ESC dua kali akan keluar dari mode terminal kembali ke mode normal, sehingga Anda dapat memanipulasi buffer yang ditulis oleh perintah yang masih berjalan.

Meskipun perlu diingat, karena nvim sedang dalam pengembangan pada saat saya memposting jawaban ini, cara lain untuk keluar dari mode terminal dapat ditambahkan. Seperti Ctrl+\Ctrl+nberalih ke mode normal dari hampir semua mode, saya tidak berharap bahwa jawaban ini akan salah, tetapi perlu diketahui bahwa jika tidak bekerja, jawaban ini mungkin sudah usang.

https://github.com/neovim/neovim

lahwran
sumber
29

:term

Namun, fitur ini baru ditambahkan di Vim 8.1, yang mana dari postingan ini baru saja dirilis, jadi Anda mungkin perlu memperbarui untuk menggunakannya.

flarn2006
sumber
Itu ditambahkan sebelum vim 8.1. Ini hanya fitur besar utama yang tidak dimiliki vim 8.0.001. Itu sebabnya ini diiklankan sebagai vim 8.1 yang baru. Lihat jawaban Daniel mulai Oktober 2017, dan fjardon pada apr 2018. -> github.com/vim/vim/blob/master/runtime/doc/version8.txt#L18814
Luc Hermitte
17

Saya tahu bahwa saya tidak langsung menjawab pertanyaan, tetapi saya pikir itu pendekatan yang baik. Tidak ada yang menyebut tmux (atau setidaknya bukan sebagai jawaban mandiri). Tmux adalah layar seperti multiplexor terminal. Sebagian besar barang dapat dibuat di kedua multiplexor, tetapi afaik tmux lebih mudah dikonfigurasi. Juga tmux saat ini sedang lebih aktif dikembangkan daripada layar dan ada ekosistem yang cukup besar di sekitarnya, seperti alat yang membantu konfigurasi, ECC.

Juga untuk vim, ada plugin lain: ViMUX , yang banyak membantu dalam interaksi antara kedua alat. Anda dapat memanggil perintah dengan:

:call VimuxRunCommand("ls")

Perintah itu menciptakan pemisahan horizontal kecil di bawah pane vim saat ini.

Itu juga dapat membiarkan Anda lari dari prompt jika Anda tidak ingin menjalankan seluruh perintah:

<Leader>vp :VimuxPromptCommand<CR>

Karena itu tidak cukup, setidaknya ada 6 'plugin khusus platform':

  • vim-vroom : pelari untuk rspec, mentimun dan tes / unit; dukungan vimux viag:vroom_use_vimux
  • vimux-ruby-test : serangkaian perintah untuk dengan mudah menjalankan tes ruby
  • vimux-mentimun : menjalankan Fitur Mentimun melalui Vimux
  • vim-turbux : Pengujian Turbo Ruby dengan tmux
  • vimux-pyutils : Seperangkat fungsi untuk vimux yang memungkinkan untuk menjalankan blok kode di ipython
  • vimux-nose-test : Jalankan tes hidung di vimux

Berikut ini adalah "kasus penggunaan" yang bagus: Pengujian sesuai permintaan menggunakan Vimux dan Turbux dengan Spork and Guard

Pablo Olmos de Aguilera C.
sumber
Peduli untuk menjelaskan mengapa itu diturunkan? (Selain menjadi jawaban dari 6 tahun yang lalu)
Pablo Olmos de Aguilera C.
13

Seseorang telah menyarankan https://github.com/Shougo/vimshell.vim , tetapi mereka tidak menyebutkan alasannya. Akibatnya, ketika saya keluar dari pertanyaan ini, saya membuang banyak waktu untuk mencoba pilihan lain (yang berperingkat lebih tinggi).

Shougo / vimshell adalah jawabannya. Inilah alasannya:

Selain sebagai emulator terminal, VimShell memungkinkan Anda untuk menavigasi output terminal dalam mode normal dan visual. Dengan demikian, jika perintah yang Anda jalankan menghasilkan keluaran yang ingin Anda salin dan tempel menggunakan keyboard saja ... VimShell mencakup ini.

Tidak ada opsi lain yang disebutkan, termasuk: perintah terminal di NeoVim melakukan ini. Neovim's: terminal mendekati, tetapi gagal dalam setidaknya cara berikut pada 2/18/2017:

  • Memindahkan kursor ke ujung buffer, bukan pada yang terakhir menyimpannya di tempat yang sama seperti yang dilakukan VimShell. Buang-buang waktu.

  • Tidak mendukung modifiable = 1melihat diskusi tentang ini di Github , plugin yang sangat membantu seperti vim-easymotion tidak dapat digunakan.

  • Tidak mendukung tampilan nomor baris seperti yang dilakukan Vimshell.

Jangan buang waktu untuk opsi lain, termasuk terminal Neovim :. Pergilah dengan VimShell.

pengguna3751385
sumber
1
NeoVim memungkinkan Anda untuk menavigasi dan menyalin dari output terminal dalam mode normal / visual. Saya melakukan ini sepanjang waktu. Menggunakan NVIM 0.1.6-dev
Alice Heaton
Terima kasih, saya akan mencoba VimShell. Saya telah mengambil kebebasan untuk menghapus pernyataan yang salah dari jawabannya. Seperti @Alice tunjukkan, NeoVim :terminalbenar-benar dapat melakukan hal yang sama.
Konrad Rudolph
:terminaltidak dapat melakukan hal yang sama seperti :VimShelldalam hal navigasi dan pengeditan, dan dengan cara yang mendasar. Lihat penjelasan edit di atas.
user3751385
9

Anda mungkin ingin melihat :shperintah (lihat :help shdi Vim).

Berbagai perintah

Eric Schwabe
sumber
Jadi jangan gunakan zsh dengan vim. set shell=/bin/shakan membuat vim menggunakan shell yang lebih tenang untuk perintahnya.
Ross Presser
8

Tidak Anda tidak bisa:

http://vimdoc.sourceforge.net/htmldoc/tips.html#shell-window

Amber
sumber
2
JANGAN MENGAMBIL NASIHAT splitvt- itu merusak kode kontrol warna dan membuat vimsama sekali tidak dapat digunakan.
new123456
12
"Tidak" adalah jawaban yang buruk. Jawaban yang lebih baik adalah "Secara default, tidak." Secara teknis, itu bisa dilakukan, dan mungkin Anda perlu menulis kode sumber baru dan kompilasi sendiri, atau menulis sebuah plugin. Apakah itu mudah? Mungkin tidak, tapi itu bisa dilakukan. Mengatakan TIDAK lebih seperti mengatakan "tidak, saya tidak akan melakukannya."
trusktr
2
@AnishRamaswamy Masih tidak mungkin untuk menjalankan shell dalam buffer vim menggunakan stock vim (tidak seperti emacs). Itulah pertanyaan OP.
Amber
1
@ Amp, Ya itu akan baik-baik saja kecuali OP tidak menyebutkan menggunakan vim saham.
Anish Ramaswamy
3
Seseorang seharusnya mengedit jawaban ini untuk mengatakan Anda tidak dapat melakukannya dengan stock vim.
still_dreaming_1
4

Satu-satunya cara saya tahu adalah dengan menggunakan vim-shell , patch pihak ketiga.

romansa
sumber
Menjadi bertele-tele, vim-shell adalah sebuah tambalan, bukan 'add-on' (yang bagi saya, setidaknya, menyiratkan bahwa itu adalah skrip). Saya belum mencobanya secara pribadi, tetapi halaman vim-shell pada Vim wiki sayangnya menunjukkan bahwa ia tidak dapat dikompilasi dengan Vim 7.1+.
Yewge
Diubah untuk menenangkan pedant. :) (. Harus mengetik sesuatu lebih panjang dari 15 karakter 'Tetap' tidak cukup lama)
romandas
Shougo / vimshell ( github.com/Shougo/vimshell.vim ) tampaknya berfungsi dengan baik. Memang diperlukan membangun perpustakaan yang dinamis, tetapi cukup sederhana (cd <vim> / vimproc; make)
Wayne Walker
3

Saya menggunakan ini sekarang, Anda dapat mencoba. VimShell

Gatspy
sumber
2

Coba vterm , yang merupakan shell fitur lengkap di dalam vim. Ini sedikit bermasalah dengan sejarah dan fungsi yang jelas, dan masih dalam pengembangan, tetapi masih cukup bagus

Christopher Dumas
sumber
2

Dengan asumsi versi vim Anda mendukung +termperintah terlebih dahulu, atur shell untuk vim untuk digunakan dalam satu perintah (misalnya set=/usr/bin/zsh), dan kemudian jalankan perintah +term(yaitu bo 15vs +term). Anda mungkin harus melakukan beberapa manuver tambahan dari jendela Anda (yaitu menghapus satu dan memutar), tetapi Anda akan memiliki terminal Anda.

Kx
sumber
0

Saya mengakui bahwa saya tidak benar-benar menjawab pertanyaan Anda, tetapi apa yang telah bekerja lebih baik bagi saya ketika menggunakan Vim dan Terminal di jendela yang sama adalah Tmux (yang merupakan semacam "run in the background software" seperti, mirip dengan layar, meskipun ini satu berfungsi lebih baik dengan pemisahan dan tab).

Posting ini akan membantu Anda memahami bagaimana mereka bekerja bersama: 'Tmux dan Vim - bahkan lebih baik bersama' .

Dengan cara ini kita dapat mengubah Vim menjadi IDE yang kuat

Javi
sumber
0

Split layar dan jalankan perintah term ++curwinuntuk menjalankan terminal di dalam buffer Vim. Perintah berikut melakukan keduanya dan bekerja untuk saya:

:bo 10sp | term ++curwin
Subrat Prasad
sumber