Можно ли оформить интерактивную оболочку в окне Vim?

16

Я знаю, что могу :!или могу :r!выполнить внешнюю команду и при желании вставить ее вывод в текст. Я даже могу выполнить, :!shи я создам оболочку, которая будет жить до тех пор, пока я не выйду из нее - но пока оболочка активна, Vim «спит» и недоступен. Я должен выйти из оболочки и создать новую, если я хочу на мгновение вернуться в Vim - не очень полезно.

Я могу получить доступ к оболочке на противоположном конце, приостановив Vim с помощью ^Zи управляя заданием Vim bg, fgи jobs. Это имеет больше смысла, но в конечном итоге очень громоздко. Я могу использовать, Screenесли он доступен (часто это не так), или открыть несколько окон моего оконного менеджера (и ssh для последовательного выбора хоста из каждого из них, чтобы на удаленном хосте были и vim, и shell, опять же громоздко).

Было бы лучше, если бы Vim позволил мне открыть сеанс оболочки и сохранить его, скажем, в одном из его (внутренних) окон или разрешить переключаться на него и обратно. Возможно ли что-то подобное?

Научная фантастика
источник
1
Итак, вы хотите открыть оболочку в a :split, сохранив файл в другом окне? ... Для меня это звучит как работа для tmux или screen ...
Мартин Турной
1
@Carpetsmoker: я часто не контролирую то, что установлено в удаленной системе, и чаще всего нет ни того, ни другого, хотя Vim всегда рядом.
SF.
Подумайте о переходе на Neovim. Теперь он имеет встроенный эмулятор терминала, который работает довольно хорошо и может быть открыт в буфере vim.
Зак

Ответы:

16

Есть пара плагинов vim, которые позволяют это. Я использую Conque ( Github ).

После помещения его в каталог плагинов все, что вам нужно сделать, это:

:ConqueTermSplit bash

И у вас будет интерактивная оболочка bash в vim. Затем вы можете использовать свои обычные жесты vim, чтобы делать что-либо еще, что вы можете сделать в окне.

Также другой плагин vimshell .

Bambu
источник
1
Нет способа сделать что-нибудь подобное без плагина?
SF.
3
@SF Смотрите :help shell-window. (Краткий ответ: нет.)
Муру
3

Я полагаю, что с VIM плагины, предназначенные для этого, не так уж хороши, хотя IMO vimshell подходит ближе всего. Однако вы должны понимать, что это проблема с двумя частями.

  1. VIM не был предназначен для выполнения подобных задач, особенно громоздким является возможность выполнять любую долгосрочную задачу и асинхронно общаться с ней, не блокируя VIM. В этом случае это не только сама оболочка, но и другие задачи, которые вы можете выполнять в процессе оболочки.
  2. Модальная философия VIM не очень хорошо сочетается с тем, как мы взаимодействуем с оболочкой. В оболочке редактируется только текущая строка, хотя вы можете прокручивать и видеть более старый текст вашей истории в оболочке, но вы не можете редактировать его. Это совсем не вписывается в философию VIM: если вы нажмете ESC и вернетесь в нормальный режим, станет довольно трудно запретить пользователю возвращаться и редактировать части истории выше.

На мой взгляд, есть два подхода, которые работают намного лучше в этом отношении.

  1. Использование окон терминала TMUX / Screen и мультиплекса, чтобы иметь как vim, так и оболочку. Таким образом, оба они аккуратно разделены, и все же вы можете просматривать оба с очень небольшим усилием, и оба могут работать в меру своих возможностей, не конфликтуя друг с другом.
  2. Используя плагины, такие как tpope / vim-dispatch и т. П., Вы можете легко запускать однократные команды оболочки и запускать их асинхронно в фоновом режиме в реальной оболочке терминала и возвращать результаты в vim после завершения. Это также обеспечивает вам одинаковый уровень изоляции между двумя, и, следовательно, оба могут снова работать в меру своих способностей, не наступая друг другу на пальцы.

Я должен добавить, что существует высокая вероятность того, что NeoVIM может привести к изменению этого аспекта, поскольку одной из его основных целей является возможность выполнять задания асинхронно. Но до тех пор это лучшее, что мы можем получить на мой взгляд.

Дхрува Сагар
источник
3

В :help shell-windowмы можем прочитать о выполнении команд оболочки в окне:

Возникли вопросы о возможности выполнения оболочки в окне внутри Vim.

Ответ: ты не можешь!

В том числе это добавит много кода в Vim, что является хорошей причиной не делать этого. В конце концов, Vim - редактор , он не должен выполнять задачи без редактирования. Однако, чтобы получить что-то подобное, вы можете попробовать разделить экран терминала или окно дисплея с помощью программы « splitvt ».

Альтернативой является команда « window », встречающаяся в системах BSD Unix, которая поддерживает несколько перекрывающихся окон. Или " экранная " программа.

Однако есть несколько решений, которые вы можете использовать:

  • использование, screenкоторое специально разработано для таких вещей, например:

    • Ctrl+ a, Sчтобы разделить текущее окно по горизонтали
    • Ctrl+ a, Tabдля переключения между окнами
    • Ctrl+ a, Xчтобы удалить текущий регион
    • Ctrl+ a, Qчтобы удалить все регионы, кроме одного

    Смотрите больше на: Руководство по выживанию экрана GNU в stackoverflow SE

    Или: GNU Screen Splitting , экран Quick Reference для более подробной информации.

  • VIM-Shell - сторонний патч

    Оболочка VIM - это расширение для VIM, которое имеет разделенные окна, и этот патч позволяет запускать оболочки в этих окнах. Доступно только для систем POSIX

  • vterm - эмулятор терминала внутри vim.

    Цель vterm - предоставить клон unix-терминала внутри vim, который работает прямо из коробки без каких-либо зависимостей.

  • Vimux - легко взаимодействовать с tmux из vim.

    Вдохновленный tslime.vim , плагином, который позволяет отправлять входные данные в tmux, vimux делает взаимодействие с tmux из vim без особых усилий.

  • другие уже упоминались: Conque

Связанный: Как запустить терминал внутри vim? в стеке потока

kenorb
источник
Как избавиться от раскола ?? : - /
0xc0de
Смотрите: Разделение экрана GNU
kenorb