J'essaie de lire beaucoup de code C / Perl via Vim qui contient de nombreux noms de variables à une seule lettre.
Ce serait bien d'avoir une commande qui pourrait m'aider à changer le nom d'une variable en quelque chose de plus significatif pendant que je suis en train de lire le code afin que je puisse lire le reste plus rapidement.
Y a-t-il une commande dans Vim qui pourrait me permettre de le faire rapidement?
Je ne pense pas que les expressions régulières fonctionneraient parce que:
le même nom de lettre unique peut avoir des objectifs différents dans différents blocs de portée
la même combinaison de lettres pourrait faire partie d'un autre nom de var plus grand, ou dans une chaîne ou un commentaire ... ne voudrait pas les modifier
Des solutions connues?
la source
:
fois sur deux points ( ). La première fois que j'ai appuyé dessus, j'ai vu:'<,'>
. Si je tapais juste às/
partir de là, cela ne fonctionnait pas; J'ai dû taper un autre deux-points avant les/
.<C-R>
de la commande de substitution, simplement en omettant la recherche, vim utilisera le dernier modèle recherché, qui dans ce cas a été créé à partir de lagd
commande. Il:s//<newname>/gc
suffira donc simplement de faire .AFAIK, il n'y a pas de support de refactoring réel dans VIM. Lorsque vous effectuez un changement de nom avec l'intention d'un refactor, je prends généralement les précautions suivantes:
Mon changement de fin ressemble à quelque chose comme ça
J'adorerais me tromper sur le fait qu'il n'y a pas d'outil de refactoring pour VIM mais je ne l'ai pas vu.
la source
Je sais que c'est une vieille question, et la manière de @ mykola-golubyev EST évidemment la meilleure réponse pour le cas particulier de la question OP (qui, je suppose, passe par un code obscurci où vous êtes susceptible d'avoir plusieurs blocs avec les mêmes noms de var) ; mais avec le nom de la question comme celui-là, de nombreuses personnes qui viennent ici à partir de recherches Google recherchent probablement des moyens moins spécifiques à la situation pour renommer les variables dans VIM - et ceux-ci peuvent être plus concis
Je suis surpris que personne n'ait suggéré de cette façon:
Le
*
est le même quegn
- il recherche l'occurrence suivante du mot sous le curseur ET il devient le dernier modèle recherché, donc lorsque vous omettez le modèle de recherche dans la commande de remplacement, VIM suppose que c'est le modèle à rechercher.Pour de petites quantités de copies var, une copie encore plus rapide:
Recherche d'occurrence,
cw
commande de changement de mot ,n
passe à l'occurrence suivante du dernier terme recherché et.
répète la dernière commande (qui est de changer le mot en NEWNAME )(Crédits pour moi sachant tout cela, allez à @doomedbunnies sur Reddit )
Une autre astuce intéressante est la suivante: ( crédits à @ nobe4 )
cgn
est "changer tout ce qui est le résultat de (trouver l'occurrence suivante)". Maintenant que c'est la dernière commande , vous n'avez pas besoinn
de passer à l'occurrence suivante, donc moins de coups à nouveau, et, plus important encore, pas besoin d'alternern
et.
. Mais, évidemment, celui-ci présente l'inconvénient de ne pas avoir de moyen de sauter une occurrence.Voici quelques avantages:
*
ougn
pour la sélection de mots est très rapide - une seule touche (enfin, disons 1,5)*
ougn
s'assure que vous n'obtenez aucune correspondance dans d'autres mots, tout comme le:%s/<C-R>//gc
fait. Beats en tapant le:%s/\<OLDNAME\>/NEWNAME/gc
à la main: personnellement, j'ai tendance à oublier d'utiliser le\<
choses pour limiter les correspondances à des mots entiers uniquement.n
pour sauter les matchs indésirables - probablement encore moins que les coups supplémentaires nécessaires pour limiter la portée. Dans des circonstances normales, vos variables sont probablement quelque peu localisées dans un certain bloc de code de toute façon.la source
Mettez ceci dans votre .vimrc
Appelez-le avec
:call Rnvar()
expand("<cword>")
obtient le mot sous le curseur. Les utilisations de chaîne de recherche%
pour le fichier entier , et les\(\W\)
motifs recherchent des caractères non-mot à la limite du mot à remplacer, et de les enregistrer dans des variables\1
et de\2
manière à être réinséré dans le modèle de remplacement.la source
Vous pouvez utiliser le modificateur «c» dans la recherche globale et remplacer qui vous demandera une confirmation pour chaque remplacement. Cela prendrait plus de temps, mais cela pourrait fonctionner pour un fichier de code non énorme:
Le c signifie confirmer.
la source
En c, vous pourrez peut-être faire des progrès en utilisant cscope. Il tente de comprendre la syntaxe, donc aurait une chance de savoir quand la lettre était une variable.
la source
S'il s'agit de plusieurs fichiers, vous pouvez envisager de jeter un œil à sed. Utilisez find pour récupérer vos fichiers et xargs plus sed pour un remplacement. Supposons que vous souhaitiez remplacer a par a_better_name dans tous les fichiers correspondant à * .c, vous pouvez faire
trouver . -nom "* .c" | xargs sed -i -e 's / a / a_better_name / g'
Gardez à l'esprit que cela remplacera TOUTES les occurrences de a, vous voudrez peut-être une regex plus robuste.
la source