Скиньте висновок внутрішньої команди vim у буфер


18

Як я скидаю внутрішню команду vim (не команду shell) у новий буфер?

Наприклад, я хочу , щоб скинути список всіх плагінів в :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 (). : нехай hostname = system ('ім'я хоста')
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т.п.


посилання на gist.github.com/romainl/eae0a260ab9c135390c30cd370c20cd7 @ romainl's gist.github.com/romainl/eae0a260ab9c135390c30cd370c20cd7
Dyno Fu

@DynoFu, додав посилання на мою відповідь.
klaus

1

Є також плагін bufferize.vim :

:Bufferize scriptnames

яка в основному є упакованою версією прийнятої відповіді (з використанням :redir) і може бути більш зручною для деяких.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.