首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在恢复删除后突出显示所有以前删除的文本

如何在恢复删除后突出显示所有以前删除的文本
EN

Stack Overflow用户
提问于 2011-06-16 22:59:25
回答 3查看 472关注 0票数 7

我经常使用命令或脚本来删除文本,并且在执行undelete (u)之后,我想要查看之前被命令/脚本删除的内容。

使用undelete命令时,是否可以突出显示以前删除的文本?(或者更好地匹配先前在find "/“命令中删除的文本)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-17 01:16:34

如果你只是使用d删除了一些文本,你可以使用/<CTRL-R>"来匹配你刚刚删除的文本(即使你刚刚用u撤销了删除)。

如果删除的文本包含换行符或正则表达式元字符(如\[),这将不起作用。如果有可能,试一下:

代码语言:javascript
复制
/\V<CTRL-R>=substitute(substitute(getreg('"'), "[\\/]", '\\\0', 'g'), "\n", '\\n', "g")

  • \V -非常没有意义-关闭大多数正则表达式meta-characters
  • <CTRL-R>= -插入vim expression
  • substitute(..., "\n", '\\n', "g")的求值-转义给定string
  • substitute(..., "[\\/]", '\\\0', 'g')中的所有换行符-转义给定string
  • getreg('"')中的所有斜杠和反斜杠-获取"寄存器的内容,其中包含最近拖拽和/或删除的文本

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

代码语言:javascript
复制
" 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>
票数 6
EN

Stack Overflow用户

发布于 2011-06-17 01:58:05

将文件的一种状态与另一种状态进行比较如何?

代码语言:javascript
复制
: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"撤消当前buffer
  • vert new中的最后更改垂直拆分新的buffer
  • set bt=nofile将缓冲区类型更改为临时buffer
  • r #从替代文件中读取内容,即我们开始的缓冲区with
  • 0d _通过将顶部的空行移入黑洞来清理新缓冲区register
  • diffthis将当前缓冲区标记为diff
  • wincmd p的一部分切换到最后一个缓冲区(返回到缓冲区我们开始执行重做来恢复原始缓冲区,并将原始缓冲区标记为with)
  • exe "norm! \<c-r>" state
  • diffthis

的一部分

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

遗憾的是,此命令在其当前状态下不能处理未保存的缓冲区,因为:read #将读取文件。解决方案是将缓冲区的内容复制到指定的寄存器中,然后将其粘贴到临时缓冲区中。遗憾的是,这将重创命名寄存器。将代码重构为函数将提供更大的灵活性,并允许使用变量来保存寄存器的内容(和寄存器类型),并在结束时恢复寄存器。

代码语言:javascript
复制
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

有关更多帮助,请参阅:

代码语言:javascript
复制
:h diffthis
:h diffoff
:h wincmd
:h 'bt'
:h :r
:h :d
票数 4
EN

Stack Overflow用户

发布于 2011-06-17 14:18:06

试试histwin或Gundo插件。它允许您比较所有撤消分支,并在预览窗口中显示不同的统一差异。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6373991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档