html+-mode

Last modified: "2003/08/17 08:42:44"

Intro

html+-modeは, YAMAMOTO Taizo さんがつくられた, HTML 文書を書くためのメジャーモードです。 私は、これがないと HTML 文書が書けません。詳しい使い方は, shiroさんち をどーぞ。

ここには,とても番外編なものだけです。

Table of contents


いろいろ

*html+-use-html-kwd* 変更時の注意点

xyzzyでタグ打ってる人の数 → 400 403 よりほぼ全文引用させていただいてます。

Question

html+-mode を使うおうとして siteinit.l で

(in-package "editor")
(export 'html+-mode)
(autoload 'html+-mode "html+-mode" t)
(pushnew '("\\.html?$" . html+-mode) *auto-mode-alist* :test 'equal)
; (1)
(in-package "user")
(require "html+-mode")
(setq *html+-use-html-kwd* t) ; (2)

と書いておいて html+-mode を実行した時に、評価順序のせいか
*html+-tags-hash-list* が定義されていないというエラーが出ます。
(2)を(1)に書いておけば大丈夫でした。
autoload があるから大丈夫だと思ったんですが、
なぜエラーが出るんでしょうか?

Answer

あー、分かりました。
*html+-use-html-kwd*がライブラリのロードの前後で、値が変更された場合のことを想定していないからです。
html-kwdはライブラリのロード時にその関連の変数の初期化を行うので、
>>400のように値を変更すると、その関連の変数の初期化が行われていない状態で
関数html+-modeが呼び出されるので"*html+-tags-hash-list*が無い"とエラーが出ます。
申し訳ないですが(1)の位置に書いてください。

uplevel-tag の詳しい説明

xyzzyでタグ打ってる人の数 → 396-397 (おそらく山本さん)のを全文引用させていただいてます。

 uplevel-tagは、閉じタグの自動補完やそれっぽいタグを挿入する場合に、
条件に一致した直前のタグ情報を取得するために存在します。
例えば、ABCのAの位置にカーソルがある場合に、<ul>の情報を取得するために用います。 
 <html> 
   <body> 
     <ul> 
       <li>flksafjdlds</li> 
       <li>adlfkasjd</li> 
       <li>aldkdfjd</li> 
       ABC 
  
 呼出形式は以下のとおりです。条件として渡す引数は以下の二つです。
この二つに一致するタグを探します。 
 (uplevel-tag &optional same nobol) 
 same:  同じレベルのタグ場合を許すかどうか?許すならt 
 nobol: 行頭に無いタグを許すかどうか?許すならt 
  
 返り値は多値をとります。受ける時は、multiple-value-bindを使います。 
 (result position-of-tag name-of-tag) 
 result:          正常終了か?条件に一致するタグがあればt 
 position-of-tag: 条件に一致したタグの位置 
 name-of-tag:     条件に一致したタグの名前


 以下は具体例です。 
  
 例1:sameの役割 
  
 <html> 
   <body> 
     <ul> 
               <li>aldfjd</li> 
       ABC 
  
 ABCのAの位置のカーソルがある場合にuplevel-tagを評価すると... 
 (uplevel-tag nil) => (t "ul" ...) 
 (uplevel-tag t) => (t "li" ...) 
  
 例2:nobolの役割 
  
 <html> 
   <body> 
             <li> 
               <ul> 
               </ul><dl> 
               </dl> 
       ABC 
  
 ABCのAの位置のカーソルがある場合にuplevel-tagを評価すると... 
 (uplevel-tag t t) => (t "dl" ...) 
 (uplevel-tag t nil) => (t "ul" ...) 
  
 どうでしょうか?

これのことと思います。(html+-mode より)

; ひとつ上のタグを取り出す
; 同レベルのタグの場合でも中断可
; 1.	正常終了か?
; 2.	開始タグの位置
; 3.	開始タグの名前
(defun uplevel-tag (&optional same nobol)
  (save-excursion
    (while (scan-buffer *html+-tags-regexp*
                        :regexp t
                        :reverse t
                        :tail nil
                        :case-fold t
                        :no-dup t)
      (cond ((parse-point-syntax))
            ((match-string 1)
             (let ((pntB (point)))
               (multiple-value-bind (rtn pntA tagA pntZ tagZ)
                   (match-tag (compile-tags-regexp (list (match-string 2))))
                 (unless (and rtn pntA)
                   (return-from uplevel-tag (values nil nil nil nil nil)))
                 (goto-char pntA)
                 (if (and same (or nobol (bol-white-p)))
                     (return-from uplevel-tag (values nil pntA tagA pntB tagA))))))
            ((match-string 2)
             (return-from uplevel-tag
               (values t (match-beginning 0) (match-string 2) nil nil)))))))


(^_^)