如何找出emacs引入功能的版本?

时间:2010-03-22 14:57:17

标签: emacs robustness

我想编写一个尽可能多地使用主线emacs功能的.emacs,在以前版本下运行时优雅地退回。我通过试验和错误找到了一些不存在的一些函数,例如,在emacs 22中,但现在在emacs 23中,我很少在emacs下运行我的dotfiles 22.但是,我想对此采取更主动的方法,并且我的dotfiles的子集仅在版本&gt; = <some-threshold>时生效(例如)。我现在关注的功能是scroll-bar-mode,但我想要一个通用的解决方案。

我没有看到此信息的一致来源;我已经检查了gnu.org在线文档,功能代码本身,到目前为止还没有。我怎样才能确定这一点,而不是保留我想支持的每个版本的emacs?

3 个答案:

答案 0 :(得分:2)

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

e.g。

(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)
)

我猜你已经知道了这一点;并且诸如“何时CUA模式被包含在Emacs中”这样的问题很难回答..

答案 1 :(得分:0)

“NEWS”文件(可通过C-h N访问)可以提供有关何时引入功能的提示。

答案 2 :(得分:0)

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