![](/img/trans.png)
[英]switching between autocompletion and character-by-character entry in an ido path
[英]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-char
與insert
。 insert
在新插入的字符之后放置點,因此循環將繼續使用下一個未處理的字符。
添加@lunaryorn所說的內容 - 也許是解決方案的一部分,取決於你需要什么,所以不僅僅是評論:
當您逐個字符處理緩沖區時,通常情況下您不希望或不需要為每個字符執行某些操作,但您需要為緩沖區中的特定字符執行某些操作。
在這種情況下,你往往不需要檢查每個字符。 相反,您可以使用這些功能(請參閱他們的文檔,了解他們的工作):
search-forward
或re-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.