Emacsのすゝめ

この記事は[ストックマーク Advent Calendar 2021](https://adventar.org/calendars/6612)の9日目の記事です。

弊社Advent Calendarの全体の議題が決まっているわけではないので、今回は私個人の思いを書いていこうと思います。

## 前置き

突然ですが、皆様、Emacsというものをご存知でしょうか。
ご存知の方も多いと思いますが、Emacsとはテキストエディタです。
太古の昔、テキストエディタと言えば、viかEmacsが2大陣営があり、その間での争い([エディタ戦争](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%88%A6%E4%BA%89))があるほどでした。
その他にも多数のテキストエディタがありますが、昨今はVisual Studio Codeが人気なのではないでしょうか。

まあ、テキストエディタは個人の好きなものを使えば良いので、お互いに良い所どりができると良いですね。


さて、その中で私はEmacsを使っています。
そこで、この記事では、少しでも同好の士が増えると嬉しいので、Emacsの魅力と業務への活用例を紹介します。

## 序章

えらい人は言いました。「Emacsはエディタではなくて環境である」と。
Emacsにはテキストエディタの枠に収まらない可能性(拡張性)があります。

この自由な拡張性が、Emacs布教の高いハードルになっている一面もあり、これから紹介する内容も設定が必要となるものも多数あります。
しかし、最初のハードルを(ハードルは多数ありますが...)飛び越えると、Emacsの広大な世界が見えてきますので、ぜひ一読していただけますと幸いです。

ポイントとしては以下の通りです。順番にいきましょう。

- テキストエディタとしてのEmacs
- 開発環境としてEmacs
- GTDツールとしてのEmacs
- Emacs Lisp実行環境としてのEmacs
- その他

## テキストエディタとしてEmacs
まず、テキストエディタとしてのEmacsです。

テキストを書くと言っても色々あります。
私の業務だと頻度は異なりますが、メモ・記事・原稿執筆となります。

まさにこの記事もEmacsで書いています。
Emacsで書くと何が嬉しいかと言うと以下の3点があります。

### 集中できる
Emacsは基本的にマウスやトラックパッドを使わずに、キーボード操作のみで完結でき、さらにキーボードでもカーソルキーやバックススペース、エンターキーを使う必要がありません。
つまり、手をキーボードのホームポジションから動かす必要がほぼありません(移動のためにわざわざカーソルキーまで手を動かす必要がないのです!)。
そんなに一分一秒を惜しんで生活しているのかと言われるとそうでもないのですが、手の移動がなくなってみると案外快適で書くことに集中できます。

では、どうやってカーソル移動、削除、確定等をしているのかというとEmacsには色々なキーバインド(キーボードショートカット)があります。例えば、以下のような感じです。

※ 以下表のキーバインドで、`C`はCtrlキー、`M`はMetaキー(macだとoption、Windowsやlinuxだとaltキーかな)のことで、`C-f`となっていれば、Ctrlキーとfキーを同時に押すということです。

| キーバインド | 処理          | 備考                                                 |
|--------------|---------------|------------------------------------------------------|
| C-f          | 1文字先に移動 | カーソルキーで言えば「→」と同様。macOS単体でも利用可                     |
| C-b          | 1文字前に移動 | カーソルキーで言えば「←」と同様。macOS単体でも利用可                     |
| C-p          | 1行上に移動   | カーソルキーで言えば「↑」と同様。macOS単体でも利用可                     |
| C-n          | 1行下に移動   | カーソルキーで言えば「↓」と同様。macOS単体でも利用可                     |
| C-a          | 行頭に移動  |                                                      |
| C-e          | 行末に移動    |                                                      |
| C-h          | 削除          | 本来はhelp表示だが、バックスペースと同様の挙動を設定。macOS単体でも利用可 |
| C-m          | 改行や確定    | エンターキーと同様                                   |


macOSでは、上記表の備考に記載したようにos標準で設定されているキーバインドもありますので、Emacsを使わなくてもキーバインドを試してみても良いかもしれません。

上記表はほんの一例であり、便利なキーバインドが多数あります。
全部覚える必要あるの？と不安になるかもしれませんが、最初は必要最低限を覚えるだけ大丈夫です。それだけでも全然違います。
使っていく内によく使うものは覚えていきますし、キーバインドを別途補完できますので、すべて覚える必要はありません。

これらのキーバインドは、Emacsを使う上ではすべてのところで役立ちますね。

### textlintによるリアルタイムチェック
[textlint](https://github.com/textlint/textlint)とは、テキストファイルを特定のルールに従ってチェックや修正してくれるツールです。[@azu_re](https://twitter.com/azu_re)さんという方が作られています。
ルールには色々あり、技術文書向けや誤字脱字のルール、英語向け、日本語向けのルール等、多数公開されています。

このtextlintを使うだけでも大変便利なのですが、Emacsでは、以下のようにtextlintでリアルタイムに修正すべき箇所を指摘可能です。
![textlint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53086/a32a450f-3ade-7bfe-f726-d9045c3b2d36.png)

もちろん自動修正もできますが、常に指摘を受けることで自身の執筆能力アップに繋ります。
ここでは設定方法について詳細を記載しませんが、「emacs textlint flycheck」でweb検索すると素晴しい記事がたくさんありますので、試したいなという方はぜひ。

### Org Modeの恩恵
[Org Mode](https://orgmode.org/ja/)とはEmacsでのプレーンテキストのファイルフォーマットです。org-modeというモードで利用できます。

Org Modeでは、メモ、タスク管理、プロジェクト管理、文書編集、計算ノート等、できることが多数あります。
ぱっと見は、markdownのような軽量マークアップ言語に近いですが、とても多機能です。
簡単なことから始めるのが良いですね。

私は、メモならばとりあえずOrg Modeで書きます。そして、他の人に共有するならば、色々な形式にExportできますので、makrdownやhtmlに変換しています。
もちろん、Org Modeはただのプレーンテキストなので、そのまま他のエディタでも閲覧可能です(ハイライト等はつきませんが)。
![org.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53086/1a78db45-e157-14bf-1bea-ec71a0384f5d.png)

## 開発環境としてのEmacs
次は開発環境としてのEmacsです。
コーディングは統合開発環境(IDE)で書いている方も多数いらっしゃいますが、私は、もちろんEmacsです。

Emacsでは標準でコーディングに便利な機能がありますが、他にも様々な拡張(Emacsパッケージ)をEmacsユーザの方が公開してくれています。

例えば、pythonコードを書くなら以下の公開されているEmacsパッケージを導入するのも良いです。

| Emacsパッケージ                                                                   | 概要                                        |
|:----------------------------------------------------------------------------------|:--------------------------------------------|
| [smartparens](https://github.com/Fuco1/smartparens)                               | 括弧等のペアの処理                          |
| [blacken](https://github.com/pythonic-emacs/blacken)                              | コードフォーマッタ                          |
| [highlight-indent-guides](https://github.com/DarthFennec/highlight-indent-guides) | インデントの強調表示                        |
| [rainbow-delimiters](https://github.com/DarthFennec/highlight-indent-guides)      | 対応する括弧の強調表示                      |
| [whitespace-mode](https://www.emacswiki.org/emacs/WhiteSpace)                     | 空白の可視化                                |
| [mwim](https://github.com/alezost/mwim.el)                                        | 行頭・行末移動の拡張                        |
| [py-isort](https://github.com/paetzke/py-isort.el)                                | pythonファイルのimport順の整理              |
| [company-mode](https://github.com/company-mode/company-mode)                      | Emacsの入力補完用パッケージ                 |
| [yasnippet](https://github.com/joaotavora/yasnippet)                              | テンプレートの挿入                          |
| [Flycheck](https://github.com/flycheck/flycheck)                                  | 構文チェッカー                              |
| [lsp-mode](https://github.com/emacs-lsp/lsp-mode/)                                | lspを利用するためのクライアントパッケージ   |
| [lsp-pyright](https://github.com/emacs-lsp/lsp-pyright)                           | pyrightをlsp-modeで利用するためのパッケージ |

![ide![ss_ 2021-12-09 at 6.03.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53086/61145676-3571-80e3-c2be-7939c7b918e6.png)
.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53086/63f93af5-34fe-61e5-7b35-f045abb2e840.png)

これらの拡張を組み合わせるとIDEと同様の機能が使えますし、さらにEmacs Lispを使うことで自分の好きな機能を作り出せます。

## GTDツールとしてのEmacs
次は、GTDツールとしてのEmacsです。
GTD(Getting Things Done)はタスク管理手法の一つです。EmacsではOrg Modeを利用して、GTDを実現できます。
前述したEmacsのキーバインドの恩恵を受けられますので、こちらも快適に記述できます。
例えば、以下のようなイメージです。
![gtd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53086/e50cd277-4ad9-aa1a-8aa3-e2dae9e21e5f.png)

## Emacs Lisp実行環境としてのEmacs
Emacs Lispは、Emacsで使われているプログラミング言語(LISPの一種)です。
Emacs Lispは、Emacs自体の実装にも使われていますし、Emacsの設定、パッケージにも使われています。

見慣れないと分かりづらいかもしれません。
しかし、このEmacs Lispを使えるようになると、以下のように自分の思いをそのままEmacsに反映させることができるようになります。

- この処理はまとめて自動化できそう
- 他のエディタでみたこの機能便利だから、Emacsでも実装してみよう
- UIはこうだったらもっと良いから変更してみよう

まさに自分好みのエディタ(Emacs)ができあがります。
この拡張性の高さがEmacsの一番の醍醐味だと個人的には思っています！

使いこなすまでには多くのハードルがありますので、まずは簡単な設定から始めて少しずつ変えていくのが良いかもしれません。

## その他
Emacsは上記以外にも色々できます。メーラ、Jupyter Lab、skk(日本語入力システム)等。
すべてEmacsでやる必要はないですが、Emacsの恩恵を受けられるようになりますので、何ができてどのような操作感になるか試してみるのも一興です。(ネイティブアプリのほうが便利なことのほうが多いですが 笑)


## おわりに
ここまで読んでいただき、ありがとうございました。
少しはEmacsを使ってみたいなと思っていただけると嬉しいです。

Emacsのインストールや設定方法についてはWeb検索していただくと素晴しい記事がたくさんありますので、そちらをご参照いただければと思います。

おっと、最後に大事なことを書くのを忘れていました。

「ctrlキーをAの左隣に設定すること。」

この設定を忘れてしまうとctrlキーを多用するEmacsはかなり使いづらくなってしまいます。例えEmacsを使わなくともこの設定することをお勧めします。

それでは、皆様も素敵なEmacsライフを！