Je veux insérer du texte comme ceci:
similar text wordA similar text ...
similar text wordB similar text ...
similar text wordC similar text ...
Je sais que je peux coller le texte plusieurs fois puis utiliser la substitution pour changer un seul mot pour chaque ligne, mais je trouve toujours cette méthode très gênante.
Existe-t-il un moyen d'enregistrer un mot ou une liste de mots dans une "variable" puis d'utiliser cette variable pour générer un texte similaire?
EDIT J'ai rendu quelque chose de peu clair dans la question d'origine, en fait j'essaie de faire des définitions de fonctions très similaires, donc wordA
wordB
... peut apparaître plusieurs fois dans chaque clone de texte et le texte peut contenir plusieurs lignes. le motif est exactement comme ceci:
similar_text1 wordA similar_text2 wordA similar_text3 ...
similar_text1 wordB similar_text2 wordB similar_text3 ...
similar_text1 wordC similar_text2 wordC similar_text3 ...
(le texte peut contenir de nouvelles lignes, et le mot A, le mot B ... peuvent exister plusieurs fois)
2nd EDIT Les parties "similar_text" peuvent être différentes à chaque fois que je fais un tel travail, donc la solution pour ce travail est préférable d'être réutilisable. Parce que j'essaie de faire des définitions de fonctions très similaires, ou une chaîne de table de mappage de fonctions.
Après avoir lu les réponses et un peu de pratique, je trouve qu'il est plus pratique de penser que ce travail est une sorte de substitution, parce que "part1", "part2" ... "partN" qui peut contenir des retours à la ligne est difficile à écrire, alors écrivez un modèle d'abord:
similar_text1 $WORD similar_text2 $WORD similar_text3 ...
(text may contain <ENTER>, make sure $WORD not exist in "similar_text" parts )
Ensuite, essayer de mettre des clones du texte, mais remplacer $ WORD par une liste de mots est une pensée plus simple.
Il semble donc que mon problème ait changé: "comment cloner un bloc de texte plusieurs fois, mais à chaque fois en y substituant un mot-clé par un mot d'une liste?"
la source
Réponses:
Vous pouvez utiliser la fonction suivante:
Dans les variables
firstpart
etsecondpart
mettez le texte à répéter avant et après les mots et dans la listewords
mettez les mots qui doivent changer.Ensuite, la boucle créera le contenu de la ligne pour chaque mot de la liste, insérera la ligne dans le tampon et ira à cette nouvelle ligne.
Vous pouvez ensuite appeler simplement la fonction:
call GenerateLines()
.Modifier Pour faciliter la manipulation, vous pouvez également passer les différentes parties en arguments, la fonction devrait ressembler à ceci:
Et vous pouvez l'appeler comme ceci:
la source
call map(a:words, 'a:firstpart . v:val . a:secondpart')
etcall append(line('.'), a:words)
.Ma stratégie dans de tels cas variera, mais elle suit souvent les étapes suivantes:
Écrivez le ou les mots uniques, par exemple
Soit
a) faire une recherche et remplacer, par exemple
b) ou utilisez le mode de blocage visuel, voir
:h blockwise-visual
. En particulier, je sélectionnerais les mots et utiliseraisI
pour insérer un texte similaire devant ouA
pour ajouter un texte similaire après.Je dirais que cette stratégie est logique lorsque vous effectuez ce genre de tâche d'édition relativement rarement. Cependant, si vous trouvez que vous devez le faire souvent, vous devez suivre la suggestion de @ statox avec une fonction qui étend la liste des mots.
la source
:read
suivi de votre substitution, cela a beaucoup de sens.Je dirai que c'est un travail pour le bloc visuel ( Ctrl+ v). J'écrirais d'abord tous les mots distincts:
En commençant par le curseur sur le premier,
w
je ferais ensuite:Je peux contrôler le nombre de colonnes dont j'ai besoin en appuyant
A <esc>p
autant de fois que je le souhaite. Supposons que j'avais besoin de trois colonnes, comme le montre la commande ci-dessus. Maintenant, nous avons ceci:Et le curseur est au début du 3ème
wordA
dans la première ligne. Ensuite, je bloquerais la sélection de la colonne d'espaces entre les colonnes en arrière et en ajoutant le texte entre les deux. Depuis l'emplacement actuel du curseur:Il en résulte (le% marque la position du curseur):
Répétez pour la colonne suivante:
Et la dernière / première (celle du côté gauche):
Il en résulte finalement:
Mise à jour: ajout d'un screencast
Cela semble être beaucoup de frappe, mais il est en fait très facile de s'y habituer. Il vous offre la liberté de modifier le nombre de mots, le nombre de colonnes et même l'espacement entre les colonnes.
L'inconvénient est que vous devez connaître le nombre de mots distincts que vous utilisez. J'ai
5
codé en dur dans toutes les commandes ci-dessus car c'est le nombre de lignes sur lesquelles les commandes fonctionnent.Note de débogage: toutes les commandes démarrent et se terminent en mode normal, si vous vous trouvez en mode visuel ou inséré à la fin d'une commande, vous faites quelque chose de mal.
la source