Nổi bật hoàn tác trong Vim


12

Tôi đang cố gắng hoàn tác tô sáng trong Vim, như cấu hình mặc định của spacemacs. Đôi khi, khi tôi muốn nhanh chóng, tôi không thể nhận ra điều gì đã thay đổi bởi vì đó là tức thời. Vì vậy, tôi đang cố gắng để có một cái gì đó như thế này khi báo chí hoàn tác:

đánh dấu hoàn tác

Bất cứ ai cũng có một ý tưởng làm thế nào để làm điều này trong Vim?

(Tôi đã có plugin Gundo, tôi chỉ muốn làm cho mặc định hoàn tác trơn tru hơn)

Chỉnh sửa : Plugin undotree thực hiện công việc ( Gundo không làm nổi bật các thay đổi), chỉ cần sử dụng UndotreeTogglelệnh và tất cả các thay đổi trong tương lai trên tệp sẽ được tô sáng.


Ý kiến ​​hay. Bạn có thể tạo một điểm nổi bật với matchadd(), nhưng khó hơn một chút là tìm ra phần nào của tệp đã thay đổi.
joeytwiddle

Có lẽ lưu vào bộ đệm / tệp tạm thời trước khi hoàn tác, sau đó vào bộ đệm / tệp thứ 2 sau khi hoàn tác và tô sáng các khác biệt mới sau khi làm sạch (hoặc thay đổi màu của) các tệp trước đó. Có thể bị chậm cho các tệp lớn.
VanLaser

UndoTree thực sự làm nổi bật các dòng thay đổi , nhưng nó không làm điều đó trong thời gian thực. Tôi nghĩ rằng nó sử dụng GNU diff. Lấy độ chi tiết của từ sẽ là một bước bổ sung (ví dụ: các dòng phân chia tại các ngắt từ , các dòng khác nhau, kết hợp lại).
joeytwiddle

Các plugin này đến gần, nhưng chúng vẫn dựa trên dòng: smeargle có thể làm nổi bật các dòng đã thay đổi kể từ lần lưu cuối cùng. thay đổiPlugin đánh dấu các dòng thay đổi (bao gồm xóa) trong máng xối bên trái.
joeytwiddle

1
@joeytwiddle, thay đổiPlugin cũng có thể làm nổi bật khu vực thay đổi cuối cùng
Christian Brabandt

Câu trả lời:


6

Giải pháp mới

Bạn có thể xem những thay đổi cuối cùng của bạn với :changeslệnh. Vì vậy, bạn có thể thay đổi dòng thay đổi gần đây nhất của mình bằng biểu thức chính quy và sau đó áp dụng dòng này matchadd()theo đề xuất của @joeytwiddle.

Đây là mã:

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

Lưu ý :

  • Chức năng này chỉ thêm một điểm nổi bật mới mà không xóa cái cũ, vì vậy trước tiên bạn phải xóa cái cũ. Với clearmatcheschức năng bạn có thể loại bỏ các trận đấu trước khi thêm một trận đấu mới. Cẩn thận, nó sẽ loại bỏ TẤT CẢ các trận đấu. Nếu bạn muốn chi tiết hơn, bạn có thể lưu trận đấu của mình và xóa nó bằng tay:

ví dụ

function! DiffWithPrevious()
  call matchdelete(m)
  ... 
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
  • Sau một số thử nghiệm, tôi phát hiện ra nó chỉ hoạt động để thay đổi một dòng.

Người giới thiệu :


Giải pháp cũ

Đây là một giải pháp khả thi, chủ yếu lấy cảm hứng từ bộ đệm Diff hiện tại và tệp gốc :

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

Ý tưởng là để khuếch tán tệp với tệp trên hệ thống, vì vậy bạn hoàn tác thay đổi cuối cùng của mình, viết nó, làm lại thay đổi las và thực hiện tìm khác biệt.

Tôi nghĩ rằng điều này sẽ làm công việc cho hình ảnh khác biệt theo thời gian theo thời gian.


Có cách nào để xóa thông báo "bộ đệm" trên DiffWithPreingly () không? Tôi muốn chức năng được tô sáng chỉ là những thay đổi cuối cùng, nhưng điểm nổi bật đang tích lũy theo thời gian, tôi đang thử một cái gì đó như message = 0 hoặc message = "" nhưng không thành công.
tjbrn

Tất nhiên, vâng, để tôi cập nhật câu trả lời của tôi.
nobe4


2

Đối với một người đang cố gắng giống tôi, đó là điều gần nhất mà tôi đạt được nhờ vào câu trả lời.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.