Je suis en train d'embellir du code source à l'aide de vim. {1}
J'ai créé quelques macros vim qui effectuent les étapes individuelles: supprimer les espaces de fin, supprimer les lignes vides après {
, supprimer les lignes vides avant {
, ce genre de choses.
Maintenant, je veux créer une macro qui exécute toutes les macros individuelles dans l'ordre. Cependant, une fois la première macro récursive terminée (car elle ne trouve plus de correspondance -> erreur de correspondance), ma macro «wrapper» se termine également.
Existe-t-il un moyen de faire continuer une macro vim après qu'une sous-macro a généré une erreur?
{1} Je connais les reformatages automatiques. Je pourrais même les utiliser sur mon problème actuel. J'ai simplement mentionné le reformatage de la source dans l'intérêt de l'exemple. Ne postez aucune réponse à propos de cet embellisseur source ou de cela. La question ne concerne pas le reformatage du code en soi , mais les macros vim.
Exemple:
- Macro 1 - découpage des espaces de fin -
qw/\s\+$d$@wq
- Macro 2 - supprimer les lignes vides avant} -
qe/\n\n *}dd@eq
- Wrapper Macro - retabbing, Macro 1, Macro 2 -
qr:retab@w@eq
Lorsque @r
j'exécute le wrapper - - il se retabera, puis exécutera la macro 1 jusqu'à ce qu'il n'y ait plus d'espace blanc de fin, puis se terminera ( sans exécuter la macro 2).
Clarification:
Ce que je recherche, c'est comment appeler une sous-macro pour que, lorsque cette sous-macro se termine, la macro d'appel continue?
Si la commande défaillante est une substitution qui ne trouve pas son modèle, par exemple,
quand
foo
n'existe pas dans le tampon, vous pouvez ajouter l'e
indicateur pour ignorer cette erreur, par exemple,Voir
Vous pouvez dire à Vim d'ignorer les erreurs de certaines commandes: ex en les précédant de
:silent!
. VoirModifier après l'ajout d'un exemple à la question
La macro 1 et la macro 2 sont toutes deux récursives et aucune n'a de mécanisme explicite pour mettre fin à la récursivité. Je suppose que l'un des tests internes de Vim pour la récursion illimitée est déclenché, ce qui génère une erreur. Si la macro 1 génère une telle erreur, cette erreur mettra fin à l'exécution de la macro Wrapper juste après
@w
.Ma suggestion serait de limiter le nombre d'exécutions de vos macros en les réécrivant en tant que: commandes ex et en limitant la plage de lignes sur lesquelles elles sont exécutées. Par exemple:
où
^M
signifie taper votre touche Entrée ou Retour. Je ne les ai pas testés ensemble dans votre macro Wrapper, mais je pense que vous pourrez corriger les erreurs que j'ai pu commettre.la source
/foo
). Bien:silent!
que la sous-macro récursive n'ait pas abandonné la macro wrapper, la submacro ne se termine pas du tout ... et je soupçonne que le faire à nouveau se terminerait également la macro wrapper. On dirait que je suis coincé. : - \Ce qui a fonctionné pour moi était une combinaison de réponses @Peter Rincker et @garyjohn. Séparément, je n'arrêtais pas d'avoir des problèmes étranges.
Je pense que le
silent!
dans le<leader>rt
, et les caractères de tuyau entre leendtry
et lew
étaient les clés - simplement avoir la ligne coupée après l'endtry
échec. Lestry
s fonctionnaient quand je venais de les entrer, mais quand ils étaient exécutés en tant que macro, l'erreur sur le texte de recherche était introuvable continuerait d'être soulevée.la source
Je crée régulièrement des macros à la volée lorsque je dois effectuer une tâche répétitive parmi de nombreux fichiers. Dans mon cas, j'ai NERDtree ( http://www.vim.org/scripts/script.php?script_id=1658 ) installé dans VIM, qui crée une
vsplit
fenêtre, et à gauche, j'ai une liste de tous les fichiers dans le répertoire courant. Dans un exemple, je dois trouver la première instance de la chaîneMY_TEST
dans le fichier, puis supprimer, s'il est présent, un préfixe étiqueté àCUSTOM_PREFIX-
partir de cette ligne, enregistrer le fichier, puis passer à la suivante.Voici comment faire fonctionner cette macro sur environ 2000 fichiers dans le répertoire courant. Je pourrais écrire un script bash pour ce faire, mais c'est plus rapide dans VIM, dans mon cas. Le
+
indique que les touches sont enfoncées simultanémentq,a
CTRL+ W,←
↓
ENTER
q
1000, @,a
J'espère que cela t'aides!
la source