6

我从版本 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 吗?

如果是这样,我在哪里可以找到完成此任务的“烹饪书”或权威指南?

4

3 回答 3

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)

是的,这有点痛苦,但没有你想象的那么戏剧化。我在所有 DOS、Windows 和 unix 上维护一个.emacs适用于自 19.23 以来的任何东西(IIRC,自从我测试任何早于 19.34 的东西以来已经有一段时间了)。实际上,与 Windows 的兼容性比跟上 GNU Emacs 版本的变化更重要。

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

于 2011-11-17T22:50:10.093 回答
4

由于无法预测任何事物的未来变化,因此没有人可以保证未来的兼容性。

我认为以下几点是使维护 .emacs 或 init.el 变得容易的许多通用方法中的几个(我现在正在练习。)

  1. 放 .emacs.d/ 版本控制(必须一个)
  2. 将 init 文件拆分为几个小文件。
  3. 用于when为某个版本的 emacs 加载特定的自定义项。

    例如:

    (当 (= emacs-major-version 24)
    ;;加载我的设置为 24

于 2011-11-17T21:42:12.967 回答
2

我同情你,我分担你的痛苦。答案是否定的,恐怕没有这样的圣杯。正如您所说,如果您的 init 文件足够简单,那么您可能不需要更改任何内容。实际上,即使这不是真的:init 文件名和 Emacs 查找它的位置都随着时间而改变。

于 2011-11-17T21:28:20.190 回答