问题描述
||
我经常使用命令或脚本来删除文本,并且在执行取消删除(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插件。它使您可以比较所有撤消分支,并在预览窗口中显示差异的统一比较。