Jako ex jedną wkładką:
:syn clear Repeat | g/^\(.*\)\n\ze\%(.*\n\)*\1$/exe 'syn match Repeat "^' . escape(getline('.'), '".\^$*[]') . '$"' | nohlsearch
używa grupę Repeat
aby wyróżnić powtarzające się linie.
złamanie go:
syn clear Repeat
:: usunąć dowolny poprzednio znalezionych powtórzenia
g/^\(.*\)\n\ze\%(.*\n\)*\1$/
:: dla każdej linii, który jest powtarzany później w pliku
- regex
^\(.*\)\n
:: pełna linia
\ze
:: Koniec meczu - sprawdza resztę wzór, ale nie zużywają dopasowany tekst (pozytywny uprzedzona)
\%(.*\n\)*
:: dowolną liczbę pełnych linii
\1$
:: pełną linię powtórzenie dopasowane pełna linia
exe 'syn match Repeat "^' . escape(getline('.'), '".\^$*[]') . '$"'
:: dodaj pełne linie, które pasują do tego celu grupy Repeat
składni
exe
:: wykonać dany ciąg jako polecenia ex
getline('.')
:: zawartość bieżącej linii dopasowane g//
escape(..., '".\^$*[]')
:: uciec podane znaki z ukośniki dokonać legit regex
syn match Repeat "^...$"
:: dodaj dany ciąg do grupy Repeat
składni
nohlsearch
:: usunąć podkreślenie z wyszukiwania wykonanej dla g//
Metoda nie regex
Justina jest prawdopodobnie szybciej:
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()
Metoda bez regex działa błyskawicznie! całkiem dobry scenariusz, dzięki! – Hassek
to jest naprawdę niesamowite! – pymarco
Nie mogę tego uruchomić. umieściłem funkcję w moim ~/.vimrc, ale po uruchomieniu ": wywołaj funkcję HighlightRepeats()" pojawia się błąd: wykryto błąd podczas przetwarzania funkcji HighlightRepeats: wiersz 10: E28: Brak takiej nazwy grupy punktów wyróżnienia: Powtórz – Daps0l