Oniguruma 5.8.0 の ONIG_SYNTAX_PERL(_NG) に問題発見。ONIG_SYNTAX_PERL(_NG) では、オプションとして ONIG_OPTION_SINGLELINE が指定されているが、このオプションの意味は、ドキュメントには、
'^' -> '\A', '$' -> '\z', '\Z' -> '\z'
と書かれている。しかし、ソースを見ると、
'^' -> '\A', '$' -> '\z'
となっている模様。しかし Perl に合わせるなら、
'^' -> '\A', '$' -> '\Z'
とならなければならない。
作者に問い合わせたところ、次のリリースで修正するが、リリース予定が未定のため、自分で直して使ってほしいとのこと。以前指摘があった bregonig.dll の $ のバグはこれが原因だったようだ。(自分が一番良く使っている K2Editor では、マルチラインモードで動いているため問題とはならなかったようで、原因もすぐには分かりそうになかったので放置していた。) bregonig.dll の修正版は Ver.1.31, Ver.2.00 beta2 として公開予定。
ところで、ONIG_OPTION_SINGLELINE は Perl 以外の言語でも、'$' -> '\Z' でいいのだろうか?
Bregexp.dll には、いくつかバグが見つかっている。まとめてみた。
3. と 4. は、bregonig.dll を開発中に自分が発見したものである。上記の4点の修正を統合したパッチを置いておく。(bregexp-1.03.diff) (Win32 用の Makefile と def ファイル付き) オリジナル版に対するパッチなので、Bregexp.dll for SAKURA や K2Regexp.dll にそのまま適用することはできないが、簡単な修正なので手動で当てても問題ないだろう。
Bregexp.dll には他に、パターンによってはスタックオーバーフローで落ちるという問題もあるが、「サクラエディタ開発掲示板」では現在対応策が検討されている。
Oniguruma 5.8.0 で ONIG_SYNTAX_RUBY と ONIG_SYNTAX_PERL_NG の差異を調べてみた。
ONIG_SYNTAX_RUBY にのみ指定されているフラグは以下の通り。
ONIG_SYN_OP2_OPTION_RUBY /* (?imx), (?-imx) */ ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT /* ?+,*+,++ */ ONIG_SYN_OP2_CCLASS_SET_OP /* [...&&..[..]..] */ ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL /* \C-x */ ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META /* \M-x */ ONIG_SYN_OP2_ESC_V_VTAB /* \v as VTAB */ ONIG_SYN_OP2_ESC_H_XDIGIT /* \h, \H */ ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV /* {,n} => {0,n} */ ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND /* (?<=a|bc) */ ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY /* a{n}?=(?:a{n})? */ ONIG_SYN_WARN_CC_OP_NOT_ESCAPED /* [,-,] */ ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT /* (?:a*)+ */
ONIG_SYNTAX_PERL_NG にのみ指定されているフラグは以下の通り。
ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE /* \Q...\E */ ONIG_SYN_OP2_OPTION_PERL /* (?imsx),(?-imsx) */ ONIG_OPTION_SINGLELINE /* '^' -> '\A', '$' -> '\z', '\Z' -> '\z' */
利便性を考えて、bregonig.dll の次の版 (Ver.1.30) では、ONIG_SYNTAX_PERL_NG に加えて、ONIG_SYN_OP2_CCLASS_SET_OP, ONIG_SYN_OP2_ESC_V_VTAB, ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND を指定しておこうと考えている。さらに ONIG_SYN_OP2_ESC_H_XDIGIT, ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV も指定すべきか迷っている。ただ、bregonig.dll の元となった Bregexp.dll はあくまで Perl 互換ということを考えると、何でもかんでも付け加えるのは考え物ではある。
Ctrl は、A の左にあるべき。しかし、以前の方法で Ctrl と Caps を完全に入れ替えてしまうと、他人が自分の PC を使ったときに混乱する。Caps を Ctrl に変更し、元の Ctrl は Ctrl のまま残しておくのが混乱が少なくて良さそうである。Caps が無くなってしまうが、まあどうせ使わないし仕方あるまい。
Esc と [半角/全角] の入れ替えはどうするかという問題があるが、とりあえず入れ替えてしまおう。
設定は以下のようになる。
REGEDIT4 [HKEY_CURRENT_USER\Keyboard Layout] "Scancode Map"=hex:00,00,00,00,00,00,00,00,04,00,00,00,1d,00,3a,00,01,00,29,00,\ 29,00,01,00,00,00,00,00
最初の 8bytes は 0 固定。次の 4bytes は変換データペアの個数(末尾の 0 を含む)。次は、変換後のキーコード 2bytes、変換前のキーコード 2bytes をペアにして列挙。末尾の 4bytes は 0 固定。
8年ぶりに LFN library のソースを眺めていたら、バグがあることに気付いた。_expand.c と lfnexpnd.c の _expand() 内で、エラーで関数を抜ける際に、_dos_lfn_findclose() を実行するのを忘れていた。しかし、自分自身もはや LSI-C はほとんど使っていないし、わざわざ修正版を出すのも面倒だ。
springm.dll に、ワイルドカードの処理を追加しようと思い、参考にしようと見ていて気付いた。
Migemo で sa と入力すると、なぜか O が検索に引っかかる。辞書 (migemo-dict) を調べてみると、さんそ という読みで O が登録されており、これが原因だった。他にも読みと綴りが違う元素記号として、H, B, C, N, P, S, I, W などが登録されていた。ファイル名の検索には邪魔なので、1文字の元素記号は辞書から削除することにした。正規表現で \t[A-Z](?=\s) で検索して削除。
Migemo で入力の文字数が少ないと正規表現の生成に時間が掛かる。特に c, k, s, t などは候補が多いために遅い。入力が1文字の場合は、少し待って新たな文字入力が無ければ正規表現を生成するようにしたほうが良いだろうか。
半日掛けて、SpringM で C/Migemo を使えるようにしてみた。こいつは便利だ。漢字を含むファイル名でも、一瞬で見つけ出すことが可能になった。
メモリ食いなのが問題。辞書の内容にもよるが 15MB ぐらいはメモリを消費する。現在は、一度、'/' キーで C/Migemo を起動したら、SpringM を終了させるまで、そのままメモリに居座るようになっている。そのようにしているのは、毎回メモリを解放してしまうと C/Migemo の起動が遅くなってしまうからである。しかしそのせいで、辞書を変更しても、SpringM を再起動しないと変更が反映されないという問題もある。
Vista で Cygwin の patch.exe を bash 上で実行しようとしたら、access denied などと表示されてしまった。コマンドプロンプトから patch.exe を実行したら、UAC の昇格ダイアログが出た。OS に、インストーラの類だと判断されてしまったようだ。
昇格しないようにするためには、manifest を用意しないといけない。本当はファイルのプロパティで昇格しないように設定できると良いのだが、管理者権限で起動するようにするための設定はあっても、逆に一般権限で起動するようにする設定はない。実に中途半端だ。
次のような内容のファイルを用意して、c:\cygwin\bin\patch.exe.manifest というファイル名で保存したところ、無事に一般権限で起動するようになった。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="*" type="win32" /> <description></description> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" /> </requestedPrivileges> </security> </trustInfo> </assembly>
patch を実行したところ、パッチ適用後のファイルが読めなくなってしまった。ファイルのアクセス権が変なことになっていた。ファイルのプロパティからアクセス権を設定しなおして無事読めるようになった。しかし、なぜこうなったのかが分からない。
WM_KEYDOWN と WM_CHAR の扱いを今までよく理解していなかったことに気付いた。WM_KEYDOWN がウィンドウプロシージャに届いたときには、既に TranslateMessage() でメッセージの変換が行われて、WM_CHAR はメッセージキューに入っているとのこと。今まで、DefWindowProc() に処理を渡さなければ、WM_CHAR には変換されないものだと勘違いしていた。(参考:仮想入力キュー)
SpringM にインクリメンタルサーチ機能を付けてみた。まだ作りかけの段階ではあるが、これは便利だ。ファイル操作が劇的に向上しそうな予感。今までは、ファイル名の先頭1文字での検索はできたが、先頭の文字が同じファイルが多数ある場合にはあまり役に立たなかった。
とりあえず、検索開始のキーは / に固定。less, vi, FireFox などで、/ が検索開始キーとなっているので、それらを参考にした。
先月の spam メールの集計結果。着信拒否にならなかった spam が少なくとも 1788通。そのうち、@nifty の迷惑メールフォルダーでも Spam Mail Killer でも spam として認識できなかったものは 0通。