Exécuter des commandes de nettoyage uniquement pour les lignes modifiées est-il possible?

8

Se référant à des tâches de nettoyage comme (mais sans s'y limiter) celles détaillées dans ces questions:

existe-t-il un moyen d'appliquer ces commandes uniquement aux lignes des fichiers qui ont été réellement modifiés? C'est pour garder la sortie diff concentrée sur le changement réel après avoir édité le code source (un réviseur de code potentiel ne serait pas dérouté par les changements impliqués dans le nettoyage du fichier entier), sans introduire de nouveaux problèmes de formatage.

guido
la source
vim.wikia.com/wiki/… ... Ce pourrait être un bon point de départ ... Pas le temps d'écrire une réponse complète maintenant ;-)
Martin Tournoij
@Carpetsmoker thx pour le lien
guido
J'ai creusé un peu plus et je ne pense pas que ce soit possible. :changesne fonctionne pas sans beaucoup de piratage; car il semble que ces informations soient stockées dans le fichier viminfo, et il n'y a aucun moyen de voir quelles modifications vous avez apportées cette session, et laquelle la précédente ... À moins que vous ne désactiviez le fichier viminfo bien sûr, mais c'est plutôt compliqué ... aimerait qu'on se trompe ici, cependant :-)
Martin Tournoij
@Carpetsmoker Je ne pense pas que la liste des modifications contienne suffisamment d'informations pour implémenter cette fonctionnalité, même si vous pouviez isoler les modifications apportées à chaque session. Il contient une position de curseur unique pour chaque modification, vous ne pouvez donc pas déterminer l'étendue de la modification effectuée.
Rich
@Rich Oui, je suis arrivé à la même conclusion ...
Martin Tournoij

Réponses:

4

Vous pouvez utiliser la commande folddoopenpour exécuter une commande uniquement sur les lignes qui ne se trouvent pas dans un pli fermé.

Par exemple, vous pouvez supprimer des espaces à la fin des lignes avec la commande:

:%s/\s\+$//

Pour appliquer cela uniquement aux lignes qui ne se trouvent actuellement pas dans un pli fermé, ajoutez folddopencomme ceci:

:%folddoopen s/\s\+$//

folddoopenpeut également être abrégé en foldd.

Si vous utilisez Vim comme outil de diff de votre contrôle source, vous pouvez l'utiliser pour appliquer des modifications uniquement aux lignes modifiées tout en affichant le diff.

Notez que par défaut, le mode diff de Vim affiche quelques lignes avant et après chaque section modifiée. Ainsi, afin de ne pas affecter les lignes qui sont immédiatement avant ou après les lignes modifiées dont vous aurez besoin à la première série contextdans diffoptà 0par exemple:

:set diffopt=filler,context:0

Pour les modifications manuelles, cette foldopenoption peut également vous être utile. Il définit quels types de commandes entraîneront l'ouverture des plis. Notez cependant que cela n'empêche pas l' édition de se dérouler dans les plis comme le fait la folddoopencommande.

(Si vous voulez dire autre chose par "les lignes des fichiers qui ont été réellement modifiés", alors vous allez devoir trouver un moyen de replier les lignes inchangées avant d'exécuter la commande: le plus simple est de garder une copie inchangée du fichier et utilisez vimdiff manuellement.)

Riches
la source
2
C'est une idée très créative! Je ne savais pas :folddoopen, semble être une commande très utile. Je voulais également proposer que si vous utilisez fugitive.vim , vous pouvez plus facilement voir la différence de votre tampon actuel avec la :Gdiffcommande.
tommcdo
Cela fonctionne bien; Je peux ouvrir un tampon de travail avec la révision précédente différente de la version actuelle avec :vsp new, puis :read !git show HEAD~1:pathet enfin :windo diffthis(et ensuite en utilisant votre solution).
guido