6

私はバージョン18からEmacsを使用しています。EmacsLispは私の日常的なプログラミング言語ではありませんが、何年も前に、これまでのどのGUI IDEよりも優れた(私にとって).emacsを作成するまで、Emacsを研究することに時間を費やしました。

それは一度だけの努力でした、そしてそれ以来、私はLispでプログラムする方法を完全に忘れました。

悲しいかな、Emacsをアップグレードするたびに(18> 19> 20> 21> 22> 23)、.emacsの何かが壊れてしまい、修正に何時間も(時には何日も)費やしてしまいます。

私が日常的にプログラムしている他の多くの言語では、時代遅れになることのないコードを書くことができます。一方、emacsでは、物事がどのように変化するかを予測することはできません。たとえば[M-TAB]、バージョン21.4.1までは機能していましたが、バージョン23では機能しなくなったため、に置き換える必要があります"\M-\t"。もう1つの例はdired-omit-toggle、バージョン21で機能していたが、バージョン22で機能を停止し、に置き換えられたものdired-omit-modeです。

さて、.emacsがあまり機能しない場合は、(おそらく)将来のバージョンとの互換性を維持できる「ほぼ空の」.emacsを作成できることを私は知っています。

しかし、私の.emacsは巨大で、1つの変更なしで多くの異なるオペレーティングシステム(およびそれらの異なるフレーバー、エディション、バージョン、非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)

はい、それは少し苦痛ですが、あなたが思っているほど劇的ではありません。.emacs私は、DOS、Windows、およびUNIXのすべてで19.23以降(IIRC、19.34より古いものでテストしてからしばらく経ちました)で動作するものを維持しています。実際、Windowsとの互換性は、GNUEmacsのバージョン変更に対応するよりも負担が大きくなります。

クックブックに関しては、バージョン間のほとんどの違いは、あまり広く使用されていない機能に関係しています(そうでない場合、メンテナは厳密な上位互換性をより重要視します)。Emacsは大きいので、間違いなくたくさん使っていますが、料理本のライターは聞いたことがないでしょう。耳で弾く必要があります。幸い、それほど難しくはありません。

于 2011-11-17T22:50:10.093 に答える
4

将来の変化を予測することは不可能であるため、将来の互換性を保証することはできません。

以下の点は、.emacsまたはinit.el(私が今練習している)を簡単に維持できるようにするための多くの一般的な方法のいくつかだと思います。

  1. put .emacs.d /バージョン管理(1つでなければなりません)
  2. initファイルをいくつかの小さなファイルに分割します。
  3. whenemacsのバージョンの特定のカスタマイズをロード するために使用します。

    例:

    (when(= emacs-major-version 24)
    ;; 24の設定をロードする

于 2011-11-17T21:42:12.967 に答える
2

私は同情し、あなたの痛みを分かち合います。答えはノーです、そのような聖杯はありません、私は恐れています。あなたが言ったように、あなたのinitファイルが十分に単純であるなら、あなたは何も変更する必要がないかもしれません。実際、それでも真実ではありません。initファイル名とEmacsがそれを探す場所は、どちらも時間の経過とともに変化しています。

于 2011-11-17T21:28:20.190 に答える