2014/08/20

Emacsをpackage.el + el-get環境に移行させた

久しぶりに、Emacsの設定などを見直しました。

  • Emacs Mac Portにした
  • package.elで起動時にインストールするようにした
  • el-getを使うようにした
  • init-loaderを使うようにした

Emacs Mac Port

山本光晴氏によるいろいろなパッチを当てられたEmacsで、バイナリもあります

入れたらいろいろ幸せになれるらしいので入れてみました。 導入後、すぐにMetaとOptionを入れかえました。

いろいろな変更があるっぽいですが、個人的に一番嬉しいのはスワイプスクロールが滑らかになる点。

init-loader

Qiitaエントリを参考にして、init-loaderを導入しました。

上記エントリのコメントを参考に、起動時に (必要なら) パッケージを初期化しつつinit-loaderをパッケージから導入するようにしています。

(require 'package)
(package-initialize)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))

(my:package-install-if-needed 'init-loader)
(require 'init-loader)
(init-loader-load (expand-file-name "~/.emacs.d/conf.d"))

なお、環境ごとのプレフィックスは、99foobar.elみたいなのよりも後に読み込まれてしまうのと、「これ以外の環境」みたいなのが書けないので利用せずにsystem-typeとかで自力で判定しています。

marmaladeはデータの取得が遅すぎたので利用していません。

package.elとパッケージ削除

package.elについても上記のQiitaエントリを参考にしています。

個人的にはリストにないパッケージは自動で削除して欲しかったので、そのコードを追加しています。

(defvar installing-package-list
  '(
    anzu
      ;
    volatile-highlights
    ))

(let ((not-installed-packages (loop for x in installing-package-list
                                    when (not (package-installed-p x))
                                    collect x))
      (not-listed-packages (cl-nset-difference package-activated-list
                                               (my:package-all-dependencies installing-package-list))))
  (when not-installed-packages
    (package-refresh-contents)
    (dolist (pkg not-installed-packages)
      (package-install pkg)))

  (when not-listed-packages
    (my:require 'pkg-info)
    (dolist (pkg not-listed-packages)
      (let* ((pkgs (format "%s" pkg))
             (ver (pkg-info-package-version pkg))
             (vers (pkg-info-format-version ver)))
        (package-delete pkgs vers)))))

今のところ、次のような問題があります。

  • パッケージの自動アップデートがない
  • パッケージを特定バージョンでピンできない
  • コンパイル時にファイル開きすぎエラーになることがある

パッケージの自動アップデートについては、次の設定ファイルでは起動時に1週間以上経っていたら自動でパッケージ更新する機能を実装しているようなので、機能追加したいところ。

上記リポジトリはパッケージ一覧取得関連のコードを書くときにも参考にさせていただきました。

el-get

el-getはddskkneotreeを入れるためだけに利用しています。

GitHubリポジトリならパッケージとしてインストールするのも難しくありません。

(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(require 'el-get)
(setq el-get-dir "~/.emacs.d/el-get")

(setq el-get-sources
      '((:name neotree
              :type github
              :pkgname "jaypei/emacs-neotree")))

(el-get 'sync '(neotree))

package.elでは入れられないものでもel-getで入れられたりするので、package.elの補完的なものだと思うと割と便利な気がします。

ちなみに、el-getはWindowsだと導入がわりと面倒だったりするので、el-getはgitのサブリポジトリとして入れています。

おすすめパッケージ

次の2つの記事を参考にして、パッケージをいくか導入したりしました。

上記の記事内でお勧めなのは、yankの場所がハイライトするようになるvolatile-highlights.elです。

この2記事にないお勧めパッケージとしては次の2つがあります。

2014.08.22 追記

C-u 0 C-;でマッチ範囲を関数内に限定できるので、下で紹介している方法よりも、そちらのほうが便利かもしれません。

narrow-or-widen-dwimはnarrowingをトグル操作にしてくれるパッケージで、ieditは以前に紹介した同じキーワードを同時に編集するパッケージです。

この2つを組み合わせると、メソッドでの変数名の変更なんかも次のように簡単にできます。

上のgifは変数pparticlesに変更する例です。

メソッド内でリージョン選択していないならnarrow-or-widen-dwimnarrow-to-defunを実行します。そこからieditで変数名をインタラクティブに変更します。最後に再びnarrow-or-widen-dwimすると、narrowing中なのでwidenされます。

さらに、expand-regionと組み合わせると、ブロック内での変数名の変更を行うこともできます。 まあ、範囲選択はShift-矢印のほうが楽かもしれませんが。

Caskを使っていない理由

EmacsはMacとWindowsで利用しています。

なので、CaskはWindowsで利用するのがちょっと面倒だったので諦めました (最近出たCask v0.7.1だと大丈夫かも)。

まとめ

Emacsの設定は次のリポジトリにありますので、ご自由にどうぞ。

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。