vim redirect command output to buffer




Vim: Pipe ausgewählten Text zu Shell-Cmd und erhalten Ausgabe auf Vim Info/Befehlszeile (4)

Bei mehrzeiliger Version können Sie dies nach Auswahl des Textes tun:

:'<,'>:w !command<CR>

Sie können es einer einfachen visuellen Modusverknüpfung wie folgt zuordnen:

xnoremap <leader>c <esc>:'<,'>:w !command<CR>

Drücken Sie die Führungstaste + c im visuellen Modus, um den ausgewählten Text an eine Standardeingabe des Befehls zu senden. stdout des Befehls wird unter der Statusleiste von vim ausgegeben.

Beispiel aus der realen Welt mit CoffeeScript:

https://github.com/epeli/vimconfig/commit/4047839c4e1c294ec7e15682f68563a0dbf0ee6d

Ich möchte den ausgewählten Text zu einem Shell-Befehl pipe und erhalten Sie die einzeilige Ausgabe von diesem Shell-Befehl auf der vim info / Befehlszeile?

Was ich wirklich versuche zu tun: Pipe den ausgewählten Text zu einem Shell-Befehl pastebin-Typ und ich möchte die Ausgabe der Shell cmd (das ist der http-Link zum Pastebin) erhalten. Ist das möglich?


Die Lösung von @matias funktioniert nicht gut für mich, weil es so aussieht, als würde die shellescape an jede Zeile anhängen.

Also benutze ich sed , um das zu erreichen, und es funktioniert gut!

"dump selected lines
function! DumpLines() range
  echo system('sed -n '.a:firstline.','.a:lastline.'p '.expand('%'))
endfunction

com! -range=% -nargs=0 Dump :<line1>,<line2>call DumpLines()

Ich würde es so machen:

Platziere diese Funktion in deinem vimrc:

function Test() range
  echo system('echo '.shellescape(join(getline(a:firstline, a:lastline), "\n")).'| pbcopy')
endfunction

Dadurch können Sie diese Funktion aufrufen, indem Sie Folgendes tun:

:'<,'>call Test()

Dann können Sie das auch so abbilden (direkt unter der Funktionsdeklaration in Ihrem vimrc):

com -range=% -nargs=0 Test :<line1>,<line2>call Test()

Sie können die Funktion also folgendermaßen aufrufen:

:'<,'>Test

Hinweis :<','> sind Bereichsselektoren, um sie zu erzeugen, wählen Sie einfach die entsprechenden Zeilen im visuellen Modus und gehen Sie dann in den Befehlsmodus (durch Drücken der Doppelpunkttaste)


Markieren Sie einfach die Linien mit der visuellen Linie und wählen Sie shift-v, den Treffer:! und geben Sie den Befehl ein, an den Sie die Befehle senden möchten. Die resultierende Ausgabe ersetzt dann den ausgewählten Text.

Wenn Sie Ihren Befehl eingeben, erscheint er unten als:

:'<,'>!somecmd

Das '<,'> zeigt an, dass der visuell ausgewählte Bereich an den Befehl übergeben wird, der nach dem!







pipe