〜/ .emacs.d / init.elおよび〜/ emacs.dのコンテンツを整理しますか?


28
  1. ~/.emacs.d/init.elさまざまな目的(python-mode、emacs-eclim、...など)で行を追加すると、ファイルが長くなり、読みにくくなります。コンテンツを整理する方法はありますか?
  2. 私の現在~/.emacs.dはこんな感じ

    $ ls *
    init.el
    
    auto-save-list:
    
    elisp:
    python-mode.el-6.1.3
    
    elpa:
    archives        auctex-readme.txt         s-20140910.334
    auctex-11.87.7  emacs-eclim-20140809.207
    
    eshell:
    history
    

    python-mode.el-6.1.3一方で、手動で、インストールされた emacs-eclim-20140809.207ことにより、インストールされていたelpa、と私は100%でないことを確認、他のものの下では、という思いelpa/でいましたelpa。のコンテンツを整理するにはどうすればよい~/.emacs.d/ですか?

回答:


32

少ないエディタを使用している人々は、コードを複数のファイルに分割することを好みます。Emacsを使用している場合、それを行う理由はありません。1つの大きなファイルを使用し、それをセクションに分割します。

各セクションは

^L
;;; title of the section

^L入力して文字を挿入する場所C-q C-l。その後、C-x ]forward-page)やC-x n pnarrow-to-page)などのコマンドを使用して、ファイル内を移動できます。詳細については、Emacsマニュアルのセクション25.4(ページ)を参照してください。


16
特別な理由もありませんではない複数のファイルに分割されたコードには。それは、あなたが何を意味するのか、あなたがそれをどのように振る舞わせたいかによって決まります。また、LARGEの大きさに依存します。そして、それはあなたのコードの一部が、たとえばライブラリとして他の人と共有されるかどうかに依存します。
ドリュー

2
@Drewのコメントに便乗して、ユーザーは異なるemacsバージョンと環境に対して異なる設定を持ち、それに応じて関連するelispをロードしたい場合があります。とはいえ、私はページネーションのヒントが好きです。
ハーベイ14年

3
@Harvey:ページネーションと個別のファイルの使用は、テキストを整理する独立した方法です。もちろん、両方を使用できます。すべてのライブラリでページネーションを使用して、セクションを区切ります。しかし、別のライブラリ(ファイル)もあります。
ドリュー

1
@jchこのスタイルを使用している場合は、セクションと機能の折りたたみを許可するために、アウトラインマイナーモードまたは同様の機能を有効にすることもできます。すべてのトップレベルの見出しを折りたたむと、Emacs構成のすべてのセクションの概要がわかりやすくなります。
lunaryorn 14年

@lunaryorn、私は試してみましたが、気が散ることに気づきました-ほとんどの場合、ページ移動コマンドで十分であることがわかりました。おそらく、私.emacs.wl十分な長さではありません。
JCH

20

これを行う古典的な方法は、ユーザー.emacsを別々のファイルに分割することです。たとえば、すべてのWebアイテムを移動して、~/.emacs.d/web-config.el内部にロードできますinit.el

(load "~/.emacs.d/web-config.el")

~/.emacs.d少し整理したい場合は、これらの構成ファイルを独自のディレクトリに移動することもできます。

(load "~/.emacs.d/config/web.el")

これで、設定を変更するときに適切なファイルにジャンプできます。

これに欠けているものの1つは、カスタマイズシステムを介して設定される変数です。これらはすべてメインのinit.elにあります。どうやら、initスプリットと呼ばれる小さなユーティリティがあり、どのカスタマイズ設定をどこに適用するかについてのルールを作成できますが、私はそれを使用したことがありません。または、「カスタマイズ」システムは、設定の変更に別のファイルを使用するように構成できます。custom-file変数を設定して、「カスタマイズ」設定の読み取り元書き込み先指定ます

ディレクトリ自体に関しては、デフォルトのレイアウトに常に満足しています。私が行った主な変更は、によって管理されていないすべての独自のカスタムパッケージとライブラリのディレクトリを作成することでしpackage.el。これにより、構成に関係しないカスタムelispに単一のホームが提供されます。


ありがとう。(1)package.elによって管理されるパッケージおよびライブラリのディレクトリは何ですか?(2)dirの内容はelpa管理されていelpaますか?他の場所に移動できますか?
ティム14年

2
変数を設定custom-fileすることにより、変数のカスタマイズ用に別のファイルを指定できます。出典
Kaushal Modi 14年

@Tim:package.elによって管理されるディレクトリはelpaです。ElpaはLispパッケージではなく、パッケージリポジトリです。Package.elは、インストールするすべてのパッケージ(elpaからでも、別のリポジトリからでも---たとえば、eclimやsはelpaからだとは思わない)をディレクトリelpaに追加します。もちろん、このディレクトリの内容について心配する必要はありません。
T.バーロン14年

(これ以上編集できません)上記で書いたことは厳密には真実ではありません:elpaはパッケージアーカイブの形式、package.elはパッケージマネージャーです。ユーザーにとって、この2つの間に実質的な違いはありません。上記の私のコメントは、elpaをGNU elpaと間違えています。これは、利用可能なelpaパッケージの1つ(そして唯一の公式パッケージ)です。
T.バーロン14年

16

組織モードが好きなら、それを使用して、.emacs分割せずに整理できます。私の現在の設定では、私の.emacsファイルはinit.orgファイルをブートストラップします~/.emacs.d/init/init.org

(require 'org)

;; Load the actual configuration file
(org-babel-load-file
  (expand-file-name (concat user-emacs-directory "init/init.org")))

さまざまなファイルを使用することで、何かgrepを簡単C-sに検索するのではなく、などを行う必要があります。また、組織にいくつかのレベルを追加する方が簡単です。


1
使用するつもりはなかったが、私は現在これを実行中ですorg-babel-load-file。甘い!(例:github.com/vermiculus/dotfiles/blob/…、github.com / larstvei / dot
ショーン

この質問については、Emacsの設定にorg-modeを使用する方法の詳細:org-modeを使用して、.emacsまたはその他の.el設定ファイルを構成できますか?
シュ

9

コードの一部をinit.elから別のファイル(ライブラリ)に移動するだけですrequire。(provideライブラリで使用してrequiredにします。)これらのファイルを必要な場所に配置し、load-pathそれに応じて更新します。


ありがとう。(1)たとえば?(2)〜/ .emacs.d /を整理するために何を提案しますか?
ティム14年

1
「コンテンツの整理」とはどういう意味~/.emacs.d/ですか。必要なものを指定しません。すべてを1つのディレクトリに置くことに制約されません。好きな場所に置いて、load-pathそれに応じて変更できます。中のもの~/.emacs.d/。(つまり、あなたはどこのものを入れて、それを伝えることができない場合)、その後、あなたがそれを配置したい場所をそのプログラム/ツールが実行された後、それを動かす
ドリュー

1
「たとえば」とはどういう意味ですか?例を挙げたいのは何ですか?(require 'foobar)の使用例ですrequire(add-to-list 'load-path "/my/lisp/dir")変更の例ですload-path(provide 'foobar)の使用例ですprovide
ドリュー

「〜/ .emacs.d /のコンテンツを整理することで、私は人間として、emacsが理解するのではなく、よりよく理解できます。それは習慣です。キャビネット、引き出し、本棚を整理するようなものです。たとえば、python -mode.el-6.1.3は手動でインストールされ、emacs-eclim-20140809.207はelpaによってインストールされましたが、両方ともパッケージですか?ある場合は、〜/ .emacs.dの1つのサブディレクトリに配置することをお勧めします/?
ティム14年

あなたは、どの組織があなたがそれをよりよく理解するのを助けるかもしれないかについて答えることができる人間です。(Emacsは何も理解しません。)好きなフォルダー構造を使用します。それらをキャビネット、引き出し、本棚、または単なるフォルダーと呼びます。また、内だけでなく、どこinit.elでもライブラリをロードできます~/.emacs.d/
ドリュー

7

Emacs Wiki:Load directoryにあるtargzetaの提案を使用します。

基本的には〜/ .emacs.d / load-directory.elがあります。

;;;; ~/.emacs.d/load-directory.el

;; Handy function to load recursively all '.el' files in a given directory
(defun load-directory (directory)
  "Load recursively all '.el' files in DIRECTORY."
  (dolist (element (directory-files-and-attributes directory nil nil nil))
    (let* ((path (car element))
           (fullpath (concat directory "/" path))
           (isdir (car (cdr element)))
           (ignore-dir (or (string= path ".") (string= path ".."))))
      (cond
       ((and (eq isdir t) (not ignore-dir))
        (load-directory fullpath))
       ((and (eq isdir nil) (string= (substring path -3) ".el"))
        (load (file-name-sans-extension fullpath)))))))

次に、〜/ .emacs.d / configに個別のファイルを配置します。

~/.emacs.d/config ls
01-packages.el  02-style.el  03-modes.el  04-keybindings.el  05-functions.el

そして、最後に〜/ .emacs.d / init.elにこれがあります:

;; Load all ".el" files under ~/.emacs.d/config directory.
(load "~/.emacs.d/load-directory")
(load-directory "~/.emacs.d/config")

リンクだけではなく、そのリンクにあるものの概要説明など、より多くの情報を提供したい。
ドリュー

そうです、答えを編集しました。
ボッカペルタ-IT 14年

ふむ 礼儀として、少なくとも、スワイプしたコードはtargzetaによって書かれたと言うべきでしょう。相互参照ページを要約することは、そのコンテンツを盗用することを意味しません。(あなたがあればもちろん、ある targzeta、その後、おそらく問題はありません。)
ドリュー

編集し直しました。ありがとう。
ボッカペルタ-IT 14年

ありがとう。(正しく行うには少し時間がかかりますが、それはすべての人にとってもう少し役立ちます。)
ドリュー

5

この特定の猫の皮を剥ぐ方法は明らかに複数あります。私の現在のお気に入りはoutline-minor-modeoutshineで使用することです。抜粋:

;; * This here is my emacs init file
;; ** Many subsections with headlines like this one omitted
;; ** Customising modes
;; […] more lines omitted
;; *** Org and outline modes
(autoload 'outshine-hook-function "outshine")
(add-hook 'outline-minor-mode-hook 'outshine-hook-function)
;; […] and more
;; * Emacs Magic
;;; Local Variables:
;;; mode: emacs-lisp
;;; coding: utf-8
;;; mode: outline-minor
;;; fill-column: 79
;;; End:

お気に入りのパッケージリポジトリから抜粋する必要があることに注意してください。


1
アウトラインマイナーモードから始めましたが、キーバインドが非常に苦痛であり、それについて自分で何もする時間を見つけることができませんでした。それで、org-modeを発見してからorgstruct-modeに移行しましたが、それからoutshineについて知りました。至福!現在、elisp、latex、およびその他のファイルを独自のメジャーモードですべての構造化にアウトライン+ outshineを使用し、すべての種類のノートにorg-modeを使用しています。
ハラルドハンチェオルセン14年

2

次の構造を使用して、パッケージとファイルを追跡します

~/.emacs.d
|-- elpa            ;; Package.el packages
|-- hack            ;; Development versions of packages (e.g. org, personal packages)
|-- single-lisp     ;; Individual lisp files from outside sources (e.g. EmacsWiki)
|-- site-lisp       ;; Lisp packages not managed by package.el (directories)
|-- user-config     ;; Machine/situation specific customization (work vs home)
|   `-- custom.el   ;; Customization settings
|-- lisp            ;; Individual .el files to keep init.el clean
|   `-- defaults.el ;; Default configuration settings
`-- init.el

次に、use-packageどのパッケージをロードし、各パッケージにどのカスタマイズを設定するかを管理します。唯一のほとんどの時間hackelpa、他のフォルダは、私がテストまたは使用簡単にしたいが(でも空回り)ロードする必要はありません。という単発のパッケージ、多くの場合、更新する必要があります

custom.el 設定をカスタマイズするためのもので、使用しないことを好みます(使用してもバージョンを作成しません)。

defaults.el一般的な構成(メニューバー、フォント、エンコーディングなど)のためのもので、.elファイルで上書きして、user-config/期待どおりに動作するシステムを可能にしますが、環境に合わせて調整できます。

私は以前に保つためにしようとしたfunctionsmacrosadvice定義にコンテンツ間の描写を可能にするために別々のパッケージではなく、RAN /そうにそれらの背中を入れてきた問題を必要としますinit.el。それらは最終的に戻るかもしれません~/.emacs.d/lisp/

私はinit.el整理し、機能と目的でコンテンツを並べ替えて、もう一度見つけることを簡単にします。私はモノリシックinit.elファイルを持っていて、最後に(またはそれが収まると思った場所に)新しいコンテンツを追加し続けましたが、それを探しに行ったときに追加したものや追加した場所を知らないことになりました(そしてを使用isearchして検索すると、当時の名前を覚えていないために役に立たないことがありました)。


2

既存の回答はすべて、手動で作成されたファイル(like init.elやfriends)を整理するためのベストプラクティスに対応しています。同様に重要なのは、さまざまなパッケージから自動的に作成されたすべてのファイルの編成であり、このためにパッケージno-litteringは優れています。


1

追加した

  (when (string= (buffer-name) "init.el")
    (setq imenu-generic-expression
      '((nil "^;; \\[ \\(.*\\)" 1))))

emacs-lisp-mode-hookに。次に、ファイルセクションに「yasnippet」、「packaging」、「java mode」などを追加します。これは、1000行のコード(コメントを含む)に適しています。

編集:最後に、helm-imenuでセクションを切り替えます。実際にヘルムは通常のimenu関数に自動的にフックするので、必要なのは

       (local-set-key (kbd "C-*") 'imenu)

フックの代わりにファイルローカル変数を使用している可能性があります。
YoungFrog

1

比較的小さな.emacsファイルを3つの部分に分割しました。

  • emacs-custom.elでカスタマイズし、大量の無駄なデータを削除します。ファイルはメインの.emacsファイルに触れることなく自動的に書き換えられ、誤った変更を防ぎます。

    (setq custom-file "~/.emacs-custom.el")
    (load custom-file)
    
  • 構成ではなくコード用のlg-lib.el:パッケージディレクトリからではなく、非標準のソースの場所から独自のライブラリをロードし、さまざまな機能を定義します(適切なパッケージがない場合、ほとんどがコピーおよびハッキングされます)。.emacs行数のもう1つの大幅な削減です。

    (load "~/lg-lib")
    
  • メインの.emacsファイル:かさばるコードとかさばるカスタマイズ変数なしで、requireパッケージの呼び出し、Customizeシステムの一部ではない変数、およびパッケージをロードして初期化するためのさまざまな関数呼び出しが含まれます。同じパッケージまたは機能に関連するすべての行を注意深く保持し、パッケージのロードおよびパッケージ関連の設定を「コア」機能からさらに分離することにより、「編成」します。かなり代表的な抜粋:

    (require 'ido)
    (ido-mode t)
    
    (require 'auto-complete)
    (add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
    
    (require 'auto-complete-config)
    (ac-config-default)
    (global-auto-complete-mode t)
    

    これらのセクションは小さなものですが、各パッケージの設定行が増えれば管理しやすくなります。


1

https://github.com/purcell/emacs.dなどの Emacsマスターのセットアップに従ってください

たとえば、手動でインストールされたパッケージとELPAからインストールされたパッケージを整理する方法に関して、Steven Purcellのセットアップには

a place for 3rd party code which isn't available in MELPA or other
package repositories. This directory and its immediate
subdirectories will be added to load-path at start-up time.

Notably, in Emacs 23.x, a backported package.el is automatically
downloaded and installed here

マスターに従うのはなぜですか?私の「1年でのマスターemacs」の主なポイントは、初心者がセットアップのオーバーヘッドと「落とし穴」を効率的に回避できることです。

多くの人が私に同意しないことを理解していますが、ここに私のケースがあります(私の記事で詳しく説明します):

Purcellの尊敬すべき(2014年11月の時点で1403 GitHubスター!)、安定した(開発中の5年)構成を使用して、Emacsの使用を開始しました。それから始めたにもかかわらず、私はまだ多くの問題を抱えていました。スティーブパーセルは、これらすべての問題の解決を助けてくれました。(私は実際に1年以上彼のパダワンになりました。)彼のセットアップを使用し、彼のレポの問題を使用して問題を報告し、彼の経験を活用することで、多くの時間を無駄にしませんでした。今日でも、git submoduleサードパーティのプラグインを管理するために使用している多くの人々を観察しています。スティーブと私git submodule両方とも、このようなPITAになる可能性があるため、この使用あきらめました

しかし、スキルに自信がある場合、または自己学習を好む場合、これはあなたの道ではありません。


2
マスターからセットアップを複製する」:素晴らしい機能やアドバイスを提供する可能性のある引用文献(特にチェックしていません)を特に考慮せずに、他のユーザーからinitファイルまたは他のセットアップを複製することから始めるべきだとは一般的には同意しません。問題につながる可能性があるため、これは明示的に推奨されないポリシーIIRCでさえあります。基本設定として使用するものは何でも、ゼロから始めて認識(さらには理解!)することをお勧めします。もちろん、他の人がやったことから学び、学ぶことには何の問題もありません。しかし、initファイルを盲目的にコピーすることはお勧めできません。(ちょうど1件の意見。)
ドリュー

1
実際、私は自分の記事を書いています。なぜなら、まだ多くの人々がセットアップの最初から始めるべきだと信じているからです。私が観察したように、それはほとんどの人にとって最良の方法ではなく、初心者にとっては不必要に難しい方法です。ちょうど検索
チェンビン14

1
それほとんどの人にとって最良の方法」です。他の誰かのinitファイルを使用して、議論やアドバイス開始するだけで検索してください。検索help-gnu-emacs@gnu.org、そしてwww.emacswiki.org、そしてemacs-devel@gnu.org、そしてdebbugs.gnu.org。とはいえ、自分の初期ファイルを共有して、他の人に思考の糧を提供することには何の問題もありません。アドバイスは、初心者がそのように始めないことです。アドバイスは、人々が自分のスタートアップのアプローチとヒントを共有しないことではありません。
ドリュー

1
「サバイバーシップバイアス」が原因です。emacswikiやメーリングリストを知る前に多くの人がgiveめます。
陳ビン

0

.emacs.dフォルダをクリーンアップするための革新的で簡単な方法は、org-modeソースブロックを使用してすべてを使用し、輪郭を描くことです。次に、.emacsファイルでをポイントしますconfig.org

これに関する素晴らしいリソースは、Harry Schwartzです。彼は感動するyoutubeビデオ詳細を説明するブログ投稿を持っています。私はemacs noobとしてそれに従い、すべてのセットアップを取得することができました。魔法のように機能します。私の全体のための1ファイルinit

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.