我一直在使用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}}表现不同?
答案 0 :(得分:4)
原因是'_'的语法表定义存在差异。
在Python模式中,“_”的语法定义为“word”,而在其他情况下,它定义为“symbol”。看Elisp manual: Syntax tables
答案 1 :(得分:0)
另外:
掌握标识符,像'forward-word'这样的基本命令在单词语法上用“_”更有意义。 AFAIK Emacs不提供带符号的相应命令WRT。