

Emacsを沢山のOS・マシン上で動かすため、パッケージ管理について良い方法を探しています。

Emacsのバージョンは現在の最新24.4です。どのようなマシンでもこのバージョンなため、最新版以外で動くことを考慮しなくて良いです。

欲しい回答は、以下の好ましい方法を可能な限り実現出来ている方法です。

  * 設定ファイルとEmacsのパッケージのみで完結する(OSにコマンド等を入れる必要がない)
  * 複数のOS(Windows含む)で動く
  * パッケージ自動インストールが可能
  * (上に繋げて)Gitプロトコル等を使い、リポジトリ以外の所からパッケージを取得出来る(つまり、いわゆる野良パッケージを自動でインストール出来る)
  * 設定を簡単に書ける

勿論、以上の好ましい手法以外のメリットがある方法もあれば嬉しいですし、全てを満たす必要はありません。

試行錯誤としては、Package.el+自作の関数群やQuelpa、Caskを試しました。ですが、どれも条件の全ては満たさなかったと考えています。

現在はPackage.elに以下のようなコマンドを実装して、パッケージをインストールする際に使っています。

[code]

    (defvar my/favorite-packages
      '(package names here))
    (defun  set-pac ()
      "my package install command"
      (interactive)
      (package-refresh-contents)
      (dolist (package my/favorite-packages)
        (when (not (package-installed-p package))
        (package-install package))))
    
[/code]

何か他にももっと条件を満たす、良い方法が無いでしょうか？


CC BY-SA 3.0
2014-12-19T15:07:58.903
2157
2015-01-09T15:33:38.847
2014-12-22T09:21:40.667
4632
4632
question
emacs
Emacsパッケージ管理の良い方法について


質問者ですが、この問題に対し一定の成功しているやり方を持っているため投稿します。

init.elもしくは任意の.el(ここではhoge.elとします)で以下の物を定義します

[code]

    (require 'package)
    (add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
    (add-to-list 'package-archives  '("marmalade" . "http://marmalade-repo.org/packages/"))
    (package-initialize)
    
[/code]

ここではパッケージの使用、使用するリポジトリの追加、パッケージ初期化を行なっています。必要に応じてリポジトリは変更してください。

[code]

    (defvar my/favorite-packages
      '(package names here))
    
[/code]

ここではリストを定義して、パッケージの名前を **そのまま** 表記します。`popwin`といった風にです。

[code]

    (defun  set-pac ()
      "my package install command"
      (interactive)
      (package-refresh-contents)
      (dolist (package my/favorite-packages)
        (when (not (package-installed-p package))
        (package-install package))))
    
[/code]

これはパッケージ情報を更新し、入っていないパッケージをインストールするコマンドです。

パッケージをインストールする為には以下のどちらかを行ないます。

  * Emacsを起動した後、M-x set-pacと実行する
  * `emacs --batch -l path/to/hoge.el -f 'set-pac'`

path/to/hoge.elは上の変数と関数を定義したinit.elもしくは任意の.elの場所を書いてください。
init.elにて定義した場合は恐らく`~/.emacs.d/init.el`となるでしょう。

この方法は、EmacsのPackage.elで扱えるパッケージならば、Emacsが動く複数のOSで自動インストールが出来る上に設定ファイルとEmacsのみで完結しています。

誰かの参考になれば幸いです。

追記: koshさんがuse-packageと良い回答をくださっていて、use-packageは大変良い拡張でした。 ですが、use-
packageはブートストラップ問題に陥るため、package.elのみでuse-packageを自動インストールするEmacs Lispを書きます。

この回答の中の最初のコードブロックを前提とします(requireしている所です)

[code]

    (when (not (package-installed-p 'use-package))
      (package-refresh-contents)
      (package-install 'use-package))
    
    (require 'use-package)
    
[/code]

このような物をinit.elのuse-packageを使う部分の前に書くと、特に手動でインストールしなくても、そのままuse-
packageを使えるようになります。

こちらも何かの参考になれば幸いです。


CC BY-SA 3.0
2014-12-20T14:13:25.627
2254
2014-12-21T16:20:16.440
2014-12-21T16:20:16.440
4632
4632
2157
answer


[use-package](https://github.com/jwiegley/use-package) を利用するのはどうでしょうか。

  * [use-packageで可読性の高いinit.elを書く- Qiita](http://qiita.com/kai2nenobu/items/5dfae3767514584f5220)

ロード後の設定、条件分岐、遅延ロード、キー設定など.emacs
を書く際に必要な要素はひと通り揃っています。おまけにライブラリの読み込みと設定をひとつのS式でまとめられるため、可読性も良くなります。

package.el による外部パッケージの自動インストールが必要ならば、引数に `:ensure t`
を追加してください。これがない場合は自動インストールは行われず、設定はスキップされます。

[code]

    (use-package magit
      :ensure t)
    
[/code]


CC BY-SA 3.0
2014-12-20T18:37:23.117
2293
2014-12-20T18:37:23.117
2391
2157
answer


[`el-get`](https://github.com/dimitri/el-get) はいかがでしょう？

こんな感じのレシピ(例: `~/.emacs.d/el-get-user/recipes/migemo.rcp` )を書いておけば、

[code]

    (:name migemo
       :description "Japanese incremental search trough dynamic pattern expansion."
       :website     "http://0xcc.net/migemo/"
       :type        github
       :pkgname     "emacs-jp/migemo")
    
[/code]

`.emacs` もしくは、 `.emacs.d/init.el` に以下のように書いておくだけで起動時にインストールできます。

[code]

    (add-to-list 'load-path "~/.emacs.d/el-get/el-get")
    
    (unless (require 'el-get nil 'noerror)
      (with-current-buffer
          (url-retrieve-synchronously
           "https://raw.githubusercontent.com/dimitri/el-get/master/el-get-install.el")
        (goto-char (point-max))
        (eval-print-last-sexp)))
    
    (add-to-list 'el-get-recipe-path "~/.emacs.d/el-get-user/recipes")
    (el-get 'sync)
    
    (el-get 'sync 'migemo)
    
[/code]

### 追記 by @uchida

elpa パッケージにも対応しております。

`.emacs.d/init.el` に上記を記述した場合は、以下のように記載することで elpa パッケージからレシピを `~/.emacs.d/el-
get/el-get/recipe/elpa` 以下に作成できます。

[code]

    (require 'el-get-elpa)
    (unless (file-directory-p el-get-recipe-path-elpa)
      (el-get-elpa-build-local-recipes))
    
[/code]

そのため自作レシピに加え elpa のパッケージも合わせて以下のようにしてインストールできます。

[code]

    (defvar my/el-get-packages '(package names here))
    (el-get 'sync my/el-get-packages)
    
[/code]


CC BY-SA 3.0
2014-12-25T06:01:21.797
2547
2015-01-09T15:33:38.847
2015-01-09T15:33:38.847
4978
5727
2157
answer