Annuler en surbrillance dans Vim

12

J'essaie d'avoir une annulation en surbrillance dans Vim, comme la configuration par défaut de spacemacs. Parfois, quand je veux des annulations rapides, je ne peux pas réaliser ce qui a changé parce que c'est instantané. J'essaie donc d'avoir quelque chose comme ça quand une presse annule:

annuler en surbrillance

Quelqu'un a une idée de comment faire cela à Vim?

(J'ai déjà un plugin Gundo, je veux juste rendre la défection par défaut plus fluide)

Edit : le plugin undotree fait le travail ( Gundo ne met pas en évidence les modifications), utilisez simplement la UndotreeTogglecommande et toutes les modifications futures sur le fichier seront mises en évidence.

tjbrn
la source
Bonne idée. Vous pouvez créer une surbrillance avec matchadd(), mais un peu plus délicat consiste à déterminer quelles parties du fichier ont changé.
joeytwiddle
Peut-être l'enregistrement dans un tampon / fichier temporaire avant l'annulation, puis dans un deuxième tampon / fichier après l'annulation, et en mettant en évidence les nouveaux diff après le nettoyage (ou la modification de la couleur) des précédents. Pourrait devenir lent pour les fichiers volumineux.
VanLaser
UndoTree met en évidence les lignes modifiées , mais il ne le fait pas en temps réel. Je pense qu'il utilise GNU diff. L'obtention de la granularité des mots serait une étape supplémentaire (par exemple, séparer les lignes lors des sauts de mots , diff, recombiner les lignes).
joeytwiddle
Ces plugins se rapprochent, mais ils sont toujours basés sur des lignes : smeargle peut mettre en évidence les lignes modifiées depuis la dernière sauvegarde. changesPlugin marque les lignes modifiées (y compris les suppressions) dans la gouttière à gauche.
joeytwiddle
1
@joeytwiddle, changesPlugin peut également mettre en évidence la dernière région de changement
Christian Brabandt

Réponses:

6

Nouvelle solution

Vous pouvez visualiser vos dernières modifications avec la :changescommande. Vous pouvez donc effectuer votre changement de ligne le plus récent avec une expression régulière, puis appliquer la ligne matchadd()comme suggéré par @joeytwiddle.

Voici le code:

function! DiffWithPrevious()
  call clearmatches()
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=green guibg=green
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction

Remarque :

  • Cette fonction n'ajoute qu'une nouvelle surbrillance sans supprimer l'ancienne, vous devez donc d'abord supprimer l'ancienne. Avec la clearmatchesfonction, vous pouvez supprimer les correspondances avant d'en ajouter une nouvelle. Attention, cela supprimera TOUTES les correspondances. Si vous souhaitez plus de granularité, vous pouvez enregistrer votre correspondance et la supprimer manuellement:

par exemple

function! DiffWithPrevious()
  call matchdelete(m)
  ... 
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
  • Après quelques tests, j'ai découvert que cela ne fonctionne que pour le changement d'une ligne.

Les références :


Ancienne solution

Voici une solution possible, principalement inspirée du tampon courant Diff et du fichier d'origine :

function! DiffWithPrevious()
  undo
  write
  redo
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
endfunction

L'idée est de différencier le fichier avec le fichier sur le système, donc vous annulez votre dernier changement, l'écrivez, refaites le dernier changement et exécutez le diff.

Je pense que cela devrait faire le travail pour les visualisations temporelles de diff de temps en temps.

nobe4
la source
il existe un moyen d'effacer le message "buffer" sur DiffWithPrevious ()? Je souhaite que la fonction n'ait mis en évidence que les derniers changements, mais que le surlignage s'accumule avec le temps, j'essaie quelque chose comme message = 0 ou message = "" mais sans succès.
tjbrn
Bien sûr que oui, permettez-moi de mettre à jour ma réponse.
nobe4
3

Vérifiez mon plugin de modifications et assurez-vous de définir la variable g:changes_linehi_diffsur 1

Christian Brabandt
la source
2

Pour quelqu'un qui essaie la même chose de moi, c'est le plus proche que j'ai atteint grâce aux réponses.

function! DiffWithPrevious()
  call clearmatches()
  undo
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=black guibg=black
  let m = matchadd('TemporalDiff', '\%'.line.'l')
  redraw
  let gchar = getchar()
  highlight TemporalDiff ctermbg=none guibg=none
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
tjbrn
la source