簡體   English   中英

如何在elisp中逐個字符地處理緩沖區?

[英]how to process the buffer character-by-character in elisp?

我正在嘗試編寫一些elisp來處理當前緩沖區中的每個字符(我知道這會有點慢,但認為這是最好的方法)。 我不想使用正則表達式。 這該怎么做?

函數buffer-string將當前緩沖區作為buffer-string返回。 使用它可以迭代並引用/設置每個字符。 我無法弄清楚如何將結果放回緩沖區。
有人可以給出一個只是迭代每個字符的例子,以一種簡單的方式改變它,並將結果放回緩沖區嗎?

使用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-charinsert insert在新插入的字符之后放置點,因此循環將繼續使用下一個未處理的字符。

添加@lunaryorn所說的內容 - 也許是解決方案的一部分,取決於你需要什么,所以不僅僅是評論:

當您逐個字符處理緩沖區時,通常情況下您不希望或不需要為每個字符執行某些操作,但您需要為緩沖區中的特定字符執行某些操作。

在這種情況下,你往往不需要檢查每個字符。 相反,您可以使用這些功能(請參閱他們的文檔,了解他們的工作):

  • search-forwardre-search-forward ,如果特定字符是目標

  • next-single-property-change ,如果一個或多個具有特定文本屬性的字符被定位(或者可能是next-single-char-property-change ,如果涉及覆蓋)

  • next-property-change ,如果一個或多個字符是任何文本屬性更改的目標(或者可能是next-char-property-change ,如果涉及覆蓋)

在這種情況下,你迭代緩沖區位置(因此,在那些位置的字符上),就像@ lunaryorn的解決方案一樣,但你使用這樣的函數來快速跳過你不感興趣的字符。這是更常見的 ,IMO ,而不是逐個檢查每個角色。 但是,不知道它是否適合您的用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM