enparam.l

ファイルの頭に書いてある

# -*- spam: hoge -*-

みたいなのをバッファローカルな変数に入れてくれるものらしい、というので使ってみた。

サンプルをコピペして開くと「不正なデータ型です: #: symbol」とか怒られる。そのまま再起動するとバッファバーとかが出てこない。
んで files.l を見てみたり *auto-mode-parameter-alist* を触ってみたりしたら、どうやら *auto-mode-parameter-alist* に ("hoge" . fuga) がいくつかあって、ファイルの頭に -*- hoge: foobar -*- と書いてあると (funcall fuga "foobar") されるようだ。
んで、その後 (get fuga 'find-file-auto-mode) とかしてるのだが、シンボルじゃなくて関数だから怒られるっぽい。


んな訳で gensym して関数突っ込んでみた

;;-*- Mode: Lisp; Package: EDITOR -*-
(provide "enparam")
(in-package "editor") ;順番が違う、と 2ch にあった
(export '(enparam))

(defun enparam (param &key (default "") (val))
  (unless val
    (setq val param))
  (make-variable-buffer-local val)
  (set-default val default)
  (delete (symbol-name param) *auto-mode-parameter-alist* :key #'car :test #'string=)
  ;(push (cons (symbol-name param) #'(lambda (string) (set val string)))
  (push (cons (symbol-name param) (setf (symbol-function (gensym))
                                        #'(lambda (string) (set val string))))
        *auto-mode-parameter-alist*))

で動いたっぽい。


のだが、単に -*- hoge: fuga -*- としても変数が初期値になってしまう。たぶんモードを設定しないで enparam で変数に入れても (kill-all-local-variable) で消えてる。んーむ。大人しく mode: も入れておくか。