Die Ausgabe des internen vim-Befehls wird in den Puffer geschrieben

18

Wie speichere ich einen internen vim-Befehl (nicht einen Shell-Befehl) in einem neuen Puffer?

Zum Beispiel möchte ich eine Liste aller Plugins :enewvon :scriptnamesspeichern, damit ich sie durchsuchen kann.

Bryce Guinta
quelle

Antworten:

24

Mit können Sie :redirdie Ausgabe in eine Variable, ein Register oder eine Datei umleiten. Beispiel für die Weiterleitung zum unbenannten Register:

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

Alternativ bietet Tim Popes scriptease.vim den :ScriptnamesBefehl, der :scriptnamesin die Quickfix-Liste und geladen wird :copen.

Wenn Sie feststellen, dass Sie viele Befehle umleiten, können Sie dies in einem Befehl zusammenfassen:

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

Jetzt können Sie den :RedirBefehl verwenden, um die Ausgabe in einen neuen Puffer umzuleiten. zB :Redir scriptnamesoder :Redir ls.

Vim 8+

Vim 8 wird mit der neuen execute()Funktion ausgeliefert. Sie können die execute()Funktion verwenden :redir, um die Ausgabe von Befehlen zu erfassen , anstatt sie zu erfassen.

 :enew|pu=execute('scriptnames') 

Weitere Hilfe finden Sie unter:

:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()
Peter Rincker
quelle
Was ENDbedeutet
Bryce Guinta
1
Die Ausgabe wird nicht mehr in das Register umgeleitet, sodass Sie wieder eine normale Ausgabe erhalten können.
Tumbler41
1
:redir ENDWeist Vim an, die Umleitung von Nachrichten zu beenden. Siehe:h :redir
Peter Rincker
Verwenden Sie system (), um einen externen Befehl auszuführen und dessen Ausgabe in einer Vim-Variablen zu erfassen. : let hostname = system ('hostname')
user3751385
2

Der Vollständigkeit halber möchte ich diese fantastischen Funktionen vorstellen, die ich von romainl gesammelt (gestohlen) habe

" 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>)

Dies übernimmt die normale oder Systembefehlsausgabe und legt sie in einem neuen Tab ab. Fühlen Sie sich frei, die Zeile tabnewzu vsplitoder splitusw. zu ändern .

klaus
quelle
der Link zu @ romainl der Kern gist.github.com/romainl/eae0a260ab9c135390c30cd370c20cd7
Dyno Fu
@ DynoFu, Link zu meiner Antwort hinzugefügt.
klaus
1

Es gibt auch das bufferize.vim Plugin:

:Bufferize scriptnames

Dies ist im Grunde eine gepackte Version der akzeptierten Antwort (unter Verwendung von :redir) und kann für einige praktischer sein.

Marius Gedminas
quelle