Como ex de una sola línea:
:syn clear Repeat | g/^\(.*\)\n\ze\%(.*\n\)*\1$/exe 'syn match Repeat "^' . escape(getline('.'), '".\^$*[]') . '$"' | nohlsearch
Este utiliza el grupo Repeat
para resaltar las repetidas líneas.
Descomponiéndola:
syn clear Repeat
:: eliminar cualquier encontrado previamente repeticiones
g/^\(.*\)\n\ze\%(.*\n\)*\1$/
:: para cualquier línea que se repite más adelante en el archivo
- la expresión regular
^\(.*\)\n
:: una línea completa
\ze
:: final del partido - verificar que el resto del patrón, pero no consumen el texto coincidente (búsqueda positiva hacia delante)
\%(.*\n\)*
:: cualquier número de líneas completas
\1$
:: una repetición de la línea completa emparejado línea completa
exe 'syn match Repeat "^' . escape(getline('.'), '".\^$*[]') . '$"'
:: añadir líneas completas que coincidan con este al grupo Repeat
sintaxis
exe
:: ejecutar la cadena dada como un comando ex
getline('.')
:: el contenido de la línea actual igualada por g//
escape(..., '".\^$*[]')
:: escapar los caracteres dados con barras invertidas para hacer una expresión regular de fiar
syn match Repeat "^...$"
:: añadir la cadena dada al grupo Repeat
sintaxis
nohlsearch
:: eliminar destacando de la búsqueda realizada por g//
método no regex
de Justin es probablemente más rápido:
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 <line1>,<line2>call HighlightRepeats()
¡El método no regex es rapidísimo! muy buen guión, gracias! – Hassek
esto es realmente increíble! – pymarco
no puedo hacer que esto funcione. he puesto la función en mi ~/.vimrc pero cuando ejecuto ": call HighlightRepeats()" recibo un error: Se detectó un error al procesar la función ResaltadoRechazar: línea 10: E28: No se mencionó el nombre del grupo resaltado: Repetir – Daps0l