仕事でClojureを使うことになり、4年半ほど使っていたVSCodeからEmacsの利用に切り替えることにしました。Emacsには過去に5年間ほどSpacemacsというディストリビューションでお世話になったので、その思想を折り込んで設定します。
設定には時間も労力もかかりますが、自分だけのエディタができあがりキーボードだけで高速に操作できる体験は何者にも代えがたいです。AI連携のモダンエディタが華やかなりし今、あえてEmacsを選ぶ方の一助や楽しみとなればと思います。
スクリーンショット
Claude Code連携

SKKによるClaude Codeへの日本語入力の摩擦もEmacs側から操作するので問題にならない
Clojure開発

LSP (Language Server Protocol) + CIDERによるREPL開発もできます
注意
EmacsやVimの設定は分かりやすい正解というものがなく、「自分のユースケースに適しているなら短い記述でいいか」となっている箇所もあるのでご容赦ください。また、明らかな間違いを発見された場合は、気軽にコメント頂けると幸いです。
前提
- Mac + emacs-plus@30がインストール済み
- 細かい前提条件については、各種設定ファイルの先頭にコメントを記述
- evilというVimキーバインドを使うパッケージを適用しているため、Vimキーバインドに慣れている方向けです
利用方法
- 以下2つの設定ファイル(
early-init.el, init.el)を~/.emacs.d/以下に配置した上で、Emacsを起動
- 初回はライブラリのフェッチでとても長い時間がかかり、Warningがいくつか出るが問題ないので無視
- 2回目以降はスッキリ使えるはず
- Emacs初心者の方はとりあえずコピペ、少し詳しい方は自分なりにアレンジしてみてください
- コメントの前方に書いている前提条件や、インストール直後のコマンド実行が必要になってきます
設定 (~/.emacs.d/early-init.el)
EmacsのGUIが描画される前、init.elよりも先にロードされる設定
設定 (~/.emacs.d/init.el)
メイン設定ファイル。2000行近くありますが、これでも少ない方だと思います。
キーバインド
-
SPC: space
-
DEL: backspace
-
RET: enter
-
M- : commandキーを押しながら
-
C- : ctrlキーを押しながら
-
S- : shiftキーを押しながら
基本
-
C-;: ヘルプのトリガー(C-hはbackspaceにしたいので)
-
SPC: 自分で登録したキーバインドを起動するリーダーキー(グローバル)
-
,: 自分で登録したキーバインドを起動するリーダーキー(ローカル)
独自定義
できるだけ頭の中でニーモニックに従って思い出しやすい命名にしています。
SPC(グローバルリーダー)
| キー |
操作 |
SPC SPC |
M-x 実行 |
SPC ; |
コメントアウト/コメントイン |
SPC t l |
行の折り返しトグル(truncate-lines) |
SPC t f |
flymake の ON/OFF |
SPC t c |
copilot-mode ON/OFF |
SPC c |
vterm 内のディレクトリを移動 |
SPC q q |
Emacs 終了 |
SPC q r |
Emacs 再起動 |
ファイル (SPC f)
| キー |
操作 |
SPC f f |
ファイルを開く(find-file) |
SPC f r |
最近使ったファイルを開く |
SPC f p |
プロジェクト内のファイル検索 |
SPC f s |
ファイル保存 |
SPC f t |
treemacs を開く |
SPC f y |
プロジェクト相対パスをコピー |
init.el (SPC i)
| キー |
操作 |
SPC i i |
init.el を開く |
SPC i r |
init.el を再読み込み |
バッファとブックマーク (SPC b)
| キー |
操作 |
SPC b b |
バッファ切替 |
SPC b d |
現在のバッファを閉じる |
SPC b h |
dashboard を開く |
SPC b l |
ブックマーク一覧 |
SPC b s |
現在行をブックマークに追加 |
SPC b k |
ブックマーク削除 |
検索 (SPC s)
| キー |
操作 |
SPC s s |
バッファ内検索 |
SPC s p |
プロジェクト検索 ripgrep |
SPC s d |
カレントディレクトリ検索 |
プロジェクト管理 (SPC p)
| キー |
操作 |
SPC p p |
プロジェクトを切り替える |
SPC p f |
プロジェクト内の解析結果を一覧 |
ワークスペース / ウィンドウ (SPC w)
| キー |
操作 |
SPC w w |
Workspace切替 |
SPC w r |
Workspace 名変更 |
SPC w d |
Workspace 削除 |
SPC w s |
Workspace 保存 |
SPC w l |
Workspace 一覧から選ぶ |
SPC w u |
直前の画面分割を復元 |
Git / GoTo (SPC g)
| キー |
操作 |
SPC g s |
magit status |
SPC g l |
magi log |
SPC g d |
プロジェクト内の現在の変更を表示 |
SPC g b |
magit blame トグル |
Diff/Debug/Docker/DB (SPC d)
| キー |
操作 |
SPC d d |
現在バッファの変更を表示 |
SPC d c |
Dockerコンテナの操作 |
SPC d b |
DBに接続 |
AI (SPC a)
| キー |
操作 |
SPC a m |
Claude Code menu |
SPC a a |
Claude 開始 |
SPC a b |
Claude scratch |
SPC a s |
Claude prompt送信 |
SPC a n |
Claude 改行 |
SPC a 1 |
Claude: send '1' |
SPC a 2 |
Claude: send '2' |
SPC a 3 |
Claude: send '3' |
SPC a e |
Claude ESC |
SPC a q |
Claude 停止 |
SPC a c |
Claude continue |
SPC a r |
Claude resume |
SPC a l |
Claude session list |
SPC a x |
Codex 起動 |
LSP (SPC l)
| キー |
操作 |
SPC l s |
LSP start |
SPC l r |
シンボルのリネーム |
SPC l a |
code actions |
SPC l f |
フォーマット |
SPC l R |
再接続 |
SPC l q |
LSP停止 |
Motion (g)
| キー |
操作 |
g n |
次の diff hunk へ |
g p |
前の diff hunk へ |
g t |
next workspace |
g T |
prev workspace |
ローカルリーダー(,) Lisp編集
| キー |
操作 |
, s |
slurp forward |
, S |
slurp backward |
, b |
barf forward |
, B |
barf backward |
, r |
raise |
, p |
splice backward |
, ( |
wrap () |
, [ |
wrap [] |
, { |
wrap {} |
, " |
"" で wrap |
, d w |
delete wrap |
, k |
sexp end まで kill |
, y |
sexp end まで yank |
, h |
eldoc |
Markdown
| キー |
操作 |
, , |
GFM チェックボックス toggle |
Flymake
| キー |
操作 |
] ] |
次のエラーへ |
[ [ |
前のエラーへ |
Clojure (SPC m)
| キー |
操作 |
SPC m i |
cider-jack-in |
SPC m c c |
cider connect clj&cljs |
SPC m c j |
connect clj |
SPC m c s |
connect cljs |
SPC m q |
cider quit |
SPC m l F |
clojure-lsp cache clear/restart |
Clojure Eval (,)
| キー |
操作 |
, e e |
eval last sexp |
, e f |
eval dwim |
, e b |
eval buffer |
, e n |
eval ns form |
, i |
REPL に defun を挿入 |
, n r |
ns refresh |
, n s |
REPL の ns を設定 |
, t |
REPL buffer に移動 |
, R |
(reload) を REPL に送る |
Emacs Lisp (,)
| キー |
操作 |
, ' |
ielm 開く |
, e e |
eval last sexp |
, e f |
eval defun |
, e b |
eval buffer |
, i |
時刻挿入 |
, P |
パッケージが built-in か確認 |
K |
helpful-at-point |
その他
SKK
| キー |
操作 |
C-x j |
skk-mode ON/OFF |
C-j |
skk 確定 |
evil-numbers
embark
| キー |
操作 |
C-. |
embark-act(ミニバッファ) |
C-, |
embark-export(ミニバッファ) |
vterm toggle
copilot
| キー |
操作 |
C-<tab> |
Copilot 補完を accept |
M-/ |
Copilot 補完開始(prog-mode) |
eglot
to be continued...
Discussion