Vim'in içinde bir terminali nasıl çalıştırırım?


307

Emacs'a alışkınım, ama hangisini daha çok sevdiğimi görmek için Vim'i deniyorum.

Emacs hakkında sevdiğim bir şey, Emacs içinde bir terminal çalıştırma yeteneğidir. Bu Vim'in içinde mümkün mü? Vim'den komutları çalıştırabileceğinizi biliyorum, ama bir sekmenin içindeki bir terminali çalıştırabilmek istiyorum.



42
:! <command>arıyorsun ne olacak?
takeshin

48
Vim 8.0'dan bu yana, :termyeni bir bölünmüş pencerede yeni bir terminal açan bir komut var. Sizin için çalışmazsa, vim --version | grep -o .terminalbu özelliğin kullanılabilir ( +terminal) veya kullanılamıyor ( -terminal) olup olmadığını kontrol edin .
Susam Pal

Yanıtlar:


123

Kesinlikle screenböyle bir şey için tavsiye ederim . Vim bir metin editörüdür, kabuk değil.

Ben kullanırım Ctrl+ASyatay Geçerli pencereyi bölmek veya Ubuntu'nun ekranı ve diğer yamalı sürümlerinde kullanabileceğiniz Ctrl+A|dikey bölmek (boru). Daha sonra pencereler arasında geçiş yapmak için Ctrl+ATab(veya yazması Ctrl+ACtrl+Idaha kolay olabilecek bazı sistemlerde eşdeğerde ) kullanın. Pencerelerin boyutunu ve düzenini değiştirmek için başka komutlar da vardır.

Ya da daha az gelişmiş bir kullanımı, screenbirden fazla tam ekran pencereyi açmak ve aralarında geçiş yapmaktır. Normalde yaptığım bu, sadece ara sıra bölünmüş ekran özelliğini kullanıyorum.

GNU Screen Survival Guide onun kullanımı ile bilginiz yoksa soru iyi bazı ipuçları vardır.


7
+1 Daha yeni ekran müjdesini aldım. Onsuz nasıl yaşadığımı merak ediyorum.
guns

118
ekran yerine tmux'u tercih ederim.
tomaszkubacki

81
Evet, elbette ekran, tmux veya sonlandırıcı çalıştırabilir veya başka bir pencere ve alt sekme açabilir, hatta ayak pedalı ile etkinleştirilen bir KVM anahtarı kullanabilirsiniz. Ama mesele bu değil - tüm bu çözümler terminal ve VIM arasındaki entegrasyonu feda ediyor , bu yüzden bu alanda çözümler aramak zahmete girecekti. Bu cevabın üst veya kabul edilen bir cevap olsa bile nasıl bir cevap olduğunu anlamıyorum. Conque'yi deneyeceğimi düşünüyorum.
Stabledog

33
bu nasıl en iyi cevap ??? soruyu açmanız ve bir sonraki cevabı oylamanız gerekir. Ekranı kullanmak vim içinde bir kabuk çalıştırmaz. Bu, birine başka bir mermi başlatmasını söylemek gibi bir şey. Ve atmaya devam edenler için ":!" HER ZAMAN komutların nasıl yürütüleceğini biliyordu, bu onun istediği şey DEĞİL ... şeyh. Kibir o kadar kalın ki, bir bıçakla kesebilirsiniz.
osirisgothra

6
Bu cevap, yeni vim 8.1 özelliği Terminal Penceresi
Alan Garrido

232

Ağustos 2011'den itibaren modası geçmiş

Check out Conque Shell (ayrıca GitHub'dan ). Sadece bir kabuk değil, vim içinde herhangi bir interaktif programı çalıştırmanızı sağlar.


21
:ConqueTerm bash <CR>, vim <CR>, :ConqueTerm bash.... özyinelemeli korku !!
keflavich

1
psihodelia haklı görünüyor. Ben ven --enable-pythoninterp (cygwin vim + python ile dağıtmaz) ile derledim ve ConqueTerm yükledikten sonra #set_buffer_settings bir hata alıyorum. Bu işlevin nerede yaşadığını izleyemedim veya hatanın ne anlama geldiğine dair bir fikir edemedim. İleti, "edit ++ enc = utf-8 bash \ - \ 2" geçersiz argümanı hakkında bir ifade içeriyor. Ahh.
Nate Kennedy

47
Özyinelemeyi anlamak için önce özyinelemeyi anlamalısınız.
Stabledog

19
@ Asukasz Niemier VIMCEPTION
Sebastián Grignoli

1
Bu artık desteklenmiyor gibi görünüyor, başka bir alternatif var mı?
dykeag

204

Neyi başarmaya çalıştığınızdan tam olarak emin değilim (Emacs'ı hiç kullanmadım), ancak Vim'de komutları yazarak çalıştırabilirsiniz:

:! somecommand [ENTER]

Ve birkaç komut yazmak veya bir süre bir kabukta oynamak istiyorsanız, her zaman şunları kullanabilirsiniz:

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

Komut veya kabuk sona erdiğinde, Entereditör pencerenize dönmek için tuşuna basma seçeneği sunulur

Vim kasıtlı olarak hafiftir ve tıpkı Vim bölmesi / sekmesi içinde tam gelişmiş bir kabuk çalıştırmak gibi editör olmayan tip şeyler yapma yeteneğinden yoksundur, ancak yukarıda belirtildiği gibi vim-shell gibi size izin veren üçüncü taraf eklentileri vardır böyle bir şey yapmak için.

Tipik olarak Vim ve kabuğum (Bash) arasında geçiş yapmak istersem , Vim işlemini duraklatmak, kabuğumda oynatmak için CTRL+ Ztuşuna basıp Vim'e geri dönmek istediğimde 'fg' yazıyorum - editörümü ve güzel ve ayrı kabuk.


17
Ve komutun çıktısını geçerli arabelleğe kopyalamak istiyorsanız:: r! dir
Cyber ​​Oliveira

6
Hem Emacs hem de Vim kullanıyorum (ve Vim ile çok daha fazla deneyime sahibim). Ancak, aynı anda iki görünümle çalışmanın daha iyi ve daha kolay olduğunu gördüm (biri ne düzenlediğinizi görmek için ve diğeri etkileşimli bir kabuk içinde çalışmak için - örneğin sahip olduğunuz bir yapılandırma değişikliğinin etkisini test etmek için) yeni düzenlenmiş). Ayrıca, yakından izlemem gereken önemli şeyler ekrandan kaybolmadığında (Ctrl-Z veya: Vim'de: shell kullandığınızda ne olduğu gibi) biliş, tutma ve zihinsel iş akışlarımda yardımcı olur.
mvanle

Çok zaman kazandıracak harika bir cevap.
jerry_sjtu

Güzel cevap! Daha da övmek için, ben de :r! command [ENTER]yorumlarda belirtilen ekledi.
Jeach

152

Ben bu şekilde:

  • Vim'i Ctrl+ ile duraklat Z,
  • terminalde oynamak,
  • sadece komutu yazarak Vim ile tam olarak kaldığınız yere dönün fg.

14
:!bashbunu yapmanın daha güzel bir yoludur
0atman

Sanırım işlevsellik gibi bir tür rüya istiyor
Adam Miller

10
@Oatman Neden daha :!bashgüzel Ctrl+z? (Sadece merak ediyor)
Sebastián Grignoli

2
@ SebastiánGrignoli çünkü Ctrl+Z, örneğin, başka bir klasöre taşıyabilirsiniz, o lszaman git status, vb Ctrl+Zbir "duraklama", ile "devam" olabilir fg. Ama ile:! Bash, şimdiye kadar bildiğim gibi, aynı anda sadece tek bir komut çalıştırabilirsiniz, ya da aynı anda bir komuttan daha fazlasını çalıştırabilseniz bile, hala uygun değildir. Genel olarak, 'Ctrl + Z' çok daha iyi
Leo

+1 çünkü bu hemen hemen her ortamda çalışır. Özelleştiremediğim yabancı bir sistem üzerinde çalışmak ve ucuz bir PuTTY kabuğu aracılığıyla bu harika çalışıyor.
t3sture

122

Vim sürümünüzde etkinleştirilirse, :termkomutla bir terminal başlatılabilir .

Vim 8'e terminal penceresi desteği eklendi. Vim + terminal özelliğiyle derlenirken etkinleştirilebilen isteğe bağlı bir özelliktir. Vim sürümünüzün terminal desteği varsa, :echo has('terminal')"1" çıktısı verir.

Girme :termyerleştirecektir Terminali-İş beklendiği gibi terminalini kullanabilirsiniz modunda.

İçinde Terminali-İş modunda basarak Ctrl-W Nveya Ctrl-\ Ctrl-Nkipine geçer Terminali-Normal imleç hareket ettirilecek ve komutları Vim'ın benzer koştu olmasını sağlar, normal modda. Terminal İş moduna dönmek için düğmesine basın i.

Diğer cevaplar Neovim'deki benzer işlevlerden bahsediyor.


5
iCtrl-wN tarama modundan geçiş yaptıktan sonra Terminal cmd moduna nasıl geri döneceğiniz için +1 . Bu tmux üzerinde bile katil bir özelliktir ve Windows üzerinde de çalışır.
radke

1
Kullanarak dikey bölme yapmak mümkün müdür :term?
Vitaly Zdanevich

1
Süper! Terminalin yerleşik olması harika, bu yüzden daha fazla eklenti ile karışıklık yok. Vim 8'e yükseltildi brew install vim --override-system-vive :termmükemmel çalışıyor. Paylaşım için teşekkürler!
LeOn - Han Li

18
@VitalyZdanevich, :vertical :termsol pencerede terminal ile dikey olarak bölünecek. :vertical :botright :termterminal sağ pencerede olacak şekilde dikey olarak bölünecektir. Alternatif olarak, pencereleri elle düzenleyebilir ve ardından :term ++curwinetkin pencerede bir terminal açmak için kullanabilirsiniz .
Daniel S.

esc ctrl-w w pencereler arasında geçiş yapmanızı sağlar
user1869582

87

:shsonra ctrl+diçeri girmek için (bash)

Güncelleme :

ctrl+dVim'de çalıştırmak için harita :sholuşturabilirsiniz, bu da bash ve vim arasında hızlı bir şekilde geçiş yapmanızı sağlar.

noremap <C-d> :sh<cr>


1
Sanırım ctrl+zve bu durumda fgyazmanız gerekmediği için biraz daha hızlı :sh.
Alex

@Alex no :sh, haritayı yaparsanız yazmak zorunda kalmazsınız. Sonra noremap, sadece Ctrl+Dvim'den vO'ya, sonlandıran EOF sholduğundan ^D, vim'e shgeri dönersiniz. Bir anahtar shve vim arasında geçiş yapabilir .
no1xsyzy

42

Vim 8.1'in ana yeni özelliği, Vim penceresinde bir terminalin çalıştırılması desteğidir.

:term terminali Vim içindeki başka bir pencerede açacaktır.


2
bu mükemmel çalışıyor, teşekkürler! cevabınız orijinal sorunun ruhunda çok daha fazla
subelsky

Merhaba, bu moddan nasıl çıkılacağını biliyor musun?
user3289737

2
normal terminalde olduğu gibi, terminalden exitçıkacak, sonra :qpencereyi kapatmak için kullanacak
Yossarian42

2
@ user3289737 Alternatif olarak, pencereler arasında geçiş yapmak için arka arkaya iki kez Ctrl + W tuşlarına basabilirsiniz. Bu terminal pencerelerine özgü değildir, ancak aynı şekilde çalışır.
flarn2006

39

Sonunda :terminal2017'de vim'e yerel bir komut eklendi.

Terminal readme'den bir alıntı :

Bu özellik bir Vim penceresinde bir terminal emülatörü çalıştırmak içindir. Terminal öykünücüsüne bir iş başlatılabilir. Örneğin, bir kabuk çalıştırmak için:

 :term bash

Veya build komutunu çalıştırmak için:

 :term make myprogram

İş Vim'den eşzamansız olarak çalışır, pencere başka bir pencerede düzenlenirken işten çıktı gösterecek şekilde güncellenir.


Terminal aynı sekmedeki bir tamponda çalışır. vim'de birden fazla dosya kullanmaya alışkınsanız, bazı zorluklarla karşılaşabilirsiniz. anahtarlama tamponları sonunda geri dönüşü olmayan bir noktadan terminale gelecek, terminali öldürmelisiniz. bunun farkında olduğunuz sürece, iyi olmalı. Umarım geliştiriciler bunun için bir çözüm bulurlar.
ArunMKumar

1
@ArunMKumar Terminalden "kaçmak" için [Ctrl + W] kullanın ve sonra :bnher zamanki gibi yapın. Terminali öldürmeye gerek yok ve geri dönüşü olmayan bir nokta değil :)
fjardon

Teşekkürler dostum, tamamen özledim. Keymapped : bn bir tuşa ve çalışmayı durdurdu, tekrar çalışıyor. Benim kötüydü.
ArunMKumar

2017? 2018 mi demek istiyorsun?
flarn2006

1
@ flarn2006, 2017'ye karşı 2018'e göre, Vim 8.1, vim.org'da 18 Mayıs 2018'de "ana yeni özellik" olarak listelenen "bir Vim penceresinde terminal çalıştırma desteği" ile duyuruldu. Bu özellik ilk olarak daha önce 7 Temmuz 2017'de 8.0.0693 yamasında mevcuttu. github.com/vim/vim/commit/…
Daniel S.

32

Bu soru oldukça eski, ama onu bulanlar için yeni bir olası çözüm var: Neovim, tam donanımlı, birinci sınıf bir terminal emülatörü içeriyor, bu ConqueTerm'in tam olarak ne yaptığını yapıyor. Sadece koş :term <your command here>.

<C-\><C-n>terim modundan normal moda geri döner. Eğer benim gibiyseniz ve hala kaçış terim modundan çıkmayı tercih ediyorsanız, bunu nvimrc'nize ekleyebilirsiniz:

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

Ve sonra ESC'ye iki kez basmak terminal modundan normal moda geri döner, böylece hareketsiz komutun yazdığı arabelleği değiştirebilirsiniz.

Unutmayın, bu cevabı yayınladığım sırada nvim ağır bir gelişme gösterdiğinden, terminal modundan çıkmak için başka bir yol eklenebilir. Gibi Ctrl+\Ctrl+nneredeyse normal moda anahtarlar herhangi modda, bu cevap yanlış olacağını bekliyoruz, ama değildi çalışır, bu cevap güncel olabileceklerinin farkında olma.

https://github.com/neovim/neovim


29

:term

Bu özellik, Vim 8.1'de yeni eklendi, ancak bu kayıttan kısa bir süre önce yayınlandı, bu nedenle kullanmak için güncellemeniz gerekebilir.


Madde 8.1'den önce eklenmiştir. Vim 8.0.001'in sahip olmadığı sadece ana büyük özellik. Bu yüzden vim 8.1 yenilik olarak tanıtıldı. Daniel'in Ekim 2017'den yanıtı ve fjardin'in Nisan 2018'deki yanıtı. -> github.com/vim/vim/blob/master/runtime/doc/version8.txt#L18814
Luc

17

Soruyu doğrudan cevaplamadığımı biliyorum, ama bence bu iyi bir yaklaşım. Hiç kimse tmux'dan bahsetmedi (veya en azından bağımsız bir cevap olarak değil). Tmux terminal çoklayıcı benzeri bir ekrandır. Çoğu şey her iki çoklayıcıda da yapılabilir, ancak afaik tmux yapılandırmak daha kolaydır. Ayrıca tmux şu anda ekrandan daha aktif olarak geliştiriliyor ve etrafında, konfigürasyona yardımcı olan araçlar, ecc gibi oldukça büyük bir ekosistem var.

Ayrıca vim için başka bir eklenti daha var: ViMUX , her iki araç arasındaki etkileşime çok yardımcı oluyor. Komutları şununla çağırabilirsiniz:

:call VimuxRunCommand("ls")

Bu komut, geçerli vim'in bulunduğu bölmenin altında küçük bir yatay bölünme oluşturur.

Ayrıca, tüm komutu çalıştırmak istemiyorsanız bir istemden çalışmanıza izin verebilir:

<Leader>vp :VimuxPromptCommand<CR>

Yeterli olmadığı için, en az 6 'platforma özgü eklenti' vardır:

  • vim-vroom : rspec, salatalık ve test / birim koşucusu; vimux desteğig:vroom_use_vimux
  • vimux-ruby-test : ruby ​​testlerini kolayca çalıştırmak için bir dizi komut
  • vimux-cucumber : Salatalık Özelliklerini Vimux üzerinden çalıştırın
  • vim-turbux : tmux ile Turbo Ruby testi
  • vimux-pyutils : vimux için ipython'da kod bloklarını çalıştırmaya izin veren bir dizi işlev
  • vimux-nose-test : Vimux'da burun testleri yapın

İşte güzel bir "kullanım örneği": Spim ve Guard ile Vimux ve Turbux kullanarak talep üzerine testler


Neden indirildiğini açıklamak ister misiniz? (6 yıl önce bir cevap olmanın yanı sıra)
Pablo Olmos de Aguilera C.

13

Birisi zaten https://github.com/Shougo/vimshell.vim önerdi , ancak nedenini belirtmediler. Sonuç olarak, bu sorudan uzaklaştığımda diğer (çok daha yüksek sırada) seçenekleri denemek için çok fazla zaman harcadım.

Cevap Shougo / vimshell . İşte nedeni:

Bir terminal öykünücüsü olmanın yanı sıra VimShell, terminal çıkışında normal ve görsel modda gezinmenizi sağlar. Böylece, çalıştırdığınız bir komut yalnızca klavyeyi kullanarak kopyalamak ve yapıştırmak istediğiniz çıktıyla sonuçlanırsa ... VimShell bunu kapsar.

NeoVim'deki: terminal komutu dahil olmak üzere belirtilen diğer seçeneklerin hiçbiri bunu yapmaz. Neovim's: terminal yaklaşıyor, ancak 2/18/2017 itibariyle en azından aşağıdaki şekillerde yetersiz kalıyor :

  • İmleci en son VimShell ile aynı noktada tutmak yerine tamponun sonuna taşır. Büyük zaman kaybı.

  • Github'da bununla ilgili bir tartışmayımodifiable = 1 görmeyi desteklemez , bu nedenle vim-easymotion gibi yardımcı eklentiler kullanılamaz.

  • Vimshell gibi satır numaralarının görüntülenmesini desteklemez.

Neovim'in de dahil olduğu diğer seçeneklerde zaman kaybetmeyin: terminal. VimShell ile git.


1
NeoVim, normal / görsel modda terminal çıkışında gezinmenize ve kopyalamanıza izin verir. Bunu her zaman yaparım. NVIM 0.1.6-dev kullanma
Alice Heaton

Teşekkürler, VimShell'i deneyeceğim. Ancak cevabın yanlış bir ifadesini kaldırma özgürlüğünü aldım. @Alice'nin belirttiği gibi, NeoVim'ler :terminalkesinlikle aynı şeyi yapabilir.
Konrad Rudolph

:terminal:VimShellgezinme ve düzenleme açısından ve temel yollarla aynı şeyi yapamaz . Yukarıdaki açıklama düzenlemesine bakın.
user3751385


8

2
TAVSİYE ETMEYİN splitvt- renk kontrol kodlarını düzenler ve vimtamamen kullanılamaz hale getirir.
yeni123456

12
"Hayır" kötü bir cevaptır. Daha iyi bir yanıt "Varsayılan olarak hayır" dır. Teknik olarak, yapılabilir ve belki de yeni kaynak kodu yazmanız ve kendiniz derlemeniz veya bir eklenti yazmanız gerekir. Kolay mı? Belki hayır, ama yapılabilir. Sadece Hayır demek daha çok "hayır, yapmayacağım" demek gibidir.
trusktr

2
@AnishRamaswamy Stok vim (emacs aksine) kullanarak bir vim tamponu içinde bir kabuk çalıştırmak hala mümkün değildir. OP'nin sorusu buydu.
Amber

1
@Amber, Evet, OP'nin hisse senedi viminden bahsetmemesi dışında bu iyi olurdu.
Anish Ramaswamy

3
Birisi sadece stok vim ile yapamayacağınızı söylemek için bu cevabı düzenlemelidir.
still_dreaming_1

4

Bildiğim tek yol , üçüncü taraf bir yama olan vim-shell kullanmaktır .


Bilgiçlikçi olmak için, vim-shell bir 'eklenti' değil, bir yamadır (en azından benim için bir senaryo olduğunu ima eder). Kişisel olarak denemedim, ancak Vim wiki'deki vim kabuğu sayfası maalesef Vim 7.1+ ile derlenmeyeceğini gösteriyor.
Yewge

Bilgiçi yatıştırmak için değiştirildi. :) (15 karakterden daha uzun bir şey yazmak zorunda kaldım. 'Sabit' yeterince uzun değildi)
romandas

Shougo / vimshell ( github.com/Shougo/vimshell.vim ) oldukça iyi çalışıyor gibi görünüyor. Dinamik bir kütüphane oluşturmayı gerektirir, ancak oldukça basittir (cd <vim> / vimproc; make)
Wayne Walker


2

Vim'in içinde tam özellikli bir kabuk olan vterm'i deneyin . Tarihi ve net işlevleri ile biraz buggy ve hala geliştirilme aşamasında, ancak yine de oldukça iyi


2

Vim sürümünüzün +termönce komutu desteklediğini varsayarsak, vim için shell komutunu tek bir komutta kullanacak şekilde ayarlayın (örn. set=/usr/bin/zsh) Ve sonra komutu çalıştırın +term(ie bo 15vs +term). pencerelerinizde ek manevralar yapmanız gerekebilir (örn. birini silmek ve döndürmek), ancak terminalinize sahip olacaksınız.


0

Sorunuza kesinlikle cevap vermediğimi kabul ediyorum, ancak Vim ve Terminalleri aynı pencerede kullanırken benim için daha iyi olan şey Tmux'dur (bu, ekrana benzer bir şekilde "arka planda yazılımda çalıştırmak" gibi) biri bölmeler ve sekmelerle daha iyi çalışır).

Bu gönderi birlikte nasıl çalıştıklarını anlamanıza yardımcı olacaktır: 'Tmux ve Vim - birlikte daha da iyi' .

Bu şekilde Vim'i güçlü bir IDE'ye dönüştürebiliriz


0

term ++curwinVim arabelleğinin içindeki terminali çalıştırmak için ekranı bölün ve komutu çalıştırın. Aşağıdaki komut her ikisini de yapıyor ve benim için çalıştı:

:bo 10sp | term ++curwin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.