4

.emacsファイルを何度リロードしても、

M-x load-file RET ~/.emacs RET

1回目と同じ結果を出したい。.emacsファイルをべきにしたい。

動機

私は、領域 ( C-c C-r)、defun ( C-M-x)、または最後の Sexp ( ) を外科的に評価できることを知っていC-x C-eます。小さな変更を加えるときは、このようなより洗練されたアプローチを取ることがよくあります。ただし、.emacsファイルを再処理する場合、ファイル全体をリロードして変更の結果を最終的に確認したい場合があり.emacsます。毎回 emacs を再起動すると、特に大規模な.emacsハウスキーピングを行うときに、すぐに古くなります。

具体的な手順

.emacsファイルを更新して非べき等操作をべき等操作に置き換えるには、具体的にどのような手順を実行する必要がありますか?

例えば、

  1. 「-hook」を検索し、フックへの直接の追加を への呼び出しに置き換えますadd-hook。これにより、既に存在する場合、フックに関数が再追加されません。
  2. フラグのトグルを直接設定またはクリアに置き換えます。注意してください?? 特に。
  3. ...

包括的なチェック アンド コレクト リストが理想的ですが、重要な個々のチェックがあればそれも役に立ちます。

4

3 に答える 3

9

ほとんどの .emacs ファイルは、べき等の初期化ルーチンを持たない可能性のあるライブラリに依存しているため、これを完全に保証できるかどうかはわかりません。ただし、問題を軽減するための便利な方法がいくつかあります。

  1. add-hook、および無名関数の代わりにキーバインドに名前付き関数を使用します。特にadd-hook、これにより、既存の参照を交換できます。

  2. を慎重に使用するとdefvar、デフォルトでは、変数が未定義の場合にのみ本体が評価されます。C-M-xon adefvarは本体を再評価しeval-bufferますが、変数が既に初期化されている場合はそうしません。

  3. 関数の値の代わりに名前付き関数を参照する(quote function)代わりに、慎重に使用してください。これに関するより高度な議論については、無名関数functionを参照してください。

  4. は、最初に実行されたときにのみ対応するライブラリをロードすることを覚えておいてください。require繰り返しの呼び出しでは再評価されloadません。Autoload も require を使用して、対応するライブラリをロードします。

  5. 要素が存在しない場合にのみ要素を追加するのではなく、優先してadd-to-listください。cons

  6. (mode-name-mode t)古いモードのアクティブ化には、トグル機能の代わりに必ずアクティブ化を使用してください。turn-on-モード切り替えの代わりにマイナー モード機能についても同様です。

  7. 繰り返し実行すると副作用のあるガード ブロック。特にサーバーモードでは(unless (server-running-p) (server-start))、パッケージをインストールするための同様のガード。

  8. eval-after-loadまたはカスタムモードのフックでの副作用に注意してください。デフォルト モードのフックは、モードが最初に有効になったときに実行され、後続の各バッファーで実行されますが、フック関数が変更されたときに既存のバッファーで再実行されないことに注意してください。eval-after-load物事がつまずく可能性は低くなりますが、いつ評価されるかを覚えておくことは依然として重要です。

  9. #2に関連して、ファイルの評価時に常に実行するようにmakunbound強制するため、相互に依存する変数のチェーンを再評価する必要がある場合に役立ちます。defvar

init ファイルでの実行eval-bufferは可能な限り冪等でなければなりませんが、emacs Lisp は副作用と状態を好むことを覚えておくことが重要です。これをある程度改善することは可能ですが、init を再評価しても、emacs が最初に起動したときの状態に戻ることはありません。

于 2014-08-02T23:06:47.930 に答える
4

べき等であることがわかっているものに限定してください。

  • デフン。
  • setq を定数に設定します。
  • 定数を使用してリストに追加します。
  • フックを追加しますが、ラムダ式ではなくシンボルを追加することをお勧めします。
  • マイナー モードの有効化/無効化。
  • 上記の一部を条件にラップします。

もちろん、冪等性は、結果が再起動と同じであることを実際に意味するものではありません (たとえば、 a を削除してsetqから .emacs を再評価しても、前の setq の影響は削除されません) が、上記はほとんど原則です。私は自分の ~/.emacs に従ってみます。

于 2014-08-02T22:27:44.973 に答える
2

他の人が言ったことに加えて、読み込みがべきrequire等であるサードパーティのライブラリを含むライブラリを読み込みます (例: )。

はい、特定のライブラリについてそれを見つけるには、コードを読むか実験する必要があるかもしれません。しかし、最近では、ライブラリは冪等 (またはそれに近い) であると想定されており、多くのライブラリはそうです。

于 2014-08-03T02:12:58.773 に答える