Notepad++がレジストリに書き込みを行なうタイミング

最近Notepad++が熱いらしい。本当に熱いのかどうかは不明だが、取り敢えず「熱い」ということにしておく。

海外製のエディタなので日本語周りが微妙だったりするが、有志が日本語対応したNotepad++ EUC-JP対応版がある。ということで、最近EUC-JP対応版を試しに使っている。

実際のところ、プログラマ向けのテキストエディタとしては結構高機能で、IDEのエディタのような折りたたみ表示や自動入力補完も備えている。あと設定ファイルを作っておけばコールチップ*1も可能*2IDEのようにコンパイラ(もしくはコンパイラ並みにソースを解析する機能)を噛ませているツールならコールチップが使えることに納得できるのだが、まさかコンパイラ無しでやってしまうとはなぁ。

ところでNotepad++は基本的にレジストリを使用せず、XMLファイルに各種設定を保存しているのだが、ある操作をした場合のみ、レジストリに書き込みが発生する。

Notepad++のv4.9.2-4 +EUC-JP版とv5.0.3-3 +EUC-JP版に付属のソースを眺めて、実物の挙動を追った限り、大体次のような感じだ。

  • 「設定→環境設定」で環境設定ダイアログを表示した瞬間に、HKEY_CLASSES_ROOT直下に「Notepad++_file」というキーが作成され、その中にキーや値が設定される。
  • 「設定→環境設定→ファイルの関連付け」で拡張子を登録すると、HKEY_CLASSES_ROOT以下にその拡張子名でキーが作成され、デフォルトの値に「Notepad++_file」が設定される。既にその拡張子名のキーが存在する場合、キーのデフォルトの値が上書きされる。

どちらもファイルの関連付けでのみ使用する情報のようで、関連付けしない場合はレジストリからキーを削除してしまえばよい。というか関連付けしない場合は環境設定ダイアログを開いた時にキーが作成されるだけなのだが、逆に言えば環境設定ダイアログを開かない限りレジストリへの書込みは発生しない。一旦設定を作りこんでしまえば環境設定ダイアログを開くことはまずないので、レジストリへの書き込みを運用でカバーできる。

ちなみにソースからレジストリにアクセスしている部分を探した方法は、

D:\npp.5.0.3-2.src>grep -nr RegCreate .
./PowerEditor/src/MISC/RegExt/regExtDlg.cpp:259:        nRet = ::RegCreateKeyEx(HKEY_CLASSES_ROOT,
./PowerEditor/src/MISC/RegExt/regExtDlg.cpp:328:        nRet = ::RegCreateKeyEx(}}}

D:\npp.5.0.3-2.src>

もの凄く単純。

WikipediaのNotepad++の項目に曰く、

Scintillaと呼ばれるコンポーネントをベースにしており、Win32APIコールを用い、STLを利用したC++で記述されている。

ということらしいので、Win32 APIレジストリ操作APIの名前で全ソースにgrepをかけてみた。レジストリにアクセスするコードは環境設定ダイアログの部分にしかないようだ。

*1:(念の為補足しておくけど)関数入力時に戻り値や引数などの書式を表示する機能。

*2:作るのが面倒なんだけど、実際にコールチップが表示されるとちょっと便利。