Eche un vistazo font-lock-keywords
despué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-keywords
expresió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 FUNCTION
en 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-region
de 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 face
en el let
, y setq
al (hlt-next-face)
lado de donde line-re
se establece, y reemplace font-lock-warning-face
con face
. La opción hlt-auto-face-backgrounds
controla 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-regexp
interior(let ((hi-lock-mode -1)) .. )
. Lo hice para resolver el mismo problema: github.com/kaushalmodi/.emacs.d/blob/…