So übergeben Sie vim-Pufferinhalte über den Shell-Befehl und erfassen die Ausgabe in einem geteilten Fenster

8

Ich habe viele Threads über das Ausführen von Shell-Befehlen aus vim gelesen, viele Dokumentationen über vim-Befehle, .vimrc und all das, aber ich kann die "Ex" -Sprache oder die vim-Zuordnungen einfach nicht gut genug verstehen, um das zu tun, was ich tue will, also hier stelle ich diese Frage. Hier geht:

Ich habe einen offenen Puffer in vim (mit dem neuesten stabilen MacVim auf Snow Leopard, aber nicht im GUI-Modus), dessen Inhalt ich später in ein Befehlszeilentool einspeisen werde, das ihn verarbeitet und mir eine Ausgabe gibt. Was ich will, ist in der Lage zu sein:

  1. Drücken Sie eine Taste (oder eine Tastenkombination oder geben Sie einen vi-Befehl aus).
  2. Führen Sie mein Befehlszeilenprogramm mit dem Inhalt meines aktuellen Puffers (der möglicherweise nicht in der Datei gespeichert ist) aus
  3. Erfassen Sie die Ausgabe und zeigen Sie sie in vim an, vorzugsweise in einem neuen geteilten Fenster (wie z. B.: Help does)

Also zusammenfassend: Ich kann rennen

$ cat ~/myinput.txt | myScript > output.txt

Aber ich möchte so etwas in vim machen und die Ausgabe wenn möglich in ein neues geteiltes Fenster stellen.

UPDATE:
Natürlich habe ich kurz nach dem Posten weitere Informationen zu diesem Thema gefunden. Ich weiß jetzt, dass ich das in vim tun kann:

:%! myScript

Und es wird die Ausgabe von myScript (mit dem dazugehörigen Pufferinhalt) in meinen aktuellen Puffer einfügen und alles ersetzen, was ich gerade darin habe.

Gibt es also eine Möglichkeit, diese Inhalte in einen neuen, geteilten Fensterpuffer zu stellen? Vielen Dank!

Malvim
quelle

Antworten:

7

Ich würde so etwas in mein ~ / .vimrc oder eine Datei mit der Erweiterung .vim in ~ / .vim / plugin / einfügen:

command! FW call FilterToNewWindow('myscript')

function! FilterToNewWindow(script)
    let TempFile = tempname()
    let SaveModified = &modified
    exe 'w ' . TempFile
    let &modified = SaveModified
    exe 'split ' . TempFile
    exe '%! ' . a:script
endfunction

Dann können Sie einfach " :FW" tun .

Es kann eine gute Idee sein, die Befehlsdefinition so zu ändern, dass ein Argument für den Namen des Filterskripts an die Funktion übergeben werden muss, anstatt sie "fest zu codieren".

Heptit
quelle
Das hat funktioniert, danke! Ich werde später etwas über die Parameter erfahren und viel über das Scripting von vim lernen. Danke für deine Hilfe.
Malvim
0

Die Funktion von @Heptite wurde allgemeiner gestaltet:

function! FilterToNewWindow()
    let TempFile = tempname()
    let SaveModified = &modified
    exe 'w ' . TempFile
    exe '!chmod +x ' . TempFile
    let &modified = SaveModified
    exe ':e ' . TempFile
    exe '%! ' . @%
   exe 'w!'
endfunction

" bash execute contents of current buffer and filter it to a new window
command! FW call FilterToNewWindow()

`` `

Tiberiu Ichim
quelle
0

Dieser Befehl macht die Hälfte von dem, was Sie wollen.

map <Leader>r :!%:p<cr>

Der aktuelle Puffer muss eine ausführbare Datei mit einer Shebang-Zeile sein, damit dies funktioniert.

user3304574
quelle