有没有办法编写一个始终保持向上兼容的.emacs?

And*_*Eve 6 emacs elisp dot-emacs

我从18版开始就使用Emacs .Emacs Lisp不是我的常规编程语言,但几年前我花了一些时间来研究它,以创建一个比迄今为止任何GUI IDE更好(对我来说)的.emacs.

这是一次性的努力,从那时起,我完全忘记了如何在lisp中编程.

唉,每当我升级我的Emacs时(18> 19> 20> 21> 22> 23),我的.emacs中的某些东西就会中断,而我最终花了太多时间(有时是几天)修复它们.

在我经常编程的许多其他语言中,可以编写永不过时的代码.另一方面,在emacs中,我永远无法预测事情会如何变化.例如[M-TAB],用于在版本21.4.1之前运行的版本,在版本23中不再有效,必须替换为"\M-\t".另一个例子是dired-omit-toggle曾经在版本21中工作但在第22版中停止工作,被替换为dired-omit-mode.

现在,我知道如果.emacs做得不多,就可以编写"几乎空"的.emacs,可以(可能)保持与未来版本兼容.

但我的.emacs非常庞大,可以在许多不同的操作系统(以及它们的不同风格,版本和版本,包括非GUI系统)上运行,而无需一次更改.我希望有一个核心API或子集保证始终有效.

有没有这样的方法来编写一个始终保持向上兼容的.emacs?

如果是这样,我在哪里可以找到"烹饪书"或实现此目的的权威指南?

Gil*_*il' 6

使用(when (boundp 'some-variable) …)(when (fboundp 'some-function) …)围绕任何依赖于特定功能的代码.(当你在它的时候,从(require 'cl)那些没有when内置的旧版本开始.)

当一切都失败了,区别在emacs-major-version,emacs-minor-versionrunning-xemacs(定义为(string-match "XEmacs\\|Lucid" emacs-version)).

避免仅在较新版本中支持的语法和库函数.

当您坚持使用文档化的界面时,很少会出现问题.因此,尝试寻找一种方法来处理手册中提到的事情,并且只有在没有其他方法的情况下才会回退到修改一些随机的非自定义变量.根据我的经验,总是有一种相当简单的方法可以在所有版本中使用某些东西(至少使用GNU Emacs,XEmacs有时候更难以取悦),如果您允许偶尔使用条件.

例如,"\e\t"一直在努力M-TAB.随着dired-omit-mode,回落到dired-omit-toggle如果前者不存在:

(set (if boundp 'dired-omit-mode 'dired-omit-mode 'dired-omit-toggle) t)
Run Code Online (Sandbox Code Playgroud)

是的,它有点痛苦,但没有你想象的那么戏剧化.我保留了一个.emacs适用于所有DOS,Windows和unix的自19.23(IIRC,自从我用19.34之前的任何东西测试以来已经有一段时间了)的任何东西.事实上,与Windows的兼容性比跟上GNU Emacs版本更改更加困难.

至于食谱,嗯,版本之间的大多数差异都与使用不广泛的功能有关(否则维护者会更加重视严格的向上兼容性).由于Emacs很大,毫无疑问你使用的很多,但是烹饪书作者不会听说过.你必须用耳朵来播放它.幸运的是,这并不难.