Hãy xem font-lock-keywords
sau khi bạn đã gọi chức năng của bạn. Bạn sẽ thấy rằng nó chỉ có regrec cho dòng đầu tiên là regrec để phông chữ. Tất cả những gì bạn đã làm là chọn một dòng nhất định và đặt biểu thức chính quy để khớp với nó font-lock-keywords
- vì vậy chỉ các phần của dòng đó được tô sáng. IOW, biểu thức chính quy cho dòng đầu tiên được mã hóa cứng font-lock-keywords
.
Thay vào đó, bạn có thể sử dụng một FUNCTION
trong font-lock-keywords
. Nhưng tôi sẽ chỉ tìm kiếm bộ đệm cho dups của từng dòng, và không bận tâm đến font-lock-keywords
.
Đây là một giải pháp nhanh chóng. Nó sử dụng chức năng hlt-highlight-region
từ thư viện Highlight ( highlight.el
), nhưng bạn có thể sử dụng cái gì đó khác nếu bạn thích.
(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)))))
Và đây là phiên bản hoạt động trên (a) vùng hoạt động hoặc (b) bộ đệm đầy đủ nếu vùng đó không hoạt động:
(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)))))
Và nếu bạn muốn có một khuôn mặt khác nhau cho mỗi bộ dups sau đó chỉ cần ràng buộc một biến face
trong let
, và setq
nó đến (hlt-next-face)
bên cạnh nơi line-re
được thiết lập, và thay thế font-lock-warning-face
với face
. Tùy chọn hlt-auto-face-backgrounds
kiểm soát các khuôn mặt được sử dụng.
(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
bên trong(let ((hi-lock-mode -1)) .. )
. Tôi đã làm điều đó để giải quyết vấn đề tương tự: github.com/kaushalmodi/.emacs.d/blob/ mẹo