Как вывести внутреннюю команду vim (не команду оболочки) в новый буфер?
Например, я хочу вывести список всех плагинов :enew
из, :scriptnames
чтобы я мог найти его.
Как вывести внутреннюю команду vim (не команду оболочки) в новый буфер?
Например, я хочу вывести список всех плагинов :enew
из, :scriptnames
чтобы я мог найти его.
Ответы:
Вы можете использовать :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 поставляется с новой execute()
функцией. Вы можете использовать execute()
функцию вместо того, :redir
чтобы захватывать выходные данные экс-команды.
:enew|pu=execute('scriptnames')
Для получения дополнительной помощи см .:
:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()
:redir END
говорит Vim прекратить перенаправление сообщений. Смотрите:h :redir
Для полноты картины я хочу представить эти удивительные функции, которые я собрал (украл) у 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
т. Д.
Также есть плагин bufferize.vim :
:Bufferize scriptnames
который является в основном упакованной версией принятого ответа (использования :redir
) и может быть более удобным для некоторых.
END
значит?