Undo yang disorot di Vim

12

Saya mencoba untuk membatalkan undo di Vim, seperti spacemacs default config. Kadang-kadang ketika saya ingin membatalkan cepat, saya tidak dapat menyadari apa yang berubah karena itu instan. Jadi saya mencoba untuk memiliki sesuatu seperti ini ketika sebuah pers membatalkan:

disorot undo

Adakah yang tahu bagaimana melakukan ini di Vim?

(Saya sudah memiliki plugin Gundo, saya hanya ingin membuat undo default lebih lancar)

Sunting : Plugin undotree berfungsi ( Gundo tidak menyoroti perubahan), cukup gunakan UndotreeToggleperintah dan semua perubahan di masa depan pada file akan disorot.

tjbrn
sumber
Ide bagus. Anda dapat membuat sorotan dengan matchadd(), tetapi sedikit lebih rumit menentukan bagian file mana yang telah berubah.
joeytwiddle
Mungkin menyimpan ke buffer / file sementara sebelum undo, lalu ke buffer / file 2 setelah undo, dan menyoroti diff baru setelah membersihkan (atau mengubah warna) yang sebelumnya. Bisa lambat untuk file besar.
VanLaser
UndoTree benar-benar menyoroti garis yang diubah , tetapi tidak melakukannya secara realtime. Saya pikir ini menggunakan GNU diff. Mendapatkan granularitas kata akan menjadi langkah ekstra (mis. Memisahkan garis pada kata break , diff, menggabungkan garis).
joeytwiddle
Pengaya ini mendekati, tetapi masih berbasis garis: smeargle dapat menyorot garis yang diubah sejak penyimpanan terakhir. changesPlugin menandai garis yang diubah (termasuk penghapusan) di selokan di sebelah kiri.
joeytwiddle
1
@joeytwiddle, changesPlugin juga dapat menyoroti wilayah perubahan terakhir
Christian Brabandt

Jawaban:

6

Solusi baru

Anda dapat melihat perubahan terakhir dengan :changesperintah. Jadi Anda bisa melihat perubahan baris terbaru Anda dengan regex dan kemudian menerapkan garis matchadd()seperti yang disarankan oleh @joeytwiddle.

Ini kodenya:

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

Catatan :

  • Fungsi ini hanya menambahkan sorotan baru tanpa menghapus yang lama, jadi Anda harus menghapus yang lama terlebih dahulu. Dengan clearmatchesfungsi ini Anda dapat menghapus kecocokan sebelum menambahkan yang baru. Hati-hati, ini akan menghapus SEMUA pertandingan. Jika Anda ingin lebih terperinci, Anda dapat menyimpan pertandingan dan menghapusnya secara manual:

misalnya

function! DiffWithPrevious()
  call matchdelete(m)
  ... 
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
  • Setelah beberapa tes, saya menemukan itu hanya berfungsi untuk perubahan satu baris.

Referensi :


Solusi lama

Berikut adalah solusi yang mungkin, terutama terinspirasi oleh penyangga Diff saat ini dan file asli :

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

Idenya adalah untuk diff file dengan file pada sistem, sehingga Anda membatalkan perubahan terakhir Anda, tulis itu, ulangi perubahan las dan jalankan diff.

Saya pikir ini harus melakukan pekerjaan untuk visualisasi temporal diff waktu-ke-waktu.

nobe4
sumber
ada cara untuk menghapus pesan "buffer" di DiffWithPrevious ()? Saya berharap fungsi yang disorot hanya perubahan terakhir, tetapi sorotan terakumulasi dari waktu ke waktu, saya mencoba sesuatu seperti message = 0 atau message = "" tetapi tidak berhasil.
tjbrn
Tentu saja ya, izinkan saya memperbarui jawaban saya.
nobe4
3

Periksa plugin perubahan saya dan pastikan untuk mengatur variabel g:changes_linehi_diffke 1

Christian Brabandt
sumber
2

Untuk seseorang yang mencoba hal yang sama dengan saya, itu yang paling dekat yang saya raih berkat jawaban.

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
sumber