1

我在多台计算机上共享我的 Emacs 配置。其中一些我可以轻松地维护我自己的 emacs 副本,而在其他一些我没有那么奢侈。我看到以下消息:

'disabled-command-hook' 是一个过时的变量(从 Emacs 22.1 开始);使用“禁用命令功能”

这发生在启动时,因为我将我的配置设置为对任何尚未编译的文件进行字节编译。问题是,我还有一两个 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 版本中看到有关过时变量的消息。我错过了什么?

我发现了其他类似的问题,目标是隐藏消息。我想了解为什么我会看到该消息以及如何以跨版本兼容的方式避免该问题。

谢谢。

4

2 回答 2

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)
于 2012-10-09T20:08:55.113 回答
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))
于 2012-10-09T18:17:26.927 回答