今だからこそ使いたい、若手エンジニア向けEmacs実践入門
エディタソフトウェアとして有名なEmacs。若手エンジニア向けに、今だからこそ「Emacs実践入門」をお送りする。
はじめまして、大竹智也と申します。過去に『Emacs実践入門』(技術評論社)を上梓し、雑誌での執筆経験もありますが、Webでの執筆は初めてとなります。そのためお見苦しい点があるかもしれませんが、何卒ご容赦ください。
突然ですが、みなさんはGNU Emacs(以下、Emacs)というソフトウェアを知っていますか? 本日はまだEmacsをよく知らない方に向けて、このソフトウェアの魅力を紹介していきます。
Emacs概要
Emacsは1975年に誕生した歴史あるテキストエディタソフトウェア(以下、エディタ)です。今年は2016年になりますので、誕生から40年以上が経過したことになります。おそらくこの記事を読まれている大半の方よりも年上になるでしょう。
現在、数多くのソフトウェアが存在していますが、その数だけ激しい競争があります。そのため、これほど長い歴史があり、かつ開発が継続しているソフトウェアは稀有な存在。それはつまり、Emacsがいまでも多くの開発者に愛され、支持を集めている確かな証明なのです。
Emacsの簡単な歴史
まずはEmacsの歴史をさらってみます。
EmacsはOSS(オープンソースソフトウェア)です。いまでこそOSSは一般的となっていますが、EmacsはFSF(フリーソフトウェア財団)が中心となって開発されている元祖OSSともいえるソフトウェアです。そのため、これまでに数多くの開発者が貢献しており、中にはRubyの生みの親であるまつもとゆきひろ氏も含まれています。
そんなEmacsですが、2016年9月17日に最新バージョンとなる25.1がリリースされ、現在でも精力的に開発が行われています。
Emacsの特徴
Emacsの最大の特徴は公式サイトのコピー「An extensible, customizable, free/libre text editor — and more.」からも伝わるように高い拡張性にあります。その理由は、Emacsの本質がEmacs Lisp(以下Elisp)と呼ばれるプログラミング言語の実行環境であり、この言語を通じてほとんどすべての機能が作られているためです。
Elispを書けばエディタの動作変更や上書きなどが、単純な設定の枠を越えて好きなようにカスタマイズ可能です。また、Elispによって書かれたカスタマイズは、OS、GUI、CLIなどを問わず、どんな環境でも同じ動作が約束されています。
アプリケーションフレームワークが用意されていて、その中で自分で好きなアプリケーションを開発できると考えれば分かりやすいでしょう。
Emacsの基本的な5つの機能
Emacsは必ずカスタマイズしなければならないのかと言えば、そうではありません。標準でも、とても便利な機能が用意されています。代表的な機能の一部を紹介してみましょう。
1. 検索と置換
Emacsはインクリメンタル検索機能を持っています。入力の都度リアルタイムに結果を確認でき、一度使うと手放せない機能のひとつです。また、正規表現検索にも対応しており、後方参照などを利用した強力な置換も行えます。
他にもgrepコマンドが使える環境であれば、grepを利用してプロジェクト全体を高速に検索することも可能です。
2. シンタックスハイライトと自動インデント
プログラム言語の構文を解析し、色分けして読みやすくするシンタックスハイライト機能を持っています。また、言語の種類に応じて自動的にインデントを揃えてくれる機能もあり、コーディング規約にのっとった美しいコードを書くことが可能です。
3. ウィンドウ分割
ひとつのウィンドウを上下左右に分割し、複数のファイルを同時に確認しながら作業ができます。サブモニタなどを利用する人にとってはなくてはならない機能だといえるでしょう。
4. 矩形(くけい)編集
テキストを前後だけでなく上下に渡って選択し、一括して編集を行う矩形編集機能を備えています。複数行にまたがってテキストを挿入したり削除したりなど、発想次第でとても効率的な編集が可能です。
5. バージョン管理
GitやSubversionなどのVCS(バージョン管理ソフトウェア)と連携してEmacsから直接バージョン管理を行う機能を持っています。エディタとシームレスに連動しているため、使い慣れると、コマンドやバージョン管理専用ソフトを用いるよりはるかに高速でミスのないコミットが可能です。
Emacsの持つ無限のパワー
ここまで一般的な機能を紹介してきましたが、残念ながらEmacsの持つ機能の1%も紹介できていません。それは、最初に述べたようにEmacsはElispによってどこまでも拡張可能だからです。
Elispは追加パッケージとも呼ばれ、世界中の開発者によって公開されています。このElispを自分のEmacsにインストールすることで、誰でも簡単に無限のパワーを手に入れることができるのです。
Emacsを使ってみよう(インストール~基本の扱い方)
ここからはEmacsの具体的な使い方を紹介していきます。標準的な機能を解説した後、パッケージによる拡張を紹介していきますので、ぜひ楽しみにしていてください。
Emacsの画面説明
具体的なEmacsの使い方の前に、Emacsの画面について簡単に説明します(環境:OS X 10.11.6、Emacs 25.1)。
ウィンドウとフレームとバッファ
Emacsを起動したときに表示されるアプリケーション画面はウィンドウと呼ばれます。ウィンドウは分割することが可能となっていて、分割されたウィンドウ内のウィンドウをフレームと呼びます。つまり、最初に起動したときは、1つのウィンドウの中に1つのフレームが表示されているということになります。
ウィンドウを分割すると分割回数に応じてフレームが増えていきます。ウィンドウの分割は上下左右ともに好きな回数だけ行うことが可能となっています。
フレームの中の実際にテキストが表示されている部分をEmacsではバッファと呼びます。バッファはメモリ上に作られたオブジェクトであり、Emacsからみればひとつの変数のようなものとして扱われています。しかし難しく考える必要はなく、人間からしてみれば実際にEmacs上で表示されているテキスト部分がバッファだと思ってもらえれば直感的に理解できるでしょう。
ミニバッファとモードライン
Emacsのウィンドウの下には、モードラインとミニバッファという2つの重要な要素が表示されています。モードラインは図中の赤くなっている部分で、選択中のバッファに関する様々なステータスを表示します。そのため、フレームを分割した場合はフレームの数だけモードラインが表示されます。
図中の青くなっている部分はミニバッファと呼びます。Emacsに対して、コマンドを実行入力して実行を行ったり、コマンドから返された結果が表示されます。こちらはモードラインと違ってウィンドウの中にひとつしか存在しません。
このあと、Emacsを操作するためにさまざまなコマンドを紹介していきますが、それらは、すべてこのミニバッファから実行できるようになっています。
Emacs基本編:まず覚えたい3つのキーバインド
それでは、ここからはEmacsの実際の使い方を解説していきます。
1. ファイルを開く( C-x C-f
)
Emacsでファイルを開くには、Control
+ x
に続けてControl
+ f
というショートカットを使います。すると、ミニバッファにFind file: ~/
と表示され、ここで開きたいファイルのパスを入力してenter
を押すとファイルを開くことができます。
このショートカットのことをEmacsではキーバインド(Keybindings)と呼び、一般的にControl
をC
と表記します。つまり、先ほどのファイルを開くキーバインドは、C-x C-f
と表記します。
ミニバッファではtab
キーによる補完が使えます。そのため、ファイルパスをすべて手入力しなくてもtab
を押せばファイル名が自動的に補完されます。補完対象が複数存在する場合、tab
を2回押せば図のように現在のディレクトリにあるファイルやディレクトリの一覧が表示されます。この状態で、残りのファイル名の一部を入力して再びtab
を押せば、他にマッチする候補がなくなった段階で残りの名前がすべて自動的に補完されます。
これまでFinderなどのファイラを利用してファイルを開いていた人にとって、最初は不慣れなため少し難しいかもしれませんが、慣れるとFinderよりも早くファイルを開けるようになるかと思います。
2. 検索する(C-s、C-r)
ファイル内のテキストを検索するにはC-s
を使います。このキーバインドを実行すると、ミニバッファにI-search:
と表示されます。ここに検索したい文字列を入力すると、図のように入力した文字列がハイライトされ、カーソルが最初にマッチした箇所へと移動します。
検索しているとき続けてC-s
を押すと、次の図のように次にマッチする単語へとカーソルがジャンプします。このように検索した後、さらにC-s
を押すと、次の検索結果へとカーソルが移動し続け、もし以降マッチする文字列が存在しない場合は最初にマッチした箇所へとカーソルが戻るようになっています。
C-s
は下方向への検索ですが、上方向への検索も用意されています。上方向へ検索するにはC-r
を押します。このC-r
はC-s
で下方向に検索している最中でも利用できるので、もしジャンプし過ぎてしまった場合などは、C-s
とC-r
を使い分けて移動しましょう。
3. 置換する(M-%)
置換を行うには、M-%
というキーバインドを使います。M
が初めて登場しましたが、こちらはMeta
キーのMとなっていて、MacではAlt(Option)
が割り当てられています。M-%
はAlt-%
を押すと実行できます。
M-%
を実行すると、上図のように検索と同じようにミニバッファでQuery replace:
と表示され、置換前の文字列を聞かれます。文字列を入力してenter
を押すと、Query replace <置換前の文字列> with:
と表示されるので、置換後の文字列を入力して再びenter
を押します。
すると、ミニバッファにはQuery replacing <置換前の文字列> with <置換後の文字列>: (? for help)
と表示され、検索と同じように置換前の文字列がハイライトされます。この状態で特定の操作キーを入力すると、置換が行われたりスキップされたりします。
操作キーはいつでも確認ができ?
を押すとフレームが分割され、図のようなヘルプが表示されます。
このヘルプによれば、space
かy
を押すとマッチしている箇所を置換し、delete
かn
を押すとスキップして次のマッチへと移動します。y
やn
を押してすべてのマッチしている文字列の置換を終えると、ミニバッファに図のようにReplaced <置換数> occurrences
と表示して知らせてくれます。途中で置換を終了したい場合はenter
かq
を押しましょう。
Tips:検索からそのまま置換も可能
最後に、検索と組み合わせた便利な操作を紹介しておきます。
M-%
では置換を実行するまで置換前の文字列の入力が正しいかどうか分かりませんでした。そのため、C-s
の検索からそのまま置換できれば便利です。Emacsには、もちろんこの操作が用意されていて、C-s
で検索を行って、そのままM-%
を実行すれば、置換後もスムーズに文字入力へと操作が続くようになっています。便利なのでぜひ覚えておきましょう。
Emacs実践編:パッケージで機能強化する
ここからは、Emacsの持つ基本機能ではなく、世界中の開発者によって作られたパッケージのインストール方法とその機能について解説していきます。
パッケージのインストール
Emacsには、package.el(注: EmacsではパッケージのことをElispの拡張子を用いて「パッケージ名.el」と表記することが多くなっています)と呼ばれるパッケージ管理機能が搭載されています。そのため、誰でも簡単に外部パッケージをインストールして使うことができます。
パッケージの公開は、GitHubのようなリポジトリ(Gitのリポジトリとは異なります)を通じて行われているため、色々なパッケージをインストールするためには、まずリポジトリを追加する必要があります。
1. リポジトリを追加する
リポジトリの追加は設定ファイルにリポジトリのURLを書き込むことで行えます。Emacsは設定ファイルを~/.emacs.d/init.el
で管理しているので、Emacsから設定ファイルを開いて次の設定を記述してください。
(require 'package) ; パッケージ機能を有効にする (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) ; MELPAリポジトリを追加する (package-initialize) ; インストールされているパッケージを初期化する
ここでは、MELPAというリポジトリを有効化しています。設定を記述して保存したらEmacsを一度再起動しましょう。これでMELPAリポジトリを利用してパッケージのインストールが可能になります。
2. パッケージ一覧を表示する
パッケージをインストールするには、まずパッケージ一覧を表示します。パッケージ一覧を表示するには、ミニバッファから任意のコマンドを実行するM-x
というキーバインドを実行します。するとミニバッファにM-x
と表示されるので、list-packages
と入力して(注: ファイルを開くときと同様にtab
による補完が可能です)enter
を押します。
あなたのマシンがインターネットに接続されていれば、図のようなパッケージ一覧が表示されたバッファが開きます。ここから、好きなパッケージを選択してインストールできます。
3. パッケージをインストールする
パッケージをインストールするには、まずイントールしたいパッケージの行でi
を押します。すると図のようにパッケージ名の前にI
という文字が表示され、インストール候補としてチェックされます。候補から外したい場合はu
を押します。
チェックしたパッケージはまだインストールされていません。実際にインストールを行うには、x
を押します。すると、ミニバッファにて、図のようにInstall package '<パッケージ名>'? (y or n)
という最終確認メッセージが表示されるので、インストールしたい場合はy
を、キャンセルする場合はn
を押します。
y
が押された場合、パッケージのダウンロードが実行されます。無事インストールが完了すれば、図のようにPackage menu: Operation finished [Installed <パッケージ数>]
というメッセージがミニバッファに通知されます。
なおパッケージ一覧では、通常のバッファ同様にC-s
による検索が行えますので、検索から簡単に目的のパッケージを見つけることができます。
代表的なパッケージ
最後に、Emacsの代表的なパッケージを紹介していきます。他にも便利なパッケージが多くありますので調べてみてください。
auto-complete
auto-completeは編集中のバッファの自動補完を強力にしてくれるパッケージです。インストールを行ったら、次の設定を設定ファイル~/.emacs.d/init.el
に記述してみましょう。なおパッケージの設定を有効にするには、インストールされたパッケージの初期化が必要なため、先ほど記述したpackage.elの設定より後ろに記述しておきましょう。
(require 'auto-complete-config) (ac-config-default)
設定を記述し再起動した後にEmacsでファイルを編集すると、図のようにファイルのテキストから作成された補完候補が表示されるようになります。
magit
magitはEmacsからGitを操作するためのインターフェイスです。インストール後に M-x
からmagit-status
コマンドを実行すると、git statusコマンドのようなバッファが表示がされます。
matig-statusの画面では、操作キーによってステージングやアンステージング、そしてコミットが行えます。
Unstaged changes
にリストアップされているファイルにカーソルをあわせてs
を押すとステージング、Staged changes
にリストアップされているファイルにカーソルをあわせてu
を押すとアンステージングされます。
ステージングされたファイルがある状態でc
を2回押すと、コミットメッセージの入力になります。
後は、コミットメッセージを入力してC-c C-c
を押すとコミットされます。
おわりに
ここまで駆け足でEmacsの基本的な解説を行ってきましたが、いかがでしたでしょうか?
一般的なEmacsの解説としては、まずキーバインドによるカーソル移動や画面の操作方法を入念に解説した後、本体機能の解説を行う流れが多いのですが、今回はEmacsの全体像をお見せしたかったため、あえてキーバインドの解説はほとんど省略しています。
ターミナルのEmacsであれば、終了方法が分からないという現象が起きていましたが、MacのEmacsであれば、基本的にMac標準のショートカットがEmacsのキーバインドとして割り当てられているため、ひとまず不便を感じないと考えたためです。しかし、それでもこの記事で紹介できたEmacsの機能はほんの一部でしかありません。
「Emacsはエディタではなく環境」という言葉があります。EmacsにはElispによって作られたWebブラウザ、メーラー、ターミナルなど、ひとつのアプリケーションとも言えるパッケージがあり、これらをインストールすることによって、Emacsの中で必要な機能を集約することも可能になっています。
そういった、Emacsの持つポテンシャルについては手前味噌ですが、私の著書『Emacs実践入門』(2012年、技術評論社)でふんだんに解説しておりますので、この記事でEmacsに興味が沸きましたら、ぜひともご一読ください。
これから開発者として長くキャリアを続けていかれる読者にとって、エディタは長い付き合いとなるソフトウェアです。そのためもし時間がありましたら一度時間を作って、エディタについてしっかりと学習しておくと、今後の開発人生の大きな手助けになるかと思います。この記事がきっかけとなり、これからのエンジニアライフがより良いものになることを願っています。
執筆者プロフィール
大竹 智也(おおたけ・ともや)@tomoyaton
編集:薄井千春(ZINE)