Zrzuć dane wyjściowe wewnętrznego polecenia vim do bufora

18

Jak zrzucić wewnętrzne polecenie vim (nie polecenie powłoki) do nowego bufora?

Na przykład, chcę zrzucić listę wszystkich wtyczek do :enewod :scriptnamestak, że mogę go przeszukać.

Bryce Guinta
źródło

Odpowiedzi:

24

Możesz użyć :redirdo przekierowania wyjścia do zmiennej, rejestru lub pliku. Przykład przekierowania do rejestru bez nazwy:

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

Alternatywnie skrypt scriptease.vim Tima Pope'a udostępnia :Scriptnamespolecenie, które załaduje :scriptnamessię na listę szybkich i :copen.

Jeśli przekierowujesz wiele poleceń, możesz zawrzeć je w poleceniu:

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

Teraz możesz użyć :Redirpolecenia, aby przekierować dane wyjściowe do nowego bufora. np . :Redir scriptnameslub :Redir ls.

Vim 8+

Vim 8 jest dostarczany z nową execute()funkcją. Możesz użyć tej execute()funkcji, aby zamiast :redirprzechwytywać dane wyjściowe polecenia.

 :enew|pu=execute('scriptnames') 

Aby uzyskać więcej pomocy, zobacz:

:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()
Peter Rincker
źródło
Co ENDznaczy
Bryce Guinta
1
Przestaje przekierowywać wyjście do rejestru, dzięki czemu można ponownie uzyskać regularne wyjście.
Tumbler41
1
:redir ENDmówi Vimowi, aby zakończył przekierowywanie wiadomości. Zobacz:h :redir
Peter Rincker,
Aby wykonać zewnętrzne polecenie i przechwycić jego dane wyjściowe w zmiennej Vim, użyj system (). : pozwól
nazwie
2

Dla kompletności chcę przedstawić te niesamowite funkcje, które zebrałem (ukradłem) z 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>)

To zajmie normalne lub systemowe polecenie wyjściowe i umieści je w nowej karcie. Zmień linię tabnewna vsplitlub splititd.

klaus
źródło
link do strony @ romainl's gist gist.github.com/romainl/eae0a260ab9c135390c30cd370c20cd7
Dyno Fu
@DynoFu, dodałem link do mojej odpowiedzi.
klaus
1

Istnieje również wtyczka bufferize.vim :

:Bufferize scriptnames

która jest w zasadzie spakowaną wersją zaakceptowanej odpowiedzi (za pomocą :redir) i może być wygodniejsza dla niektórych.

Marius Gedminas
źródło