如何在elisp中逐个字符地处理缓冲区?

时间:2014-07-25 10:29:07

标签: emacs elisp

我正在尝试编写一些elisp来处理当前缓冲区中的每个字符 (我知道这会有点慢,但认为这是最好的方法)。我不想使用正则表达式。怎么做?

函数buffer-string将当前缓冲区作为字符串返回。使用它可以迭代并引用/设置每个字符。但我无法弄清楚如何将结果放回缓冲区 有人可以给出一个只是迭代每个字符的例子,以一种简单的方式改变它,并将结果放回缓冲区吗?

2 个答案:

答案 0 :(得分:6)

使用while循环和forward-char迭代缓冲区中的所有字符:

(goto-char (point-min))
(while (not (eobp))
  (let* ((current-character (char-after))
         (new-character (do-something current-character)))
    (delete-char 1)
    (insert-char new-character))
  (forward-char 1))

只要未达到缓冲区的末尾(eobp),循环就会一次向前移动一个字符。

char-after为您提供当前位置的角色。 delete-char / insert-char调用将旧字符替换为旧字符,这是处理旧字符的结果。

要将旧字符替换为多个字符(即字符串),只需将insert-char替换为insertinsert放在新插入的字符之后,因此循环将继续使用下一个未处理的字符。

答案 1 :(得分:1)

为@lunaryorn所说的内容添加内容 - 可能是解决方案的一部分,具体取决于您的需求,而不仅仅是评论:

当您逐个字符处理缓冲区时,通常情况下您不希望或不需要为每个字符执行某些操作,但您需要为特定字符执行某些操作缓冲区。

在这种情况下,您经常需要检查每个角色。相反,您可以使用这些功能(参见他们的文档):

  • search-forwardre-search-forward,如果定位了特定字符

  • next-single-property-change,如果定位了一个或多个具有特定文字属性的字符(或者next-single-char-property-change,如果涉及叠加)

  • next-property-change,如果一个或多个字符的任何文字属性更改被定位(或者next-char-property-change,如果涉及叠加)

在这种情况下,你会迭代缓冲区位置(因此,在那些位置的字符上),就像@ lunaryorn的解决方案一样,但你使用这样的函数来快速跳过你不感兴趣的字符。这比IMO 更常见,而不是逐个检查每个字符。但是,不管它是否适合您的用例,我都不知道。