なんだこれは

はてなダイアリーから移転しました。

org-export で org-overlay-putが見つからないと言われる

macport で emacs-app と org-modeを入れていて、org-mode中にorg-exportしたら、org-overlay-putがないと言われる場合の対処方法

発生環境

macportでのそれぞれのバージョンはこうなっている。

  • emacs-app @23.3_3+fullscreen (active)
  • org-mode @7.7_0 (active)

org-mode中にorg-exportしたときの正確なメッセージはこう。

byte-code: Symbol's function definition is void: org-overlay-put

org-overlay-put はどこに?

実は、/opt/local/share/emacs/site-lisp/org-compat.el にあるはずの
org-overlay-put関数が抜けているためだと思われる。この関数は、
aquamacsのorg-compat.elには含まれているものらしい。

このあたりに書かれている。

;; Overlay compatibility functions
(defun org-move-overlay (ovl beg end &optional buffer)
  (if (featurep 'xemacs)
      (set-extent-endpoints ovl beg end (or buffer (current-buffer)))
    (move-overlay ovl beg end buffer)))
(defun org-overlay-put (ovl prop value)
  (if (featurep 'xemacs)
      (set-extent-property ovl prop value)
    (overlay-put ovl prop value)))
(defun org-overlay-display (ovl text &optional face evap)
  "Make overlay OVL display TEXT with face FACE."
  (if (featurep 'xemacs)
      (let ((gl (make-glyph text)))
	(and face (set-glyph-face gl face))
	(set-extent-property ovl 'invisible t)
	(set-extent-property ovl 'end-glyph gl))
    (overlay-put ovl 'display text)
    (if face (overlay-put ovl 'face face))
    (if evap (overlay-put ovl 'evaporate t))))

これってxemacsのときに必要みたいにかかれているような気がするけど、なんだろう、*1該当部分を設定ファイルに書き込むとこのエラーがでなくなる。

これと似たようなことが、 org-make-overlayのときにもあったことを思い出した。

(require 'org-install)

(add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))
;(global-set-key "\C-cl" 'org-store-link)
;(global-set-key "\C-ca" 'org-agenda)
;(global-set-key "\C-cb" 'org-iswitchb)

;;; org-remember

(require 'org)
(org-remember-insinuate) ; org-rememberの初期化
(setq org-directory "~/memo/")
(setq org-default-notes-file (expand-file-name "memo.org" org-directory))

;; org-make-overlay is missing ??
(defun org-make-overlay (beg end &optional buffer)
  (if (featurep 'xemacs)
      (make-extent beg end buffer)
    (make-overlay beg end buffer)))

;; org-overlay-put is missing ??
(defun org-overlay-put (ovl prop value)
  (if (featurep 'xemacs)
      (set-extent-property ovl prop value)
    (overlay-put ovl prop value)))

;;
(setq org-remember-templates
      '(("Note" ?n "** %?n   %i\n   %a\n   %t" nil "Inbox")
	("Todo" ?t "** TODO %?\n   %i\n   %a\n   %t" nil "Inbox")))
;; Select templete [n]ote [t]odo

よくわからない

org-7.7にはこの関数は含まれていないんだが??ということは別のファイルを先に読んでいるのかもしれない。

*1:EmacsとXEmacsで関数名が違う場合の対応策ですね。