最近のEmacsの使い方

あれ?というくらいに季節が過ぎてますね。そろそろ梅雨が明けそうな昨今、いかがお過ごしでしょうか。 キーボードの話題ばっかなので、たまにはEmacsの話題をしてみます。あ、前のキーボードは無事v2となり、かなりThockyな音が出るようになったので、個人的にはだいぶ満足です。 gptelを利用したcommit message生成 https://github.com/derui/gptel-commit-message LLMを使ってガツッと作りました。非常にシンプルな作りとしていて、カスタマイズも最小限です。部屋のGPUだと90token/sとか出るので、Gemma 4/4bと組み合わせると、速いと1秒くらいで生成がおわったりします。後でsquashするからとりあえずcommit、みたいなときに重宝します。 ちなみにこの類は、同じようなものがあと2つくらいあるのは見かけましたが、差異としては アニメーションを追加 他は割となかったんですが、個人的に視覚的にわかるものがほしかったので IntelliJとかも勝手に生成したりしますが、 今生成しているのかどうなのか がわからないのが大変にストレスだったので、自分でハンドリングできるようにしてます くらいですね。git diffをcontextに突っ込んでいるので、尋常じゃないサイズとかだと遅くなりますが、そもそもそんなケースは少ないので無視してます。 eglotのsignatureの出し方試行 https://github.com/derui/eglot-signature-display もう一個、LLMを使って作ってみました。何かというと、eglotを利用しているときに、LSPから返ってくるsignatureをどう見やすく永続化するか・・・?というポイントに対してです。IntelliJとかVSCodeとかだとwindowになるんですが、posframeを利用したところ、AeroSpaceを利用しているお仕事PCでとても大変なことになったので、overlayを利用してみてます。 逆にいえば、これがなかったらposframeだけで良かったとも言えます。Aerospace以外には https://github.com/typester/yashiki ってものも見つけたので、こっちも試してみようかなと。 だいたい動くんですが、overlayの宿命として、空白行だったりするとガコンと下がる問題があり、これについてはなかなかいかんともしがたい・・・っていうところになってます。AeroSpaceにchild frame対応が入ったらまた考えようとはしてます。 eglot標準のsignatureが気に入らなかった理由 eglotは、当然標準としてsignatureの表示に対応しています。いるんですが、表示される場所が echo area となっており、これは変数の型表示とかですごい勢いで更新されます。で、かつecho areaに出るということは、都度視線をそっちに持っていく必要がある、ということにもなります。これは割とストレスです。 これに対する対策というか案として、side windowにeldocを永続化して、そっちに表示する、みたいなのも試しましたが、これはこれで結局は 都度固定しないといけない triggerでいきなり出るとすっごい邪魔 という課題が発生しました。signatureがLSPから送られるのは基本的にtriggerになるキーが押された場合とかで、LSPサーバー側から一方的に送られる形になっています。なので編集するときにいきなりレイアウトが切り替わるのは、ちょっと色々許せない感じです。 agent-shell + agent-shell-pet https://github.com/xenodium/agent-shell https://github.com/lgmoneda/agent-shell-pet 自分でforkしたもの。 https://github.com/derui/agent-shell-pet 現在Emacsに統合されたcoding agent環境がほしいのであれば、ほぼagent-shell一択でいいのではないかとは思います。高速なrendering、visual、diffのみやすさなどは群を抜いています。agent-shell-petはまあ賑やかしといったところですね。ただ、agent-shell-petは自分の設定をサポートしていなかったのと、macOSしかまともに動作しない🤣状態だったので、以下の改善を施してます。 viewport modeへの対応 child frameのサイズ設定バグの対応 image insertではなく、事前生成したanimated webpを利用することによる性能改善 child frameのサイズ計算がちょっとミスっていそうだったのを修正 これをやることで、概ね問題ない感じになってます。ただ、event handlingがちょっと変・・・?というところがあったので、暇があればそのへんも対応しようかな、とは思ってます。 とはいえ、terminal経由でagentを直接利用することがほとんどで、そこまで使いこなしているわけではないのですが。 mozcからの脱却 記憶にある限りだと、かれこれ10年くらいmozcにお世話になってきましたが、mozc自体のバージョン管理とかとmozc.elのミスマッチとかが重なったため、macOSではnative、LinuxではFcitxを利用する形に変更しました。なんか以前は色々できなかった気がしますが、Wayland対応の一環で、そこら辺がなんとかなるアダプターだけ作ったから、あとはなんとかしてくれ、ということになったっぽいです。さすがOSたるEmacs(なんか違う気がする)。 今この文章もFcitxで打ってますが、まあ特になんの問題もなく打てていますし、keybindについても自由にできているので、ここらへんについては隔世の感を強く感じますね。Meadowとか使ってて、Windows IMEと戦ってた時代が大変に懐かしいです。 これから Emacs(Meadow/Xyzzyも含む)をなんだかんだ使い続けて20年くらいになりそうですが、最近は良くも悪くも Emacsならでは ってものはなくなり、逆に言えばエディターとしての機能そのものは収斂進化したという感覚があります。ただ、よく言うXxx is deadみたいなのは、ほぼほぼマーケティングの言葉だと思ってるので、まだEmacsは進化するとも思ってます。 Vim(neovim)/Emacsがまだ熱い支持を受けているのは、両方とも 完全なるカスタマイズが可能 であること、つまりなんらかのアイディアがある場合の実験場として利用できることそのものでもあると思います。VSCodeもカスタマイズできるとはいえ、その場で環境そのものをいじれるわけでもないですし。Emacsがvimとも一線を画すのは、まさにLisp Machineそのものであるがゆえの、「なんでもできる」ことそのものだと思います。最近はSVGなども利用できるようになったりしているので、表現力についても色々向上していますし、develでは shaderを利用する とか、いい感じに狂気を感じる提案が出ていたりしています。 仕事ではなかなか使ってられない場合もありますが、より快適だったり、使っていて楽しい、みたいなものは追い求めたいですね。 ...

July 18, 2026 · derui

Emacsでのcursor移動をisearchに1本化しようとしている

気づいたら新入社員がはいって来てました。なんか去年も同じこと書いた気がしますが、気のせいでしょう。 まだまだEmacsを現役で利用していますが、カーソルの移動に対するアプローチを変えつつあります。 もともとの課題感 私はEmacs上では multistate という、modal editingの仕組みだけを提供しているpackageを利用して、modal editingそのものは すべて 自前で定義しています。evilとかmeowとかも使ってたので、そういったもののエッセンスも入ってます。 ちなみにevilを利用しなくなったのは単純で、Qwertyを利用しなくなったのでマッスルメモリーが使えなくなった、というのが最大です。ただ、なんだかんだEmacs上でのエミュレートではあるのと、個人的にはtext objectよりもpuni/treesitterベースでの選択ができればそれでよかったです。 そんな中で、ずっと悩ましかったのがカーソル移動です。上下左右についてはそりゃー定義していますが、 10行下にあるfoo に行きたい、となった場合に、大抵10回キーを押してます。word単位の移動とかならまだいいんですが。一応avyとかも入れていたんですが、よくある文字だと候補が多すぎて・・・っていうのにもなります。 avyを激推しする記事 2021年の記事にはなりますが、すっごい長文の記事があります。めちゃくちゃ長いのですが、Emacsを利用している場合は読んでおくといいと思います。 https://karthinks.com/software/avy-can-do-anything/ この記事の要旨としては、 カーソルの移動というものは換言すると3stepの話でしかない 同じ筆者が書いた、Emacsのウィンドウ管理に対する記事でも、同じような話があります avyがすでにそれを提供している isearchかavyで十分だ というところです。間違ってたらごめんなさい。この記事を何回か読んで、なんとなーく把握できました。 移動の優先度を見直す 私がやるカーソル移動(検索含む)は以下です。上から順に頻度が高いです。 hjkl likeな文字単位移動 word単位移動 consult-xxx consult-lineが最も頻度が高いです isearch 色々見直した感じ、以下のようになるようにしてます。 hjkl likeな文字移動 isearch + avy consult-xxx mode-specificな移動 orgだったらheading単位とか insert modeのままで・・・というのであれば他の選択肢もあると思いますが、いかんせんQwertyじゃないのでキー配置が色々ございまして、移動はnormal mode、と割り切っている次第です。 さて、isearchなんかいらなくて、全部consult-lineでいいじゃん?という方もいるでしょう。そこは自由なので「そうですね」となるのですが。それだと面白くないので、理由を書いてみようかと思います。 isearch vs consult-line Emacsの検索というとisearchがまずデフォルトであるのですが、大抵は consult-line などの利用を勧めているケースが見られます。これがなんでかなーというところを考えると、 スペース区切りだったりで検索できる(ように見える) 結果の一覧が見える のが大きいのだと思います。これについては全く違和感がないのですが、ことカーソル移動を主眼に置くと、以下の点でoverpowerです。 本質は filtining なので、検索はしていない 今見えてる場所を一覧しても何も嬉しくない 逆にminibuffer/bufferへの視線移動を伴う 同一行に複数の結果がある場合に対応できない 特に最後は、consultの本来的な目的を考えると、サポートは難しいというかしないと思います。が、移動となると頻繁にありえます。isearchならなんの問題もなくできますよね?という。 isearchのカスタマイズ 激推しされるavyには、 avy-isearch というもうそのまんまな機能があります。対象のfilterをisearchでやり、selectをavyでやる、という形で1本化することができます。お、これで解決では? キー数が増えてる、非効率だ!ってのはあると思いますが、単一操作であらゆるケースに対応できるので、記憶容量はむしろ減ると思います。avy/isearchの使い分けを・・・って考える時間のほうがもったいないんじゃ?と参照元も書いてた気がします。 さて、そんなisearchですが、欠点もあります。それは 検索方向を最初に決めないといけない ということです。 isearch-forward と isearch-backward ですね。isearchをカーソル移動として利用しようとしたとき、これが困ることが多いです。 ...

April 22, 2026 · derui

project管理をできるだけシンプルに行うpackageを作った話

気づけば卒業式シーズン。いかがお過ごしでしょうか。というかこっちの卒業式って3月の半ばなんですかね?(わかってない) 最近Emacs弄りの熱がまた上がってきたところですが、生成AIにコンセプトを伝えて作らせたものを紹介します。 できたもの https://github.com/derui/projab Project.el + Tab-bar というところで projab としました。一応ググってもそれっぽいのは出てこなかったので大丈夫だとは思います。 余談ですが、生成AIが提案した名前に workroom (後で出てきます)ってのがありましたが、もう全く同じ名前のpackageがありました。事前調査は重要ですね。 Project management系統なので、基本的に画面とかはありませんが、自分が欲しい以下の機能を兼ね備えたpackageがなかったので作成しました。 標準パッケージにだけ依存する Emacsの標準パッケージはすでにかなり充実していますので 特に、visualにかかわらない部分については、大半が汎用性のある形でできてます Bufferのリストだけ保存される 意外と Window layoutも 復元しようとするケースがあるのですが、これは究極に複雑な系統になるのと、だいたいその辺キー一発なので切りたかったんです 自動レストア機能 + Projectを開いたときだけ 復元 大抵、projectを含めて全体を復元・・・ってやるのですが、それをやられると、長時間使ってると、次回起動時にとっても時間がかかるようになります 実際、Nixをdirenvで有効にしているprojectがあったりすると、開くだけでLSPの起動やらなんやら含め、長時間待たされます 私のsetupは、起動速度に重点を置いているので、ちょっと許容できなくなってきたという背景もあります そんなことで、以下のことができるように、というコンセプトで作ってます。 project.el / tab-bar / desktop.el を利用する project外のファイルも復元のリストに入れられる 復元単位はproject = tab Window/frameの復元は不要 とりあえず使える・・・って状態になるまで1,2時間くらいでした。ほぼほぼ利用する関数は自分でも把握していたので、reviewも早いですね。 自分が把握している範囲が広いほど、生成させるときも速い です。 他のpackageを利用しなかった理由 このsession管理というのは、Emacsの歴史上何度となく大きなトピックになってきた(と勝手に思ってます)ものであり、多数のpackageが存在しています。 Tabspaces もともと利用していたもの。project.el + tab-barというのはほぼほぼ同一 ただし、 自動restoreは全体の復元が強制される ことと、Windowやtemporary bufferまで保存しようとすることで、復元するときに結構厄介な状態になったり、ということがあったのが、今回作った主な動機です emacs-workroom ほぼほぼ同じ動機。 project.el + desktop.el ただ、tab-barのintegrationを作者がする気がない様子 perspective-el この分野の有名どころ より複雑な管理(merge/split)を可能としてます。elscreenとか書いてあるくらいなので、非常に歴史があるpackageでもあります これも昔使ってました つまり、個人的には 帯に短し襷に流し を地で行っている状態だった・・・というのが、ド新規でわざわざ作ろうと思った動機です。以前であれば、こうなると妥協して・・・ってのがありましたが、今はこれくらい(400〜500行程度)のElispであれば数分で作成できてしまうため、アイディアなりコンセプトの具現化は非常にやりやすいと思います。 やらないこと、を決める このpackageでは、最初から以下はやらん、と決めていました。多分作らせようと思えばできるのですが、そもそもやる理由がないのと、コンセプトからブレるためです。 ...

March 15, 2026 · derui

tabspaceをtab-barなしで利用するようにしてみた

まだEmacs使ってるの?って空気を感じる中、変わらず触っています。最近ちょっと一念発起して、header lineをカスタマイズしてみたので、ちょっと紹介します。 問題意識 Emacsのsession managementについては、色々試した結果、紆余曲折ありつつもtabspaceを利用しています。このpackageは、名前の通りEmacs標準のtab-barをprojectの単位として利用することで、spaceの切り替えを明示的にすることができるようになっています。 そんなtab-barですが、デフォルトだとこんな感じの表示です。 簡素ですがまー用は足ります。なんですが、最近の流行りに合わせてbreadcrumbを利用してheader lineも利用していると、以下のような課題が出てきます。 そもそもの領域が削れてしまう header-line + tab-bar + mode-line + echo area、という固定領域が発生してしまいます 切り替えたときに、別のprojectが見えてる意味が薄い そもそもなのですが、一回切り替えると、大体はそのprojectに関連したものに統一されるわけで・・・ 常に見えてる必要もないね? tabspaceのecho areaに表示するoptionも試してみたが、これはこれでなかなか厳しい 多分相当にいじれば問題はなさそうなんですが、上記にあるとおり、 そもそも常時見えている必要とは 🤔 と。 実際はもうちょっとカスタマイズしていたので、さらに高さがありました。 ヘッダーラインとモードライン さて、ヘッダーラインとモードラインですが、それぞれ色々と用途はあります。ただ、現状はヘッダーラインがほぼほぼbreadcrumbの領域しかないことと、大体projectの内容も含まれていることから、ヘッダーラインを追加することにします。 (defun my/header-line-project-name () "Get the current project name (tab name) for header line" (alist-get 'name (tab-bar--current-tab))) (defvar my/header-line-separator nil "Cached separator string for header line, rebuilt on theme changes") (defun my/header-line-update-separator (&rest _) "Rebuild the cached separator string" (setq my/header-line-separator (concat (propertize "|" 'face 'shadow) " "))) (add-hook 'enable-theme-functions #'my/header-line-update-separator) (defvar-local my/header-line-element-project-name '(:eval (concat "[" (my/header-line-project-name) "] " (or my/header-line-separator (my/header-line-update-separator) my/header-line-separator))) "An elenemt of header line to display project name") ;; set local variable for header line (put 'my/header-line-element-project-name 'risky-local-variable t) (defun my/setup-header-line () "Setup `header-line-format' for my purpose" (setq-default header-line-format '("%e" my/header-line-element-project-name (:eval (breadcrumb--header-line))))) (with-low-priority-startup (my/setup-header-line)) こんな感じの設定になりました。ミソとしては breadcrumb--header-line です。これはbreadcrumbの内部処理なのですが、breadcrumbが提供するheader lineがちょうどいい感じなので、これを利用しています。また、注意としては breadcrumb-modeを有効化してはならない ってのがあります。これはbreadcrumb-modeは有効化した瞬間にheader lineを強制的に変更してしまうため、こっちが想定した形にならなくなります。 ...

February 15, 2026 · derui

自分用のEmacs packageをLLMで作る

あれ、1月ってありましたっけ?という勢いで1月が終わりました。あれを何月くらいにやろうかな、とか考えてるとすぐに終わっちゃいますね。 今回はちょっと最小限で欲しいEmacs lispのpackageを作って・・・というか作らせてみました。 できたもの とりあえず画像を見るのが一番早いので貼っときます。 こんな感じに、 置換対象のものだけを、置換後とside by sideで見える ってものです。とってもシンプルで単機能です。 モチベーション できたものは、概ね行数としても150行とかなのです。もともとは単純に 置換前後をみたい というものなのですが、これが地味に対応するものがない・・・というところなので、探してました。 より高機能なものとして visual-replace やanzu.elなどがあるのですが、こちらは 検索処理そのものを置換している という課題があります。なんだかんだ、interactiveな検索・置換というのは恐ろしく複雑な行為なので、自作はしたくない・・・。また、標準へのalignが最近のトレンドと考えると、既存の継続的にメンテナンスが行われているlibraryを利用しない、というのもなかなかもったいないことだなーと。 発見と作成 ふとした発見は、 replace-update-post-hook というhookを見つけたことです。これは置換を行う直前くらいで呼び出されるhookで、今回やりたいやつにぴったりでした。 ちょうどよかったので、完全にLLMでやっていい規模だったので、全面的に生成させてます。 全体のデフォルト構成はCopilot Agentに初期生成 実際の実装はClaude Codeでplanさせてから実装 テストの生成/documentもClaude Code 動作確認は自分 という感じで、大体はClaude Codeに生成させたものになります。やっぱり一発では無理で、存在しないlexical変数を使おうとしたり、エラーハンドリングが足りずに C-g でキャンセル・・・とか気の利いた感じにはやはりなりませんでした。 とはいえ、overlayの作成やdefvarの作成といった、Emacs Lispお決まりの管理などを含めると、実際のロジックはほんの2,30行程度、というのが実態でした。やはり色々言われている、 大体定型的な処理になるもの とかは、生成させるのに向いていますね。 Emacs Lispとの向き合い方 Emacs Lispは、Emacsを触るうえで絶対に避けられないものですし、色々な概念が絡み合って、大変に複雑です。しかし、シンプルなpackageを作るとかは、今だと1時間とかあったら、 ボイラープレート的にやるもの を含め、だいぶ楽に作れます。 作れるからといって何でも作る と、それはそれでメンテナンスが不可能になっていくのですが、Unix wayのように、単機能のものをいじったり作ったりする分には、問題はそこまで露出しないかな〜、とも思っています。 Emacsを触ってみるいいチャンスとして、一個気に食わない部分をpackageにしてみる、とかいかがでしょう?

February 5, 2026 · derui

Flymakeでのlint結果などの表示方法

暦の上では秋ですが、ほんとに秋が消えつつあるなぁと実感しています。つまり暑い。 今回は、最近悩んでいるemacs上でのlint結果などをどう表示するか?というのを書いていこうかと思います。 ...

September 16, 2024 · derui

Kanzenという日本語入力の方式を再実装してみた Part.1

夏まっ盛りというところですが、いかがお過しでしょうか。暑いのは中々避けようがないですね。 何回かに分けて、現在自分で利様している日本語入力方式について書いていこうと思います。今回はその1ということで、概要からとなります。 ...

August 3, 2024 · derui

Emacsの起動を高速化してみた

前回の記事で梅雨入りした、と書いたんですが、次の記事で梅雨が明けているとは思いませんでした。 Emacsの管理を色々変えたところ、起動をかなり高速化することにも成功しましたので、その内容を記しておこうかと思います。 ...

July 20, 2024 · derui

Meowからryo-modalに切り替えてみた

ようやく梅雨に入りましたが、あんまり好きな季節というわけでもないですね。必要な季節ではあるんですけども。 最近またEmacs熱が上がってまして、meowからryo-modalに切り替えてみたので、その顛末を記録に残しておきます。 ...

June 23, 2024 · derui

propertizeした文字列をバッファに入れたい

あれ、もう桜が咲きそうなんですけど??? 今回は超小ネタです。ちょっと今Emacsをいじっているなかでなかなか出来なかったので。 ...

March 20, 2024 · derui