blove
1
想实现一个操作,高亮某个 buffer 中的关键字,希望从第一行到最后一行,在每一行都执行同样的搜索关键字、overlay 的操作,但这个在 buffer 中的循环该怎么写?
(progn
(beginning-of-buffer)
(insert-button "blove str"
'action nil
'follow-link t)
(search-backward "blove")
(setq start (point))
(search-forward "blove")
(setq end (point))
(setq rg-match-hl-overlay (make-overlay start end))
(overlay-put rg-match-hl-overlay 'face 'blove-rg-match-hl-face)
)
(defface blove-rg-match-hl-face
'((t (:foreground "#FF0000" :bold t)))
"for rg-match-hl"
)
或者应该有其它更正确的方式实现?
大概这个意思?
(defun search-mykey ()
(search-forward "your key" nil t))
(defun iter-buffer (curr-pnt)
(when curr-pnt
(let ((start (- curr-pnt (length "your key")))
(end curr-pnt))
(do-your-action))
(iter-buffer (search-mykey))))
(with-current-buffer (current-buffer)
(beginning-of-buffer)
(iter-buffer (search-mykey)))
1 个赞
blove
3
(font-lock-add-keywords nil '((“\(\<blove\>\)” 1 font-lock-constant-face t)))
1 个赞
blove
5
之前用这种方式,但没得到需要的效果!可能是我写的 lisp 实现中存在一点问题,目前还没能找到问题所在!但同样也很感谢!
还有就是,这种方式,在我的 windows emacs 27.2 和 29.1 版本中,执行后当时看不到效果,有时候按 C-u C-x = 才出效果,有时候根本就没有效果。我一般写成
(font-lock-add-keywords nil '(("\(\<blove\>\)" . 'font-lock-constant-face)))
同样也是没有立刻出效果!除非我 add-hook 到某个 mode 中,会有效果!我还是不太懂这些内容!
(font-lock-add-keywords nil (list (list (rx bow (group "blove") eow) 1 'font-lock-constant-face t)))
(font-lock-flush)
后面 flush 一下试试?
1 个赞
你应该是问了一个 XY 问题。
你真正的问题 X,#6 楼已经给了答案。
看了你实现 Y 的方式,我觉得也有必要回答一下:
(progn
(beginning-of-buffer)
;; 用 `while` + `re-search-forward` 循环查找,
;; 用 `match-beginning` / `match-end` 确定匹配目标的边界。
(while (re-search-forward "blove" nil t)
(let ((ov (make-overlay (match-beginning 0) (match-end 0))))
(overlay-put ov 'face 'blove-rg-match-hl-face))))
1 个赞
blove
9
blove
10
非常感谢 @VonFry @yangyingchao @twlz0ne 三位的帮助、解惑!
@VonFry 的解答,让我了解到实现的大致步骤!而且按照这个步骤也确实实现了需要的效果!
@yangyingchao 的解答,帮我解开了一直以来的无奈!之前一直都是尽量避开 font-lock-add-keywords 的,因为真的不会用!现在知道该如何正确使用了!以后就又可以根据需要,继续启用这种方式解决类似问题啦!
@twlz0ne 的解答,给我提供了一个最简、有效的方法!也直戳我目前所需解决的问题!
感谢大家啦!!!