Як я скидаю внутрішню команду vim (не команду shell) у новий буфер?
Наприклад, я хочу , щоб скинути список всіх плагінів в :enewвід :scriptnamesтак що я можу знайти його.
Як я скидаю внутрішню команду vim (не команду shell) у новий буфер?
Наприклад, я хочу , щоб скинути список всіх плагінів в :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означає?