Eche un vistazo font-lock-keywordsdespués de haber llamado a su función. Verá que solo tiene la expresión regular para la primera línea como la expresión regular para fontify. Todo lo que hizo fue tomar una línea determinada y poner una font-lock-keywordsexpresión regular para que coincida con ella , por lo que solo se resaltan los duplicados de esa línea. IOW, la expresión regular para esa primera línea está codificada font-lock-keywords.
En su lugar, se puede usar una FUNCTIONen font-lock-keywords. Pero solo buscaría en el búfer duplicados de cada línea, a su vez, y no me molestaría font-lock-keywords.
Aquí hay una solución rápida. Utiliza la función hlt-highlight-regionde la biblioteca Highlight ( highlight.el), pero puede usar algo más si lo desea.
(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)))))
Y aquí hay una versión que funciona en (a) la región activa o (b) el búfer completo si la región no está activa:
(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)))))
Y si desea una cara diferente para cada conjunto de dups , simplemente vincule una variable faceen el let, y setqal (hlt-next-face)lado de donde line-rese establece, y reemplace font-lock-warning-facecon face. La opción hlt-auto-face-backgroundscontrola las caras utilizadas.
(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-regexpinterior(let ((hi-lock-mode -1)) .. ). Lo hice para resolver el mismo problema: github.com/kaushalmodi/.emacs.d/blob/…