在Vim中突出显示了撤消


12

我正在尝试在Vim中突出显示撤消操作,例如spacemacs默认配置。有时候,当我想要快速撤消操作时,我无法意识到更改是因为它是瞬时的。因此,当我按一下撤消按钮时,我会尝试这样的操作:

突出显示的撤消

有人知道如何在Vim中执行此操作吗?

(我已经有了Gundo插件,我只想使默认的undo更流畅)

编辑:该undotree插件不工作(Gundo并不突出的变化),只需使用UndotreeToggle命令,将被高亮显示在文件中的所有未来的变化。


好主意。您可以使用创建突出显示matchadd(),但要弄清楚文件的哪些部分已更改,则需要一点技巧。
joeytwiddle

也许在撤消之前保存到临时缓冲区/文件,然后在撤消之后保存到第二缓冲区/文件,并在清理(或更改颜色)先前的差异后突出显示新的差异。大文件可能会变慢。
VanLaser

UndoTree实际上会突出显示已更改的,但不会实时进行。我认为它使用GNU diff。获取单词粒度将是一个额外的步骤(例如,在分行符,差异,重组行时使用分割线)。
joeytwiddle

这些插件接近,但它们仍基于行:smeargle可以突出显示自上次保存以来更改的行。changes插件在左侧装订线中更改了行(包括删除)。
joeytwiddle

1
@ joeytwiddle,changesPlugin也可以突出显示最后的更改区域
Christian Brabandt

Answers:


6

新解决方案

您可以使用:changes命令查看最后的更改。因此,您可以使用正则表达式来完成最新的行更改,然后matchadd()按照@joeytwiddle的建议将行应用到。

这是代码:

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

注意事项

  • 此功能仅添加新的突出显示而不会删除旧的突出显示,因此您必须先删除旧的突出显示。使用此clearmatches功能,您可以在添加新匹配项之前删除匹配项。小心,它将删除所有匹配项。如果您希望获得更详细的信息,可以保存并手动删除匹配项:

例如

function! DiffWithPrevious()
  call matchdelete(m)
  ... 
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
  • 经过一些测试,我发现它仅适用于单行更改。

参考文献:


旧解决方案

这是一个可能的解决方案,主要是受Diff当前缓冲区和原始文件的启发:

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

这个想法是将文件与系统上的文件进行比较,因此您撤消上一次更改,将其写入,重做其他更改并执行diff。

我认为这应该可以进行时间差异可视化。


有没有办法清除DiffWithPrevious()上的消息“缓冲区”?我希望该功能突出显示最后的更改,但是突出显示会随着时间的推移而累积,我尝试使用诸如message = 0或message =“”之类的方法,但没有成功。
tjbrn

是的,让我更新我的答案。
nobe4


2

对于正在尝试与我相同的人,这要归功于我的回答。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.