Source of Nothingness - xyzzy lisp : clone-buffer

* xyzzy lisp : clone-buffer

とりあえずこんなところか。
主だったところはsession.lから。
outline-tree2をバッファバーの代わりにしつつ、rename-bufferを良く使う人向け。
もしくは*compilation*バッファとかでうっかりそのまま編集して、undoができず残念な思いをする人向け。
(defun clone-buffer (buffer-name &optional (buffer (selected-buffer)))
  (interactive "sClone Buffer: ")
  (let ((major buffer-mode)
        (minor (mapcan #'(lambda (mode)
                           (let ((var (and (consp mode) (car mode))))
                             (and (symbolp var)
                                  (boundp var)
                                  (symbol-value var)
                                  (list var))))
                       *minor-mode-alist*))
        (locals (mapcar #'(lambda (var)
                            (and (symbolp var)
                                 (local-variable-p var)
                                 (cons var (symbol-value var))))
                        *buffer-info-variable-list*))
        (point (point)))
    (set-buffer (create-new-buffer buffer-name))
    (insert-buffer buffer)
    (funcall major)
    (mapc #'(lambda (f) (and (fboundp f) (funcall f))) minor)
    (mapc #'(lambda (x)
              (when (and (car x) (symbolp (car x)))
                (make-local-variable (car x))
                (set (car x) (cdr x))))
          locals)
    (goto-char point)))

メモ:
undo情報をそっくり写せるとうれしいかも。

OHKUBO は単純にこういう風にしています。
outline-tree2 では起動時に *after-rename-buffer-hook* が存在したら
フックに引っ掛かるようになってます。

;; rename-buffer (builtin.l)
(in-package "editor")
(defconstant *rename-buffer-org-function* #'rename-buffer)
(defvar *after-rename-buffer-hook* nil)
(defun rename-buffer (buffer-name &optional buffer)
  (interactive "sRename buffer: ")
  (prog1
      (funcall *rename-buffer-org-function* buffer-name buffer)
    (run-hook-with-args '*after-rename-buffer-hook* (or buffer (selected-buffer)))))
(export '(*after-rename-buffer-hook*))
(in-package "user")

update : 2006-10-28 (Sat) 07:58:38