2

我想编写一个 .emacs,尽可能多地使用主线 emacs 功能,在以前的版本下运行时优雅地回退。我通过反复试验发现了一些不存在的功能,例如,在 emacs 22 中,但现在在 emacs 23 中,在极少数情况下我最终在 emacs 22 下运行我的点文件。但是,我会喜欢对此采取更主动的方法,并让我的 dotfiles 的子集仅在 version >= 时生效<some-threshold>(例如)。我现在关注的功能是,scroll-bar-mode但我想要一个通用的解决方案。

我还没有看到此信息的一致来源;我已经检查了 gnu.org 在线文档、函数代码本身,但到目前为止一无所获。我如何确定这一点,而不保留我想要支持的每个版本的 emacs?

4

3 回答 3

2

我无法直接回答您的问题,但我使用的一种技术是检查functionp告诉我函数是否存在的函数。

例如

(if (load "completion" t)
  (progn
    (initialize-completions)
    (if (functionp 'dynamic-completion-mode)
      (dynamic-completion-mode) ; if exists
      (completion-mode)         ; otherwise use old version
    )
  ) ; progn
) ; if

更新:添加特定于版本的宏

除了使用之外,functionp我还有一些特定于版本的宏:

(defmacro GNU_EMACS_21 (&rest stuff)
   (list 'if (string-match "GNU Emacs 21" (emacs-version)) (cons 'progn stuff)))
(defmacro GNU_EMACS_20 (&rest stuff)
  (list 'if (string-match "GNU Emacs 20" (emacs-version)) (cons 'progn stuff)))
(defmacro GNU_EMACS_19 (&rest stuff)
  (list 'if (string-match "GNU Emacs 19" (emacs-version)) (cons 'progn stuff))) 
(defmacro WINSYS_X (&rest stuff)
  (list 'if (eq window-system 'x) (cons 'progn stuff)))
(defmacro WINSYS_W32 (&rest stuff)
  (list 'if (eq window-system 'w32) (cons 'progn stuff)))
(defmacro WINSYS_NIL (&rest stuff)
  (list 'if (eq window-system nil) (cons 'progn stuff)))
(defmacro SYSTYPE_LINUX (&rest stuff)
  (list 'if (string-match "linux" (symbol-name system-type)) (cons 'progn stuff)))

然后我可以使用这些:

(GNU_EMACS_21
  (if (load "cua" t)
    (CUA-mode t)
  )
)
(WINSYS_NIL ; when running in text mode
  (push (cons 'foreground-color "white") default-frame-alist)
  (push (cons 'background-color "black") default-frame-alist)
  (push (cons 'cursor-color "cyan") default-frame-alist)
  (push (cons 'minibuffer t) default-frame-alist)
)

但是,我猜您已经知道了;像“Emacs 何时包含 CUA 模式”这样的问题很难回答。

于 2010-03-22T15:01:56.013 回答
0

“NEWS”文件(可通过 Ch N 访问)可能会提示何时引入功能。

于 2010-03-22T15:23:25.847 回答
0

通常更好的做法是测试您要使用的函数或变量是否存在,而不是测试 Emacs 版本。使用fboundpboundp,例如。有时检查是有意义的featurep,但通常使用fboundpor更好boundp

于 2011-08-21T18:40:59.043 回答