Emacsで新しいパッケージを入れるときの私の手順

こんにちは、Emacs使いのよんたです。

ちょっと前に入社しました🎉
新たな環境で新たなEmacsパッケージを入れることが多くなっています。

そこで本稿ではEmacsで新しいことをしたいときにカスタマイズする手順を紹介します。

Emacs使いの方には「へー、そんなカスタマイズ方法があるんだ」と参考になれば幸いです。
またEmacs以外使いの方にも、読んで「へー、Emacsって自由でおもしろそう」と思っていただければ嬉しい限りです。

## パッケージを探す

まずはやりたいことのパッケージを探します。

例えば、

- Elm用の開発環境がほしい
- ファイルツリーを表示したい
- GitのCOMMIT_EDITMSGに色をつけたい

なんかです。

開発環境なら言語用のメジャーモードやLSPモード、さらにはLinter・Formatterのマイナーモードや設定がほしいでしょう。
ファイルツリーならなんらかの外部パッケージがありそうです。
Gitコミットのようなよくあるものなら、内部パッケージがあるかもしれません。

これらに対して、自分は主に以下のような手を使って探しています。

### [MELPA](https://melpa.org/)トップページでサーチ＆ソート

- DL数があって便利
- GitHubリンクもあって最高

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/5c001d21-5495-4b99-b4b7-3c8318ee6442.png)

### ChatGPTに聞く

- 「EmacsでElm用の開発環境を整えたいんだけど、どんなパッケージがおすすめ？」などと聞くとすぐ答えてくれる
- LLM便利！

### Google検索してブログとかを漁る

- 最近は古い情報ばかりであまり使わなくなりました……、寂しい

## パッケージを比較する

MELPAの検索やChatGPTの回答は、たいてい複数のパッケージが見つかります。
そこでどれが便利か自分の目的に合うかを調査・比較します。

私は以下のような点を注目して調べています。

### GitHubのREADMEを読む

- 特にスクリーンショットがあるとわかりやすくて好印象
- どんなカスタマイズができそうか
- 最終commitはいつで、いまもメンテナンスされているか

### MELPAのDL数・GitHubのスター数

- 人気があるのにはそれなりに理由があり、信頼できる数値として見ています

### モダンな実装さ、ソースコードの短さ

- 実装が巨大なレガシーパッケージはどうしても壊れやすい印象があります
- 特に最近はEmacs標準機能の追加・強化が最近多く、
  モダンでシンプルなパッケージがどんどん出てきている印象です[^modan-package]

[^modan-package]: 例えば私が移行したパッケージを例にあげると、expand-region → expreg、undotree → vundo、ivy/counsel/swiper → vertico/consult、yasnippet → tempel、all-the-icons → nerd-icons、smartparens → electric-pair-mode、auto-highlight-mode → idle-highlight-mode、volatile-highlights → goggles、git-gutter → diff-hl、centaur-tab → mode-line-tab、persp -> activities、などがあります

## パッケージをインストールしてみる

どのパッケージを使うかを1つか2つに絞ったら、実際にインストール・カスタマイズして試してみます。
私は設定にleaf.elを採用しているので、これでインストール＆カスタマイズを書きます。

インストールには、`:ensure t`つきleaf項を`eval-region`で実行したり、package.elの`list-package`を使ってリストから選択・インストールしたりしています。

### leaf.elでのインストール

```elisp:init.el
(leaf elm-mode :ensure t) ;; この行を選択しeval-regionしたりする
```

### package.elの`list-package`によるインストール

- `M-x list-package`で呼び出し
- `i`でインストールするパッケージを選択
- `x`で実行
- 他に便利なコマンドとして
  - `d`でデリーとするパッケージを選択
  - `U`でアップデート可能パッケージすべてを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/2e9933ed-e672-4cbd-a876-343acd470d6f.png "package.elのlist-packageで表示されるパッケージ一覧")

## パッケージをカスタマイズして動作を試す

カスタマイズも同じくleaf.elを使って行います。
scratchバッファーにて`setq`や`add-hook`で試すことも多いです。

このとき、カスタマイズする方法は以下のように探して実行します。

### GitHubなどのREADMEを読んでカスタマイズ方法を調べる

- たいてい基本的な使い方が載っている
- カスタマイズ可能な変数の一覧もあったりする
- おすすめのカスタマイズ例があると好印象

### ソースコードを`defcustom`で検索してカスタム変数をすべて見てみる

- なんだかんだこの方法を使うことが多い[^ellama-translate]
- カスタマイズ可能なカスタム変数がすべてわかる
- カスタマイズするとどんな動作が変わるのか、ソースコードですぐ追える
- 他にも、設定に使える`XXX-map`や`XXX-mode`の定義を見たりする


[^ellama-translate]: 昔は英語に苦しんでいましたが、いまは`ellama-translate`を使って一発で翻訳・要約できていい時代になったなと思います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/16e78fe2-7e07-4794-b620-32eebe1ec09c.png "ソースコード内でdefcustomでサーチする様子")

### 実際にカスタマイズして動作を見てみる

- インストールと同じく、leaf.elで書いた設定を`eval-region`で実行する
- scratchバッファーにて`setq`や`add-hook`を書き、`C-j`（`eval-print-last-sexp`）で実行する
  - emacs-lispとしての補完やドキュメント表示も利用できる
- コードを実行すると、Emacsの動作がすぐに変わり便利

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/c54e026c-c019-4112-b367-41acaf02dd0a.png "leaf.elでカスタマイズする様子")

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/730ca26b-6e4e-4345-967f-aeddbbc4e5a9.png "scratchバッファーにてsetqを試す様子")

### ちなみに、`customize-group`は使っていない

Emacsにはカスタム変数を見るために`customize-group`という関数も用意されています。
TUI形式でカスタム変数の一覧表示・変更ができます。

しかし私はまったく使っていません。
ドキュメントだけではわからないことも多く、すぐ追えるソースコードを見ることが多いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/f0ce9df9-ce9e-4ad1-b878-16d96e0df1f0.png "customize-gropu elmでカスタム変数一覧を表示する様子")

## まとめ

以上が私のEmacsカスタマイズ方法の手順です。
Emacsのカスタマイズはプログラミングそのものであり、とても楽しいです。
みなさんもEmacsのカスタマイズ沼にはまってくれれば幸いです。

ちなみにパッケージにはオシャレな名前がついていることもあり、検索するのが難しいと思っています。
例えば、

- copilot.el
  - Copilot用パッケージだな！
- Embark
  - 直訳すると「乗船」など
  - 🤔🤔🤔🤔🤔

となったりします。

他の方はどうやってパッケージを探したり、インストール・カスタマイズしていますか？
ぜひ教えてくれるとありがたいです。
いや、頼む！教えてくれ！