Emacsパッケージ管理

Evil化したことによりエディタとしての力を取り戻したEmacsだが物足りない部分が多々あるので、これからVimに変わってやってもいいぜ。くらいに成長させようと思う。

ググってると、package.elとel-getを併用するのがいい感じな気がしたのでその方法でパッケージを管理します。



package.el

emacs24からはデフォルトでパッケージ管理ツールpackage.elが使える。

package.elから参照できるパッケージを増やすために以下のコードをinit.elの出来るだけはじめの方に書いておきます。

;; Package Manegement
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(opackage-initialize)

M-x list-packageで開かれるバッファから、’i’でパッケージを選択して’x’でインストールすることができます。

正直手動でやんの!?って感じなので、いい方法を探したところありました。

init-loader.el と package.el を導入して快適 Emacs ライフ - Qiita [キータ]

init.elに以下のコードを追加します。

;; auto install
(require 'cl)
(defvar installing-package-list
  '(
    ;; package list
    evil
    evil-leader
    evil-numbers
    evil-nerd-commenter
    ))
(let ((not-installed (loop for x in installing-package-list
                            when (not (package-installed-p x))
                            collect x)))
  (when not-installed
    (package-refresh-contents)
    (dolist (pkg not-installed)
        (package-install pkg))))

;; package list以下にパッケージ名をリストアップすれば起動時にインストールされていなかった場合、自動でインストールしてくれます。

el-get

dimitri/el-get · GitHub

el-getのインストールは*scratch*でelispを実行することで行う。

C-x b *scratch*を入力して表示されたバッファに以下をコピー

(url-retrieve
 "https://raw.github.com/dimitri/el-get/master/el-get-install.el"
  (lambda (s)
     (goto-char (point-max))
        (eval-print-last-sexp)))

最後の行でC-x C-eをすると実行されインストール。

emacsすげー。elisp処理系的に。

M-x el-get-list-packagesでrecipe一覧を表示できるので’i’で選択’x’でインストール。

mitri/el-get · GitHub によると以下の設定を書いておくといいらしい。

最新のパッケージに自動で更新してくれるとかそういうことだろうか?

(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.github.com/dimitri/el-get/master/el-get-install.el")
    (goto-char (point-max))
    (eval-print-last-sexp)))

(el-get 'sync)

外部パッケージの追加

el-get-sourcesを書くとrecipeを追加できる。

;;; define el-get repository
(setq el-get-sources
      '(
        (:name open-github-from-here
               :type github
               :description "open github from here"
               :pkgname "shibayu36/emacs-open-github-from-here"
               :branch "development")
        (:name anything-git-files
               :type github
               :pkgname "tarao/anything-git-files-el")
        ))

GitHubリポジトリの場合が多いので、基本的に2つ目の設定のように書いておけばいい気がする。

el-getリポジトリの自動更新

;; auto install el-get.el
(defvar my/el-get-packages
  '(
    open-github-from-here
    anything-git-files
    )
  "A list of packages to install from el-get at launch.")

(el-get 'sync my/el-get-packages)

こんな感じのinit.elになった

;;
;; init.el
;;

;; Language.
(set-language-environment 'Japanese)

;; Coding system.
(set-default-coding-systems 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)
(prefer-coding-system 'utf-8)

;; Package Manegement
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)

;; usable evil
(require 'evil)
(evil-mode 1)

;; define el-get repository
(setq el-get-sources
      '(
        (:name evil-plugins
               :type github
               :pkgname "tarao/evil-plugins")
        ))

;; el-get basic setting
(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.github.com/dimitri/el-get/master/el-get-install.el")
    (let (el-get-master-branch)
      (goto-char (point-max))
      (eval-print-last-sexp))))

(el-get 'sync)

;; auto install package.el
(require 'cl)
(defvar installing-package-list
  '(
    ;; package list
    evil
    evil-leader
    evil-numbers
    evil-nerd-commenter
    ))
(let ((not-installed (loop for x in installing-package-list
                            when (not (package-installed-p x))
                            collect x)))
  (when not-installed
    (package-refresh-contents)
    (dolist (pkg not-installed)
        (package-install pkg))))

;; auto install el-get.el
(defvar my/el-get-packages
  '(
    evil-plugins
    )
  "A list of packages to install from el-get at launch.")

(el-get 'sync my/el-get-packages)

;;
;; Plugin
;;