我正在尝试更改子字模式命令(子字向前、子字向后等)停止的位置。
我注意到 subword.el 提供了用于向前和向后匹配的正则表达式,并且我一直在尝试使用它们来在添加更多子词分隔符方面取得一些进展。
我真正想要的是关于子词正则表达式到底如何工作的一些澄清,就到底匹配的内容而言,这样我就可以更改它以包含我想要停止的字符。我对正则表达式有基本的了解,以前也用过它们,但从来没有像 subword.el 中的那样大。
我不一定也需要两个正则表达式的帮助。任何有关向现有正则表达式之一添加额外分隔符的指导都将同样受到赞赏,因为这是我更改它们的目标,但我真的很想了解一些关于正则表达式是如何设置的。
最后,在寻找解决方案时,我发现了this related StackOverflow question 。我读了一遍,但 subword.el 不包含正则表达式本身,因为它看起来出现在相关问题的引用部分中,而且我不明白该引用部分中最后一个括号语句的含义。
编辑:
为了尝试将我想要做的事情放在更清晰的上下文中,我只希望 Emacs 中的 Ctrl+Left/Right (子字向前/向后)能够像 Eclipse 一样工作可能,因为我希望光标以类似的方式移动,一旦到达,就用 Ctrl+Left/Right 停在行的末尾和开头。
Here is another related StackOverflow question 。 “viper”命令更接近我正在寻找的内容,但略有偏差,因为我希望该点在继续下一行之前停在该行的末尾。
最佳答案
最后一段中问题的答案包含在同一链接页面上的另一个答案中:
(modify-syntax-entry ?\\"w")
。这使得反斜杠成为单词组成字符,因此单词函数将其视为单词的一部分。请指定您尝试实现的行为,特别是“添加更多子词分隔符”的含义。 ”
subword.el
中的正则表达式相当简单。您说您不需要帮助理解这些正则表达式。但是,你问“子字正则表达式到底是如何构造的”是什么意思呢?它们很可能是手工构建的(基于您已经了解的各个部分的用途)。由于到目前为止我还不清楚您的描述,因此您的猜测是,您所寻找的只是将一些附加字符指定为具有非单词语法。如果这就是您所说的“添加更多子词分隔符”的意思,那么就这样做。例如,如果您希望 char
a
成为非单词字符,则执行如下操作:(modify-syntax-entry ?a ".") ; Or another nonword-constituent syntax class (this uses punctuation)
这使得
a
成为标点符号而不是单词组成字符。如果您想要标点符号之外的其他语法类,请类似地选择它。
评论后更新
例如,如果您希望任何标点符号语法与大写字母相同,则可以这样做:
(defvar subword-forward-regexp
"\\W*\\(\\(\\([[:upper:]]\\|\\s.\\)*\\(\\W\\)?\\)[[:lower:][:digit:]]*\\)"
"Regexp used by `subword-forward-internal'.")
(defvar subword-backward-regexp
"\\(\\(\\W\\|[[:lower:][:digit:]]\\)\\(\\([[:upper:]]\\|\\s.\\)+\\W*\\)\\|\\W\\w+\\)"
"Regexp used by `subword-backward-internal'.")
或者,如果您只想 ,
起到与大写字母相同的作用,则可以这样做:
(defvar subword-forward-regexp
"\\W*\\(\\([,[:upper:]]*\\(\\W\\)?\\)[[:lower:][:digit:]]*\\)"
"Regexp used by `subword-forward-internal'.")
(defvar subword-backward-regexp
"\\(\\(\\W\\|[[:lower:][:digit:]]\\)\\([,[:upper:]]+\\W*\\)\\|\\W\\w+\\)"
"Regexp used by `subword-backward-internal'.")
如果这仍然不是您想要的,请尝试更好地解释您想要什么。例如,你没有给出一个例子——既不是积极的(应该停在这里)也不是消极的(不应该停在这里)。你让那些试图帮助你猜测的人超出了他们应该猜测的范围,这是没有效率的。
关于regex - Emacs - Subword 正则表达式说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22120496/