想问一下,在一个 buffer 中遍历第一行到最后一行的循环应该如何写

想实现一个操作,高亮某个 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 个赞

是的,就是这个意思!感谢指点!:+1:t2::pray:t2:经应用,得到了想要的效果!:blush:

(font-lock-add-keywords nil '((“\(\<blove\>\)” 1 font-lock-constant-face t)))

1 个赞

之前用这种方式,但没得到需要的效果!可能是我写的 lisp 实现中存在一点问题,目前还没能找到问题所在!但同样也很感谢! :hugs: :+1:
还有就是,这种方式,在我的 windows emacs 27.2 和 29.1 版本中,执行后当时看不到效果,有时候按 C-u C-x = 才出效果,有时候根本就没有效果。我一般写成

(font-lock-add-keywords nil '(("\(\<blove\>\)" . 'font-lock-constant-face)))

同样也是没有立刻出效果!除非我 add-hook 到某个 mode 中,会有效果!我还是不太懂这些内容! :blush:

(font-lock-add-keywords nil (list (list (rx bow (group "blove") eow) 1 'font-lock-constant-face t)))
(font-lock-flush)

后面 flush 一下试试?

1 个赞

你应该是问了一个 XY 问题。

image

你真正的问题 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 个赞

按照这个写法,立刻看到了效果!太感谢啦! :hugs: :+1: :pray:

您这解答太赞了 :+1:,都比我提问的思路更清晰精准!没错!这就是我想要知道的!
不得不说 ~ 您真是高人! :+1: :+1: :+1:
十分感谢!!!:pray: :blush:

非常感谢 @VonFry @yangyingchao @twlz0ne 三位的帮助、解惑!

@VonFry 的解答,让我了解到实现的大致步骤!而且按照这个步骤也确实实现了需要的效果!

@yangyingchao 的解答,帮我解开了一直以来的无奈!之前一直都是尽量避开 font-lock-add-keywords 的,因为真的不会用!现在知道该如何正确使用了!以后就又可以根据需要,继续启用这种方式解决类似问题啦!

@twlz0ne 的解答,给我提供了一个最简、有效的方法!也直戳我目前所需解决的问题!

感谢大家啦!!! :blush: