Передать вывод команды оболочки (!) В новый буфер в Vim

35

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

:!echo % | :newtab
Ричи Маркес
источник
1
stackoverflow.com/questions/3826003/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

27

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

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

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

:help :tabnew
:help :r!
:help :bar
garyjohn
источник
Это почти то, что мне нужно, просто наоборот, чтобы я мог получить доступ к имени файла текущего буфера. Примечание: обновил вопрос, чтобы, надеюсь, уточнить желаемый конечный результат.
Ричи Маркес
@Richard Marquez: я обновил этот ответ. Новая вкладка теперь открывается со «старым» именем файла, таким образом, вы можете вызвать:! echo%
akira
Но не :r!echoбез изменения буфера.
Люк Эрмит
2
@garyjohn, Акира: спасибо за помощь. Часть "<cr> = ..." вызвала ошибки Vim, но я смог заставить ее работать с ": tabnew | r! Echo #".
Ричи Маркес
1
Также может быть полезно отметить, что если вы хотите сопоставить это с ключом в вашем .vimrc, вам нужно заменить | персонаж с <бар>.
Ричи Маркес
16

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

: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для новой вкладки.

overthink
источник
Вы можете ответить на этот вопрос и здесь ? речь идет о попытке использовать текущий буфер с %для следующего буфера, но E499.
HHH
4
:tabnew | enew | r ! <your shell cmd>

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

justrajdeep
источник
2

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

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

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

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>
Люк Эрмитт
источник
см. другой ответ, вы можете сделать это без сохранения имени в переменной. но хороший ответ в любом случае.
Акира
Верно. Я не был уверен, что "#" даст ожидаемый результат в этом случае - поскольку я никогда не использую вкладки
Люк Эрмитт