プログラムなどで予約語や変数名、関数名など全て記憶することはできない。
そんなときに補完機能は便利だ。
なんとなく覚えている文字を入力して、補完機能を呼び出せば候補を表示してくれる。
記憶を助けてくれるだけでなく、正確に速く入力する手助けにもなる。
しかし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 でコマンド検索。補完は ivy の ivy-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 が強化されている。 |
使い方のコツ
-
プロジェクトごとに設定
use-package
で:ensure t
と:config
でglobal-company-mode
やglobal-corfu-mode
を有効化。 -
バッファ単位の有効化
M-x company-mode
でローカルに切り替え、補完の範囲を限定。 -
カスタム backend
例えばcompany-clang
(C/C++)やcompany-ispell
(スペル)を追加して、言語ごとに最適化。 -
キーバインド調整
C-<tab>
をcompany-complete
に、M-p/M-n
をcompany-select-previous/next
に設定すると、Emacs 標準と統一。
全部使うのがおすすめですか?
*全部を同時に入れる必要はありません。
重複している機能を競合させるだけで、設定が複雑になり、起動速度も落ちます。
役割 | 推奨パッケージ | 使う理由 |
---|---|---|
補完エンジン | company もしくは corfu |
どちらか一方であれば十分。 company はデフォルトで多くのバックエンドが用意されている。=corfu= は軽量・キーボード指向。 |
インクリメンタル検索 UI | vertico=(=orderless 併用) |
簡潔で高速。 orderless で曖昧検索を追加。 |
補完候補のメタ情報 | marginalia |
関数名の説明・引数・ファイルパスなどを表示。 |
その他便利ツール | consult=(=counsel の後継) |
find-file , M-x , search などの補完を拡張。 |
company
とcorfu
を同時に入れると UI が競合します。ivy/counsel
とvertico
は UI が異なるので混在は推奨しません。- Emacs 29 以降は標準の
completion-in-region
で十分な場合もあります。 - 追加で必要な機能(例えば C/C++ 用の
company-clang=、Python 用の =company-jedi
など)は、その言語用のバックエンドだけを入れればOK。
小まとめ
- 主軸:
company
もしくはcorfu
のどちらか。 - UI:
vertico
(orderless
)で簡潔に。 - 情報表示:
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 以降で軽量・高速な補完を求める。② vertico や orderless でシンプルな 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 で軽量・高速を求めるなら 、 corfu と
vertico + 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 | *活発*(数週間毎に更新) | 補完候補にメタ情報(説明・引数・ファイルパス)を付加。 | company や corfu の候補に追加情報を表示したいとき。 |
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.bar → fb など) |
• 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 / counsel と helm が人気 |
検索と補完の統合はしたが、UI が重い/学習コスト大 → vertico=/=orderless が登場 |
2018 | company‑mode と lsp-mode が統合 → 企業/チームで標準化 | LSP 補完を統一し、バックエンド指向で拡張しやすく |
2019‑2020 | corfu と vertico が Emacs 29 で標準化 | 軽量化・キーボード主体にフォーカスし、 orderless で曖昧検索を統一 |
2025 | すべての新パッケージが週次/月次で更新 | 旧パッケージ(auto‑complete, helm 等)は「維持中」か非アクティブ → 使い捨てになるケースが増加 |
—
3. 何が変わったのか? (主な理由)
変更点 | 旧パッケージの課題 | 新パッケージの解決策 |
---|---|---|
モジュール性 | 1 つのパッケージに UI とロジックが固まっていた | company は「バックエンド=ロジック」、UIはプラグインで分離 |
パフォーマンス | 大量候補でハング・遅延 | corfu=/=vertico は O(1) の縦リスト、GPU/CLI で高速 |
LSP 連携 | 旧 LSP 連携が不十分 | company-lsp=、=corfu で lsp-mode が標準 |
キーボードファースト | GUI のポップアップ操作が多い | corfu は完全キーボード、=vertico= は横方向の検索 |
統一 UI | =M-x=、=find-file=、言語補完が別々 | company=/=corfu と vertico=/=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をメインに設定していこうと思う。