Вывести вывод внутренней команды vim в буфер

18

Как вывести внутреннюю команду vim (не команду оболочки) в новый буфер?

Например, я хочу вывести список всех плагинов :enewиз, :scriptnamesчтобы я мог найти его.

Брайс Гуинта
источник

Ответы:

24

Вы можете использовать :redirдля перенаправления вывода в переменную, регистр или файл. Пример перенаправления в безымянный регистр:

:redir @">|silent scriptnames|redir END|enew|put

В качестве альтернативы, сценарий Tim Pope scriptease.vim предоставляет :Scriptnamesкоманду, которая будет загружаться :scriptnamesв список быстрых исправлений и :copen.

Если вы обнаружите, что перенаправляете много команд, вы можете заключить это в команду:

command! -nargs=+ -complete=command Redir let s:reg = @@ | redir @"> | silent execute <q-args> | redir END | new | pu | 1,2d_ | let @@ = s:reg

Теперь вы можете использовать :Redirкоманду для перенаправления вывода в новый буфер. например :Redir scriptnamesили :Redir ls.

Vim 8+

Vim 8 поставляется с новой execute()функцией. Вы можете использовать execute()функцию вместо того, :redirчтобы захватывать выходные данные экс-команды.

 :enew|pu=execute('scriptnames') 

Для получения дополнительной помощи см .:

:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()
Питер Ринкер
источник
Что ENDзначит?
Брайс Гуинта
1
Он перестает перенаправлять вывод в регистр, чтобы вы могли снова иметь обычный вывод.
Tumbler41
1
:redir ENDговорит Vim прекратить перенаправление сообщений. Смотрите:h :redir
Питер Ринкер
Чтобы выполнить внешнюю команду и записать ее вывод в переменную Vim, используйте system (). : let hostname = system ('hostname')
user3751385
2

Для полноты картины я хочу представить эти удивительные функции, которые я собрал (украл) у romainl

" redirect the output of a Vim or external command into a scratch buffer
function! Redir(cmd)
  if a:cmd =~ '^!'
    execute "let output = system('" . substitute(a:cmd, '^!', '', '') . "')"
  else
    redir => output
    execute a:cmd
    redir END
  endif
  tabnew
  setlocal nobuflisted buftype=nofile bufhidden=wipe noswapfile
  call setline(1, split(output, "\n"))
  put! = a:cmd
  put = '----'
endfunction
command! -nargs=1 Redir silent call Redir(<f-args>)

Это займет нормальный или системный вывод команды и поместит его в новую вкладку. Не стесняйтесь изменить строку tabnewна vsplitили splitт. Д.

клаус
источник
ссылка на суть @ romainl gist.github.com/romainl/eae0a260ab9c135390c30cd370c20cd7
Дино Фу
@DynoFu, добавил ссылку на мой ответ.
клаус
1

Также есть плагин bufferize.vim :

:Bufferize scriptnames

который является в основном упакованной версией принятого ответа (использования :redir) и может быть более удобным для некоторых.

Мариус Гедминас
источник