Emacsでアンダーバーをスキップさせる

2019-08-25

Emacsで単語を飛ばして進めたいときにM-fを入力するが、アンダーバー_を含んでいるとそこで止まってしまう。 ほとんどのプログラミング言語では変数名にアンダーバーを含めることができてひとつの単語としてスキップしたいのに、アンダーバーを含んでいる個数によってM-fを押す回数を見極める必要があって、非常に使いづらい。

そこでアンダーバーも単語の文字として認識させるようにしてみた。

結論

(defun my-syntax-table ()
(modify-syntax-entry ?_ "w"))
(add-hook 'prog-mode-hook 'my-syntax-table)

以下は調べた履歴↓

機能の調べ方

まずはキーに対応する処理を調べる。 M-xを押してミニバッファに移動してdescribe-bindingsと入力してreturnするとキーに割り当てられている処理が列挙される:

...
M-f forward-word

forward-word

forward-word が何をするのか知りたい。 ググって出てくるマニュアルで、機能は分かるが、どうやっているのかはわからない (単語境界を制御するにはSyntax Tablesを見ろと書いてある)。

ソースを調べてみると、Cで書かれているぽい。 それっぽいところを追っていく:

find-word-boundary-function-tableでググるとマニュアルが出てくる:

シンタックステーブルの変更方法

さらにググっていくとまさにな質問と解答をみつけた: Treat symbols as words in prog modes - Emacs Stack Exchange これによると、superword-modeを使うか、modify-syntax-entryを使えばよいらしい。 superword-modeは他にどういう挙動が設定されるのかわかってないので、できればmodify-syntaxを使うことにしたい。

最終的に千夜ノ: Emacs Syntax Table の変更に行き着いた。 prog-mode-hookに対して設定すれば、いろいろなプログラミング言語用のモードで同様に動作させることができる。

これで望み通りにアンダーバーを含んだものも1単語として扱われ、M-fでスキップされるようになった。

他に参考になりそうなページ