web-dev-qa-db-ja.com

emacs構成をモジュール化する方法は?

.emacsをゼロから書き直すことにしました。恐ろしい1k以上のLoCinit.elファイルを回避するために、モジュール式のものをセットアップしたいと思います...

各構成で対処する必要のある基本的な懸念事項がいくつかあると思います。

  • グローバルオプション
  • 編集機能
  • ナビゲーション(フレームとバッファー)
  • キーバインディング
  • モードのカスタマイズ

私はまだ構造を熟考している間、これを達成する方法についてのいくつかの指針を探しています。
githubなどでいくつかの.emacsを調べましたが、アプローチが異なるようで、これを実行するための好ましい方法はありません。これは少し混乱します。
そのようなセットアップを構築する方法に関するいくつかのアイデア、特にいくつかの関連するelispコードを読むことに興味があります。


編集:物事に巻き込まれ、まだこれで遊ぶ時間があまりありませんでした。提案された方法を数日で試して、何が最善かを確認します。その間、すべての推奨事項に感謝します。


edit2:私は org-modeでのリテラルinitファイル を使用してきましたが、これは絶対に素晴らしいです!
私はまだ特定のロードメカニズムに設定されていません。このコードを使用して、elispディレクトリを再帰的にロードしてから、セットアップ手順に記載されているものを要求します。

  (if (fboundp 'normal-top-level-add-subdirs-to-load-path)
  (let* ((my-LISP-dir "~/.emacs.d/elisp/")
  (default-directory my-LISP-dir))
  (setq load-path (cons my-LISP-dir load-path))
  (normal-top-level-add-subdirs-to-load-path)))

私はまだこれを磨く必要があります、多分自動ロードを使用して、そして修正されたトリックならいくつかのバイト再コンパイル;それについての提案を聞きたいです。

47
julien

私の。emacsファイルロード〜/ .emacs.d/init.elこれは、XEmacs用に最初に記述された次の関数を定義しますが、最近のEmacsでは十分に機能します。

(defconst user-init-dir
  (cond ((boundp 'user-emacs-directory)
         user-emacs-directory)
        ((boundp 'user-init-directory)
         user-init-directory)
        (t "~/.emacs.d/")))


(defun load-user-file (file)
  (interactive "f")
  "Load a file in current user's configuration directory"
  (load-file (expand-file-name file user-init-dir)))

次に、ファイルの残りの部分が移動し、次のような形式で多数の個別ファイルをロードします。

(load-user-file "personal.el")

私の現在のファイルセットは次のとおりです。

  • personal.el
  • platform.el
  • cygwin.el
  • variables.el
  • path.el
  • mail-news.el
  • misc-funcs.el
  • bbdb.el
  • calendar.el
  • gnus-funcs.el
  • c-and-Java.el
  • LISP.el
  • clojure.el
  • go.el
  • markdown.el
  • sgml-xml.el
  • tex.el
  • スペル.el
  • org.el
  • packages.el
  • fonts.el
  • color-theme.el
  • frame.el
  • server.el
  • keys.el
  • aquamacs.el

名前が示すように、それらのいくつかは他のものよりも意図がはるかに具体的です。ファイルがきめ細かいほど、パッケージまたはライブラリを再インストールするときにフォームのクラスターを無効にするのが簡単になります。これは、構成ファイルをドラッグしても、サポートするすべてのパッケージがまだインストールされていない新しいシステムに「移動」する場合に特に便利です。

44
seh

カスタマイズを異なるファイルに分割するには、 initsplit.el を使用できます。また、wikiには modular .emacs layout に関するページがあります。

6
Joe Casadonte

(require 'foo)を実行すると、ロードパスで最初に見つかった「foo.el」elispがロードされます。ロードパス外の何かの場合は(require 'foo "/home/user/experimental/foo.el")がロードされます。 「foo.el」に式(provide 'foo)が含まれていない場合、エラーが報告されます。ひどい状況では、(require 'foo "bar.el")を実行できます。これは、「bar.el」に(provide 'foo)句がある限り機能します。

2
Justin Smith

load-fileを使用することの何が問題になっていますか?

あなたが役に立つかもしれないいくつかの追加のビットは以下を含みます

  • file-exists-p
  • file-expand-wildcards

C-h f <function>を使用してヘルプを取得すると、 Emacs LISPでのプログラミング入門 便利(または PDFをダウンロード )が見つかる場合があります。

2
dmckee

これは、指定されたディレクトリに保存するだけで新しいモジュールをインストールできるライブラリです。 http://github.com/tripleee/my-site-start/ からダウンロードしてインストールできます。

    ;;; my-site-start.el --- set up personal .emacs.d/site-start.d/
    ;;
    ;; Copyright (C) era eriksson <http://www.iki.fi/~era/> 2008-2009
    ;; License: GPL v2
    ;; Version: see `my-site-start-version' below
    ;;
    ;;; Commentary:
    ;;
    ;; The purpose of my-site-start is to simplify maintenance of user libraries.
    ;; Instead of indefinitely tweaking your .emacs, just create a site-start.d
    ;; directory and add symlinks to the libraries you want to load into Emacs.

このアーキテクチャは、あなたが好むかもしれないし好まないかもしれないいくつかの慣習を課します。完全なスクープについては、ファイルの上部にあるコメントセクションの残りの部分を参照してください。

私はこのコードの作成者であり、フィードバックに感謝します(ただし、この公開フォーラムから直接ではありません)。

1
tripleee

優れた emacsスターターキット を見てください。これは非常にうまく構成されており、ELPAパッケージも含まれています。私はこの構造を、私自身のはるかに単純なセットアップのインスピレーションとして使用しました。

1
justinhj

custom-set-variablesを分割したいが、initsplit.elよりも軽いものが必要な場合は、次のことを試してください。

(defmacro custom-set-variable (var value)
  "Call `custom-set-variables' with a warning shown
when customizing using the customize GUI.

XXX: does not support setting the optional NOW and
REQUEST (dependency) fields."
  (custom-set-variables
    ;; `load-file-name' is set by `load-file':
    ;; http://stackoverflow.com/a/1971376/470844
    `(,var ,value nil nil
      ,(format "!!! CAREFUL: CUSTOM-SET IN %s !!!" load-file-name))))

次に、構成モジュールを別々のファイルに入れ、他の人が示唆しているように、load-file~/.emacsを付けてロードします。各構成モジュールで、

(custom-set-variable var value)

の代わりに

(custom-set-variables '(var value))

または

(setq-default var value)

カスタマイズによって管理される変数を設定する場合。次に、カスタマイズインターフェイスを使用して変数をカスタマイズする必要がある場合は、カスタマイズを保存する必要があるファイルを示す警告が表示されます。

"!!! CAREFUL: CUSTOM-SET IN <path to module file> !!!"

設定ファイルをバージョン管理している場合、diffは~/.emacsのどの行をカスタムモジュールに移動するかを指示します。

複数のcustom-set-variables呼び出しを単純に使用する場合の問題の説明: http://www.dotemacs.de/custbuffer.html

編集:アランの質問への回答

上記のcustom-set-variableマクロが解決する問題

Emacsのカスタマイズインターフェースは、カスタムセット変数を編集するたびに、すべてのカスタムセット変数を~/.emacsに保存します。カスタムセット変数を複数のファイルに分散してモジュール化する場合は、emacsが重複する設定を.emacsに挿入するタイミングを認識し、それらを削除する必要があります。上記のcustom-set-variableマクロは、これを行うのに役立ちます。

私の設定ファイルからの実際の例

~/.emacs.d/extensions/whitespace.el によってロードされる~/.emacsファイルに空白に関連する変数をカスタム設定しました。たとえば、 search-whitespace-regexp 変数を次のように設定します。

(nc:custom-set-variable search-whitespace-regexp "[ \t\r\n]+")

今、2つのことが起こります。まず、カスタマイズインターフェイスでその変数に遭遇すると、警告が表示されます。

Generated warning in Emacs' customization dialog

次に、カスタマイズインターフェイスを使用して変数を編集すると、~/.emacsにより、いくつかの定義をシャドウイングしたことが非常に明確になります。たとえば、カスタマイズインターフェイスでsearch-whitespace-regexpglobal-whitespace-modeを変更すると、次のようになります。

$ svn di --diff-cmd "diff" -x "-U0" ~/v/conf
Index: /home/collins/v/conf/dot.emacs
===================================================================
--- /home/collins/v/conf/dot.emacs  (revision 267)
+++ /home/collins/v/conf/dot.emacs  (working copy)
@@ -55,0 +56 @@
+ '(agda2-include-dirs (\` ("." (\, (file-truename "~/local/opt/agda-std-lib/src")))) nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/agda.el !!!")
@@ -58,0 +60,3 @@
+ '(global-whitespace-mode t)
+ '(indent-tabs-mode nil nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!")
+ '(indicate-empty-lines t nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!")
@@ -72,0 +77 @@
+ '(search-whitespace-regexp "" nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!")
@@ -74,0 +80 @@
+ '(tab-width 2 nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!")

このマクロは、search-whitespace-regexpを変更したことを思い出すのに役立ちません。すでに別の場所に設定されているだけですが、~/.emacsから削除する必要のある変数設定を知るのに役立ちます(警告のあるものすべて) 、および~/.emacsに残すか、他の個別のファイルに移動する必要があるファイル(すべて警告なし)。

結論

マクロはおそらくやり過ぎですが、一度存在すると使いやすく、シャドウされたカスタムセット変数で足を撃たないようにするのが簡単になります。

1
ntc2

EmacsWikiページ について言及してくれた@JoeCasadonteに感謝します。私はDebianとUbuntuを使用しているので、この特定のスニペットはうまく機能しました(.emacs.d/init.elに配置されます)。

(setq dotfiles-dir (file-name-directory (or load-file-name (buffer-file-name))))

(let ((user-site-start-dir (concat dotfiles-dir "/site-start.d")))
    (debian-run-directories user-site-start-dir))

次に、.elファイルを〜/ .emacs.d/site-start.d内に配置する必要があります(例:~/.emacs.d/site-start.d/50cedet.el)そしてそれらはすべて自動的にロードされます。

1
Paulo

設定ファイルのローダーであるinit-loader.elを試すことができます。 init-loader.elは指定されたディレクトリから設定ファイルをロードします。これにより、構成を分類し、複数のファイルに分割できます。

詳細については、init-loader GitHubリポジトリにアクセスしてください

0
Juanito Fatas

私が行ったことは、使用したいXごとに、configure-Xというファイルを作成し、対応するrequireを.emacsに配置することです。この機能は、1行をコメントアウトすることで削除できます。

たとえば、最も単純なもの(名前が最も不適切な場合)を選択するために、configure-picture-and-artist-mode.elを使用します。このファイルは非常に単純です。

(global-set-key (kbd "C-M-P")
                'picture-mode)

(provide 'configure-picture-and-artist-mode)

そして.emacsでは:

(require 'configure-picture-and-artist-mode)

これを整理した後、requiresの大きなリストとload-pathへのいくつかの変更を除いて、.emacsには何もありません。特定のパッケージは非常に簡単に削除でき、すべての構成が可能です。パッケージごとに1か所にあります。

(私は、明確なホーム(グローバルキーバインディング、ヘルパー関数など)を持たないものを格納するために使用するキャッチオール.elファイルも持っていますが、それでも理想的には.emacsを避けたいです。これビットはあまりモジュール化されておらず、私のスキームが簡単にアンロード可能にするはずのパッケージに暗黙の依存関係を導入する可能性がありますが、実際には大したことではないようです。)

0