僕の Emacs はまだ 7 回の変身を残している (はず)
極めたい……!
Emacs の紹介兼設定更新のスクラップです。
利用パッケージ
現状把握から始めます。
基本
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 | 探しています |
〜 2024/05
2022-12
Emacs 29 では --init-directory
引数でプロファイルを切り替えましょう。参考:
〜 2024/05
-
akib/emacs-eat
ELisp 製の速いターミナル -
org-ai
気になります -
org-nix-shell
気になりますね
Distribution は使わないのか
Spacemacs や Doom Emacs は Emacs のリッチな設定セットです。一部の人から絶大な人気を誇ります。
しかし欠点もあります。
- 独自 DSL を多用しており、何が起こっているのか分からない
- パッケージの選択が意外に不自由
各 distribution のデフォルト設定が合わなければ、 1 から設定ファイルを作った方が実は簡単かもしれません。
変身 1: Sticky imenu
VSCode の Sticky Scroll が話題になりました。実は Vim にも Emacs にも同じ機能があるみたいです。へぇ……。より理想的な UI が無いか考えたところ、アウトライン表示のハイライトと現在のソース位置を連動させたいと思いました。
できました (gist)。他力本願です 🙏 なお imenu 項目はソースに出てきた順番で表示します:
(leaf lsp-ui-imenu
:ensure nil
:custom (lsp-imenu-sort-methods . '(position))
また 1 つ欲を満たしてしまった…… (イキり)
変身 2: サイドバーのバッファグループ
上記 lsp-ui-mode-imenu
と neotree を centaur-tabs のバッファグループにまとめてみました:
改めてサイドバーのウィジェットを作ったわけではありません。効率良し!
@
から始まるバッファは、自動的にサイドバーのバッファ一覧に追加されます。今後のウィジェット追加も簡単そうです。
変身 3: ボトムバーのバッファグループ
サイドバーができるなら、ボトムバーだって作れます。画面端にウィンドウを作る関数があります (display-buffer-in-side-window):
(display-buffer-in-side-window buffer '((side . bottom)))
これにより、 vterm
や *scratch*
風のバッファを画面下部に表示できます:
これでほぼ VSCode に匹敵しました! 欠点は、ボトムバーが全く要らないことですね…… (tmux
が上位互換です)
LSP の診断情報などは minibuffer で表示・検索します。
embark
を使えば保存・再表示もできそうです。
変身 5: ハイスペック PC の購入
起動が爆走になります。結局これが一番効果ありました……!
変身 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 の呼び出しがまとまり、大幅に高速化できました。
undo
も同様に速くなって良いですね! この種の変更が妥当であるならば、 (誰か) upstream にも入れて欲しいなと思ったり思わなかったり…… (まあいいか。。)
nerd-icons.el
変身 7: これはサポートしているパッケージが少ない気がしてスルーしていたのですが、フルで機能してくれますね:
-
centaur-tabs
: out-of-the-box でうごきます -
neotree
: こちらの PR を参考にしました -
nerd-icons-completion
: minadware に icon が付きます -
doom-modeline
でもネイティブ対応 (スクリーンショットでは無効)
以上
変身と言いつつ地味な進捗を重ねてきました。アイコンも出たので NeoVim に引けを取らないエディタであると胸を張って言えるようになりました。 Emacs はターミナルでも一級品だった……!
その他、伝聞
-
embark
たとえばfind-file
で見つけたファイルの開き先をace-window
で指定する: https://karthinks.com/software/fifteen-ways-to-use-embark/#:~:text=to suitable keys.-,Open any buffer by splitting any window,-This needs a -
emacs-lsp-booster
lsp-bridge 並に速くなるとか。 - AI 関連 (+ org-ai, ellama)
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 の設定をすると見た目も良い感じに:
Ellama
VRAM が足りなかったので使っていません。
mistty