2015年Emacsパッケージ事情

  • 200
    いいね
  • 0
    コメント

Emacsは「拡張可能なテキストエディタ」と呼ばれ1、エディタとしての基本的な機能ですらユーザーが柔軟にカスタマイズできます。

最初から同梱されてるライブラリだけではなくWebにあるEmacs Lispパッケージを導入することで、べんりなインターフェイスや強力な編集機能、追加の言語サポートを取り入れることができます。

さて、そのEmacs Lispパッケージの管理方法については大きく変化があるので、この記事では近年の潮流について紹介します。

読むのがめんどくさいひとのために結論

Emacsを最新版にして、Caskを入れよう!!!!

  • Caskをインストールすると…
    • パッケージリポジトリとして、デフォルトでMELPAが登録されます
    • Palletがインストールされ、M-x package-installとCaskが統合されます
  • この記事にはWindows向けの説明はありませんので気をつけてください
  • El-Getも良いものですが、この記事ではpackage.elとCaskの話です
  • 有用な新作Emacs Lispパッケージは @rubikitchるびきち「日刊Emacs」で紹介してます
  • [Ad] 毎週土曜22時からinit.el読書会に参加しよう

よびかたについて

先に書いた通り、EmacsはLispと呼ばれるプログラミング言語で記述されたテキストエディタです。ただしLispはシンプルなプログラミング言語なので、いくつもの亜種(方言)があります2。EmacsのLispなので、ふつうは「Emacs Lisp」と呼ばれます。また、縮めて「elisp」と呼ばれることもあります3

Emacsユーザーによって作成されたプログラム/ライブラリの単位を何と呼称するかは定まって居らず、単に「拡張/extension」や「elisp4」と呼ばれてきました。Emacs 24からは後述するpackage.elが標準機能として同梱されたこともあり、「パッケージ/package」と呼ぶことが定着してきました。

以上のような経緯から、Emacsの拡張プログラムを「プラグイン/plug-in」と呼ぶことは(あまり)ありません。EmacsWiki: Emacs Pluginでは、Emacsのコア機能を拡張する(ex. 動画/音声の表示やWebブラウザのレンダリングなど)ための外部プログラムを指して「プラグイン」と呼びます。また、Emacs上に構築されたHelm/AnythingやMagitなどのフレームワークの拡張を指して「プラグイン」とも呼ばれます。

前史

Emacsの解説書として「Emacsテクニックバイブル」(るびきち著, 2010年)や「Emacs実践入門」(大竹智也著, 2012年)があり、どちらも現在でも通用する内容は多いのですが、パッケージ周りに関しては大きな変化がありました。

後者の出版された記事がEmacs 24の正式リリース直前だったこともあり、Emacs 24のpackage.elの機能についても触れられてます。ただし、当時はまだ主流で環境が整ってなかったため、紹介程度に留められてます。

ちなみに両書籍で紹介された手法はauto-install.elを利用してEmacsWikiからダウンロードする方法でした。

バージョンについて

最新のEmacsの安定バージョンは2015年4月にリリースされた「24.5」です。また、2016年8月現在の開発版は25.1rc1(リリース候補版)で、次期安定版の正式リリース25.1に向けて目下作業中の段階です。

Emacsは世間で思ひ込まれてるほど枯れて進歩のないソフトウェアではなく、旺盛な進化の途上にあります。

残念なお知らせ ですが、Macに最初からインストールされてる/usr/bin/emacsは最新のOS X El-Capitanにおいても更新されず2007年にリリースされた22.1.1で、異常に古いままです。古いEmacsは最新のべんり機能やライブラリに対応できないのはもちろんですが、Unicodeを正しく読み書きできないなどさまざまな問題があります。

Emacs24系であればある程度は問題ありませんが、最新版を導入しましょう。24.4では多くの機能追加があり、MELPAに登録されたパッケージには24.3以前のバージョンをサポート対象としないものが少なからずあります。

El-Get

本題に入る前にまた話題が逸れるのですが、El-Getは公式のパッケージ機能と人気を二分するパッケージマネージャとレシピ集(リポジトリ)です。この記事では詳しくは説明しませんが、標準のpackage.elとは別の実装なので、導入はどちらかにした方が良いでしょう。

人気を二分するだけあって、El-Getもよくできたパッケージマネージャーなので、興味があればCaskはもう古い、これからはEl-Get - いまどきのEmacsパッケージ管理 - 貳佰伍拾陸夜日記を読んでみるといいでしょう。

package.elの夜明け

Emacs 24.1がリリースされたのは2012年6月10日でした。Emacs 24でどのような機能が取り入れられたかについてはEmacs24 のインストールと新機能 : 紹介マニアに詳しいのですが、この記事の趣旨としての目玉機能はもちろんパッケージ機能です。

M-x list-packagesと打ち込んでみましょう。

list-packages

何も設定をしてない状態でも100超のパッケージがインストールできる状態です。この画面の操作方法などはpackage.el - Emacs JPをお読みください。

これは、GNU Emacs Lisp Package Archive(ELPA)だけが登録された状態です。ELPAにパッケージを登録するには書面での手続きが必要など低くない敷居があるため、現在のところ収録数も少なく、更新頻度も低いです。

MELPA

package.elには公式のリポジトリだけではなく、有志が用意したパッケージリポジトリを追加することも可能です。

現在もっとも活発に更新されてるリポジトリはMELPA (Milkypostman’s Emacs Lisp Package Archive) です。このプロジェクトには毎日多くのパッケージが追加・更新されてます。

その特徴は、GitHubやBitbucketなどのGitホスティングサイトと連携されてゐることです。パッケージ開発者はmasterブランチにpushするだけで最新版としてリリースすることができ、ユーザーはすぐさま最新版を利用できます(最新版を利用したくない場合は後述のmelpa-stableが利用できます)。

その更新の活発さはTwitterのMELPA(@melpa_emacs)アカウントの更新通知を見れば一目瞭然です!

MELPAを有効にするには、~/.emacs.d/init.elに追加するだけです。ただし、以下に紹介するCaskと併用する場合は、この記述は必要ありません。

init.el
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/"))

最新の導入方法は Getting Started - MELPAにあります。また、Webからパッケージを探したいときはmelpa.orgで簡単に絞り込み検索できるので良いです。

自作のEmacs Lispパッケージを公開することに興味のある型はMELPAにレシピを投稿するにはをお読みください。

melpa-stable

MELPAではmasterにpushされた最新の状態が取得されますが、その裏返しとして正式リリースではない、不安定なバージョンが落ちてくる可能性もあります。

上記に加へて次のコードを足すと、バージョン番号(タグ)が付いた安定バージョンが優先して取得されるようになります。

init.el
(add-to-list 'package-archives
             '("melpa-stable" . "https://stable.melpa.org/packages/") t)

先程書いた通り、以下で紹介するCaskを併用する場合は不要です。

Cask

cask/caskは、ちょうどRubyのBundlerのようなツールです5

Caskの長所についてはpackage.elから Caskに切り替えました - syohex’s diaryに詳しいので、こちらをお読みください。

Caskを利用するには依存するパッケージを~/.emacs.d/Caskファイルに記述することになるので、環境を作り直すときに依存するライブラリを復旧しやすくなるのが非常に大きなメリットです。

% cd ~/.emacs.d
% cask init
% cask install

CaskファイルにはCask作者おすすめのパッケージが最初から登録されてます。また、MELPAも最初から登録されてますが、先程紹介したmelpa-stableを利用したい場合は、ファイル先頭に(source melpa-stable)を追加してください。

パッケージのインストール・更新をするときは、必ず~/.emacs.dに移動する必要があることに注意してください。

package.elを利用した場合はパッケージは~/.emacs.d/elpa/以下にインストールされますが、Caskを利用すると~/.emacs.d/.cask/以下に保存されるようになるので気をつけてください。(その点、後述するPalletを組合せるのがオススメです)

Caskファイルの書き型の資料はCask Domain Specific Languageにあります
。また、わたしのCaskファイルはzonuexe/dotfiles:/.emacs.d/Caskです。

Pallet

rdallasgray/palletはpackage.elとCaskを統合するライブラリです。

Caskはコマンドラインツールなので単体で利用すると一旦Emacsを終了してからCaskファイルを変更してインストールまたはアップデートしたあと再起動する必要があります。

具体的には、標準機能のM-x package-installでパッケージをインストールしたときにもインストール先が~/.emacs.d/.cask/にまとめられ、また~/.emacs.d/Caskファイルに追記してくれます。

また、コマンドラインを利用せずEmacsからM-x pallet-installM-x pallet-updateを利用可能にもなります。

そのほかのリポジトリ

必要になるまで追加しなくて良いと思ひます。MELPAが定着する前はMarmaladeがよく利用されてましたが、わたしは登録したことがありません。

つまりどうすればいいの?

Emacsの最新版とCaskを入れよう!!!!

Caskをインストールし、cd ~/.emacs.d; cask init; cask installすると、パッケージリポジトリとしてMELPAが登録され、先に紹介したPalletのほか、人気のあるパッケージがインストールされた状態になります。

わたしは新しいパッケージをインストールするときはM-x package-installでインストールします。Helmなどを利用してると、パッケージ名の絞り込みができて便利です。

今後のメンテナンスについて

気が向いたときに cd ~/.emacs.d; cask update すると、パッケージがインストールできます。

ごくまれにパッケージに大きなアップデートがあってEmacs起動時にエラーが出るようになってしまったとき6rm -rf ~/.emacs.d/.cask; cask installすると、クリーンな状態に戻ります。

~/.emacs.dディレクトリはGit管理しておくと良いでしょう。init.elCaskがバージョン管理されてあれば、復旧が容易になります。

わたしはGitHubで.emacs.dを公開して居ります。バージョン管理の対象外にするファイルなどは.emacs.d/.gitignoreが参考になるかもしれません。

おまけ

設定ファイルの書き方

Emacsの設定ファイルは~/.emacs.d/init.elに置きます。~/.emacs~/.emacs.elは古い形式なので、init.elに書いてください。

これは実は最近に限った話ではないのですが、パッケージマネージャーを使ってインストールしたパッケージは基本的にrequireする必要がありません。Emacsにはオートロードの仕組みがあり、パッケージマネージャーはインストール時にソースコードからオートロードに必要なファイルを生成してくれるからです。

初期化ファイルに不必要なrequireを書かないことで、Emacsの起動時間の短縮を期待できます。また、パッケージマネージャー経由でインストールしたパッケージでもお作法に則ってないものに関しては引き続きrequireを書くことになります。

また、init.elを書くときにはuse-packageを利用すると便利です。詳しくはuse-packageで可読性の高いinit.elを書くをお読みください。

Emacsパッケージを書くには

かんたんなEmacsパッケージ(メジャーモード)を書き上げるまでの一連の流れはpixiv-novel-modeを作った - pixiv insideに書きました。

いろいろ書きましたが、Flycheckを利用すると、Emacs Lispの作法に違反した書きかたや抜け漏れを指摘してくれるので、強くオススメします。Flycheckでモダンなシンタックスチェック - Qiitaに詳しいです。

パッケージを書いたらリポジトリに登録しませう。一通り完成したらMELPAとEl-Getに登録するのがおすすめです。

以下、わたしがいままでに送ったレシピ追加依頼の例。

雑な英語でも意外にコミュニケーションできる気がする。

MELPAのひとはコーディングスタイルがお作法に則ってるか、ちゃんとレビューしてくれるので、先に送るのがオススメです。

ちなみにわたしが初めて作ったパッケージは既存のパッケージと完全に機能が重複して下位互換な上にバグってるとの理由で蹴られました ヾ(〃><)ノ゙

Emacsでわからないことがあったら

日本語で雑に質問できるチャンネルはいろいろあります。

あと、毎週土曜の22時からLingrでinit.el読書会やってるので気軽に参加してみよう。

改版履歴

  • 2015年11月2日: 初版公開
  • 2016年8月21日: 修正・表現の変更および、現在時点での情報を反映

脚注


  1. https://packages.debian.org/ja/wheezy/emacs23 

  2. 方言とはいっても互換性の差は大きく、ほかの種類のLispで書かれたプログラム/ライブラリをEmacsでそのまま動かすことは困難です。ただし、ほかのLisp方言の特徴や流行は継続的にEmacsに持ち込まれてます。 

  3. Emacsとは無関係な古い「Elisp」が存在するらしく(伝聞)、プログラミング言語名としては「Emacs Lisp」と呼ぶ方が好まれます。ただし、Emacsのソースコード内でも「elisp」と記述された箇所は少なくなく、この呼び名が誤りであるとも言切れません。 

  4. El-Getの説明文にはManage the external elisp bits and pieces upon which you depend!とあります。 

  5. Homebrew Caskとは名前がかぶってますが、無関係な別のツールです。 

  6. 最近ではMagitがバージョンアップしたときにありました