emacs 
 2018-11-20

これまで長い間放置しててきたemacsの設定たちを見直すついでに、use-pacakgeを使ってみようと思う。
https://github.com/jwiegley/use-package

use-packageとは、emacsのパッケージ管理を強化するパッケージです。

use-packageのマクロを使用することで、

  • 統一した記述による可読性が向上
  • パッケージの遅延ロードの設定を簡潔にかけることによる起動の高速化

などのメリットがあります。

シンプルな例

requireでのライブラリの読み込みは次のように書き換えることができます。

 (require 'foo)
 (use-package foo)

use-packageではキーワードを使うことで、パッケージロード時の振る舞いを指定することができます。

:init

パッケージが読み込まれる前に実行される。

 (use-package foo
   :init
   (setq foo-variable t))

:config

パッケージがロードされた後に実行される。

(use-package foo
  :init
  (setq foo-variable t)
  :config
  (foo-mode 1))

:commands

auto-loadするコマンドを指定する。

(use-package color-moccur
  :commands (isearch-moccur isearch-all)
  :bind (("M-s O" . moccur)
         :map isearch-mode-map
         ("M-o" . isearch-moccur)
         ("M-O" . isearch-moccur-all))
  :init
  (setq isearch-lazy-highlight t)
  :config
  (use-package moccur-edit))

この場合、isearch-moccurisearch-allcolor-moccur.elからauto-loadされる。

key-binding

:bindキーワードを使用し以下のように設定する。

(use-package ace-jump-mode
  :bind ("C-." . ace-jump-mode))

リストを使い以下のように複数のキーバインドを設定することも可能

(use-package hi-lock
  :bind (("M-o l" . highlight-lines-matching-regexp)
         ("M-o r" . highlight-regexp)
         ("M-o w" . highlight-phrase)))

キーバインドは:initと::commandsキーワードを使用し、以下のようにも設定できる。

 (use-package ace-jump-mode
   :commands ace-jump-mode
   :init
   (bind-key "C-." 'ace-jump-mode))

:mode

拡張子とメジャーモードの対応づけはauto-mode-alistで行なっていたが、:modeキーワードを使うことで簡潔に設定できるようになります。

(use-package python-mode
  :mode (("\\.py\\'")
             ("\\.pyx\\'"))
  )

:interpreter

シェバンとメジャーモードの対応づけは、:interpreterキーワードを使って設定できます。

 (use-package python-mode
     :interpreter (("python" . python-mode)
                        ("python" . python-mode))

:hooks

:hookキーワードを使用して、以下のように設定できます。

 (use-package ace-jump-mode
    :hook prog-mode)
	
  (use-package ace-jump-mode
    :hook (prog-mode . ace-jump-mode))

また、従来のようにadd-hookを用いても設定が可能。

 (use-package ace-jump-mode
     :commands ace-jump-mode
     :init
     (add-hook 'prog-mode-hook #'ace-jump-mode))

まとめ

use-packageの使い方を簡単にまとめてみました。このくらいあればある程度の設定はできるでしょう。余力があれば加筆します。

See Also