我已经将\
字符定义为乳胶模式中的单词成分,我对结果非常满意。唯一困扰我的是像\alpha\beta
这样的序列被视为一个单词(当然是预期的行为)。
有没有办法让emacs将特定字符解释为单词“starter”?通过这种方式,它始终被认为是跟随它的单词的一部分,但从不是它之前的单词的一部分。
为清楚起见,这是一个例子:
\alpha\beta
^ ^
1 2
如果该点位于1
并按M-d
,则应删除字符串“\ alpha”。
如果该点位于2
并按M-<backspace>
,则应删除字符串“\ beta”。
我如何实现这一目标?
答案 0 :(得分:3)
另一个想法:
您的要求非常类似于subword-mode
为camelCase提供的内容。
您无法自定义子字体模式的行为 - 正则表达式是硬编码的 - 但您当然可以复制该库并根据您的目的对其进行修改。
M-x find-library
RET subword
RET
这可能是一个非常强大的解决方案。
修改:根据建议更新评论:
对于记录,在subword.el中的函数
[[:upper:]]
和[\\\\[:upper:]]
中将subword-forward-internal
的每个实例更改为subword-backward-internal
效果很好=)(只要“\” “被定义为”w“语法)。
就个人而言,我更倾向于制作库的副本,而不是直接编辑它,除非为了使现有的库更具通用性,最简单的解决方案似乎是移动那些正则表达式。变量 - 在此之后,为此类目的使用缓冲区本地修改版本将是微不足道的。
编辑2:从Emacs 24.3开始(目前为release candidate),子词模式通过新的subword-forward-regexp
和subword-backward-regexp
变量实现了这一点(简单来说)修改),以及subword-forward-function
和subword-backward-function
变量(用于更复杂的修改)。
通过在乳胶模式下使用所需的值使这些正则表达式变量缓冲局部化,您可以直接使用子字模式。
答案 1 :(得分:2)
您应该能够使用语法文本属性来实现它:
M - : (info "(elisp) Syntax Properties")
RET
编辑:实际上,我不确定你是否可以做到这一点?
以下(仅仅是实验)很接近,但{2}的M-<backspace>
只会删除“beta”,而不会删除前面的“\”。
我想你可以将backward-kill-word
重新映射到一个检查前面“\”的函数并将其杀死。非常hacky,但如果没有更清洁的解决方案,它可能会成功。
之前我没有玩过这个功能;也许其他人可以澄清。
(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 "." ?\\)))))