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

时间:2011-11-17 20:35:46

标签: emacs elisp dot-emacs

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

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

唉,每当我升级我的Emacs(18> 19> 20> 21> 22> 23)时,我的.emacs中的某些东西都会中断,我最终会花费太多时间(有时几天)修理这些。

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

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

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

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

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

3 个答案:

答案 0 :(得分:6)

在依赖于特定功能的任何代码周围使用(when (boundp 'some-variable) …)(when (fboundp 'some-function) …)。 (对于那些没有(require 'cl)内置版本的旧版本,请从when开始。)

当其他所有方法都失败时,请对emacs-major-versionemacs-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)

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

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

答案 1 :(得分:4)

由于不可能预测未来的任何变化,没有人能保证未来的兼容性。

我认为以下几点是很容易维护的常用方法.emacs或init.el(我现在正在练习。)

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

    例如:

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

答案 2 :(得分:2)

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