Emacs はそれなりに使えるようにするまでがめんどくさい
最近 GNU Emacs 関連の諸々をいろいろ見直していてしみじみ思ったのだが、やはり Emacs は一通り使えるようにするまでがめんどくさいですな。昔に比べればインストール自体は簡単になったが、そこから先がよく分からない。素のままの Emacs はかなり使いにくい代物で、VSCode あたりに慣れた今の目からすると、見ため的にもちょっとしょぼい。設定を解説するウェブページ等はいくらでもあるのだが、何せ約40年の歴史があるソフトウェアで、おまけになんだかんだ言って結構活発に開発が続いているので、解説といっても内容が古くなっていることが多く、混乱に拍車を掛けている。そのあたりが人々を Emacs から遠ざけているとしたら残念なことである。
近年は Doom Emacs や Spacemacs といった設定フレームワークがそのへんを補おうとしているようだが、個人的な好みで言えば、これらはちょっと大規模で複雑すぎる。できれば素のまま Vanilla の Emacs に若干トッピングする程度で済ませたいのである。
黙って待てばピタリと動く
そんなわけで、自分の Emacs 設定ファイルを整理して公開してみることにした。方針としては、
- 最低限の設定はファイル1つ(実際は2つだけど)で、 全自動 で済むようにする
- WindowsでもGNU/Linuxでも同じ設定ファイルで大体いけるようにする
- パッケージは Emacs 標準となった/なりそうなものを優先して選ぶ
- 最近の流行りを優先する
といったあたりである。
一応 2022年12月現在最新の安定版である Emacs 28.2 を前提としている。一応 Emacs 29 の動向も横目で見てはいるつもりですが…。
使い方
Git のインストール
Emacs は Emacs Lisp で書かれたマクロ・パッケージで拡張でき(というかそもそもEditor MACroSの略だし)、それはそれは膨大な数のパッケージが存在するのだが、今回はパッケージ管理を leaf.el と straight.el というものに任せることにする。設定ファイルに設定を書けば、手でダウンロードしたりインストールしたりしなくても必要なパッケージを落としてきて勝手に入れてくれるのだが、バックエンドとして Git を使うので、先に Git を入れる必要がある。
GNU/Linux の場合は、ほぼ全てのディストロに git はパッケージとして収録されているだろうから、 apt-get install git
とかで入れてもらいたい。Windows の WSL2 で動かす GNU/Linux や Android で UserLAnd に入れた GNU/Linux、あるいは Termux で使う場合も同じである。今回の設定はターミナルでも動くことも確認している。
さて、Windows の場合 Git for Windows を入れてもよいのだが、最近では Emacs 本体も含めて Scoop や winget で入れるのが手軽であろう。例えば Scoop を使うとすると、PowerShell から
> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
> irm get.scoop.sh | iex
で Scoop 自体がインストールできるので、あとは scoop install git
とかである。
Emacs 本体のインストール
例によって GNU/Linux の場合は、ほぼ全てのディストロに emacs はパッケージとして収録されているだろうから、 apt-get install emacs
とかで入れてもらいたい。
Windows の場合も公式インストーラで入れてもよいのだが(プリテスト版を使いたければそうなる)、最近では Emacs 本体も Scoop や winget で入れるのが手軽であろう。例えば Scoop を使うとすると、emacs は extras
bucket に収録されているので、
> scoop bucket add extras; scoop install emacs
とかでしょうか。Scoop そのものについては Scoopを使ったWindows環境構築のススメ - Super!! が参考になる。
ところで Windows の場合、一昔前は Emacs を一通りインストールした後に Emacs バイナリにパッチを当てて再ビルドしないと満足に日本語入力が出来なかったのだが、最近では tr-ime を入れることで、パッチを当てなくても昔の IME パッチと遜色無く日本語入力が出来るようになった。しかも straight.el のおかげで全自動でインストールされる。良い時代になりましたねえ。
cmigemo のインストール
Emacs を日本語話者が使う場合、Mmigemo はある意味必需品だと思う。例えば「八田」を検索したい場合、普通は当然「八」「田」と漢字に変換した上で入力して検索しなければならないのだが、cmigemoを使えば「hat」等とローマ字で入れても読みですぐ引っかけてくれる。口で説明されてもピンと来ないだろうがやってみればすぐ分かる。今回の設定ファイルでは検索時に orderless から C/Migemo を呼び出すように仕込んだので、cmigemo をインストールする必要がある。
cmigemo は GNU/Linux なら大概のディストロには入っていると思う。以前 Windows では自分でビルドするかバイナリの zip アーカイヴをダウンロードしてきて展開したりパスを通したりする必要があったのだが、 当方で scoop の bucket を用意したので、
> scoop bucket add mhatta https://github.com/mhatta/scoop-bucket; scoop install cmigemo
でインストールできるはず。zip ファイルも同じレポジトリにある。
他にもいろいろ入れたほうが良いものはあるが、、それらは必要になってワーニングやらエラーやらが出たら scoop なりなんなりで入れればよいでしょう。一応そのうち必要になると思われるのは
> scoop install watchexec diffutils python ripgrep hugo gcc
といったあたりであろうか。特に org-roam
は emacsql
のビルドで gcc が必要なので、余裕があればあらかじめ入れておくとよい。
環境変数 HOME の設定
Unix 由来のソフトウェアはホームディレクトリを参照することが多い。Windows の場合何も指定しないと C:\Users\ユーザー名\AppData\Roaming
か何かを見に行って不便なので、 設定から C:\Users\ユーザ名
あたりを指定すると良い。
Emacs 設定ファイルのインストール
前項のように環境変数 HOME を設定した上で emacs をとりあえず一度実行すると、HOME 以下に ~/.emacs.d ディレクトリが作成される(手で mkdir してもよい)。ここに、
> git clone https://github.com/mhatta/emacs-barebone-init-el
で落としてきた early-init.el
と init.el
をコピーする。
> cp emacs-barebone-init-el/*.el ~/.emacs.d
あとは emacs を実行して辛抱強く待っていれば、特に人間が何かしなくともインストールから設定まで終わるはずである。裏ではものすごい量の git clone が走っているので、ネットワーク通信状況の良いところで実行すると良い。
あとは、 init.el
の中の ;; CHANGEME
というところがいくつかあるので検索して確認し、変えるべきところは変えてもらいたい。メールアドレスとかフォントのサイズとかです。
使い方
インストールの方法を書くだけで力尽きたので、Emacs の使い方については他のサイトを紹介するに留める。そのうちまた書くかも。
何が入っているのかよく分からないと思うが、とりあえず init.el
を開いて M-x leaf-tree
を実行し、入っているパッケージについてウェブ検索してみると良いのではないかと思う。昔は init.el
を分割したり大変だったが、 leaf-tree
のおかげで大分見通しがよくなった。
- Emacs の操作や使い方全般
- ミニバッファ補完について(ようするに Emacs の実質 UI である。ここ10年ほど移り変わりが激しいのだが今回は corfu/vertico を採用)
- Org-mode 関係(org-roam や org-roam-ui も含め一通り使えるようにしてある)
- 手前味噌ながらモーレツ! Org mode 教室シリーズ
連絡先
うまく動かない、このパッケージは追加したほうがよい、その他添削や苦情などは、Githubレポジトリのissues に投げてやってください。PRも大歓迎。Emacs 盆栽は楽しいよ!時間を無限に食うけどな!
より一般的な質問は、日本のEmacsユーザーのためのハブサイトから辿れる Slackの Emacs JP チャンネルで聞くのがよいでしょう。
この記事は、個人ブログからの転載です。Emacs 上の Org-mode で書き、Org2blog で Wordpress に投稿したのと同じ原稿を、ox-qmd で変換してそのまま投稿しました。