Откройте вывод команды оболочки в разделенной панели

23

Рассмотрим любой интерпретируемый язык программирования.

Я могу запустить текущий открытый скрипт ! interpreter %, используя ключ возврата, чтобы вернуться к vim после завершения выполнения.

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

Я пытался :split ! interpreter %, но это не сработало.

Есть ли способ? Я использую Vim 7.3.

муфель-
источник

Ответы:

29

При :!этом внешняя команда выполняется в оболочке, и мимолетный вывод не захватывается внутри Vim; вы просто видите, что выводится на терминал, а затем управление возвращается в Vim после завершения внешней команды.

Чтобы сохранить вывод, вы должны прочитать его в буфер Vim . Для этого есть :read!команда. Чтобы открыть новый рабочий буфер, объедините это с :new:

:new | 0read ! <command>

Если вы хотите передать имя файла текущего буфера ( %) внешней команде, вы должны использовать его :executeтак, чтобы оно уже оценивалось в текущем буфере:

:execute 'new | 0read ! interpreter' expand('%')

Или вы используете тот факт, что с новым буфером предыдущий становится альтернативным , и используете #вместо %:

:new | 0read ! interpreter #

Избавиться от нуля буфера с :bdelete!.

Если вы хотите видеть вывод асинхронно во время его выполнения, вам нужен внешний мультиплексор или плагин, как указано в ответе @chaos.

Инго Каркат
источник
Приведенная выше команда «: execute ...» работает для меня, но когда я пытаюсь привязать ее к нажатию клавиши F9, используя эту запись .vimrc [nnoremap <buffer> <F9>: execute 'new | 0read! / Usr / bin / env python3 'expand ('% ')], я получаю следующую ошибку: [/ bin / bash: -c: строка 0: неожиданный EOF при поиске соответствия `' 'expand ('% ') )]. Я перепробовал несколько escape-последовательностей, но, думаю, не тот. знак равно Есть идеи? Спасибо.
NYCeyes
2

Насколько я знаю, вы не можете сделать это в vim. Но используйте терминальный мультиплексор, как screenдля этого. Перед открытием vim запустите мультиплексор:

screen

Затем нажмите ctrl- a Sдля горизонтального и ctrl- a |для вертикального пролитого экрана.

Теперь откройте файл на vimодном из разделенных экранов. И перейти на другой экран, используя ctrl- a tab. Обратите внимание, что на втором экране вам сначала нужно открыть новый экран ( ctrl- a c), прежде чем вы сможете его использовать.

На экране с vim вы можете редактировать файл, а на другом экране вы можете выполнить его и постоянно видеть сообщения и код.

Здесь быстрая ссылка для screen.

хаос
источник
Кроме того, вы можете использовать tmuxмультиплексор и vim-dispatchплагин для автоматизации разделения и перехода между панелями.
taketwo