🐿️

Emacsの良いところ

2024/09/25に公開

会社でEmacsの紹介をする機会がありました。せっかくなので私の観点でのEmacsの良さを言語化しておこうと思います。Emacsのことを知りたいと思った人の助けになれば幸いです。

前提

  • Emacsは名前を聞いたことがある、くらいの人を想定読者としています。
  • 私はEmacsに特段詳しい人間ではありません。ただの一個人の感想です。
  • 他のエディタやIDE等と優劣をつける意図はありません。他のツールにはそのツールの良いところがあると思います。
  • 他のツールに無いことしか書かないということはありません。みんな互いに影響し合っています。

Emacsの良いところ

以下では私がEmacsを使っていて良いなと思う特徴を3つご紹介します。

キーボードのホームポジションから多くの操作が可能

まずEmacsといえば何と言ってもこれではないでしょうか。マウス、矢印キー、バックスペースなど、ホームポジションから離れるような操作は原則必要ありません。基本的な操作はすべて特有のキー操作で行えるようになっています。

また、その一部の操作はmacOSの多くのアプリ(特にブラウザのテキストエリアやターミナルなど)やLinuxのターミナルなどでも使えます。Emacsでの操作に慣れることで他の場所でも一貫して効率的な操作が行えるようになるというのもメリットです。

以下に基本的な操作かつ他の環境でも使える場合があるものを紹介します。ただしここで C- というのは「Controlキーを押しながら(次のキーを押す)」という操作を表します(WindowsではCtrlキーです)。

まずはカーソル移動です。

  • C-f : 右
  • C-b : 左
  • C-p : 上
  • C-n : 下

これでホームポジションからカーソル移動ができます。他によく行う操作として以下があります。

  • C-a : 行頭へ移動
  • C-e : 行末へ移動
  • C-k : 行末までを削除
  • C-y : C-k で削除した文字列を貼り付け
  • C-d : カーソル上の文字を消す(Windowsでいうdeleteキーに相当)

これらはすべてMacのChromeやSafari、ターミナルで使えることを確認しています。

他にも

  • C-g : キャンセル
  • C-r : バックワードの文字列検索
  • C-@ : 範囲選択開始
  • C-w : C-@ で選択した範囲を削除(C-y で貼り付け)

はターミナルでもEmacsでも使えるキーバインドです(ブラウザではできなさそうです)。

まだまだ書ききれないくらい多くの便利なキー操作があります。また後述するようにプログラミング言語で機能を記述可能であり、さらにそれらを任意のキー操作に割り当てることもできます。このようにホームポジションからあらゆる操作が可能であるというのがEmacsの強みであると思います。

(とはいえ、マウスを使ってはいけないわけではありません。慣れないうちから無理してキーボードでやるのはおすすめしませんし、逆にマウスの方が早い操作もあります。)

エディタ以外の機能をEmacs上で扱える

Emacsは基本的にはテキストエディタなのですが、Emacsでできることはテキスト編集には限りません。機能追加をすることでテキスト編集に付随する様々なツールをEmacs上で扱うことが可能です。Emacs上でテキスト編集以外の操作を行えることの何が良いのかというと、そのツールにおけるカーソル移動や検索やコピーなどの操作をすべてEmacsのキーバインドそのままで行うことができるという点があります。

例えばGitで管理しているプロジェクトにおける開発中、昔の変更で消してしまった箇所の一部分を復元したくなった、という場面を考えます。いろいろ方法はあるかと思いますが、例えば以下のような手順が考えられます。

  1. Gitクライアントで対象のコミットを探す
  2. 対象のコミットの差分を表示する
  3. 該当箇所をコピーする
  4. エディタにペーストする

GitクライアントとしてSourceTreeとかForkとかGitKrakenとかGitHubとかgitコマンドとかいろいろありますが、EmacsにもGitクライアントがあります。私は magit というものを使っています。

例えばEmacs上で git log を表示すると、普段のコード上での文字列検索と同じ方法でコミットメッセージの検索ができます。そして対象コミットの差分を表示したら、普段と同じ方法でコピーしたい部分の範囲選択やコピーができます。

メリットとしては前述した操作方法の一貫性もありますが、他にもEmacs上のコンテキストが使えるというのは大きいです。上の例の通り編集中のプロジェクトの git log を一発で出せますし、編集中のコードのテストを走らせるとか、編集中のファイルがある場所をカレントディレクトリとしてシェルを起動するとかもできます。また当然ながら同一ウインドウ内で開くので、使いたいアプリのウインドウがどこにあるかを探す必要もなく、視線移動も迷うことがありません。おかげで様々な操作をストレスなく効率的に行うことができます。

Emacs Lisp で拡張できる

上に少し書きましたが、Emacsは外部拡張によりさまざまな機能追加やカスタマイズを行うことができます。拡張機能と聞けば今どきは当たり前感もありますが、Emacsの場合はユーザー設定を含むあらゆるカスタマイズ(Emacs自身も含む)をすべて一貫して Emacs Lisp (以下、Elisp) というLispベースの言語で書くことができます。

具体的に何が良いのかという話ですが、まず設定がプログラミング言語で書けるというのはとても便利です。例えば開いているファイル名とかディレクトリ名とかで条件分岐が簡単に書けます。やろうと思えば毎秒自動でキーバインドを変えることもできます(やりませんが)。また、設定に慣れてきたらそのまま拡張機能が自分で作れるというのもメリットです。というか設定イコール拡張であってそこに区別はありません。Emacs自身もほぼElispなのでEmacs自体を書き換えることも同様に可能です。

ちなみにElispで表現できればいいので例えばメーラー(Mew, mu4e, notmuch)やブラウザ(eww)もEmacs上で動きます。音楽プレイヤーとかもあります(どこまでElispなのか知りませんが)。

Elispで書けてしまうので外部依存も少なくできます。init.elファイル(ユーザー設定ファイル)さえ用意しておけば新しい環境ではそれを読み込むだけでEmacsの移行が完了します。もちろん外部ツールを呼び出した方が良い場合もありますが、必要なツールがあるかどうか判断してエラーメッセージを出すとかも簡単ですし、足りない外部パッケージを自動でインストールするというコードを書いてもいいわけです。

あとはスクリプト言語なので例えば誰かが作ったライブラリを手元で修正して動かしてみたりということも簡単です。GitHub上のinit.elファイルを見て回るのも楽しいですね。起動後にインタラクティブに設定を上書き(式を評価)することも簡単です。選択範囲だけ評価することもできます。

Emacsの拡張性の高さや無限の可能性を感じていただけたでしょうか。Emacsにハマるとカスタマイズが楽しすぎてコーディングよりもカスタマイズの時間の方が長くなること請け合いです。

さいごに

私の思うEmacsの良さを文章化してみました。基本的にコマンド操作とカスタマイズ性というのが特徴かなと思うので、例えばVimにハマるような人にはEmacsにもハマる素質があるかなと思います(ただ既にVimを使っているのであればわざわざEmacsを学ぶインセンティブも低いと思います)。あとはVSCodeやIDEなどがなんだか複雑そうに見えて苦手な人とか、マウス操作よりショートカットキーの方が好みだという人にとってはかなり相性が良いのではないかと思います。

いろいろと書きましたが、結局は使ってみないと良さは伝わらないと思います。ぜひご自身でインストールして沼に飛び込んでみてください。

OPTIMINDテックブログ

Discussion