Emacs 将字符定义为单词边界

Emacs 将字符定义为单词边界,emacs,syntax,Emacs,Syntax,我已经将\字符定义为latex模式下的单词成分,我对结果非常满意。唯一困扰我的是像\alpha\beta这样的序列会被视为一个单词(当然,这是预期的行为) 有没有办法让emacs将一个特定的字符解释为一个单词“starter”?这样,它将始终被视为它后面的单词的一部分,而不是它前面的单词的一部分 为清楚起见,以下是一个示例: \alpha\beta ^ ^ 1 2 如果点位于1并且我按M-d,则字符串“\alpha”应被终止。 如果该点位于2且我按下M-,则

我已经将
\
字符定义为latex模式下的单词成分,我对结果非常满意。唯一困扰我的是像
\alpha\beta
这样的序列会被视为一个单词(当然,这是预期的行为)

有没有办法让emacs将一个特定的字符解释为一个单词“starter”?这样,它将始终被视为它后面的单词的一部分,而不是它前面的单词的一部分

为清楚起见,以下是一个示例:

\alpha\beta
^          ^
1          2
如果点位于
1
并且我按
M-d
,则字符串“\alpha”应被终止。 如果该点位于
2
且我按下
M-
,则字符串“\beta”应被终止


如何实现这一点?

您应该能够使用语法文本属性实现这一点:

M-:
(info”(elisp)语法属性“
RET

编辑:事实上,我不确定你是否能做到这一点

下面的内容(只是实验)很接近,但是第2行的
M-
将只删除“beta”,而不删除前面的“\”

我想您可以将
向后kill word
重新映射到一个函数,该函数检查前面的“\”并将其也删除。相当骇人,但如果没有更干净的解决方案,它可能会奏效

我以前没有玩过这个功能;也许其他人可以澄清

(修改语法条目?\\\“w”)
(setq解析sexp查找属性t)
(setq语法属性化函数“我的属性化语法”)
(取消我的属性语法(开始-结束)
“设置自定义语法属性。”
(省去远足
(转到字符开始)
(同时(向前搜索“\\w\\\”结束t)
(放置文本属性)
(1-(点))(点)“语法表(cons”。“\ \”))))
另一个想法:
您的要求非常类似于
子字模式
为camelCase提供的要求

您不能自定义子字模式的行为——regexp是硬编码的——但您当然可以复制该库并根据需要修改它

M-x
find library
RET
subword
RET

这大概是一个相当稳健的解决方案

编辑:根据评论更新,建议如下:


作为记录,在subword.el内的函数
子词前向内部
子词后向内部
中将
[[:upper:]]
的每个实例更改为
[\\\\\[:upper:]]
(只要“\”被定义为“w”语法,效果就很好)

就我个人而言,我更倾向于复制图书馆而不是直接编辑它,除非为了使现有图书馆更具通用性,对于这种情况,最简单的解决方案似乎是将这些regexp移动到变量中——之后,为了这种目的而修改缓冲区本地版本将变得微不足道

编辑2:自Emacs 24.3(当前为a)起,子字模式通过新的
子字前向regexp
子字后向regexp
变量(用于简单修改)和
子字前向函数
子字后向函数
变量(用于更复杂的修改)来促进这一点


通过使这些regexp变量在latex模式下具有所需的值,您可以直接使用子字模式。

是的,我一直想知道子字模式是否有帮助。我将检查regexp。实际上,如果设法将``视为大写,子字模式将为我完成其余的工作。我认为这是在语法属性中配置的,但我还不确定。这主意不错,但在我看来,如果不指定小写变量,就不能使用大写字符?(我正在查看
(elisp)字符串和字符下的
大小写表
大小写转换
,以及
[:upper:][/code>和
[:lower:][/code>字符类
中的定义,将
[:upper:][]
在函数中
子单词前向内部
子单词后向内部
在subword.el中非常有效=)(只要“\”被定义为“w”语法)。我仍然希望找到一种使用语法属性的方法(这样我就不必每次更新subword.el时都重复它),但现在如果你更新它,我会接受你的答案。