2016-06-03 28 views
4

In Vim möchte ich einen Text Zeile für Zeile scannen und den Inhalt an einen externen Shell-Befehl übergeben. Zum Beispiel habe ich eine Liste von Namen und will Hallo zu jedem Namen der Liste sagen. Was ich bereits geschafft habe, ist wie folgt.Übergabe des Arguments an einen vim "execute"

diesen Text Gegeben:

John Doe 

    Jane Doe 

Baby Doe 

ich diesen Befehl verwenden, kann nur den ersten Namen zu finden und den Token in einen Ersatz-Befehl wieder verwenden die Rückreferenzierung Syntax (\ 0 oder \ 1).

:%g/\w\+/ s//--\0--/ 

Dies ist die Ausgabe:

--John-- Doe 

    --Jane-- Doe 

--Baby-- Doe 

Was ich jetzt tun möchte, ist mein „Ersatz“ Befehl zu ändern, für „Ausführen“ Shell-Befehl.

Dieser Befehl

:% g/\ w \ +/exe ​​"Welt"

funktioniert gut, aber wie es zu parametrieren "echo hallo!"?

Bisher habe ich versucht, dies:

:% g/\ w \ +/exe ​​"echo hallo!" \ 0

und auch dies:

:% g/\ w \ +/exe ​​"! echo Hallo" &

ohne Erfolg ...

Diese Frage hat viel Wert, da Sie dann von Vim einen Text mit einer Liste von Verzeichnissen scannen und sie im laufenden Betrieb erstellen können.

+2

http: // vim .wikia.com/wiki/Power_of_g hat einige Beispiele. – bishop

+2

Speziell dieser: http://vim.wikia.com/wiki/Redirect_g_search_output – dNitro

Antwort

2

So, hier ist die Antwort:

Der folgende Befehl einen Text scannen, schneiden Sie die Zeilenumbrüche und Leerzeichen in den Text zu jedem Namen „Hallo“ zu sagen:

%g/\<\w\+\>/ y A | exe ' !echo hello '. substitute(substitute(@a, '\n\+\s*', '', ''), '\s*\n\+', '', '') | let @a =""

Die nächste Man erstellt ein Verzeichnis für jede nicht leere Zeile der Datei. Diese Zeit, die shellescape() Funktion hinzugefügt:

%g/\<\w\+\>/ y A | exe ' !mkdir '. shellescape(substitute(substitute(@a, '\n\+\s*', '', ''), '\s*\n\+', '', '')) | let @a =""

Und wenn Sie eine "stille" Verzeichnisse Schöpfung brauchen, hier ist der Befehl:

%g/\<\w\+\>/ y A | exe 'silent !mkdir ' . shellescape(substitute(substitute(@a, '\n\+\s*', '', ''), '\s*\n\+', '', '')) | let @a =""

P. S.:

Sie auch die fast denselben Befehl zur Reinigung einer Datei in eine neue Datei verwenden können (die nicht leer sind loszuwerden Leerzeilen und Trimmen):

%g/\<\w\+\>/ y A | exe 'silent !echo ' . substitute(substitute(@a, '\n\+\s*', '', ''), '\s*\n\+', '', '') . ">> new_file.txt" | let @a =""