Evidenziato annullato in Vim


12

Sto provando ad annullare un evidenziato in Vim, come la configurazione predefinita di spacemacs. A volte, quando voglio annullare rapidamente, non riesco a capire cosa è cambiato perché è istantaneo. Quindi sto provando ad avere qualcosa del genere quando una stampa annulla:

evidenziato annulla

Qualcuno ha idea di come farlo in Vim?

(Ho già il plug-in Gundo, voglio solo rendere più agevole l'annullamento predefinito)

Modifica : il plugin undotree funziona ( Gundo non evidenzia le modifiche), basta usare il UndotreeTogglecomando e tutte le modifiche future sul file verranno evidenziate.


Bella idea Puoi creare un momento saliente con matchadd(), ma è leggermente più complicato capire quali parti del file sono cambiate.
joeytwiddle,

Magari salvando su un buffer / file temporaneo prima dell'annullamento, quindi su un secondo buffer / file dopo l'annullamento, ed evidenziando le nuove differenze dopo aver pulito (o cambiato il colore di) quelle precedenti. Potrebbe rallentare per file di grandi dimensioni.
VanLaser,

UndoTree evidenzia effettivamente le linee modificate , ma non lo fa in tempo reale. Penso che usi GNU diff. Ottenere la granularità delle parole sarebbe un passo in più (ad es. Linee spezzate a interruzioni di parole , diff, linee ricombinate).
joeytwiddle,

Questi plugin si avvicinano, ma sono ancora basati su linee : smeargle può evidenziare le linee modificate dall'ultimo salvataggio. changesPlugin contrassegna le linee modificate (comprese le eliminazioni) nella grondaia a sinistra.
joeytwiddle,

1
@joeytwiddle, changesPlugin può anche evidenziare l'ultima regione di cambiamento
Christian Brabandt,

Risposte:


6

Nuova soluzione

Puoi visualizzare le ultime modifiche con il :changescomando. Quindi puoi correggere il cambio di linea più recente con una regex e quindi applicare la linea matchadd()come suggerito da @joeytwiddle.

Ecco il codice:

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

Nota :

  • Questa funzione aggiunge solo un nuovo momento saliente senza rimuovere quello vecchio, quindi dovresti rimuovere prima quello vecchio. Con la clearmatchesfunzione è possibile rimuovere le corrispondenze prima di aggiungerne una nuova. Attento, rimuoverà TUTTE le partite. Se vuoi più granularità, puoi salvare la tua partita e rimuoverla manualmente:

per esempio

function! DiffWithPrevious()
  call matchdelete(m)
  ... 
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
  • Dopo alcuni test, ho scoperto che funziona solo per il cambio di una riga.

Riferimenti :


Vecchia soluzione

Ecco una possibile soluzione, ispirata principalmente al buffer di corrente Diff e al file originale :

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'idea è di diffondere il file con il file sul sistema, in modo da annullare l'ultima modifica, scriverla, ripetere la modifica di Las ed eseguire la diff.

Penso che questo dovrebbe fare il lavoro per le diverse visualizzazioni temporali di volta in volta.


c'è un modo per cancellare il messaggio "buffer" su DiffWithPrevious ()? Vorrei che la funzione evidenziasse solo le ultime modifiche, ma l'evidenziazione si sta accumulando nel tempo, sto provando qualcosa come message = 0 o message = "" ma nessun successo.
tjbrn

Certo sì, lasciami aggiornare la mia risposta.
nobe4,


2

Per qualcuno che sta provando lo stesso di me, quello è il più vicino che ho raggiunto grazie alle risposte.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.