3

我已经使用 python-mode 很长时间了。而且我总是使用子词模式。但是 subword-mode 在 python-mode 中表现得很奇怪。例如,M-b运动。如果有一个名为的变量test_varialbe,并且我将光标放在该变量的末尾,则在 python 模式下M-b会使光标指向,t而在其他模式下它将转到v.

于是我查看了subword-mode的源码,发现如下函数:

(defun subword-backward-internal ()
  (if (save-excursion
        (let ((case-fold-search nil))
          (re-search-backward
           (concat
            "\\(\\(\\W\\|[[:lower:][:digit:]]\\)\\([[:upper:]]+\\W*\\)"
            "\\|\\W\\w+\\)")
           nil t)))
      (goto-char
       (cond
        ((and (match-end 3)
              (< 1 (- (match-end 3) (match-beginning 3)))
              (not (eq (point) (match-end 3))))
         (1- (match-end 3)))
        (t
         (1+ (match-beginning 0)))))
    (backward-word 1)))

经过一些测试,我发现re-search-backward在不同的模式下给出不同的结果。如果我在python模式下eval-expression的表达式,光标会跳转到之前的空格,而在其他模式下它会跳转到。(let ...)test_varialbe-

为什么是这样?是什么导致re-search-backward行为不同?

4

2 回答 2

4

原因是'_'的语法表定义存在差异。

在 Python 模式下,'_' 的语法定义为“word”,而在其他情况下,它被定义为“symbol”。查看Elisp 手册:语法表

于 2012-11-13T02:05:33.493 回答
0

此外:

掌握标识符,像'forward-word'这样的基本命令在单词语法上使用“_”更有意义。AFAIK Emacs 不提供带有符号的相应命令 WRT。

于 2012-11-13T15:24:17.013 回答