Vim'de vurgulanan geri alma


12

Vacem'de vurgulanan bir geri almayı deniyorum, spacemacs varsayılan yapılandırma gibi. Bazen hızlı bir şekilde geri almak istediğimde, neyin değiştiğini anlayamıyorum çünkü anlık. Yani bir basın geri alırken böyle bir şey olmaya çalışıyorum:

vurgulanan geri al

Vim'de bunun nasıl yapılacağı hakkında bir fikri olan var mı?

(Zaten Gundo eklentim var, sadece varsayılan geri almayı daha pürüzsüz hale getirmek istiyorum)

Düzenleme : Undotree eklentisi işe yarıyor ( Gundo değişiklikleri vurgulamıyor), sadece UndotreeTogglekomutu kullanın ve dosyada gelecekteki tüm değişiklikler vurgulanacaktır.


İyi fikir. İle bir vurgu oluşturabilirsiniz matchadd(), ancak dosyanın hangi bölümlerinin değiştiğini biraz daha zorlaştırır.
joeytwiddle

Geri alma işleminden önce geçici bir arabellek / dosyaya, ardından geri alma işleminden sonra 2. arabellek / dosyaya kaydetme ve öncekileri temizledikten (veya rengini değiştirdikten) sonra yeni farkları vurgulama. Büyük dosyalar için yavaş olabilir.
VanLaser

UndoTree aslında değiştirilen satırları vurgular , ancak gerçek zamanlı olarak yapmaz. Bence GNU farkını kullanıyor. Sözcük ayrıntı düzeyini elde etmek fazladan bir adım olacaktır (örneğin, sözcük sonlarında bölünmüş çizgiler , fark, çizgileri yeniden birleştirin).
joeytwiddle

Bu eklentiler yaklaşır, ancak yine de satır tabanlıdır: smeargle son kaydetmeden bu yana değişen satırları vurgulayabilir. Eklenti , soldaki olukta değişen satırları (silme işlemleri dahil) işaretler.
joeytwiddle

1
Eklenti son değişiklik bölgesini de vurgulayabilir
Christian Brabandt

Yanıtlar:


6

Yeni çözüm

Son değişikliklerinizi :changeskomutla görüntüleyebilirsiniz. Böylece en son satır değişikliğinizi düzenli bir matchadd()ifadeyle düzeltebilir ve ardından satırı @joeytwiddle tarafından önerilen şekilde uygulayabilirsiniz.

İşte kod:

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

Not :

  • Bu işlev yalnızca eskisini kaldırmadan yeni bir vurgu ekler, bu yüzden önce eskisini kaldırmanız gerekir. İle clearmatchesişlevin Yenisini eklemeden önce eşleşmeleri kaldırabilirsiniz. Dikkatli olun, TÜM eşleşmeleri kaldıracaktır . Daha fazla ayrıntı istiyorsanız, eşleşmenizi kaydedebilir ve manuel olarak kaldırabilirsiniz:

Örneğin

function! DiffWithPrevious()
  call matchdelete(m)
  ... 
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
  • Bazı testlerden sonra, sadece bir satırlık değişim için işe yaradığını öğrendim.

Referanslar :


Eski çözüm

İşte esas olarak Diff akım tamponundan ve orijinal dosyadan ilham alan olası bir çözüm :

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

Fikir dosyayı sistemdeki dosya ile dağıtmak, böylece son değişikliği geri almak, yazmak, las değişikliği yeniden ve diff yürütmek.

Bunun zaman zaman zamansal fark görselleştirmeleri için yapılması gerektiğini düşünüyorum.


DiffWithPrevious () "tampon" mesajını temizlemek için bir yolu var mı? Keşke fonksiyon sadece son değişiklikleri vurguladı, ama vurgulamak zaman içinde birikiyor, im mesaj = 0 veya mesaj = "" gibi bir şey deniyorum ama başarı yok.
tjbrn

Tabii ki evet, cevabımı güncelleyeyim.
nobe4


2

Benimle aynı şeyi deneyen biri için, cevaplar sayesinde ulaştığım en yakın şey bu.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.