我想编写一个尽可能多地使用主线emacs功能的.emacs,在以前版本下运行时优雅地退回。我通过试验和错误找到了一些不存在的一些函数,例如,在emacs 22中,但现在在emacs 23中,我很少在emacs下运行我的dotfiles 22.但是,我想对此采取更主动的方法,并且我的dotfiles的子集仅在版本&gt; = <some-threshold>
时生效(例如)。我现在关注的功能是scroll-bar-mode
,但我想要一个通用的解决方案。
我没有看到此信息的一致来源;我已经检查了gnu.org在线文档,功能代码本身,到目前为止还没有。我怎样才能确定这一点,而不是保留我想支持的每个版本的emacs?
答案 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版本。例如,使用fboundp
和boundp
。偶尔检查featurep
是有意义的,但通常最好使用fboundp
或boundp
。