2010年代のEmacs入門

高機能エディタとして長らくエンジニアに使われているEmacsだが、2016年9月にはついにバージョン25系の安定版がリリースされた。Emacsというとすでに主要な機能は実装され尽くされており安定しているというイメージもあるかもしれないが、現在でも数年おきにメジャーアップデート版がリリースされており、地味に機能が強化され続けている。本記事では昨今のEmacsの状況や基本的な設定例を紹介していく。

まだまだアップデートが続けられているEmacs

昨今ではさまざまなテキストエディタが開発されているが、Linux/UNIX環境において特に有名なのがGNU EmacsとVi(Vim)だろう。EmacsはGNUプロジェクト(GNU's Not Unix、フリーソフトウェアとして提供されるOS環境を開発するプロジェクト)やFSF(Free Software Foundation、フリーソフトウェアの推進を行う非営利組織)の創設者としても知られるRichard M. Stallman(RMS)が1970年代中盤に開発を始めたテキストエディタだ。当初はPDP-10などのメインフレームで動作するものだったが、その後GNUプロジェクトが開始されたのに伴い「GNU Emacs」となり、最初の公開バージョンとなるバージョン13が1985年にリリースされたのが現在のEmacsの原点とされている。

その後Emacsはフリーソフトウェアとしてさまざまな開発者の貢献を受け機能を強化するとともに、さまざなOSへの移植が進められ、現在ではWindowsやMac OS Xでも安定して利用できるようになっている(図1)。

図1 Windows環境におけるEmacs
図1 Windows環境におけるEmacs

Emacsの特徴

Emacsの最大の特徴は、多くの機能がEmacs Lisp(elisp)と呼ばれる言語で実装されている点だ。Emacsでは必要最小限のコア機能のみがC言語で実装されており、それ以外の大部分の機能はelispによるマクロとして実装されている。そのため、ユーザーはelispファイルを修正したり、独自に追加することでEmacsのほぼすべての機能をカスタマイズできる。また、elispコードは基本的にはプラットフォームに依存しないため、外部のコマンドやバイナリライブラリに依存しない限り、作成したelispコードは基本的にはEmacsが動作するすべてのプラットフォームで利用可能となる。

こういった背景から、多くの開発者がEmacs向けのマクロを開発し公開しており、Emacsユーザーはそれらを利用して容易にEmacsの機能を拡張できる。また、たとえばプログラミング支援向けなどの利用者の多いマクロはEmacsに同梱されて配布されている。そのため、メジャーなプログラミング言語については特に設定を行わずともEmacsのデフォルト設定でソースコードのハイライト表示や入力支援機能などが利用できるようになっている。

いっぽうで、EmacsのユーザーインターフェイスはWindowsともMac OS Xとも異なるため、取っつきにくさがあることも確かだ。これはテキストベースの端末で利用するテキストエディタとして開発がスタートしたことや、さまざまなプラットフォームに対応しなければならない点などが背景にある。とはいえ、最近のバージョンではツールバーやメニューなどがデフォルトで利用できるようになっており、初心者向けの使い勝手は向上しているといえる。

ここ10年のEmacsの機能強化

Emacsは2001年にバージョン21がリリースされて以来しばらくメジャーアップデートがなかったのだが、丁度今から10年前となる2007年にバージョン22がリリースされ、その後は数年おきにメジャーリリースが行われるようになっている。

ちなみにEmacsのバージョンは「XX.Y」というという2つの数字から構成されており、「XX」の部分がメジャーバージョン、「Y」の部分がマイナーバージョンを示している。メジャーバージョンアップでは比較的大きい機能強化や変更が行われ、マイナーバージョンアップでは基本的にはバグフィックスなどの小さい修正のみが含まれる。一般的なソフトウェアと異なり、各メジャーバージョンの最初のリリースはY=1の「XX.1」(たとえばバージョン25系の最初のバージョンは「25.1」)となる点には注意したい。

Emacs 21からの主要な変更点としては、以下のようになっている(括弧内はリリース日)。

Emacs 21(2001年9月28日)
  • プロポーショナルフォントに対応
  • 画像表示に対応
  • サウンド再生に対応
  • ツールバーに対応
  • CUI環境でもカラー表示が可能に
Emacs 22(2007年1月3日)
  • Gtk+をサポート
  • X Window System環境でドラッグ&ドロップが可能に
  • Mac OS XやCygwin環境のサポート
Emacs 23(2009年6月29日)
  • 内部的な文字コード表現がUTF-8に
  • シフトキーを使ったテキスト選択に対応
  • CEDETがデフォルトでインストールされるように(23.2)
Emacs 24(2012年1月10日)
  • パッケージ管理システムを導入
  • アラビア語やヘブライ語などの、右から左に読み進む言語の表示や編をサポート
  • GnuTLSによるTLS/SSLサポート
  • Webブラウザ機能を内蔵(24.4)
  • Lispパッケージのデジタル署名サポート(24.4)
  • 矩形選択モード(24.4)
Emacs 25(2016年9月17日)
  • 共有ライブラリ/動的ロードライブラリがロード可能に
  • Cairoの実験的サポート
  • ウィジェット機能「Xwidgets」

Emacsのインストール

Linux環境においては、ほとんどのLinuxディストーションがデフォルトでEmacsをバイナリパッケージの形で提供しており、簡単にインストールできる。また、WindowsやMac OS X向けのバイナリパッケージも配布されている。これらはEmacs公式サイトのダウンロードページから配布先へのリンクが提供されている。

これ以外にも、有志が独自にビルドして提供しているバイナリもある。特に日本語環境においては、IME経由で日本語入力を行う際にインライン入力ができないといった問題があったため、下記のようにこれを修正するパッチを適用してビルドされたWindows向けバイナリを配布するサイトが存在する。

また、Mac OS X環境でも同様のインライン入力問題があったが、Emacs 24.4以降ではEmacs公式サイトのダウンロードページからリンクされている「Emacs For Mac OS X」で提供されているバイナリでもIME経由での日本語のインライン入力が可能となっている。ただし、最新版の25.1では入力時にちらつく(入力するたびにカーソルが一瞬未変換文字列の先頭に移動する)といった問題が発生している。もしこれを嫌うのであれば1つ前のバージョンであるEmacs 24.5を利用するか、下記などのサードパーティがビルドしたバイナリを利用すると良いだろう。

Emacsの基本的な設定

前述のとおりEmacsは非常に柔軟なカスタマイズが可能であり、そのすべてを紹介することは不可能である。また、Emacsのカスタマイズに関するネット上の記事も多い。そのため、ここでは多くのユーザーにとって必要だと思われるフォント関連の設定や、Emacsを活用するためにほぼ必須と言えるパッケージ管理ツールなどの設定についてのみ紹介する。

なお、Emacsの設定についてはユーザーのホームディレクトリ内に「.emacs」というファイルを作成し、そこに初期化スクリプトを記述することで行う。Emacsの設定やカスタマイズの基本については、Emacs超入門[2]:基本的なカスタマイズ方法と定番カスタマイズ例という記事で紹介しているので、こちらを参照して欲しい。

フォント関連の設定

Emacsのデフォルト設定でも問題なく日本語の表示が可能ではあるが、フォントの種類やサイズなどを好みのものに変更したいという需要は多いだろう。Emacsでは「フォントセット(fontset)」という独自の方法でフォントを管理しており、ASCIIや日本語、さらにはカタカナといった文字セット(キャラクターセット)ごとに異なるフォントを設定できる。フォントを変更する方法自体も複数の異なる手順があるのだが、基本的な流れは下記のような形になる。

まず、「create-fontset-from-ascii-font」関数を使い、ASCII文字セットに対して使用するフォントを指定して新たな文字セットを作成する。

(create-fontset-from-ascii-font "<使用するフォント>" nill "<フォントセット名>"

ここで、使用するフォントは以下のような形で指定する。

<フォント名>-<サイズ>:weight=<太さ>:slant=<傾き>

たとえば、メイリオフォントの11ポイント、太さ/傾きともにノーマルという場合は次のようになる。

メイリオ-11:weight=normal:slant=normal

ちなみにWindows環境であれば、w32-select-font関数でフォントを調べることも可能だ。適当なバッファで次のように入力し、最後の「)」の右にカーソルを移動させて「C-x C-e」を入力して実行すると、図2のようなウィンドウが表示される。

(w32-select-font)
図2 Windows環境におけるフォント選択ダイアログ
図2 Windows環境におけるフォント選択ダイアログ

ここでフォントを選択して「OK」をクリックすると、メッセージ行や*Message*バッファに「#("メイリオ-11" 0 7 (charset cp932-2-byte))」などのようにそのフォント名が表示される。

フォントセット名には任意のものが指定でき、指定した文字列の前に「fontset-」と付けたものが実際のフォントセット名となる。たとえば次のように指定した場合、「fontset-meiryo11」がフォントセット名となる。

(create-fontset-from-ascii-font "メイリオ-11:weight=normal:slant=normal" nil "meiryo11")

続いて、作成したフォントセットに対し、「set-fontset-font」関数で文字セット毎に使用するフォントを登録していく。

(set-fontset-font "<フォントセット名>" '<文字セット> "<使用するフォント>" nill 'append)

指定できる文字セットは、「M-x list-character-sets」コマンドで確認できる。このうち、日本語関連のものは下記となっている。ちなみに「katakana-jisx0201」および「katakana-sjis」は、いわゆる「半角カナ」に対応するものだ。

japanese-jisx0208
japanese-jisx0208-1978
japanese-jisx0212
japanese-jisx0213-1
japanese-jisx0213-2
japanese-jisx0213.2004-1
katakana-jisx0201
katakana-sjis

たとえばメイリオフォントはJIS X 0213:2004という文字セットをサポートしているので(メイリオの作成元であるモリサワのWebサイト)、これに対応する「japanese-jisx0213.2004-1」を文字セットに指定すれば良い。

(set-fontset-font "fontset-meiryo11" 'japanese-jisx0213.2004-1 "メイリオ-11:weight=normal:slant=normal" nil 'append)

最後に、デフォルトのフレーム(ウィンドウ)で指定したフォントセットを使用するようdefault-frame-alistリストに作成したフォントセットを追加する。

(add-to-list 'default-frame-alist '(font . "fontset-meiryo11"))

これで、以後作成されるウィンドウはここで指定したフォントセットを使って描画されるようになる。「M-x 5 0」コマンドなどを実行して新しいウィンドウを作成して確認してみよう。

問題がなければ、これらを.emacsファイル内に追加しておくことで次回起動以降もこのフォント設定が利用可能になる。

;; フォント設定
(create-fontset-from-ascii-font "メイリオ-11:weight=normal:slant=normal" nil "meiryo11")
(set-fontset-font "fontset-meiryo11" 'japanese-jisx0213.2004-1 "メイリオ-11:weight=normal:slant=normal" nil 'append)
(add-to-list 'default-frame-alist '(font . "fontset-meiryo11"))

ちなみに、Mac OS X環境でも同様の方法でフォントを設定できる。たとえば、ターミナルなどでも使われている等幅フォント「Menlo」の14ポイントを利用する場合、以下のような設定となる。

(create-fontset-from-ascii-font "menlo-14:weight=normal:slant=normal" nil "menlo14")
(set-fontset-font "fontset-menlo14" 'unicode "menlo-14:weight=normal:slant=normal" nil 'append)
(add-to-list 'default-frame-alist '(font . "fontset-menlo14"))

ヒラギノゴシックを利用する場合は以下のようになる。

(create-fontset-from-ascii-font "Hiragino Kaku Gothic Pro W3-14:weight=normal:slant=normal" nil "hiragino14")
(set-fontset-font "fontset-hiragino14" 'unicode "Hiragino Kaku Gothic Pro W3-14:weight=normal:slant=normal" nil 'append)
(add-to-list 'default-frame-alist '(font . "fontset-hiragino14"))

また、行間を広げて表示したいという場合は「line-spacing」変数で設定が可能だ。たとえば行間を0.4行相当に設定したい場合、以下のように設定すれば良い。

(setq-default line-spacing 0.4)

ツールバーの表示/非表示

Emacs 25のデフォルト設定では、ウィンドウ上部にツールバーが表示される(図3)。これは初心者には有用かもしれないが、ショートカットキーを多用するユーザーには不要だろう。

図3 Emacsのツールバー
図3 Emacsのツールバー

これは、次のように引数に0を指定して「tool-bar-mode」関数を実行することで非表示にできる。

(tool-bar-mode 0)

同様にメニューバーについても「menu-bar-mode」関数で非表示にできる。

(menu-bar-mode 0)

デフォルトの文字コードを指定

日本語環境でのWindowsでは、Emacsはファイルを保存する際のデフォルトの文字コードとしてシフトJIS、改行コードはCRLFが使われるようだ。もちろんこれは「Cx RET f」コマンドで任意のタイミングで変更可能だが、たとえば主にUTF-8を使用したい場合などは、prefer-coding-system関数でデフォルトの文字コードを変更できる。たとえば文字コードはUTF-8、改行コードはLFにしたい場合は以下のようにする。

(prefer-coding-system 'utf-8-unix)

ちなみに、「utf-8-dos」とすると改行コードがCRLFに、「utf-8-mac」とすると改行コードがCRに設定される。

そのほかのカスタマイズ機能

Emacsではカスタマイズを支援する機能が搭載されており、「M-x customize」コマンドで実行できる(図4)。

図4 Emacsのカスタマイズ画面
図4 Emacsのカスタマイズ画面

このカスタマイズ機能では、機能グループ毎にカスタマイズ可能な設定がまとめられている。ここではキーボードだけでなくマウスでの操作も可能だ。たとえば、「Editing」にカーソルを合わせてEnterキーを押すか、もしくはマウスでクリックするとそのサブグループの設定一覧が表示される(図5)。

図5 Emacsのカスタマイズ項目では機能別にグループにまとめられている
図5 Emacsのカスタマイズ項目では機能別にグループにまとめられている

ちなみにこのカスタマイズ機能での設定方法だが、設定項目内にある「▽」(環境によっては「Show Value」ボタン)にカーソルを合わせてEnterキーを押すかクリックすると(この操作を以下では「選択する」と呼ぶ)、値を指定できるボタンやフォームが表示される。たとえば図6の例では、デフォルトのインデント幅を指定する「Standard Indent」については数値を入力するフォームが、Tabキーの挙動を設定する「Tab Always Indent」では値を選択するためのボタン(「Value Menu」ボタン)が表示されている。

図6 入力フォームやボタンで値を指定できる
図6 入力フォームやボタンで値を指定できる

ここでValue Menuボタンを選択するとメニューが表示され、設定したい挙動を選択できる(図7)。

図7 「Value Menu」ボタンを押すとメニューがポップアップ表示されて値を指定できる
図7 「Value Menu」ボタンを押すとメニューがポップアップ表示されて値を指定できる

ここで値を変更すると「State」が「EDITED」になるが、この段階ではまだ設定は反映されていない。この状態で「State」ボタンをクリックするとメニューが表示されるので、ここで「Set for Current Session」を選択すると変更が反映される。ただしこの場合、Emacsを終了すると変更がリセットされてしまう。Emacsの次回起動後もこの設定を保存したい場合は、「Save for Future Session」を選択すれば良い(図8)。

図8 「State」ボタンをクリックすると設定の保存などの操作を行える
図8 「State」ボタンをクリックすると設定の保存などの操作を行える

ちなみにこの変更は.emacs内に「custom-set-variables」などのリストとして記録されるようになっている(図9)。

図9 カスタマイズした内容は.emacsファイル内に保存される
図9 カスタマイズした内容は.emacsファイル内に保存される

パッケージマネージャを使用する

Emacsでは、elispファイルを用意することで独自に機能の拡張が可能であり、多くの有志がEmacs向けのelispを提供している。これらを利用する場合、まずその配布元からファイルをダウンロードして適切なディレクトリにインストールし、設定ファイルにそれらを利用するよう記述する、という作業が必要だった。Emacs 24では新たにelispをパッケージという単位で管理できるパッケージ管理システムが導入され、Emacs上から簡単にパッケージのダウンロードやインストールが可能になっている。

Emacs 24以降ではデフォルトでパッケージ管理システムが有効となっており、「M-x list-packages」コマンドを実行すると利用できるパッケージ一覧を確認できる(図10)。

図10 「M-x list-packages」でパッケージ一覧を確認できる
図10 「M-x list-packages」でパッケージ一覧を確認できる

ここで、「Status」が「built-in」となっているのがデフォルトでEmacsに組み込まれているパッケージで、「available」となっているのが利用可能なパッケージだ。ここでインストールしたいパッケージ名を選択すると、ウィンドウが分割されてそのパッケージの詳細が表示される(図11)。

図11 パッケージ名を選択するとパッケージの詳細やインストールボタンが表示される
図11 パッケージ名を選択するとパッケージの詳細やインストールボタンが表示される

ここで「Install」を選択すると、パッケージのダウンロードとインストールが行われる。インストール先ディレクトリはデフォルトではホームディレクトリ内の「.emacs.d」以下だ。

デフォルトのパッケージリポジトリ以外を利用する

Emacs 24以降では、デフォルトのパッケージリポジトリとして「ELPA(GNU Emacs Lisp Package Archive」が利用できるようになっている。ただ、ELPAに登録されているパッケージはまだ多くないのが現状だ。ELPAはEmacsの公式パッケージリポジトリという位置付けだが、人力での内容チェックも含まれていることからやや登録のハードルが高いように見えるのもその理由の一つだろう。そのため、気軽にパッケージを登録できるリポジトリとして「MELPA(Milkypostman’s Emacs Lisp Package Archive)」を利用しているユーザーも多い(図12)。

図12 サードパーティによるEmacs向けパッケージリポジトリ「MELPA」
図12 サードパーティによるEmacs向けパッケージリポジトリ「MELPA」

MELPAでは現在3500を超えるパッケージが公開されており、Emacs向けのパッケージリポジトリとしては現在最大のものになっているという。MELPAを利用するには、次のようにして「package-archives」リストにMELPAのURLを追加する。

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

なお、ここで指定している「mepla-stable」は安定版パッケージのみが含まれたリポジトリだ。非安定版パッケージも利用したい場合は、代わりに以下のように指定すれば良い。

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

この設定を追加した後に「M-x list-packages」コマンドを実行すると、利用できるパッケージが大幅に増えていることが確認できる(図13)。

図13 MELPAのリポジトリを登録すると、利用できるパッケージが大幅に増える
図13 MELPAのリポジトリを登録すると、利用できるパッケージが大幅に増える

まだまだ機能強化は続くEmacs

昨今ではさまざまなIDEやプログラミング/コーディング向けエディタが登場しているいっぽう、Emacsというと古く開発が停滞していると思われている人もいるのではないだろうか。しかし、今回紹介したようにEmacsは現在でも定期的に新たなリリースが提供されており、機能強化が進められている。

また、MELPAでは大量のパッケージが提供されていることからも分かるとおり、サードパーティ開発者の活動も活発だ。「古くさい」という理由でEmacsから離れた人も、ぜひEmacsをもう一度試してみてはいかがだろうか。

続く記事後編では、Emacsが標準で提供するプログラミング支援機能「CEDET」や、EmacsをGitクライアント化する「Magit」を紹介する。