3

私は長い間 python-mode を使用してきました。そして、私は常にサブワードモードを使用しています。しかし、subword-mode は python-mode で奇妙な動作をします。例えば、M-b動き。という名前の変数がありtest_varialbe、この変数の最後にカーソルを置くと、python-modeM-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-mode で式を入力すると、カーソルは の前のスペースにジャンプし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 に答える