Inilah yang saya miliki:
(defun my-show-duplicate-lines ()
(interactive)
(highlight-lines-matching-regexp
(concat "^"
(regexp-quote
(substring-no-properties
(thing-at-point 'line) 0 -1))
"$")
font-lock-warning-face))
Tujuan saya adalah menambahkan ini untuk post-command-hook
menemukan baris tempat saya menduplikasi logika, tetapi ketika saya menjalankan perintah untuk kedua kalinya, itu tidak efektif (dan penguncian font lama masih berlaku).
Masalah kedua disebabkan oleh font-lock tidak menyegarkan sendiri. Saya sudah mencoba menambahkan (font-lock-mode -1) (font-lock-mode 1)
definisi, tetapi itu tidak efektif.
Saya tidak tahu mengapa perintah itu hanya baik untuk sekali jalan.
highlight-lines-matching-regexp
dalamnya(let ((hi-lock-mode -1)) .. )
. Saya melakukan itu untuk mengatasi masalah yang sama: github.com/kaushalmodi/.emacs.d/blob/…unhighlight-regexp
bisa juga digunakan. Terlepas dari fitur ini mungkin paling baik diimplementasikan menggunakan fungsi pencocokan font-lock yang memindai buffer untuk garis duplikat dan menerapkan penyorotan pada mereka. Ini akan menangani unhighlighting secara otomatis setelah tidak ada garis duplikat.highlight-lines-matching-regexp
harus berlaku untuk kasus ini - hampir seperti sepatu. (Meskipun saya juga berpikir untuk menggunakan overlay, tapi itu konsep yang kurang saya kenal.)delete-duplicate-lines
, lalu bedakan dua buffer.Jawaban:
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 mencocokkannyafont-lock-keywords
- jadi hanya dups dari garis yang bisa disorot. TKI, regexp untuk baris pertama itu adalah hard-codefont-lock-keywords
.Sebagai gantinya, Anda bisa menggunakan
FUNCTION
infont-lock-keywords
. Tapi saya hanya akan mencari buffer untuk dups dari setiap baris, pada gilirannya, dan tidak repot denganfont-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.Dan ini adalah versi yang berfungsi pada (a) wilayah aktif atau (b) buffer penuh jika wilayah tidak aktif:
Dan jika Anda ingin wajah yang berbeda untuk setiap set dups kemudian hanya mengikat variabel
face
dilet
, dansetq
ke(hlt-next-face)
sebelah manaline-re
diatur, dan gantifont-lock-warning-face
denganface
. Opsihlt-auto-face-backgrounds
mengontrol wajah yang digunakan.sumber
setq: Symbol's value as variable is void: hlt-highlight-line-dups-ignore-regexp
. Bagaimana variabel ini didefinisikan?Bagaimana kalau menggunakan overlay alih-alih font-lock?
Buat wilayah, lalu
M-x my-highlight-duplicate-lines-in-region
Anda dapat menghapus semua overlay denganM-x ov-clear
sumber
Ini agak samar, tetapi dengan sedikit usaha (lihat C-h f
ediff-buffers
RETinfo tentangHOOK
argumennya) Anda bisa membuatnya tampil lebih baik / melakukan pembersihan yang lebih baik setelah keluar dari mode diff:sumber
Peningkatan jawaban di atas oleh Shingo Fukuyama.
Versi ini memeriksa duplikat baris di wilayah aktif tetapi jika tidak ada, cari seluruh buffer.
sumber