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

[debian-devel:10467] Re: Bug#46016: 50yasgml.el code uses `make-variable-buffer-local' and breaks `outline-level' variable



佐野@浜松です。

 Debian に持っていった yasgml ですが、
以下の Bug Report (Important) が届きました。

In <199909260329.XAA10989@xxxxxxxxxxxxxxx>,
 at Sat, 25 Sep 1999 23:29:30 -0400,
 on Bug#46016: 50yasgml.el code uses `make-variable-buffer-local' 
                and breaks `outline-level' variable,
  Matthew Swift <swift@xxxxxxxxxxxx> さん writes:

swift> Package: yasgml
swift> Version: 1.5-3
swift> Severity: important
swift> 
swift> 50yasgml.el contains the declaration:
swift> 
swift>   (make-variable-buffer-local 'outline-level)

 これは /etc/emacs/site-start.d/50yasgml.el ですね。
パッケージのソースで言うと debian/yasgml-init.el になります。

swift> This is a bug.  Doing this binds the variable and sets it to the value nil.
swift> The ooutline (outline) package uses `defvar' (`defcustom') to declare the
swift> variable.  If the variable is already bound, its value is not changed.  The
swift> result is that whenloading 50yasgml.el, `outline-level' defaults to nil (which
swift> causes errors) rather than the proper default defined in the (o)outline
swift> package.

「これはバグです。これを実行すると変数を bind してその値を nil に設定します。
 ooutline (outline) パッケージは `defvar' (`defcustom') を使用して同じ変数を
宣言しています。この変数が既に bind されていると、その変数の値は変更されません。
つまり、 50yasgml.el をロードすると、`outline-level` のデフォルト値は
 (o)outline パッケージの中で定義されている適切なデフォルト値ではなく、
 nil に設定され、エラーの原因になります。」

 ooutline.el は /usr/share/emacs/20.3/lisp/textmodes/ooutline.el のこと
だと思います。ここには

    ;;; Commentary:

    ;; This package is a major mode for editing outline-format documents.
    ;; An outline can be `abstracted' to show headers at any given level,
    ;; with all stuff below hidden.  See the Emacs manual for details.

    ;;; Code:

    ;; Jan '86, Some new features added by Peter Desnoyers and rewritten by RMS.

    (defgroup outlines nil
      "Support for hierarchical outlining"
      :prefix "outline-"
      :group 'editing)

    (defcustom outline-regexp nil
      "*Regular expression to match the beginning of a heading.
    Any line whose beginning matches this regexp is considered to start a heading.
    The recommended way to set this is with a Local Variables: list
    in the file it applies to.  See also outline-heading-end-regexp."
      :type '(choice regexp (const nil))
      :group 'outlines)

    ;; Can't initialize this in the defvar above -- some major modes have
    ;; already assigned a local value to it.
    (or (default-value 'outline-regexp)
        (setq-default outline-regexp "[*\^L]+"))

(snip)

    (defvar outline-level 'outline-level
      "Function of no args to compute a header's nesting level in an outline.
    It can assume point is at the beginning of a header line.")

    ;; This used to count columns rather than characters, but that made ^L
    ;; appear to be at level 2 instead of 1.  Columns would be better for
    ;; tab handling, but the default regexp doesn't use tabs, and anyone
    ;; who changes the regexp can also redefine the outline-level variable
    ;; as appropriate.

    (defun outline-level ()
      "Return the depth to which a statement is nested in the outline.
    Point must be at the beginning of a header line.  This is actually
    the number of characters that `outline-regexp' matches."
      (save-excursion
        (looking-at outline-regexp)
        (- (match-end 0) (match-beginning 0))))

と書かれています。 emacs 用の lisp パッケージが emacs 本体と
一緒に供給されている lisp パッケージと衝突するのはマズイですよね。

swift> I can't suggest a fix because I haven't determined why yasgml wants to make the
swift> variable buffer-local.  In any case it should not be declared buffer-local
swift> until after a sensible default value is provided.

「何故 yasgml が buffer-local という変数を使おうとするのか、理解できていないので
私には対処法を提案することはできません。いずれにせよ、意味のあるデフォルト値が
与えられなければ、 buffer-local 変数を (/etc/emacs/site-start.d/50yasgml.el の中で) 
宣言するべきではないと思います。」

swift> 50yasgml.el also contains the declaration:

「50yasgml.el には以下の宣言もあります」

swift>   (make-variable-buffer-local 'outline-regexp)
swift> 
swift> This is OK because the default value of `outline-regexp' just happens to be
swift> nil.  But it seems like bad style to depend on this coincidence.

「これは、偶然 `outline-regexp' のデフォルトがたまたま nil なので、
問題はありません。しかし、この偶然の一致に依存するのは良いスタイルでは
無いと思います。」

swift> -- System Information
swift> Debian Release: potato
swift> Architecture: i386
swift> Kernel: Linux aleph 2.0.36 #1 Fri Jan 15 18:12:05 EST 1999 i586
swift> 
swift> Versions of packages yasgml depends on:
swift> ii  emacs20 [emacsen]             20.3-11    The GNU Emacs editor.             
swift> ii  yatex                         1.67-4     Yet Another LaTeX mode            

私もちょっとコードを眺めてみたのですが、

 grep outline /usr/share/emacs/site-lisp/yasgml/*

を実行しても何も出てこないみたいですね。 yatex のほうでは

yatexm-o.el:;;; Sample startup file to invoke yatex-mode with outline-minor mode.
yatexm-o.el:;; outline-minor-mode(使用しない場合は不要です)
yatexm-o.el:(autoload 'outline-minor-mode "min-out" t)
yatexm-o.el:(make-variable-buffer-local 'outline-prefix-char)
yatexm-o.el:(make-variable-buffer-local 'outline-regexp)
yatexm-o.el:(setq  default-outline-regexp "[*\^l]+")
yatexm-o.el:(make-variable-buffer-local 'outline-level-function)
yatexm-o.el:(setq-default outline-level-function 'outline-level-default)
yatexm-o.el:(setq LaTeX-outline-regexp
yatexm-o.el:     (setq outline-regexp LaTeX-outline-regexp)                        ;;@
yatexm-o.el:     (outline-minor-mode 1)                                     ;;@
yatexm-o.el:     (setq-default outline-prefix-char (concat YaTeX-prefix "\C-o"));;@
yatexm-o.el:     ;(define-key outline-minor-keymap "\C-?" 'hide-subtree)           ;;@
yatexm-o.el:     ;;Emacs 付属の outline.el の場合これ↓
yatexm-o.el:     (define-key outline-mode-prefix-map "\C-?" 'hide-subtree)

というのがあるんですが。西本さんが yasgml の初期化で

50yasgml.el:(make-variable-buffer-local 'outline-level)
50yasgml.el:(make-variable-buffer-local 'outline-regexp)

50yasgml.el- 'yasgml-mode-hook
50yasgml.el- (function
50yasgml.el-  (lambda ()
50yasgml.el:    (setq outline-regexp "[ \t]*<\\(sect\\|sect1\\|sect2\\|sect3\\|sect4\\)>")
50yasgml.el:    (outline-minor-mode t)
50yasgml.el:    (setq outline-level 'sgml-outline-level)
50yasgml.el-    )))

50yasgml.el:(defun sgml-outline-level ()
50yasgml.el-  (save-excursion
50yasgml.el:    (looking-at outline-regexp)
50yasgml.el-    (let ((title (buffer-substring (match-beginning 1) (match-end 1))))
50yasgml.el-      (cond ((equal title "sect") 1)
50yasgml.el-            ((equal title "sect1") 2)
50yasgml.el-            ((equal title "sect2") 3)
50yasgml.el-            ((equal title "sect3") 4)
50yasgml.el-            ((equal title "sect4") 5)
50yasgml.el-           ))))

50yasgml.el-(mapcar 'byte-compile
50yasgml.el:        '(sgml-outline-level))

と指定されているのはどういう理由からでしたっけ ?

もともとの yasgml.el 本体には

   ;;-->.emacs の設定します。
   ;;  -->(setq auto-mode-alist
   ;;       (nconc
   ;;         '(("\\.sgml$" . yasgml-mode)) auto-mode-alist))
   ;;     (autoload 'yasgml-mode "yasgml" "Major mode for editing files of SGML." t)
   ;;     の2行を .emacs に加えます。

だけしか書かれていなかったし、それでちゃんと動いていたように
思うので、

   ;;; sgml-mode
   ;set [sgml-mode] into yasgml-mode
   (autoload 'yasgml-mode "yasgml" "Major mode for editing files of SGML." t)

   ;;; user should provide the proper value to this variable
   ;(setq yasgml-author "Takashi Nishimoto (g96p0935@xxxxxxxxxxxxxxxx)")

   ;;; this enables warning sound but does not prohibit the input of specials
   (setq yasgml-special-characters-input-method 'bell)

   ;;; use yasgml if the extention of the file is ".sgml"
   (setq auto-mode-alist
     (nconc '(("\\.sgml$" . yasgml-mode)) auto-mode-alist))

これだけでも良いような気がするんですが。

試しにこれ以外の行を全部コメントアウトしたパッケージを作って
動かしてみましたが、特に動作に異常は感じませんでした。

西本さんもお忙しいでしょうけれど、できれば直接で良いですから返事をください。

そういえば yasgml.el 本体のコメントも英訳したものを付けておいたほうが
「日本語わからん」な人には親切かもしれないと思いました。今度 try してみる
つもりですが、もし西本さんのほうで既にあるようでしたら送ってもらえませんか ?

それと、現状では yasgml は linuxdoc DTD 専用 (だと思った) ですが、
 docbook DTD への対応予定はありますか ?

以上、よろしくお願いします。なお、emacs lisp について他の人からの
コメントも期待したいので、このメールは debian-devel@debian.or.jp にも
 cc: してあります。では。

--
     # 11/13 に何かが起きる? > "http://www.szlug.factory.to";
     # (わたしのおうちは浜松市、「夜のお菓子」で有名さ。)
    <xlj06203@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)