Jak zrzucić wewnętrzne polecenie vim (nie polecenie powłoki) do nowego bufora?
Na przykład, chcę zrzucić listę wszystkich wtyczek do :enew
od :scriptnames
tak, że mogę go przeszukać.
Jak zrzucić wewnętrzne polecenie vim (nie polecenie powłoki) do nowego bufora?
Na przykład, chcę zrzucić listę wszystkich wtyczek do :enew
od :scriptnames
tak, że mogę go przeszukać.
Odpowiedzi:
Możesz użyć :redir
do 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 :Scriptnames
polecenie, które załaduje :scriptnames
się 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ć :Redir
polecenia, aby przekierować dane wyjściowe do nowego bufora. np . :Redir scriptnames
lub :Redir ls
.
Vim 8 jest dostarczany z nową execute()
funkcją. Możesz użyć tej execute()
funkcji, aby zamiast :redir
przechwytywać 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()
:redir END
mówi Vimowi, aby zakończył przekierowywanie wiadomości. Zobacz:h :redir
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ę tabnew
na vsplit
lub split
itd.
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.
END
znaczy