为什么re-search-backward在python-mode中给出不同的结果?

时间:2012-11-13 01:06:00

标签: emacs elisp

我一直在使用python-mode很长一段时间。我总是使用subword-mode。但是subword-mode在python-mode中表现得很奇怪。例如,M-b运动。如果有一个名为test_varialbe的变量并且我把光标放在这个变量的末尾,那么在python-mode M-b中会使光标指向t,而在其他模式下它会变为v(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)))

所以我查看了subword-mode的源代码并找到了以下函数:

re-search-backward

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

这是为什么?是什么导致{{1}}表现不同?

2 个答案:

答案 0 :(得分:4)

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

在Python模式中,“_”的语法定义为“word”,而在其他情况下,它定义为“symbol”。看Elisp manual: Syntax tables

答案 1 :(得分:0)

另外:

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