Emacs - 子词正则表达式澄清

时间:2014-03-01 21:17:22

标签: regex emacs elisp

我正在尝试更改子字模式命令(subword-forward,subword-backward等)停止的位置。

我注意到subword.el为前向和后向匹配提供了正则表达式,我一直在试图在添加更多子字分隔符方面取得一些进展。

我真正想要的是对子词正则表达式的确切运作方式进行一些澄清,就确切匹配的内容而言,以便我可以将其更改为包含我想要停止的字符。我对正则表达式有基本的了解并且之前使用过它们,但是从来没有像subword.el那样大。

我也不一定需要帮助这两个正则表达式。任何有关在现有正则表达式中添加其他分隔符的指导都会受到同样的赞赏,因为这是我改变它们的目标,但我真的想知道如何设置正则表达式。

最后,在搜索解决方案时,我找到了this related StackOverflow question。我读完了,但是subword.el不包含正则表达式本身,因为它看起来出现在相关问题的引用部分中,我不明白该引用部分中最后一个括号语句的含义。

修改

为了尝试在更清晰的上下文中放置我想做的事情,我只想让Emacs中的 Ctrl + Left / Right (subword-forward / backward)与Eclipse紧密相关可能的,因为我希望光标移动类似,一旦到达就停止在 Ctrl + Left / Right 的行的末尾和行的开头。

Here is another related StackOverflow question。 “毒蛇”命令更接近我要求的,但略微偏离,因为我希望该点在该行的末尾停止,然后继续下一个。

1 个答案:

答案 0 :(得分:3)

  1. 您上一段中问题的答案包含在同一链接页面上的其他答案中:(modify-syntax-entry ?\\ "w")。这使反斜杠成为一个单词构成字符,因此单词函数将其视为单词的一部分。

  2. 请指定您尝试实施的行为 ,尤其是“添加更多子词分隔符。的含义。” “

  3. subword.el中的正则表达式相当简单。你说你不需要帮助理解这些正则表达式。但那你问“究竟如何构造子词正则表达式”是什么意思?它们很可能是手工制作的(基于你已经了解的各个部分)。

  4. 猜测,因为到目前为止您的描述还不清楚,所有您要查找的是将一些其他字符指定为<​​strong>非单词语法。如果你的意思是“添加更多的子词分隔符”那么就这样做。例如,如果您希望char a是非单词字符,那么执行以下操作:

      

    (modify-syntax-entry?a“。”);或者另一个非词组成语法类(这使用标点符号)

    这使得a成为标点字符而不是单词构成字符。如果你想要一些其他语法类而不是标点符号,那么请选择它。


  5. 评论后更新

    例如,如果您希望任何标点符号语法与大写字母相同,则可以执行此操作:

    (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'.")
    

    如果这仍然不是你想要的,那么试着解释你想要的更好一点。例如,你没有给出一个例子 - 既不是积极的(应该停在这里)也不是消极的(不应该停在这里)。你让那些试图帮助你猜测的人比他们应该做的更多,这是无效的。