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



vim redirect command output to buffer (5)

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?


Vielleicht solltest du sowas benutzen

:echo system('echo '.shellescape(@").' | YourCommand')

Ab einer vim-7.4-Version ist es besser zu verwenden

:echo system('YourCommand', getreg('"', 1, 1))

. Dies ist im Grunde die einzige Möglichkeit, NUL-Bytes unberührt zu lassen, falls sie in der Datei vorhanden sind. Wenn @" auf die eine oder andere Weise übergeben wird, werden NUL-Bytes in NL (Newline) umgewandelt.


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!


Eine andere Antwort:

function Pastebin() range
    let [email protected]"
    silent execute a:firstline.",".a:lastline."yank"
    python import vim, subprocess
    python p=subprocess.Popen(["pastebin"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    python p.stdin.write(vim.eval('@"'))
    let @"=savedreg
    python p.stdin.close()
    python retstatus=p.poll()
    python print p.stdout.read()
endfunction

Erfordert Python-Unterstützung. Benutze es genau wie die Funktion von matias.


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)


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





pipe