2016-06-03 1 views
4

Depuis Vim, je souhaite analyser un texte ligne par ligne et transmettre son contenu à une commande shell externe. Par exemple, j'ai une liste de noms et je veux dire bonjour à chaque nom de la liste. Ce que j'ai déjà réussi à faire est le suivant.Transférer un argument à un vim "execute"

Compte tenu de ce texte:

John Doe 

    Jane Doe 

Baby Doe 

Je peux utiliser cette commande pour trouver seul le premier nom et réutiliser le jeton dans une commande de remplacement en utilisant la syntaxe backreference (\ 0 ou \ 1).

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

C'est la sortie:

--John-- Doe 

    --Jane-- Doe 

--Baby-- Doe 

Ce que je voudrais faire maintenant est de modifier ma commande « de remplacement » pour la commande shell « exécuter ».

Cette commande

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

fonctionne très bien, mais comment paramétrer "echo bonjour!"?

Jusqu'à présent, j'ai essayé ceci:

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

et cela aussi:

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

sans succès ...

Cette question a beaucoup de valeur puisque vous pouvez ensuite, à partir de Vim, scanner un texte contenant une liste de répertoires et les créer à la volée.

+2

http: // vim .wikia.com/wiki/Power_of_g a quelques exemples. – bishop

+2

Spécialement celui-ci: http://vim.wikia.com/wiki/Redirect_g_search_output – dNitro

Répondre

2

Voici donc la réponse:

La commande suivante va scanner un texte, couper les nouvelles lignes et espaces blancs pour dire « bonjour » à chaque nom dans le texte:

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

La prochaine on va créer un répertoire pour chaque ligne non-vide du fichier. Cette fois, le shellescape() fonction est ajouté:

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

Et si vous avez besoin d'un répertoire "silencieux" création, voici la commande:

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

post-scriptum:

Vous pouvez également utiliser la commande presque même pour le nettoyage d'un fichier (se débarrasser des lignes vides et tailler les non vides) dans un nouveau fichier:

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