我已经定义了字符,使其在乳胶模式下表现为单词成分,我对结果非常满意。唯一困扰我的是像
alphabeta
这样的序列被视为单个单词(当然,这是预期的行为(。
有没有办法让 emacs 将特定字符解释为单词"starter"?这样,它将始终被视为其后面的单词的一部分,但永远不会被视为其前面的单词的一部分。
为清楚起见,下面是一个示例:
alphabeta
^ ^
1 2
如果点在1
并且我按M-d
,则应杀死字符串"\alpha"。如果点在2
并且我按M-<backspace>
,则应杀死字符串"\beta"。
我怎样才能做到这一点?
另一个想法:
您的要求非常类似于subword-mode
为camelCase提供的要求。
您无法自定义子词模式的行为 - 正则表达式是硬编码的 - 但您当然可以复制该库并根据您的目的对其进行修改。
M-x find-library
RET subword
RET
这可能是一个非常强大的解决方案。
编辑:根据建议从评论中更新:
作为记录,将
[[:upper:]]
的每个实例更改为 subword.el 中的函数subword-forward-internal
和subword-backward-internal
中的[\\[:upper:]]
效果很好 =((只要"\"定义为"w"语法(。
就个人而言,我更倾向于制作库的副本而不是直接编辑它,除非为了使现有库更通用,最简单的解决方案似乎是将这些正则表达式移动到变量中 - 之后,为此目的使用缓冲区本地修改版本是微不足道的。
编辑 2:从 Emacs 24.3(目前是候选版本(开始,子字模式通过新的 subword-forward-regexp
和 subword-backward-regexp
变量(用于简单的修改(以及 subword-forward-function
和 subword-backward-function
变量(用于更复杂的修改(来促进这一点。
通过使这些正则表达式变量在乳胶模式下具有所需值的缓冲区本地,您可以直接使用子字模式。
您应该能够使用语法文本属性实现这一点:
M-:(info "(elisp) Syntax Properties")
RET
编辑:实际上,我不确定你是否可以做到这一点?
以下内容(只是实验(很接近,但 2 处M-<backspace>
只会删除"beta",而不是前面的"\"。
我想你可以backward-kill-word
重新映射到一个函数,该函数检查前面的"\"并杀死它。相当黑客,但如果没有更干净的解决方案,它可能会解决问题。
我以前没有玩过这个功能;也许其他人可以澄清一下。
(modify-syntax-entry ?\ "w")
(setq parse-sexp-lookup-properties t)
(setq syntax-propertize-function 'my-propertize-syntax)
(defun my-propertize-syntax (start end)
"Set custom syntax properties."
(save-excursion
(goto-char start)
(while (re-search-forward "\w\\" end t)
(put-text-property
(1- (point)) (point) 'syntax-table (cons "." ?\)))))