Closed17

僕の Emacs はまだ 7 回の変身を残している (はず)

toyboot4etoyboot4e

極めたい……!

Emacs の紹介兼設定更新のスクラップです。

toyboot4etoyboot4e

利用パッケージ

現状把握から始めます。

基本

leaf, lsp-mode, minadware です。

項目 パッケージ
プロファイル切り替え chemacs2
パッケージ管理 leaf.el + leaf-manager.el (package.el, straight.el), auto-package-update
completing-read consult + vertico
LSP lsp-mode, lsp-ui
補完 corfu

UI 強化

こだわりが出ると思います。

項目 パッケージ
キーバインド evil, hydra
スニペット tempel
モードライン doom-modeline + minions
Git git-gutter, magit + forge, blamer
プロジェクト projectile
ウィンドウ tab-bar-mode, (tmux)
ウィジェット neotree, centaur-tabs

改善の余地あり

項目 パッケージ
アイコン (TUI) なし
シェル vterm 単体
VSCode の pane 探しています
toyboot4etoyboot4e

Distribution は使わないのか

SpacemacsDoom Emacs は Emacs のリッチな設定セットです。一部の人から絶大な人気を誇ります。

しかし欠点もあります。

  • 独自 DSL を多用しており、何が起こっているのか分からない
  • パッケージの選択が意外に不自由

各 distribution のデフォルト設定が合わなければ、 1 から設定ファイルを作った方が実は簡単かもしれません。

toyboot4etoyboot4e

変身 1: Sticky imenu

VSCode の Sticky Scroll が話題になりました。実は Vim にも Emacs にも同じ機能があるみたいです。へぇ……。より理想的な UI が無いか考えたところ、アウトライン表示のハイライトと現在のソース位置を連動させたいと思いました。

できました (gist)。他力本願です 🙏 なお imenu 項目はソースに出てきた順番で表示します:

(leaf lsp-ui-imenu
    :ensure nil
    :custom (lsp-imenu-sort-methods . '(position))

また 1 つ欲を満たしてしまった…… (イキり)

toyboot4etoyboot4e

変身 2: サイドバーのバッファグループ

上記 lsp-ui-mode-imenuneotreecentaur-tabs のバッファグループにまとめてみました:

改めてサイドバーのウィジェットを作ったわけではありません。効率良し!

@ から始まるバッファは、自動的にサイドバーのバッファ一覧に追加されます。今後のウィジェット追加も簡単そうです。

toyboot4etoyboot4e

変身 3: ボトムバーのバッファグループ

サイドバーができるなら、ボトムバーだって作れます。画面端にウィンドウを作る関数があります (display-buffer-in-side-window):

(display-buffer-in-side-window buffer '((side . bottom)))

これにより、 vterm*scratch* 風のバッファを画面下部に表示できます:

これでほぼ VSCode に匹敵しました! 欠点は、ボトムバーが全く要らないことですね…… (tmux が上位互換です)

LSP の診断情報などは minibuffer で表示・検索します。 embark を使えば保存・再表示もできそうです。

toyboot4etoyboot4e

変身 5: ハイスペック PC の購入

起動が爆走になります。結局これが一番効果ありました……!

toyboot4etoyboot4e

変身 6: 強引な fix

うちの Evil Emacs はかなり設定を妥協しています。妥協点を強引に解決すれば、それも 1 つの変身と呼べるのではないでしょうか。

変身 6-1: 巨大ファイルにおける複数行挿入の高速化 (Evil)

プロファイル (profile-start, profile-end, profile-report) を取ると tree-sitter--do-parse が CPU (使用率?) の 95% を閉めていました。 insert mode における変更の繰り返し適用を combine-change-calls で囲うことで hook の呼び出しがまとまり、大幅に高速化できました。

https://github.com/toyboot4e/dotfiles/commit/46a59aa4011909938aeb71daca46dc6d746f39bd

undo も同様に速くなって良いですね! この種の変更が妥当であるならば、 (誰か) upstream にも入れて欲しいなと思ったり思わなかったり…… (まあいいか。。)

toyboot4etoyboot4e

以上

変身と言いつつ地味な進捗を重ねてきました。アイコンも出たので NeoVim に引けを取らないエディタであると胸を張って言えるようになりました。 Emacs はターミナルでも一級品だった……!

toyboot4etoyboot4e

その他、伝聞

toyboot4etoyboot4e

org-ai

便利だー

(leaf org-ai
    :hook (org-mode-hook . org-ai-mode)
    :custom (org-ai-default-chat-model . "gpt-4o"))

(leaf markdown-mode
    :custom
    ((markdown-command . "multimarkdown")
     (markdown-hide-markup . t)
     (markdown-fontify-code-blocks-natively . t))

markdown-mode の設定をすると見た目も良い感じに:

このスクラップは6ヶ月前にクローズされました