取消删除后如何突出显示所有先前删除的文本

问题描述

|| 我经常使用命令或脚本来删除文本,并且在执行取消删除(u)后,我想查看该命令/脚本先前删除内容。 使用undelete命令时是否可以突出显示先前删除的文本? (甚至更好地匹配find \“ / \”命令中先前删除的文本)     

解决方法

        如果您只是使用
d
删除了某些文本,则可以使用
/<CTRL-R>\"
来匹配刚删除的文本(即使您只是用
u
取消了删除)。 如果删除的文本包含换行符或正则表达式元字符(例如
\\
[
),则此方法将无效。如果可能,请尝试:
/\\V<CTRL-R>=substitute(substitute(getreg(\'\"\'),\"[\\\\/]\",\'\\\\\\0\',\'g\'),\"\\n\",\'\\\\n\',\"g\")
\\V
-非常不可思议-关闭大多数正则表达式元字符
<CTRL-R>=
-插入vim表达式的求值
substitute(...,\"g\")
-对给定字符串中的所有换行符进行转义
substitute(...,\'g\')
-在给定的字符串中转义所有斜杠和反斜杠
getreg(\'\"\')
-获取
\"
寄存器的内容,其中包含最近被拉出和/或删除的文本 这有点罗word,所以如果您发现自己需要经常这样做,可以将其绑定到
~/.vimrc
中的命令:
\" use,/ in normal mode to match the most recently deleted or yanked text
nmap,/ /\\V<C-R>=substitute(substitute(getreg(\'\"\'),\"g\")<CR><CR><CR>
    ,        如何从文件的一种状态获取差异并与另一种状态进行比较呢?
:command! -nargs=0 DiffLastChange  exe \"norm! u\" | vert new | set bt=nofile | r # | 0d _ | diffthis | wincmd p | exe \"norm! \\<c-r>\" | diffthis
现在您可以运行
DiffLastChange
来查看文件的最后更改的差异。 说明:
exe \"norm! u\"
撤消当前缓冲区中的最后一个更改
vert new
垂直拆分新缓冲区
set bt=nofile
将缓冲区类型更改为暂存缓冲区
r #
从备用文件中读取内容,即我们开始时使用的缓冲区
0d _
通过将顶部的空白行移入黑洞寄存器来清理新缓冲区
diffthis
标记当前缓冲区为差异的一部分
wincmd p
切换到最后一个缓冲区(回到我们开始时使用的缓冲区)
exe \"norm! \\<c-r>\"
执行重做以恢复原始缓冲区状态
diffthis
将原始缓冲区标记为与差异区分开 完成后,我建议执行
:diffoff!
关闭两个差异。 遗憾的是,此命令在当前状态下无法处理未保存的缓冲区,因为“ 26”将读取文件。解决方案是将缓冲区的内容复制到命名寄存器中,然后将其粘贴到暂存缓冲区中。不幸的是,这会破坏命名寄存器。将代码重构为函数将提供更大的灵活性,并允许使用变量来保存寄存器的内容(和寄存器类型)并在最后恢复寄存器。
function! DiffLastChange(...)
  let a = @a
  let at = getregtype(\'a\')
  let c = a:0 == 1 ? a:1 : 1
  let ft = &ft
  try
    exe \"norm! \" . c . \"u\"
    sil %y a
    vert new
    set bt=nofile
    exe \"set ft=\" . ft
    sil pu a
    0d _
    diffthis
    wincmd p
    exe \"norm! \" . c . \"\\<c-r>\"
    diffthis
  finally
    call setreg(\'a\',a,at)
  endtry
endfunction
command! -nargs=? DiffLastChange call DiffLastChange(<f-args>)
除了解决未保存的缓冲区问题和破坏问题之外,我还添加了通过命令参数(例如
:DiffLastChange 3
。该命令还将暂存缓冲区的文件类型设置为与原始缓冲区相同的文件,因此将为该缓冲区打开语法突出显示。 对于在缓冲区中查看历史各部分之间差异的更健壮的解决方案,我同意Christian Brabandt的建议,并建议使用Gundo或histwin。有关Gundo的更多信息,请参见此vimcast。 有关更多帮助,请参见:
:h diffthis
:h diffoff
:h wincmd
:h \'bt\'
:h :r
:h :d
    ,        尝试使用histwin或Gundo插件。它使您可以比较所有撤消分支,并在预览窗口中显示差异的统一比较。