Как я могу направить вывод команды оболочки в новый буфер в Vim? Очевидно, что следующее не сработает, но вы можете видеть, к чему я клоню:
:!echo % | :newtab
Как я могу направить вывод команды оболочки в новый буфер в Vim? Очевидно, что следующее не сработает, но вы можете видеть, к чему я клоню:
:!echo % | :newtab
Ответы:
Вы не можете перенаправить вывод команды оболочки в команду, которая создает новый буфер, но вы можете создать новый буфер и прочитать вывод команды оболочки в этот буфер с помощью одной записи в командной строке Vim. Рабочая версия вашего примера будет
:tabnew | r !echo <c-r>=bufname("#")<cr>
Обратите внимание, что символ канала в этом случае является разделителем между командами Vim ex, а не каналом оболочки. Смотрите также
:help :tabnew
:help :r!
:help :bar
:r!echo
без изменения буфера.
Вот что я делаю. Это упоминается в комментариях в ответах выше.
: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
для новой вкладки.
:tabnew | enew | r ! <your shell cmd>
работает для меня.
Если вам действительно требуется сохранить результат в новом буфере, но требуется информация из старого текущего буфера, то вы можете использовать system()
:
:let res = system('echo '.expand('%'))
:tabnew
:put=res
или сохраните текущее имя буфера для дальнейшего использования :
:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>