当变量过时时,如何支持多个版本的Emacs配置?

时间:2012-10-09 18:03:33

标签: emacs

我在众多计算机上共享我的Emacs配置。其中一些我可以很容易地保留我自己的emacs副本,而另一些我没有那么奢侈。我看到以下消息:

'disabled-command-hook'是一个过时的变量(从Emacs 22.1开始);使用'disabled-command-function'

这在启动时发生,因为我的配置设置为字节编译任何尚未编译的文件。问题是,我仍然有一个或两个Emacs 21实例。我如何支持旧的和新的?我的google-fu不适合我。

我尝试使用这个宏:

(defmacro WhenEmacsOlderThan (major minor &rest body)
   `(if (or (< emacs-major-version ,major) (and (= emacs-major-version ,major)
                                                                           (< emacs-minor-version ,minor)))
      (progn ,@body)
     nil
    )
 )

使用中看起来像这样:

(WhenEmacsOlderThan 22 1
   (setq disabled-command-hook nil)
 )

但我仍然在较新的Emacs版本中看到有关过时变量的消息。我错过了什么?

我找到了其他问题,例如this,但目标是隐藏信息。我想了解为什么我会看到该消息以及如何以跨版本兼容的方式避免此问题。

感谢。

2 个答案:

答案 0 :(得分:2)

该消息是一个警告,因此您的(setq disabled-command-hook nil)仍然有效,但当该变量被删除时,警告也会消失,因此最好做好准备。你可以这样做:

(setq disabled-command-hook nil) ;; Obsolete since Emacs-22.
(setq disabled-command-function nil)

所以它适用于所有版本。您也可以使用

来避免警告
(if (boundp 'disabled-command-hook)
    (setq disabled-command-hook nil)) ;; Obsolete since Emacs-22.
(setq disabled-command-function nil)

答案 1 :(得分:0)

您可以直接检查disabled-command-hookobsolete吗?

(defun make-obsolete (obsolete-name current-name &optional when)
  ....
  (put obsolete-name 'byte-obsolete-info

所以也许

(if (not (get disabled-command-hook 'byte-obsolete-info))
  (setq disabled-command-hook nil))
相关问题