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

时间:2011-06-16 14:59:25

标签: vim find match highlight

我经常使用命令或脚本来删除文本,在我取消删除之后(u)我想看看之前删除的命令/脚本。

使用undelete命令时是否可以突出显示以前删除的文本? (或者甚至更好地匹配查找“/”命令中之前删除的文本)

3 个答案:

答案 0 :(得分:6)

如果您刚刚使用d删除了某些文字,则可以使用/<CTRL-R>"来匹配刚刚删除的文字(即使您只是使用u取消删除)。

如果删除的文字包含换行符或正则表达式元字符(如\[),则无效。如果可能的话,试试:

/\V<CTRL-R>=substitute(substitute(getreg('"'), "[\\/]", '\\\0', 'g'), "\n", '\\n', "g")
  • \V - 非常无害 - 关闭大多数正则表达式元字符
  • <CTRL-R>= - 插入vim表达式的评估
  • substitute(..., "\n", '\\n', "g") - 转义给定字符串中的所有换行符
  • substitute(..., "[\\/]", '\\\0', 'g') - 转义给定字符串中的所有斜杠和反斜杠
  • getreg('"') - 获取"注册表的内容,其中包含最近被删除和/或删除的文本

这有点罗嗦,所以如果你发现自己需要经常这样做,你可以将它绑定到~/.vimrc中的命令:

" use ,/ in normal mode to match the most recently deleted or yanked text
nmap ,/ /\V<C-R>=substitute(substitute(getreg('"'), "[\\/]", '\\\0', 'g'), "\n", '\\n', "g")<CR><CR><CR>

答案 1 :(得分:4)

如何从文件的一个状态中获取差异并与另一个状态进行比较?

: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将当前缓冲区标记为diff
  • 的一部分
  • wincmd p切换到最后一个缓冲区(返回我们开始使用的缓冲区)
  • exe "norm! \<c-r>"执行重做以恢复原始缓冲区状态
  • diffthis将原始缓冲区标记为diff
  • 的一部分

完成后我建议执行:diffoff!以关闭两个差异。

令人遗憾的是,当前状态下的此命令无法处理未保存的缓冲区,因为:read #将在文件中读取。解决方案是将缓冲区的内容复制到命名寄存器中,然后将其粘贴到临时缓冲区中。可悲的是,这将破坏一个命名的注册。将代码重新编写到函数中将提供更大的灵活性,并允许使用变量来保存寄存器的内容(和寄存器类型)并在最后恢复寄存器。

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并建议Gundohistwin。有关Gundo的更多信息,请参阅此vimcasts

如需更多帮助,请参阅:

:h diffthis
:h diffoff
:h wincmd
:h 'bt'
:h :r
:h :d

答案 2 :(得分:2)

尝试使用histwin或Gundo插件。它允许您对所有撤消分支进行区分,并且还显示预览窗口中差异的统一差异。

相关问题