Lihatlah font-lock-keywords
setelah Anda memanggil fungsi Anda. Anda akan melihat bahwa itu hanya memiliki regexp untuk baris pertama sebagai regexp untuk diklasifikasi. Yang Anda lakukan adalah mengambil garis yang diberikan dan meletakkan regexp untuk mencocokkannya font-lock-keywords
- jadi hanya dups dari garis yang bisa disorot. TKI, regexp untuk baris pertama itu adalah hard-code font-lock-keywords
.
Sebagai gantinya, Anda bisa menggunakan FUNCTION
in font-lock-keywords
. Tapi saya hanya akan mencari buffer untuk dups dari setiap baris, pada gilirannya, dan tidak repot dengan font-lock-keywords
.
Inilah satu solusi cepat. Menggunakan fungsi hlt-highlight-region
dari Highlight Library ( highlight.el
), tetapi Anda dapat menggunakan sesuatu yang lain jika Anda mau.
(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)))))
Dan ini adalah versi yang berfungsi pada (a) wilayah aktif atau (b) buffer penuh jika wilayah tidak aktif:
(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)))))
Dan jika Anda ingin wajah yang berbeda untuk setiap set dups kemudian hanya mengikat variabel face
di let
, dan setq
ke (hlt-next-face)
sebelah mana line-re
diatur, dan ganti font-lock-warning-face
dengan face
. Opsi hlt-auto-face-backgrounds
mengontrol wajah yang digunakan.
(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
dalamnya(let ((hi-lock-mode -1)) .. )
. Saya melakukan itu untuk mengatasi masalah yang sama: github.com/kaushalmodi/.emacs.d/blob/…