プログラムなどで予約語や変数名、関数名など全て記憶することはできない。
そんなときに補完機能は便利だ。
なんとなく覚えている文字を入力して、補完機能を呼び出せば候補を表示してくれる。
記憶を助けてくれるだけでなく、正確に速く入力する手助けにもなる。

しかしEmacsの補完機能は複雑だ。
その拡張性の高さから様々な補完パッケージが存在する。

Emacsの補完機能について、AI(gpt-oss:20b)と会話を行った。
見出しがプロンプト、内容がAIの回答である。(まとめの手前まで)

emacsで主流の補完機能について教えて

主流の補完機能(completion)は次のように分けられます。

パッケージ 主な特徴 使い方
company-mode 会社統合型補完。モジュール単位で「backend」を切り替えて、語彙・関数・文法など多様に補完。 M-x company-mode で有効化。 C-<tab> で候補を選択。
corfu 軽量でキーボード指向。 M-x corfu-mode で有効化。 C-<tab> で候補表示、 M-p/M-n で移動。
ivy + counsel Emacs 版 fzf=。=C-s でインクリメンタル検索。 counsel-M-x でコマンド検索。補完は ivyivy-read が内部で呼ばれる。
helm UI が独自。 M-x helm-M-x で補完。検索結果をウィンドウに表示し、 C-n/C-p で選択。
vertico シンプルなインクリメンタル補完。 M-x vertico-mode で有効化。 C-<tab> で候補のリストを表示。
auto-complete 古典的パッケージ。 M-x ac-start で起動。 C-<tab> で候補。 company-mode が主流になっているので、基本はそちらに置き換えると良い。
builtin completion completion-at-point=(=M-TAB=)や =icomplete=(=M-?=)。Emacs 29 以降は標準で =completion-in-region が強化されている。

使い方のコツ

  1. プロジェクトごとに設定
    use-package:ensure t:configglobal-company-modeglobal-corfu-mode を有効化。

  2. バッファ単位の有効化
    M-x company-mode でローカルに切り替え、補完の範囲を限定。

  3. カスタム backend
    例えば company-clang (C/C++)や company-ispell (スペル)を追加して、言語ごとに最適化。

  4. キーバインド調整
    C-<tab>company-complete に、 M-p/M-ncompany-select-previous/next に設定すると、Emacs 標準と統一。

全部使うのがおすすめですか?

*全部を同時に入れる必要はありません。
重複している機能を競合させるだけで、設定が複雑になり、起動速度も落ちます。

役割 推奨パッケージ 使う理由
補完エンジン company もしくは corfu どちらか一方であれば十分。 company はデフォルトで多くのバックエンドが用意されている。=corfu= は軽量・キーボード指向。
インクリメンタル検索 UI vertico=(=orderless 併用) 簡潔で高速。 orderless で曖昧検索を追加。
補完候補のメタ情報 marginalia 関数名の説明・引数・ファイルパスなどを表示。
その他便利ツール consult=(=counsel の後継) find-file, M-x, search などの補完を拡張。
  • companycorfu を同時に入れると UI が競合します。
  • ivy/counselvertico は UI が異なるので混在は推奨しません。
  • Emacs 29 以降は標準の completion-in-region で十分な場合もあります。
  • 追加で必要な機能(例えば C/C++ 用の company-clang=、Python 用の =company-jedi など)は、その言語用のバックエンドだけを入れればOK。

小まとめ

  • 主軸: company もしくは corfu のどちらか。
  • UI: verticoorderless )で簡潔に。
  • 情報表示: marginalia
  • その他便利ツール: consult

この組み合わせで、設定はシンプルに保ちながら高速で豊富な補完体験が得られます。

companyとcorfuはどちらがおすすめですか

company か corfu か?

両者は「補完エンジン」として同じ目的を持ちますが、設計思想と使い勝手が異なります。

視点 company corfu
歴史 1999 からのベストプラクティス。多くのバックエンドが用意されている。 2019 以降の軽量設計。Emacs 29 の標準補完とシームレスに連携。
UI ポップアップ( company-box 等でカスタム可) 文字列上に縦リスト( corfu-quick で補完)
パフォーマンス バックエンド数が多いと遅くなる。 非常に軽量。起動時間・CPUが少ない。
カスタマイズ company-frontend, company-backend で細かく制御。 corfu-auto, corfu-preview-current, corfu-popupinfo などでシンプルに拡張。
キーバインド M-<tab> で補完開始。UI によっては C-<tab> で移動。 C-<tab> で次候補、 S-<tab> で前候補。 M-<=/=M-> でスライド。
統合 company-mode を有効にすれば、言語サーバーや LSP、バッファ内検索、M-x など全てで補完が統一。 vertico + orderless と相性抜群。 marginalia でメタ情報表示がシームレス。
おすすめシーン ① 既存の Emacs 25/26 でスムーズに導入したい。② 会社や組織で既に company-mode が設定済み。③ 複数のバックエンド(clang, ispell, yasnippet, LSP など)を使いたい。 ① Emacs 29 以降で軽量・高速な補完を求める。② verticoorderless でシンプルな UI を重視。③ キーボード主体で「補完+検索」を一気に使いたい。

具体的な選び方

条件 推奨
既に company-mode を使っている そのまま継続。別途 corfu を入れると競合するので入れない方が安全。
Emacs 29+ で軽量・スリムな環境を目指す corfu を導入。=vertico + orderless + marginalia= と合わせれば「補完・検索・情報表示」が完結。
多数の言語やバックエンドを必要とする company-mode を選択。=company-lsp=, company-ivy, company-clang など、既に多くのバックエンドがある。
シンプルさを最優先したい =corfu=。UI がほぼ「入力欄上の縦リスト」で、設定は 5 行程度で完結。

小まとめ

使う人 何を重視するか 推奨
初心者 / 既存設定に合わせたい シンプルな導入、既存の company-mode で統一 company
パフォーマンス重視 / Emacs 29+ で軽量化 低レイテンシ、最小設定 corfu
多機能・多バックエンド LSP, clang, yasnippet など多彩なバックエンド company
キーボード主導でシンプル UI vertico と合わせて高速補完 corfu

結論

  • 既存環境が company-mode で問題ないなら 、会社やチームの設定に合わせて company を使い続けるのが安定です。
  • Emacs 29 で軽量・高速を求めるならcorfuvertico + orderless + marginalia の組み合わせが推奨です。

※ どちらを選んでも、補完が無効になるわけではなく、必要に応じてカスタムバックエンドを追加できる点は同じです。選択は「パフォーマンスか統一性か」「既存設定か新しいワークフローか」で決めるとよいでしょう。

それぞれのパッケージの役割と便利な利用シーン、リリース年と現在の開発状況が活発か、表にして教えて

パッケージ リリース年 開発状況(2025年現在) 主な役割 便利な利用シーン
company‑mode 1999 *非常に活発*(毎月更新) バックエンド指向の補完エンジン。UIはプラグインで拡張可能。 多言語・LSP・yasnippet などを同時に利用したいとき。既存 Emacs 25/26 での統一感が必要。
corfu 2019 *非常に活発*(週次更新) 軽量な縦リスト補完。 vertico と合わせて「補完+検索」をシームレスに実現。 Emacs 29 以降で高速・キーボード主体の補完を求める。UIが最小限で設定も簡潔。
vertico 2020 *非常に活発*(週次更新) インクリメンタル検索 UI。 orderless と連携して曖昧検索が可能。 シンプルで高速な検索・補完 UI が欲しいとき。 company=/=corfu との併用が最適。
orderless 2019 *活発*(数ヶ月毎に更新) 区切り文字で曖昧検索。 vertico の検索スタイルを拡張。 vertico での検索時に「部分一致・区切り文字検索」を簡単に利用したい。
marginalia 2019 *活発*(数週間毎に更新) 補完候補にメタ情報(説明・引数・ファイルパス)を付加。 companycorfu の候補に追加情報を表示したいとき。
ivy + counsel 2009/2013 *維持中*(数ヶ月毎にマイナー更新) インクリメンタル検索 + コマンド・ファイル検索の統合。 既存 Emacs 26/27 環境で手軽に検索・補完を拡張したい。
helm 2010 *維持中*(年次メジャー更新) 大量候補をウィンドウで表示し、豊富な操作を提供。 大規模プロジェクトで多種多様な候補を UI で可視化したい。
auto‑complete 2005 *非アクティブ*(過去数年更新なし) 古典的補完パッケージ。 新規設定は推奨されず、代替として company=/=corfu が主流。

備考

  • 「活発」: 定期的にマイナーチェンジが入る(週次〜月次)。
  • 「維持中」: 重大な修正はほぼ無く、安定版が利用される。
  • 「非アクティブ」: ほぼメンテナンスが停止しており、機能追加はほぼ見込めない。

この表をもとに、既存環境や必要機能に合わせてパッケージを選択してください。

過去によく使われていたパッケージから新しいパッケージに変わった理由や経緯を教えて

1. 旧パッケージ(主に *auto‑complete*、*ivy*/ *counsel*、*helm*)

パッケージ 代表的な利用時期 主な欠点 / 制約
auto‑complete Emacs 24以前、2005‑2010 • UI がポップアップで重い• バックエンドが限定的• LSP 連携が生まれない
ivy + counsel 2009‑2015 • UI が縦リストで一見シンプルだが、検索と補完を同じバッファで切り替える必要がある• スケーラビリティ(候補が10k以上)で遅くなる
helm 2010‑2016 • ウィンドウベースの UI はリソースを多く消費• キーボード操作は多機能だが学習コストが高い• LSP 連携が後付けになる

主要理由

理由 説明
パフォーマンス 1000 件以上の候補を表示すると Emacs が固まるケースが多かった。
モジュール性の欠如 補完ロジックと UI が一体化しており、カスタマイズが難しい。
LSP / 言語サーバーとの統合不足 近年導入された LSP (eg. lsp-mode) と連携しやすい仕組みが無かった。
UI/UX の統一性 M-x=、検索(=find-file)、LSP 補完をすべて別々のインタフェースで扱うため、ユーザー体験が断片化。
キーボードファースト GUI を前提とした操作が多く、ターミナル/キーボードベースの環境に不向き。


2. 進化したパッケージへの移行(2018‑2025)

新パッケージ 主な利点 旧パッケージに置き換えた主な理由
company‑mode • モジュラー(バックエンド指向)• UI はプラグインで拡張可• LSP( company-lsp, lsp-company )との統合が標準化 auto‑complete の UI が重い。• LSP 連携が容易に。• 言語ごとに複数バックエンドを同時に使える。
vertico • 低レイテンシの縦リスト UI• orderless と組み合わせて曖昧検索が可能 ivy の縦リスト UI はシンプルだが検索時に区切り文字やパターンを扱いにくい。• 低負荷でターミナル/キーボード主体に最適化。
orderless • 区切り文字で曖昧検索( foo.barfb など) ivy=/=helm の検索は「正規表現」や「全角」限定。• より直感的な入力が必要。
marginalia • 補完候補に説明・引数・ファイルパスを自動付加 company=/=corfu ではメタ情報が欠如。• ユーザーにとって補完内容だけでなく、なぜその候補が来たのかを即座に把握したい場面。
corfu • 軽量縦リスト補完• vertico と一緒に「補完+検索」を一つのフローに統合 company は UI がプラグイン依存、設定が重い。• helm は重いウィンドウ UI。• ivy は検索と補完を分けている。• キーボードだけで補完を完結させたい(ゲーム感覚)。
helm 依然として有名だが、 LSP 連携の遅れ helm は UI が重い、設定が煩雑。• LSP 連携は helm-lsp でサポートされるが、 lsp-mode + company がより自然。

経緯(簡潔版)

重要な動き 変化
2005‑2010 Emacs 24 以前で auto‑complete が主流 UI が重く、LSP 未導入 → company 開発開始
2009‑2015 ivy / counselhelm が人気 検索と補完の統合はしたが、UI が重い/学習コスト大 → vertico=/=orderless が登場
2018 company‑modelsp-mode が統合 → 企業/チームで標準化 LSP 補完を統一し、バックエンド指向で拡張しやすく
2019‑2020 corfuvertico が Emacs 29 で標準化 軽量化・キーボード主体にフォーカスし、 orderless で曖昧検索を統一
2025 すべての新パッケージが週次/月次で更新 旧パッケージ(auto‑complete, helm 等)は「維持中」か非アクティブ → 使い捨てになるケースが増加


3. 何が変わったのか? (主な理由)

変更点 旧パッケージの課題 新パッケージの解決策
モジュール性 1 つのパッケージに UI とロジックが固まっていた company は「バックエンド=ロジック」、UIはプラグインで分離
パフォーマンス 大量候補でハング・遅延 corfu=/=vertico は O(1) の縦リスト、GPU/CLI で高速
LSP 連携 旧 LSP 連携が不十分 company-lsp=、=corfulsp-mode が標準
キーボードファースト GUI のポップアップ操作が多い corfu は完全キーボード、=vertico= は横方向の検索
統一 UI =M-x=、=find-file=、言語補完が別々 company=/=corfuvertico=/=orderless を組み合わせると 1 つの UI で完結
カスタマイズの簡易さ 何度もパッチ適用が必要 新パッケージは 5 行程度の設定で済む
コミュニティ & 開発活発 旧パッケージは更新頻度低下 company=、=corfu=、=vertico などは毎週/毎月更新、積極的に改善


4. 小まとめ

旧パッケージ 何で置き換えられたか 置き換え後の主な利点
auto‑complete UI が重く、LSP 連携できない =company=(モジュール化、LSP 標準)
ivy / counsel 検索/補完は統合だが UI が煩雑 =vertico=(軽量)+=orderless=(曖昧検索)
helm UI が重い、学習コストが高い =vertico=+=orderless=(UI をシンプルに)

これらの変化は、*Emacs のユーザー体験を「高速 + キーボード主体 + 共有 UI」に統一* し、*言語サーバーや補完バックエンド* と自然に連携できるようにするために起きました。新しいパッケージは、旧パッケージの長所を残しつつ、短所を大幅に解消しているため、現在はほぼ標準として受け入れられています。

まとめ

  • 既に company-mode を使っていて問題ないならcompany を使い続けるのが安定。
  • Emacs 29以降で軽量・高速を求めるならcorfu と vertico + orderless + marginalia の組み合わせが良い。

補完機能は複数のパッケージがあり複雑だが今までの流れを理解できたので、
corfuをメインに設定していこうと思う。