Dê uma olhada font-lock-keywords
depois de ter chamado sua função. Você verá que ele apenas possui o regexp para a primeira linha como o regexp para tipificar. Tudo o que você fez foi pegar uma determinada linha e colocar um regexp para combiná-la font-lock-keywords
- para que apenas os dups dessa linha sejam destacados. IOW, o regexp para essa primeira linha é codificado font-lock-keywords
.
Em vez disso, você pode usar um FUNCTION
in font-lock-keywords
. Mas eu procuraria no buffer por dups de cada linha, por sua vez, e não me incomodaria font-lock-keywords
.
Aqui está uma solução rápida. Ele usa a função hlt-highlight-region
da biblioteca Highlight ( highlight.el
), mas você pode usar outra coisa, se quiser.
(defun highlight-line-dups ()
(interactive)
(let ((count 0)
line-re)
(save-excursion
(goto-char (point-min))
(while (not (eobp))
(setq count 0
line-re (concat "^" (regexp-quote (buffer-substring-no-properties
(line-beginning-position)
(line-end-position)))
"$"))
(save-excursion
(goto-char (point-min))
(while (not (eobp))
(if (not (re-search-forward line-re nil t))
(goto-char (point-max))
(setq count (1+ count))
(unless (< count 2)
(hlt-highlight-region (line-beginning-position) (line-end-position)
'font-lock-warning-face)
(forward-line 1)))))
(forward-line 1)))))
E aqui está uma versão que funciona (a) na região ativa ou (b) no buffer completo se a região não estiver ativa:
(defun highlight-line-dups-region (&optional start end face msgp)
(interactive `(,@(hlt-region-or-buffer-limits) nil t))
(let ((count 0)
line-re)
(save-excursion
(goto-char start)
(while (< (point) end)
(setq count 0
line-re (concat "^" (regexp-quote (buffer-substring-no-properties
(line-beginning-position)
(line-end-position)))
"$"))
(save-excursion
(goto-char start)
(while (< (point) end)
(if (not (re-search-forward line-re nil t))
(goto-char end)
(setq count (1+ count))
(unless (< count 2)
(hlt-highlight-region
(line-beginning-position) (line-end-position)
face)
(forward-line 1)))))
(forward-line 1)))))
E se você quiser uma face diferente para cada conjunto de cópias de segurança , basta vincular uma variável face
no let
, e setq
ao (hlt-next-face)
lado de onde line-re
está definido, e substitua font-lock-warning-face
por face
. A opção hlt-auto-face-backgrounds
controla as faces usadas.
(defun hlt-highlight-line-dups-region (&optional start end msgp)
(interactive `(,@(hlt-region-or-buffer-limits) t))
(let ((hlt-auto-faces-flag t)
count line line-re ignore-re)
(save-excursion
(goto-char start)
(while (< (point) end)
(setq count 0
line (buffer-substring-no-properties (line-beginning-position)
(line-end-position))
ignore (and (not (string= "" line)) "[ \t]*")
line-re (concat "^" ignore (regexp-quote line) ignore "$"))
(save-excursion
(goto-char start)
(while (< (point) end)
(if (not (re-search-forward line-re end t))
(goto-char end)
(setq count (1+ count))
(unless (< count 2)
(hlt-highlight-region (line-beginning-position) (line-end-position))
(forward-line 1)))))
(forward-line 1)))))
highlight-lines-matching-regexp
interior(let ((hi-lock-mode -1)) .. )
. Eu fiz isso para resolver o mesmo problema: github.com/kaushalmodi/.emacs.d/blob/...