31

Как я могу перенаправить вывод команды оболочки в новый буфер в Vim? Очевидно, что следующее не сработает, но вы можете видеть, к чему я клоню:

:!echo % | :newtab

4 ответа4

24

Вы не можете перенаправить вывод команды оболочки в команду, которая создает новый буфер, но вы можете создать новый буфер и прочитать вывод команды оболочки в этот буфер с помощью одной записи в командной строке Vim. Рабочая версия вашего примера будет

:tabnew | r !echo <c-r>=bufname("#")<cr>

Обратите внимание, что символ канала в этом случае является разделителем между командами Vim ex, а не каналом оболочки. Смотрите также

:help :tabnew
:help :r!
:help :bar
14

Вот что я делаю. Это упоминается в комментариях в ответах выше.

:new | r ! <cmd>
:new | r ! <cmd> #   (# is replaced with filename)

Пример 1: Найти все текстовые файлы в /tmp

:new | r ! find /tmp -name '*.txt'

Пример 2: Вы редактируете файл foo.txt и хотите запустить ls -la foo.txt и получить вывод в буфере:

:new | r ! ls -la #

Символ # заменяется именем файла исходного буфера, который вы редактируете. Это особенно полезно для специальных команд управления исходным кодом, например

:new | r ! hg annotate -un #

:new создает горизонтальное разделение, используйте :vnew если вы хотите вместо него вертикальное разделение, и :tabnew для новой вкладки.

4
:tabnew | enew | r ! <your shell cmd>

работает для меня.

2

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

:let res = system('echo '.expand('%'))
:tabnew
:put=res

или сохраните текущее имя буфера для последующего использования:

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .