[xyzzy:07889] Re: xyzzy 内部でのキーワード判定の方法について
- Subject: [xyzzy:07889] Re: xyzzy 内部でのキーワード判定の方法について
- From: KAMEI Tetsuya <kamei@xxxxxxxxxxxx>
- X-mailer: KaMail-0.0.2.5 (ITS / PDP-10s)
- X-yzzy-version: 0.2.2.220
大久保さん、こんにちは。
2001年12月14日(金)[19:14:47]の、
[xyzzy:07888] xyzzy 内部でのキーワード判定の方法について
への返事です。
| 1. 正規表現でない普通のキーワードをあるコンテキストの範囲で検索する
| 際、xyzzy ではどのようにキーワードを検索しているのでしょうか。
| lisp-mode 等ではうまくキーワードを切り出せているのですが、
| html-mode や html+-mode (等 tag のあるモード?) でうまくキーワー
| ドが切り出せていません。
|
| 「キーワード文字列の前後に境界となる正規表現をいれて検索する」と
| いった単純な方法では xyzzy と同じ動作キーワードを切り出すことは出
| 来ないのでしょうか。
うーん、どうでしょう? それでできるかどうかは分かりませ
ん。xyzzy では、バッファ中のキーワードになり得る文字列
すべてでハッシュテーブルを引いて、当たったらキーワード
であると認識しています。具体的には、ある位置が文字列・
コメントの内部でない場合に、正規表現
\(\s@\|\s{\|\s\\\)?\(\sw\|\s_\)+
にマッチする文字列が存在すれば、その文字列でハッシュテ
ーブルを見にいきます。それがキーワードかどうかにかかわ
らず、次のキーワードは (match-end 0) から検索されます。
基本的にはこれだけですが、いくつか例外があって、
・変数 html-highlight-mode が non-nil なら、タグの内部
である場合のみ。
・マッチした先頭の文字が syntax-symbol-prefix-p である
場合は、(1+ (match-beginning 0)) から始まる文字列でハ
ッシュテーブルを見て、ハイライトする範囲も
(1+ (match-beginning 0)) から。
・(logand (get-syntax-option (syntax-table)) *syntax-option-c-preprocessor*)
が 0 でなければ、#[ \t]*\(\sw\|\s_\)+ にマッチする文字
列の (concat "#" (match-string 1)) でハッシュテーブル
を見て、(match-beginning 0) からハイライトする。
という条件もあります。
| 2. html-mode, html+-mode は set-syntax-start-multi-comment
| set-syntax-end-multi-comment されていないのですが、どのようにし
| てコンテキストがコメントかどうかを xyzzy は判定しているのでしょうか。
変数 html-highlight-mode が non-nil の場合は、HTML 専
用のルーチンで、下記の状態遷移表にしたがって判定してい
ます。
状態 \ 文字列 | < > " --
--------------------+--------------------------------
normal | tag
tag | normal string comment
string | tag
comment | tag
--
亀井哲弥(KAMEI Tetsuya)
kamei@xxxxxxxxxxxx