当前位置:  开发笔记 > 开发工具 > 正文

如何在VI编辑器中标记/突出显示重复的行?

如何解决《如何在VI编辑器中标记/突出显示重复的行?》经验,为你挑选了3个好方法。



1> rampion..:

作为ex one-liner:

:syn clear Repeat | g/^\(.*\)\n\ze\%(.*\n\)*\1$/exe 'syn match Repeat "^' . escape(getline('.'), '".\^$*[]') . '$"' | nohlsearch

这使用该Repeat组突出显示重复的行.

打破它:

syn clear Repeat ::删除以前发现的任何重复

g/^\(.*\)\n\ze\%(.*\n\)*\1$/ ::对于稍后在文件中重复的任何行

正则表达式

^\(.*\)\n ::全线

\ze ::匹配结束 - 验证模式的其余部分,但不要使用匹配的文本(正向前瞻)

\%(.*\n\)* ::任意数量的实线

\1$ ::匹配实线的整行重复

exe 'syn match Repeat "^' . escape(getline('.'), '".\^$*[]') . '$"'::将与此匹配的完整行添加到Repeat语法组

exe ::执行给定的字符串作为ex命令

getline('.') ::当前行匹配的内容 g//

escape(..., '".\^$*[]') ::使用反斜杠转义给定的字符以制作合法的正则表达式

syn match Repeat "^...$"::将给定的字符串添加到Repeat语法组

nohlsearch ::从搜索中删除突出显示 g//

贾斯汀的非正则表达式方法可能更快:

function! HighlightRepeats() range
  let lineCounts = {}
  let lineNum = a:firstline
  while lineNum <= a:lastline
    let lineText = getline(lineNum)
    if lineText != ""
      let lineCounts[lineText] = (has_key(lineCounts, lineText) ? lineCounts[lineText] : 0) + 1
    endif
    let lineNum = lineNum + 1
  endwhile
  exe 'syn clear Repeat'
  for lineText in keys(lineCounts)
    if lineCounts[lineText] >= 2
      exe 'syn match Repeat "^' . escape(lineText, '".\^$*[]') . '$"'
    endif
  endfor
endfunction

command! -range=% HighlightRepeats ,call HighlightRepeats()


非正则表达式方法很快!非常好的剧本,谢谢!

2> Jenny O'Reil..:

上面的答案都没有对我有用,所以这就是我的工作:

    使用排序文件 :sort

    执行命令 :g/^\(.*\)$\n\1$/p



3> 小智..:

    :sort并将其保存在中file1

    :sort u并将其保存在中file2

    gvimdifftkdiff两个文件。

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有