Emacsに拡張機能を追加した話

2017.6.13 追記

書き直しました。

hakumai164.hatenablog.com

 

MacBook Airを購入して半年以上過ぎているが、今に至るまでテキストエディタは、春先の講義でEmacsを使わされたことから特に何も考えずそのまま使用している。 

しかし、「Emacsはカスタマイズしてなんぼ」という話を頻繁に聞きながら「拡張機能なにそれおいしいの」みたいな使い方をするのもさすがにどうなのよ、と思ったのでじゃちょっと調べてみよう、ってなった話。

パッケージ管理機能を使う

Emacsのバージョンが24以上ならば、スクリプトpackage.elが標準で追加されており、「M-x package-list-packages」と入力することで導入可能な拡張機能の一覧を表示できる。

普段はターミナル上でEmacsを起動して使用しているので、今回も同様に起動して入力してみたが、受け付けなかった。

f:id:hakumai164:20141128225236p:plain
"No Match"と言われる

 

とりあえずバージョン確認。 

f:id:hakumai164:20141128230513p:plain

"Emacs22.1.1"との表示が

 

Emacs22。調べたところ(http://www.gnu.org/software/emacs/history.html)、2012年にはEmacs24がリリースされているので、だいぶ古い。

今度は後に手動で導入したEmacs.appで試してみる。
LanchpadからEmacs.appを起動してみたところ、

 

f:id:hakumai164:20141128230834p:plain
こちらは"Emacs24.3.1"

 

こちらはEmacs24。ほぼ最新のものである。
(ここまできてやっと「ターミナルから起動しているMacOSXに標準で導入されているEmacsと自分で導入したEmacsが全く別の独立したアプリケーションである」という事に気づいた)

Emacs 24ならば「M-x package-list-packages」と入力することで拡張機能の一覧が表示される。

f:id:hakumai164:20141128231053p:plain f:id:hakumai164:20141128231103p:plain
パッケージ名をクリックすることで説明の確認とインストールが可能

 

この機能によって導入された拡張機能は ~/.emacs.d/elpa 内に保存され、Emacsを起動した時に自動で読み込まれる。

~/.emacs.d/
├──auto-save-list
├──elpa
└──init.el

手動で追加

elpaと同じ階層に置かれているinit.elはEmacsの設定が保存されている。

上記の方法以外にも、このファイルに直接追記することで拡張機能の導入が可能であり、バージョンが24未満で上記の方法が使えない場合はこの方法となる。

(ここで、ターミナル上で動くEmacsと手動で導入したEmacsでバージョンが異なる(前者が22.1.1、後者が24.3.1)が、.emacs/dフォルダは共通なので、互換性を考慮してそれぞれ別のelファイルを使用するようにする。
今回は前者をinit22.el、後者をinit24.elとした)

元のinit.elには、Emacsのバージョンに応じて使用するelファイルを変えるように追記する。

;init.el
(setq preferences-directory "~/.emacs.d/")
;"preferences-directroy" という変数の中身を"~/.emacs.d/" とする

(defun load-file-in-dir (dir file)
 (load (concat dir file)))
;"dir"と"file"という2つの引数をとる関数"load-file-in-dir"を新たに定義
;(dirとfileの中身を結合させた文字列).elを読み込む

(cond
 ((string-match "^24\." emacs-version)
 (load-file-in-dir preferences-directory "init24.el"))
 ((string-match "^22\." emacs-version)
 (load-file-in-dir preferences-directory "init22.el")))
;条件分岐
;変数emacs-version に"^24." という文字列が含まれていた場合
;"~/.emacs.d/init24.el"を読み込む
;変数emacs-version に"^22." という文字列が含まれていた場合
;"~/.emacs.d/init22.el"を読み込む

今回は行番号を左側に表示する拡張機能を導入してみる。

と言っても、Emacs23以降ならばこの機能は標準で専用のスクリプトが導入されているらしく、init.el(ここではinit24.el)に追記するだけで良い。

;init24.el
(global-linum-mode t) ;変数global-linum-modeの値を真にする(有効にする)
f:id:hakumai164:20141128234554p:plain
左側に行番号が表示された

 

Emacs22ではまず自分でスクリプトを持ってくる必要がある。
(EmacsWiki)
http://www.emacswiki.org/emacs/line-num.el

ここでは.emacs.dの下に、Emacs22用のスクリプトを保存するフォルダとしてplugin22を作成し、その中にlinum.elとして保存する。

~/emacs.d/
├──auto-save-list
├──elpa
├──init.el
├──init22.el
├──init24.el
└──plugin22/
          └──linum.el

しかし、このままでは保存しただけでEmacsを起動してもlinum.elを読み込まないので、 plugin22の中に追加したelファイルを、Emacsを起動した時に自動で読み込むように設定を追加する(load-pathを追加する)必要がある。

;init22.el
(setq load-path (cons "~/.emacs.d/plugin22" load-path))
;変数load-path に "~/.emacs.d/plugin22" を追加 (require 'linum)
;(linum.elが読み込まれていない場合は)linum.elを読み込む
(global-linum-mode t)
;//変数globa-linum-modeの値を真にする

これでEmacs22でも行番号が表示されるようになる。

f:id:hakumai164:20141129000239p:plain
こちらでも左側に行番号が表示された

まとめ

Emacs拡張機能を導入するには、

(1)スクリプト保存用のフォルダを用意し、その中にスクリプトを保存する
(2)init.elにload-pathにそのフォルダを追加するように記述
(3)require関数で読み込む
(4)設定を弄るなりなんなり

で出来る。Emacs24ならばパッケージ管理機能も標準で導入されている。