[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:07889] Re: xyzzy 内部でのキーワード判定の方法について



大久保さん、こんにちは。

	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

Index Home