Jak uruchomić terminal w Vimie?


303

Jestem przyzwyczajony do Emacsa, ale wypróbowuję Vima, żeby zobaczyć, który z nich bardziej mi się podoba.

Jedną z rzeczy, które lubię w Emacsie, jest możliwość uruchomienia terminalu wewnątrz Emacsa. Czy jest to możliwe w Vimie? Wiem, że możesz wykonywać polecenia z Vima, ale chciałbym móc uruchomić terminal wewnątrz karty.



42
Czy :! <command>tego szukasz?
bierze

48
Od wersji Vim 8.0 istnieje :termpolecenie, które otwiera nowy terminal w nowym podzielonym oknie. Jeśli to nie działa, sprawdź, vim --version | grep -o .terminalczy ta funkcja jest dostępna ( +terminal) czy niedostępna ( -terminal).
Susam Pal

Odpowiedzi:


123

Zdecydowanie poleciłbym screencoś takiego. Vim to edytor tekstu, a nie powłoka.

Chciałbym użyć, Ctrl+ASaby podzielić bieżące okno w poziomie, lub w ekranie Ubuntu i innych poprawionych wersjach możesz użyć Ctrl+A|(potoku), aby podzielić w pionie. Następnie użyj Ctrl+ATab(lub równoważnie w niektórych systemach, Ctrl+ACtrl+Iktóre mogą być łatwiejsze do wpisania), aby przełączać się między oknami. Istnieją inne polecenia zmieniające rozmiar i układ okien.

Lub mniej zaawansowane użycie screento po prostu otwieranie wielu okien pełnoekranowych i przełączanie się między nimi. Tak zwykle robię, od czasu do czasu używam funkcji podziału ekranu.

GNU ekranu Survival Guide pytanie ma kilka dobrych rad, jeśli jesteś zaznajomiony z jego stosowania.


7
+1 Dopiero niedawno otrzymałem ewangelię na ekranie. Zastanawiam się, jak żyłem bez tego.
pistolety

118
wolałbym wybrać tmux zamiast screena.
tomaszkubacki

81
Tak, oczywiście można uruchomić screen, tmux lub terminator, albo otworzyć inne okno i alt-tab, a nawet użyć przełącznika KVM aktywowanego za pomocą pedału. Ale nie o to chodzi - wszystkie te rozwiązania poświęcają integrację między terminalem a VIM, dlatego trudno byłoby szukać rozwiązań w tej przestrzeni. Nie rozumiem, w jaki sposób ta odpowiedź jest nawet odpowiedzią, nie mówiąc już o najwyższej lub zaakceptowanej odpowiedzi. Myślę, że pójdę wypróbować Conque.
Stabledog

33
jak to jest najlepsza odpowiedź ??? musisz cofnąć głosowanie i zagłosować na następną odpowiedź, która faktycznie odpowiada na twoje pytanie. Używanie screena nie uruchamia powłoki w vimie. To tak, jakby kazać komuś uruchomić kolejną powłokę. A dla tych, którzy ciągle wyrzucają „:!” JUŻ POWIEDZIAŁ, że wiedział, jak wykonywać polecenia, a NIE o to prosił ... sheesh. Arogancja jest tutaj tak gruba, że ​​można ją przeciąć nożem.
osirisgothra

6
Ta odpowiedź powinna zostać zaktualizowana z powodu nowej funkcji vima 8.1 Okno terminala
Alan Garrido

232

Nieaktualny od sierpnia 2011 r

Sprawdź Conque Shell (także na GitHub ). Umożliwia uruchamianie dowolnego programu interaktywnego w vimie, nie tylko powłoki.


21
:ConqueTerm bash <CR>, vim <CR>, :ConqueTerm bash.... rekurencyjne horror !!
keflavich

1
psihodelia wydaje się mieć rację. Właśnie skompilowałem vima z --enable-pythoninterp (cygwin nie dystrybuuje vima z + python) i po zainstalowaniu ConqueTerm pojawia się błąd z #set_buffer_settings. Nie byłem w stanie wyśledzić, gdzie mieszka ta funkcja, ani nie miałem pojęcia, co oznacza błąd. Wiadomość zawiera stwierdzenie o niepoprawnym argumencie „edit ++ enc = utf-8 bash \ - \ 2”. Argh.
Nate Kennedy,

47
Aby zrozumieć rekurencję, musisz najpierw zrozumieć rekurencję.
Stabledog

19
@ Łukasz Niemier VIMCEPTION
Sebastián Grignoli

1
Wydaje się, że nie jest to już obsługiwane, czy ktoś ma zastępcę?
dykeag

203

Nie jestem pewien, co dokładnie chcesz osiągnąć (nigdy nie korzystałem z Emacsa), ale możesz uruchamiać polecenia w Vimie, pisząc:

:! somecommand [ENTER]

A jeśli chcesz wpisać kilka poleceń lub pobawić się przez chwilę w powłoce, zawsze możesz użyć:

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

Po zakończeniu polecenia lub powłoki pojawi się opcja naciśnięcia, Enteraby wrócić do okna edytora

Vim jest celowo lekki i nie ma możliwości robienia rzeczy nieedytorskich, podobnie jak uruchamianie pełnowymiarowej powłoki w panelu / karcie Vima, ale jak wspomniano powyżej, istnieją dodatki innych firm, takie jak vim-shell, które pozwalają ci robić takie rzeczy.

Zazwyczaj, jeśli chcę przełączać się między Vimem a moją powłoką (Bash), po prostu naciśnij CTRL+, Zaby wstrzymać proces Vima, bawić się w mojej powłoce, a następnie wpisać „fg”, gdy chcę wrócić do Vima - zachowując mój edytor i mój muszla ładna i osobna.


17
A jeśli chcesz skopiować wynik polecenia do bieżącego bufora:: r! reż
Cyber ​​Oliveira,

6
Używam zarówno Emacsa, jak i Vima (i mam o wiele więcej doświadczenia z Vimem). Odkryłem jednak, że często ładniej i łatwiej jest pracować z dwoma widokami jednocześnie (jeden, aby zobaczyć, co edytujesz, a drugi, aby pracować w interaktywnej powłoce - na przykład, aby przetestować efekt zmiany konfiguracji, którą masz właśnie edytowane). Pomaga również w moich procesach poznawczych, retencyjnych i mentalnych, gdy ważne rzeczy, które mogę potrzebować uważnie monitorować, nie znikają z ekranu (jak dzieje się, gdy używasz Ctrl-Z lub: shell w Vimie).
mvanle

To świetna odpowiedź, która pozwoli zaoszczędzić dużo czasu.
jerry_sjtu

Niezła odpowiedź! Aby jeszcze bardziej to uzupełnić, dodam również :r! command [ENTER]wspomniane w komentarzach.
Jeach,

151

Sposób na obejście tego jest:

  • wstrzymaj Vima za pomocą Ctrl+ Z,
  • grać w terminalu,
  • następnie wróć do miejsca, w którym zostawiłeś Vima, po prostu wpisując polecenie fg.

14
:!bashjest lepszym sposobem na zrobienie tego
0atman

Wydaje mi się, że chce czegoś w rodzaju marzycielskiej funkcjonalności
Adam Miller,

10
@Oatman Dlaczego jest :!bashładniejszy niż Ctrl+z? (Zastanawiam się)
Sebastián Grignoli

2
@ SebastiánGrignoli, ponieważ Ctrl+Zna przykład możesz przejść do innego folderu, a lsnastępnie git statusitd. Ctrl+ZOznacza „pauzę”, którą możesz „wznowić” fg. Ale dzięki:! Bash, jak dotychczas wiem, możesz uruchomić tylko jedno polecenie na raz, a nawet jeśli możesz uruchomić więcej niż jedno polecenie na raz, nadal nie jest to wygodne. Ogólnie więc „Ctrl + Z” jest znacznie lepszy
Leo

+1, ponieważ działa prawie w każdym środowisku. Działa na obcym systemie, którego nie mogę dostosować, a dzięki taniej powłoce PuTTY działa to świetnie.
t3sture,

121

Jeśli jest włączony w twojej wersji Vima, terminal można uruchomić :termpoleceniem.

Obsługa okna terminala została dodana do Vima 8. Jest to opcjonalna funkcja, którą można włączyć podczas kompilacji Vima z funkcją terminalu +. Jeśli twoja wersja Vima ma obsługę terminalu, :echo has('terminal')wyświetli „1”.

Wpisanie :termspowoduje przejście do trybu Terminal-Job , w którym możesz używać terminala zgodnie z oczekiwaniami.

W trybie Terminal-Job naciśnięcie Ctrl-W Nlub Ctrl-\ Ctrl-Nprzełączenie trybu na Terminal-Normal pozwala na przesuwanie kursora i uruchamianie poleceń podobnie jak w trybie normalnym Vima . Aby wrócić do trybu pracy terminalowej , naciśnij i.

Inne odpowiedzi wspominają o podobnej funkcjonalności w Neovim.


5
+1 za powrót do trybu terminalu cmd ipo przełączeniu z trybu przeglądania ctrl-wN. Jest to funkcja zabójcza nawet dla tmux i działa również w systemie Windows.
radke

1
Czy możliwe jest użycie podziału pionowego :term?
Witalij Zdanewicz

1
Wspaniały! Świetnie, że terminal jest wbudowany, więc nie mamy bałaganu z większą liczbą wtyczek. Uaktualniono do vim 8 via brew install vim --override-system-vii :termdziała idealnie. Dzięki za udostępnienie!
LeOn - Han Li

18
@VitalyZdanevich, :vertical :termpodzieli się pionowo z terminalem w lewym oknie. :vertical :botright :termpodzieli się pionowo z terminalem w prawym oknie. Alternatywnie możesz ręcznie rozmieścić okna, a następnie użyć, :term ++curwinaby otworzyć terminal w aktywnym oknie.
Daniel S.

esc ctrl-w pozwala na przełączanie między oknami
1869582

87

:shpotem ctrl+dwracać (bash)

Aktualizacja :

Możesz odwzorować ctrl+dw vimie, aby uruchomić :sh, co pozwala szybko przełączać się między bash i vim.

noremap <C-d> :sh<cr>


1
Myślę ctrl+zi fgsą nieco szybsze, biorąc pod uwagę, że nie musisz pisać :shw tym przypadku.
Alex

@Alex nie, nie musisz pisać, :shjeśli wykonujesz mapę. Po noremap, możesz po prostu Ctrl+Dod vima do sh, a ponieważ ^Djest EOF, który kończy sh, więc powrócisz do vima. Jeden klawisz może przełączać się między shi vim.
no1xsyzy,

42

Główną nową funkcją Vima 8.1 jest obsługa uruchamiania terminala w oknie Vima.

:term otworzy terminal w innym oknie w Vimie.


2
to działa idealnie, dzięki! twoja odpowiedź jest znacznie bardziej
zgodna

Cześć, czy wiesz, jak wyjść z tego trybu?
user3289737,

2
jak w normalnym terminalu, exitwyjdzie z terminala, a następnie użyj, :qaby zamknąć okno
Yossarian42

2
@ user3289737 Alternatywnie możesz nacisnąć Ctrl + W dwa razy z rzędu, aby przełączać się między oknami. Nie dotyczy to okien terminali, ale działa równie dobrze.
flarn2006

39

Ostatecznie natywna :terminalkomenda została dodana do vima w 2017 roku.

Oto fragment pliku : terminal readme:

Ta funkcja służy do uruchamiania emulatora terminala w oknie Vima. Zadanie można uruchomić podłączone do emulatora terminala. Na przykład, aby uruchomić powłokę:

 :term bash

Lub uruchomić polecenie kompilacji:

 :term make myprogram

Zadanie jest uruchamiane asynchronicznie z Vima, okno zostanie zaktualizowane, aby pokazać wynik zadania, również podczas edycji w innym oknie.


Terminal działa w buforze na tej samej karcie. więc jeśli jesteś przyzwyczajony do używania wielu plików w vimie, możesz napotkać pewne trudności. przełączanie buforów w końcu dojdzie do terminala, skąd nie ma punktu powrotu, musisz zabić terminal. tak długo, jak jesteś tego świadomy, powinno być dobrze. mam nadzieję, że programiści zaproponują obejście tego problemu.
ArunMKumar

1
@ArunMKumar Użyj [Ctrl + W], aby „uciec” z terminala, a następnie wykonaj :bnjak zwykle. Nie trzeba zabijać terminalu i nie ma sensu wracać :)
fjardon

Dzięki, kolego, całkowicie tego przegapiłem. Mam przypisane klucze : bn do klucza i przestał działać, działa ponownie. To było moje złe.
ArunMKumar

2017? Masz na myśli 2018?
flarn2006

1
@ flarn2006, w odniesieniu do 2017 r. w porównaniu z 2018 r., Vim 8.1 został ogłoszony na vim.org 18 maja 2018 r., a „wsparcie dla uruchamiania terminala w oknie Vima” wymieniono jako „główną nową funkcję”. Ta funkcja była po raz pierwszy dostępna wcześniej, 7 lipca 2017 r., W łatce 8.0.0693. github.com/vim/vim/commit/…
Daniel S.

32

To pytanie jest dość stare, ale dla tych, którzy je znajdą, istnieje nowe możliwe rozwiązanie: Neovim zawiera pełnoprawny, pierwszej klasy emulator terminala, który robi dokładnie to, co próbował ConqueTerm. Po prostu biegnij :term <your command here>.

<C-\><C-n>wyjdzie z trybu termicznego z powrotem do trybu normalnego. Jeśli jesteś podobny do mnie i wolisz, aby tryb ucieczki nadal wychodził, możesz dodać to do swojego nvimrc:

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

A następnie dwukrotne naciśnięcie ESC spowoduje wyjście z trybu terminalowego z powrotem do trybu normalnego, dzięki czemu można manipulować buforem, w którym nadal działa polecenie.

Chociaż należy pamiętać, ponieważ w chwili, gdy publikuję tę odpowiedź, nvim jest w fazie intensywnego rozwoju, można dodać inny sposób na wyjście z trybu terminalowego. Ponieważ Ctrl+\Ctrl+nprzełączam się w tryb normalny z prawie dowolnego trybu, nie oczekuję, że ta odpowiedź będzie błędna, ale pamiętaj, że jeśli nie zadziała, ta odpowiedź może być nieaktualna.

https://github.com/neovim/neovim


29

:term

Ta funkcja została jednak niedawno dodana w Vimie 8.1, która od tego momentu została niedawno wydana, więc może być konieczna aktualizacja, aby z niej skorzystać.


Został dodany przed wersją 8.1. To tylko główna duża funkcja, której nie miał vim 8.0.001. Dlatego jest reklamowany jako nowość vim 8.1. Zobacz odpowiedź Daniela z października 2017 r. I fjardona na kwiecień 2018 r. -> github.com/vim/vim/blob/master/runtime/doc/version8.txt#L18814
Luc Hermitte

17

Wiem, że nie odpowiadam bezpośrednio na pytanie, ale myślę, że to dobre podejście. Nikt nie wspomniał o tmuxie (a przynajmniej nie jako samodzielnej odpowiedzi). Tmux jest terminalem przypominającym ekran multipleksera. Większość rzeczy można wykonać w obu multipleksatorach, ale łatwiej jest je skonfigurować. Również tmux jest obecnie aktywniej rozwijany niż ekran, a wokół niego znajduje się dość duży ekosystem, na przykład narzędzia pomagające w konfiguracji, ecc.

Również dla vima istnieje inna wtyczka: ViMUX , która bardzo pomaga w interakcji między oboma narzędziami. Możesz wywoływać polecenia za pomocą:

:call VimuxRunCommand("ls")

To polecenie tworzy mały poziomy podział poniżej obecnego vima panelu.

Może także umożliwiać uruchamianie z wiersza poleceń na wypadek, gdyby nie chcesz uruchamiać całego polecenia:

<Leader>vp :VimuxPromptCommand<CR>

Ponieważ to nie wystarczyło, istnieje co najmniej 6 „wtyczek specyficznych dla platformy”:

  • vim-vroom : biegacz do rspec, ogórka i testu / jednostki; Wsparcie vimux przezg:vroom_use_vimux
  • vimux-ruby-test : zestaw poleceń ułatwiających uruchamianie testów ruby
  • vimux-cucumber : uruchom Cucumber Features przez Vimux
  • vim-turbux : Testy Turbo Ruby z tmux
  • vimux-pyutils : Zestaw funkcji dla vimux, które pozwalają na uruchamianie bloków kodu w ipython
  • vimux-nose-test : Uruchom testy nosa w vimux

Oto ładny „przypadek użycia”: Testy na żądanie przy użyciu Vimux i Turbux z Spork i Guard


Chcesz wyjaśnić, dlaczego zostało to odrzucone? (poza tym, że był odpowiedzią sprzed 6 lat)
Pablo Olmos de Aguilera C.

13

Ktoś już zasugerował https://github.com/Shougo/vimshell.vim , ale nie wspomniał dlaczego. W związku z tym, kiedy odeszłam od tego pytania, traciłam wiele czasu na wypróbowywanie innych (znacznie wyżej ocenianych) opcji.

Shougo / vimshell jest odpowiedzią. Dlatego:

Oprócz bycia emulatorem terminala, VimShell umożliwia nawigację po wyjściu terminala w trybie normalnym i wizualnym. Tak więc, jeśli uruchomione polecenie daje wynik, który chcesz skopiować i wkleić tylko przy użyciu klawiatury ... VimShell obejmuje to.

Nie robi tego żadna z pozostałych wymienionych opcji, w tym polecenie: terminal w NeoVim. Neovim: terminal zbliża się do końca, ale nie spełnia przynajmniej następujących sposobów na dzień 18.02.2017:

  • Przesuwa kursor na koniec bufora, zamiast na końcu utrzymując go w tym samym miejscu, co robi VimShell. Ogromna strata czasu.

  • Nie obsługuje modifiable = 1zobaczyć dyskusję na ten temat na Github , więc pomocna wtyczek jak vim-easymotion nie może być używany.

  • Nie obsługuje wyświetlania numerów linii, podobnie jak Vimshell.

Nie trać czasu na inne opcje, w tym terminal Neovim:. Idź z VimShell.


1
NeoVim umożliwia nawigację i kopiowanie z wyjścia terminala w trybie normalnym / wizualnym. Robię to cały czas. Korzystanie z NVIM 0.1.6-dev
Alice Heaton

Dzięki, spróbuję VimShell. Pozwoliłem sobie jednak na usunięcie niepoprawnego stwierdzenia z odpowiedzi. Jak zauważyła @Alice, NeoVim :terminalmoże absolutnie zrobić to samo.
Konrad Rudolph

:terminalnie może robić tego samego, co :VimShellw zakresie nawigacji i edycji oraz w zasadniczy sposób. Zobacz objaśnienie edycji powyżej.
user3751385,


8

2
NIE NALEŻY PORADAĆ splitvt- zakłóca kody kontroli kolorów i czyni go vimcałkowicie bezużytecznym.
new123456

12
„Nie” to zła odpowiedź. Lepszą odpowiedzią jest „Domyślnie nie”. Technicznie można to zrobić i być może trzeba napisać nowy kod źródłowy i samodzielnie go skompilować lub napisać wtyczkę. To jest łatwe? Może nie, ale da się to zrobić. Po prostu powiedzenie „Nie” bardziej przypomina powiedzenie „Nie, nie zrobię tego”.
trusktr

2
@AnishRamaswamy Nadal nie jest możliwe uruchomienie powłoki w buforze vim przy użyciu stock vim (w przeciwieństwie do emacsa). Oto pytanie OP.
Bursztyn

1
@Amber, Tak, byłoby dobrze, gdyby OP nie wspomniał o używaniu vim-a.
Anish Ramaswamy,

3
Ktoś powinien po prostu edytować tę odpowiedź, aby powiedzieć, że nie możesz tego zrobić za pomocą standardowego vima.
still_dreaming_1

4

Znam tylko sposób używania vim-shell , łaty innej firmy.


Aby być pedantycznym, vim-shell jest łatką, a nie „dodatkiem” (co przynajmniej dla mnie oznacza, że ​​jest to skrypt). Nie próbowałem tego osobiście, ale strona vim-shell na wiki Vima niestety sugeruje, że nie skompiluje się z Vimem 7.1+.
Yewge,

Zmieniono, aby uspokoić pedanta. :) (Musiałem wpisać coś dłuższego niż 15 znaków. „Naprawiono” nie było wystarczająco długie)
romów

Shougo / vimshell ( github.com/Shougo/vimshell.vim ) wydaje się działać całkiem dobrze. Wymaga zbudowania biblioteki dynamicznej, ale jest dość prosta (cd <vim> / vimproc; make)
Wayne Walker


2

Wypróbuj vterm , który jest całkiem pełną powłoką wewnątrz vima. Jest nieco wadliwy ze swoją historią i przejrzystymi funkcjami i wciąż się rozwija, ale nadal jest całkiem niezły


2

Zakładając, że twoja wersja vima obsługuje +termnajpierw polecenie, ustaw powłokę, aby vim używał go w jednym poleceniu (np. set=/usr/bin/zsh), A następnie uruchom polecenie +term(tj bo 15vs +term.). być może będziesz musiał wykonać dodatkowe manewry w swoich oknach (tj. usunąć jedno i obracać), ale będziesz mieć swój terminal.


0

Potwierdzam, że nie odpowiadam ściśle na twoje pytanie, ale to, co działało dla mnie lepiej, gdy korzystam z Vima i terminali w tym samym oknie, to Tmux (który jest swego rodzaju „uruchomionym w tle oprogramowaniem”, podobnym do ekranu, chociaż to jeden działa lepiej z podziałami i tabulatorami).

Ten post pomoże ci zrozumieć, jak działają razem: „Tmux i Vim - jeszcze lepiej razem” .

W ten sposób możemy przekonwertować Vima na potężne IDE


0

Podziel ekran i uruchom polecenie, term ++curwinaby uruchomić terminal w buforze Vima. Następujące polecenie działa zarówno i działa dla mnie:

:bo 10sp | term ++curwin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.