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.