Як я скидаю внутрішню команду 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
означає?