Czy mogę wystawić interaktywną powłokę w oknie Vima?

17

Wiem, że mogę :!lub mogę :r!wykonać polecenie zewnętrzne i opcjonalnie wstawić jego wynik do tekstu. Mogę nawet występować :!shi odradzam pocisk, który będzie żył, dopóki go nie opuszczę - ale gdy pocisk jest aktywny, Vim „śpi” i jest niedostępny. Muszę opuścić powłokę i odrodzić nową, jeśli chcę wrócić na chwilę do Vima - niezbyt przydatna.

Mogę uzyskać dostęp do powłoki na drugim końcu, zawieszając Vima ^Zi zarządzając zadaniem Vima poprzez bg, fgi jobs. Ma to większy sens, ale na dłuższą metę jest bardzo uciążliwe. Mogę użyć, Screenjeśli jest dostępny (często nie jest), lub otworzyć kilka okien mojego menedżera okien (i ssh do docelowego hosta z każdego z nich po kolei, aby mieć zarówno vima, jak i powłokę na zdalnym hoście, znowu niewygodne).

Byłoby najlepiej, gdyby Vim pozwolił mi otworzyć sesję powłoki i zatrzymać ją, powiedzmy, w jednym z (wewnętrznych) okien lub pozwolić mi się na nią przełączyć i wrócić. Czy coś takiego jest możliwe?

SF.
źródło
1
Więc w zasadzie chcesz otworzyć powłokę w :split, zachowując plik w drugim oknie? ... Dla mnie to brzmi jak praca dla tmux lub screena ...
Martin Tournoij
1
@Carpetsmoker: Często nie mam kontroli nad tym, co jest zainstalowane w zdalnym systemie, i najczęściej żadna z nich nie istnieje, podczas gdy Vim jest zawsze obecny.
SF.
Rozważ przejście na Neovim. Ma teraz wbudowany emulator terminala, który działa całkiem dobrze i może być otwarty w buforze vim.
Zach

Odpowiedzi:

16

Istnieje kilka wtyczek vim, które to umożliwiają. Używam Conque ( Github ).

Po umieszczeniu go w katalogu wtyczek wystarczy, że:

:ConqueTermSplit bash

W vimie będziesz mieć interaktywną powłokę bash. Następnie możesz używać swoich regularnych gestów vim, aby robić cokolwiek innego, co chcesz zrobić w oknie.

Inną wtyczką jest vimshell .

Bambu
źródło
1
Nie możesz zrobić czegoś takiego bez wtyczki?
SF.
3
@SF Zobacz :help shell-window. (Krótka odpowiedź: nie.)
muru
3

W przypadku VIM uważam, że wtyczki, które mają to zrobić, nie są wcale takie świetne, chociaż vimshell IMO jest najbliższy. Musisz jednak zrozumieć, że jest to problem z 2 częściami.

  1. VIM nie został zaprojektowany do robienia takich rzeczy, szczególnie kłopotliwe jest wykonywanie dowolnego długiego zadania i rozmawianie z nim asynchronicznie bez blokowania VIM. W tym przypadku nie tylko sama powłoka, ale także inne zadania, które możesz wykonać w ramach procesu powłoki.
  2. Modalna filozofia VIM nie gra zbyt dobrze ze sposobem interakcji z powłoką. W powłoce można edytować tylko bieżący wiersz, chociaż można przewijać i wyświetlać starszy tekst swojej historii za pomocą powłoki, której nie można edytować. Nie pasuje to wcale do filozofii VIM-a, jeśli naciśniesz ESC i wrócisz do normalnego trybu, trudno będzie uniemożliwić użytkownikowi cofnięcie się i edycję części powyższej historii.

Moim zdaniem istnieją dwa podejścia, które pod tym względem działają znacznie lepiej.

  1. Korzystanie z TMUX / Screen i okien terminala multipleksowego, aby mieć zarówno vim, jak i powłokę. W ten sposób oba są starannie rozdzielone, a jednocześnie możesz oglądać oba przy niewielkim wysiłku, a oba mogą pracować najlepiej, jak potrafią, bez konfliktu ze sobą.
  2. Korzystając z wtyczek takich jak tpope / vim-dispatch i podobnych, możesz łatwo uruchamiać pojedyncze polecenia powłoki i uruchamiać je asynchronicznie w tle w rzeczywistej powłoce terminalowej i wyciągać wyniki z vima po zakończeniu. Zapewnia to również ten sam poziom izolacji między nimi, dzięki czemu oboje mogą znów pracować najlepiej, jak potrafią, nie stawiając sobie nawzajem palców.

Powinienem dodać, że istnieje duże prawdopodobieństwo, że NeoVIM może zmienić ten aspekt, ponieważ jednym z jego głównych celów jest możliwość wykonywania zadań asynchronicznie. Ale do tego czasu moim zdaniem jest to najlepsze, co możemy uzyskać.

Dhruva Sagar
źródło
3

W :help shell-windowmożemy przeczytać o wykonywaniu poleceń powłoki w oknie:

Pojawiły się pytania dotyczące możliwości wykonania powłoki w oknie w Vimie.

Odpowiedź: nie możesz!

Włączenie tego dodałoby dużo kodu do Vima, co jest dobrym powodem, aby tego nie robić. W końcu Vim jest edytorem , nie powinien wykonywać zadań nieedytacyjnych. Aby jednak uzyskać coś takiego, możesz spróbować podzielić ekran terminala lub okno wyświetlania za pomocą programu „ splitvt ”.

Alternatywą jest polecenie „ okno ”, znalezione w systemach BSD Unix, które obsługuje wiele nakładających się okien. Lub program „ ekranowy ”.

Istnieje jednak kilka rozwiązań, z których można skorzystać:

  • zastosowanie screenspecjalnie zaprojektowane do tego rodzaju rzeczy, np .:

    • Ctrl+ a, Saby podzielić bieżące okno w poziomie
    • Ctrl+ a, Tababy przełączać się między oknami
    • Ctrl+ a, Xaby usunąć bieżący region
    • Ctrl+ a, Qaby usunąć wszystkie regiony oprócz jednego

    Zobacz więcej na: GNU Screen Survival Guide at stackoverflow SE

    Czyli GNU Dzielenie ekranu , ekran szybkich Reference więcej szczegółów.

  • VIM-Shell - łatka innej firmy

    Powłoka VIM jest rozszerzeniem VIM, które zawiera podzielone okna, a ta łatka umożliwia uruchamianie powłok w tych oknach. Jest dostępny tylko dla systemów POSIX

  • vterm - emulator terminala w vimie.

    Celem vterm jest dostarczenie klonu terminala unixowego wewnątrz vima, który działa od razu po rozpakowaniu, bez żadnych zależności.

  • Vimux - łatwa interakcja z tmux z vim.

    Zainspirowany przez tslime.vim , wtyczkę, która pozwala wysyłać dane wejściowe do tmux, vimux ma ułatwić interakcję z tmux z vim.

  • inne już wspomniane: Conque

Powiązane: Jak uruchomić terminal w vimie? przy przepełnieniu stosu

kenorb
źródło
Jak pozbyć się podziału? : - /
0xc0de
Zobacz: Podział ekranu GNU
kenorb