作为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()
上面的答案都没有对我有用,所以这就是我的工作:
使用排序文件 :sort
执行命令 :g/^\(.*\)$\n\1$/p
:sort
并将其保存在中file1
。
:sort u
并将其保存在中file2
。
gvimdiff
或tkdiff
两个文件。