6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ConsultのREADME

Last updated at Posted at 2025-02-10

GNU Emacs

GNU ELPA

GNU-devel ELPA

MELPA

MELPA Stable


Table of Contents


Emacsの標準APIであるcompleting-readを中心に置いた補完システム、とりわけデフォルトの補完システム、VerticoMctIcompleteと完全な互換性がある。

このパッケージでは補完システムを具体的に最小となるよう維持している。任意の補完システムと良好に動作するというConsultコマンドの能力は、このパッケージの主なアドバンテージのうちの1つだ。Consultは従来のセットアップとの相性もよく、小規模で独立したコンポーネントから完全な補完環境を構築するのに役に立つだろう。

Consultを補足するパッケージとしてMarginaliaEmbarkOrderlessを組み合わせることができる。Marginaliaは注釈(ドキュメント文字列やファイル情報など)によって補完の表示を強化する。コンテキストメニューに匹敵するローカルアクションを提供するのは、多目的用のEmbarkだ。これらのアクションはミニバッファーで選択された候補、あるいは通常のバッファーのポイント位置にたいして処理を行う。たとえばファイルのリストから選択したとき、Embarkはファイルを削除するアクションを提示する。更にEmbarkは収集バッファーで補完候補を収集する機能を提供している。セクションEmbarkとの統合では、ConsultとEmbarkを協調して機能させる方法について詳細に述べる。

利用可能なコマンド

Consultのほとんどのコマンドは意味的にconsult-<thing>という命名スキームにしたがう。あまり知名度はないものの役に立つEmacsの機能に"futureヒストリー(future history: 未来の履歴)"と呼ばれる機能がある。これは次にユーザーが何を入力したいか推測を行う機能であり、Consultの多くのコマンドがこれを実装している。通常はコマンドプロンプトでM-nとタイプすると、ポイント位置にあるシンボル等を入力に挿入する。

ヒント 注釈機能(annotator)のMarginaliaをアクティブにしていれば、M-x ^consultとタイプすることによって短い説明とともにConsultのすべてのコマンドを確認できる筈だ。かわりにC-h a ^consultとタイプすればConsultのすべての変数と関数の概要を得ることができる。

仮想バッファー

  • consult-buffer: switch-to-bufferの強化バージョン、仮想バッファー(virtual buffer)をサポートしている。 バッファーのライブプレビュー、仮想バッファータイプへのナローイング(narrowing)もサポートしている。f SPCとタイプすれば最近使ったファイルにナローイングすることができる。SPCを押下すれば一時的なバッファーを表示する。サポートされているナローイング用のキーは以下の通り:

    • b バッファー

    • SPC 非表示のバッファー

    • * 変更されているバッファー

    • f ファイル(recentf-modeが必要)

    • r ファイルレジスター

    • m ブックマーク

    • p プロジェクト

    • B プロジェクトバッファー

    • F プロジェクトファイル

    • R プロジェクトのルート

  • Custom consult-buffer-sourcesで構成した別のソース

  • consult-buffer-other-windowconsult-buffer-other-frameconsult-buffer-other-tab: consult-bufferの変種

  • consult-project-buffer: カレントプロジェクトのバッファーおよびファイルに制限されたconsult-bufferの変種。consult-project-buffer-sourcesにカスタムソースを追加できる。プロジェクト外部から呼び出されるとプロジェクトの入力を求めるかもしれない

  • consult-bookmark: ブックマークの選択または作成。あなたはブックマーク選択の際には仮想バッファーのソースをブックマークできるconsult-bufferをかわりに使っているかもしれない。consult-bookmarkの方はブックマークのプレビューとナローイングが可能なことに注意

  • consult-recent-file: プレビュー付きで最近のファイルから選択。最近のファイルを仮想バッファーソースを含めることができる、強力なconsult-bufferの方がお気に召すかもしれない。recentf-modeは最近ファイルの追跡を有効にする。

編集

  • consult-yank-from-kill-ring: kill-ringからアイテムを選択するyankの強化版。選択されたテキストはオーバーレイによってバッファーにプレビューされる。

  • consult-yank-pop: yank-popkill-ringを循環させて最後のyankを置き換えるか、あるいは直前にyankされていなければkill-ringを照会するが、こちらはDWIMな挙動の強化版だ(訳注: DWIMは"Do what I mean."の略、意味は"私の意図することを行え")選択されたテキストはオーバーレイとしてバッファーでプレビューされる。

  • consult-yank-replace: consult-yank-popと似ているが、こちらは常にkill-ringのアイテムで最後のyankを置き換える。

  • consult-kmacro: マクロリングからマクロを選択して実行する。

レジスター

  • consult-register: レジスターのリストから選択する。レジスターのタイプによるナローイング、それにマーカー位置のプレビューをサポートしている。レジスターコンテンツの検索に役に立つコマンド。素早くアクセスするコマンドならconsult-register-loadconsult-register-store、あるいはEmacsのビルトインのレジスターコマンドを使うことができる。

  • consult-register-format: 強化されたレジスターフォーマットを得るには、この関数をregister-preview-functionにセットすればよいだろう。consult-register-windowによって自動的に使用されている。

  • consult-register-window: レジスターウィンドウを改善したければ、この関数でregister-previewを置き換えよう。コンフィグの例を参照のこと。

  • consult-register-load: 素早くレジスターをロードするためのユーティリティコマンドだ。このコマンドはレジスターにジャンプするか、レジスターの値の挿入を行う。

  • consult-register-store: アクションメニューのカレントコンテキストに応じてレジスターを格納する改良されたUI。リージョンがアクティブだとコンテンツのstore(格納)/append(後に追加)/prepend(前に追加)、オプションでプレフィックス引数を与えるとリージョンを削除する。数プレフィックス引数のときは措定した個数分のstore(格納)/add(追加)を行う。それ以外にもポイント、フレームセット、ウィンドウやkmacro(キーボードマクロ)を格納する。以下は使い方の例だ。

    • M-' x: リージョンがアクティブでなければポイントをレジスターにx格納。
      リージョンがアクティブならリージョンをレジスターxに格納。

    • M-' M-w x: ウィンドウ構成をレジスターxに格納。

    • C-u 100 M-' x: 数値をレジスターxに格納。

ナビゲーション

  • consult-goto-line: ライブプレビューによって改良された行番号ジャンプ。goto-lineのちょっとした代替えだ。行番号を入力すれば与えられた行の1列目にジャンプする。line:columnのように入力すれば、かわりに指定した行の特定の列にジャンプする。

  • consult-mark: mark-ring内のマーカーへジャンプ。ライブプレビューと再帰編集(recursive edit)をサポートしている。

  • consult-global-mark: global-mark-ring内のマーカーへジャンプ。ライブプレビューと再帰編集(recursive edit)をサポート。

  • consult-outline: アウトラインのヘッダにジャンプ。ナローイング、ヘッダレベル、ライブプレビュー、それに再帰編集をサポートしている。

  • consult-imenu: カレントバッファーのimenuアイテムにジャンプ。ライブプレビュー、再帰編集、ナローイングをサポートしている。

  • consult-imenu-multi: プロジェクトバッファーのimenuアイテムにカレントバッファーと同じメジャーモードでジャンプする。ライブプレビュー、再帰編集、ナローイングをサポートしている。この機能はimenu-anywhereから発想を得ている。

検索

  • consult-line: 検索文字列を入力するとマッチした行を選択する。ライブプレビューと再帰編集をサポートしている。ポイント位置のシンボルおよび最近のIsearch文字列が"未来のヒストリー(future history)"に追加されるので、M-nの押下でアクセス可能だ。consult-lineisearch-mode-mapにバインドされている間にIsearchを実行すると、カレントのIsearch文字列文字列が使用される。

  • consult-line-multi: 複数バッファーを動的に横断して検索を行う。デフォルトではプロジェクトのバッファーを横断して検索する。プレフィックス引数とともに呼び出すとすべてのバッファーに渡って検索を行う。候補は入力に応じてオンデマンドで算出される。consult-grepのように振る舞うが、ファイルではなくバッファーを処理するコマンドだ。

  • consult-keep-lines: バッファーのフィルタリングにカレントの補完スタイルを使用するkeep/flush-linesの置き換えだ。この関数はタイプ中にバッファーを更新する。特にconsult-keep-linesはEmbarkによって収集、エクスポートされたバッファーを更に絞り込むことができる(completing-readと同じ補完フィルタリングであることに依存している)。! SPCのように入力が否定演算子で始まる場合には、補集合となるようなバッファーがマッチする。リージョンがアクティブなら、フィルタリングはリージョンに制限される。

  • consult-focus-lines: カレントの補完スタイルを用いたフィルタリングにより、行を一時的に非表示にする。非表示になった行を表示するには、プレフィックス引数C-uと呼び出せばよい。! SPCのように入力が否定演算子で始まる場合には、補集合となるようなバッファーがマッチする。consult-keep-linesとは対照的に、この関数はバッファーを編集しない。リージョンがアクティブなら、フィルタリングはリージョンに制限される。

GrepとFind

  • consult-grep, consult-ripgrep, consult-git-grep: ファイルの中から正規表現を検索する。Consultは検索用語の入力中に非同期でGrepを呼び出す。少なくともconsult-async-min-inputの文字数を入力した後に検索が開始される。Consultは最初の文字が#のような句読点文字(punctuation character)の場合には、入力文字列を2つの部分に分割する。たとえば#regexps#filter-stringだと2つ目の#で分割されるのだ。Grepには文字列 regexpsが渡される。ConsultがEmacsの正規表現から検索プログラムが理解できる式への変換を行っていることに注意して欲しい。プロンプトでは常にEmacsの正規表現が使えるのだ。スペースで区切って複数の正規表現を入力した場合には、正規表現すべてにマッチする行だけが表示される。リテラル(literal: 文字通り)のスペースをマッチさせたければ、バックスラッシュでスペースをエスケープすること。filter-stringはEmacsの高速なフィルタリングに渡されて、マッチしたリストを更に絞り込むために使用される。これはorderlessのような高度な補完スタイルを使っていれば、特に役に立つだろう。consult-grepはプレビューをサポートしている。consult-grepはプロジェクトが見つかった場合には、カレントのプロジェクトのディレクトリーを検索する。見つからなかった場合には、default-directoryが検索される。C-u M-s gのようにプレフィックス引数とともにconsult-grepを呼び出した場合には、カンマ区切りでファイルとディレクトリーを手入力で指定できる。C-u C-u M-s gのようにプレフィックス引数を指定して呼び出した場合には、まだプロジェクト内部にいなくても最初にプロジェクトの選択ができる。

  • consult-findconsult-fdconsult-locate: regexpにたいしてパスをマッチしてファイルを検索する。consult-grepと同じようにプロジェクトのルートかカレントディレクトリーが検索のルートディレクトリーとなる。入力文字列はconsult-grepの場合と同じように1つ目の部分が検索、、2つ目の部分はEmacsのフィルタリングに渡されることになる。consult-findへのプレフィックス引数はConsultのgrepコマンドと同じように機能する。

コンパイル

  • consult-compile-error: コンパイルエラーにジャンプする。ライブプレビュー、ナローイング、再帰編集をサポートしている。

  • consult-flymake: Flymakeのdiagnostic(診断)にジャンプする。ライブプレビューと再帰編集をサポート、ナローイングもこのコマンドはサポートしている。表示をerrors(エラー)、warnings(警告)、notes(ノート)だけにするにはそれぞれe SPCw SPCn SPCを押下すればよい。

  • consult-xref: xrefとの統合だ。この関数はxref-show-xrefs-functionおよびxref-show-definitions-functionとしてセットすることができる。

ヒストリー

  • consult-complex-command: command-historyからコマンドを選択する。このコマンドはcompleting-read版のrepeat-complex-commandであるとともに、"chistory.el"のcommand-historyコマンドの置き換えでもある。

  • consult-history: カレントバッファーのヒストリー、たとえばEshellやComintから文字列を挿入する。このコマンドはミニバッファーからも呼び出せる。そのような場合にはconsult-historyminibuffer-history-variableに格納されているヒストリーを使用する。completion-at-point,が気に入っているようなら、Capeパッケージのcape-historyを調べてみたらよいだろう。

  • consult-isearch-history: このコマンドはIsearchのセッション中にはヒストリーから検索文字列を物色して、新たに選択された文字列での検索を継続する。Isearchの外部にいる場合にはあなたがヒストリーから文字列を選んで、新たなIsearchを開始することができる。consult-isearch-historyisearch-edit-stringのちょっとした置き換えとして機能するだろう。

モード

  • consult-minor-mode-menu: マイナーモードを有効あるいは無効にする。ナローイングへのサポートをローカルまたはグローバルに、オンあるいはオフにするにはそれぞれl/g/i/o SPCt押下すればよい。

  • consult-mode-command: 現在アクティブなメジャーモードやマイナーモードからコマンドを実行する。l/g/mというキーを通じたローカルのマイナーモード、グローバルなマイナーモード、そしてメジャーモードのナローイングをサポートしている。

Orgモード

  • consult-org-heading: consult-imenuconsult-outlineのOrgバッファー用の変種だ。ヘッドラインとその祖先となるヘッドラインの間の区切りはスラッシュ。ヘッダレベル、priority(優先度)とTODOでのナローイング、それにライブプレビューと再帰編集をサポートしている。

  • consult-org-agenda: Orgのagendaヘッダにジャンプする。ヘッダレベル、priorityとTODOでのナローイング、それにライブプレビューと再帰編集をサポートしている。

ヘルプ

  • consult-man: Unixにaproposman -kを通じてUnixのmanページを検索する。consult-manはEmacsのmanコマンドを使用して選択されたmanページをオープンしている。候補スクロール中のライブプレビューをサポートしている。

  • consult-info: infoページを通じて全文検索(full text search)を行う。*info*バッファーでこのコマンドを呼び出すと、カレントのマニュアルを検索する。infoページを事前に定義して、そこから検索を行うようなコマンドを独自に作成したい場合には以下のような例ではどうだろう:

    (defun consult-info-emacs ()
      "Emacsのinfoページを検索"
      (interactive)
      (consult-info "emacs" "efaq" "elisp" "cl" "compat"))
    
    (defun consult-info-org ()
      "Orgのinfoページを検索"
      (interactive)
      (consult-info "org"))
    
    (defun consult-info-completion ()
      "補完のinfoページを検索"
      (interactive)
      (consult-info "vertico" "consult" "marginalia" "orderless" "embark"
                    "corfu" "cape" "tempel"))

その他

  • consult-theme: テーマを選択して、それ以外の有効なすべてのテーマを無効にする。テーマ候補のスクロール中のライブプレビューをサポートしている。

  • consult-preview-at-pointおよびconsult-preview-at-point-mode: *Completions*バッファーのポイント位置の候補をプレビューするコマンドおよびマイナーモード。このモードはMct*Completions*のデフォルトUIを使っている場合には関係あるだろう。

  • consult-completion-in-region: バッファー内での補完UIとしてCorfuを使っていなければ、completion-in-region-functionとしてこの関数をセットできる。 その場合にはあなたのミニバッファー補完がcompletion-at-pointに使用されることになる。

        ;; Verticoが有効なら`consult-completion-in-region'
        ;; それ以外はデフォルトの`completion--in-region'関数を使う
        (setq completion-in-region-function
              (lambda (&rest args)
                (apply (if vertico-mode
                           #'consult-completion-in-region
                         #'completion--in-region)
                       args)))

consult-completion-in-regionではなく小さいポップアップとしてバッファー内で直接補完を確認できる方が好みに合うかもしれない。そのような場合にはCorfuパッケージをお勧めする。 consult-completion-in-regionにはLspモードと組み合わせて使う際の技術的な制限が存在する。Lspサーバーは洗練された候補文字列を生成するためにポイント位置の入力に依存している。補完は元のバッファーからミニバッファーに送信されてしまうので、サーバーが更新された入力を受信しないのだ。それに比べてたとえばCorfuを通じたバッファー内での補完であれば、元のバッファーで補完が直接行われるので正しく機能するだろう。

特別な機能

候補のライブプレビュー、更に候補をグループ化してナローイング(絞り込み)を行う機能や候補リストの非同期生成によってcompleting-readを強化するのがConsultだ。ほとんどのConsultコマンドが使用する内部関数のconsult--readは、completing-readの薄いラッパーであり、特別な機能を提供する。複数の補完ソースをサポートするために、より高レベルな関数であるconsult--multiが存在する。高度な機能を失うことなく異なる補完機能のバックエンドとして機能できるのはConsultのアーキテクチャによるものだ。

ライブプレビュー

一部のConsultコマンドはライブプレビューをサポートしている。たとえばconsult-lineのアイテムをスクロール中には、対応する位置へとバッファーがスクロールするのだ。検索を行っている最中にミニバッファーとバッファーの間をジャンプして行き来して、再帰編集を行うことも可能である。

Consultのプレビューはデフォルトで有効になっている。consult-preview-key変数を調節して無効にもできる。コンフィグの例でも触れるが、キーバインディングを指定して手動でプレビューをトリガーすることも可能だ。consult-preview-keyのデフォルトのセッティングanyは、選択された候補が変更された際に何かキーを押下すると、Consultが即座にプレビューをトリガーすることを意味する。コマンド自体の:preview-keyにより、個別にコマンドの設定を行うことができる。セットできる設定は以下の通り:

  • 'any: 自動で即時

  • (list :debounce 0.5 'any): 自動で遅延あり

  • "M-.": 手動で即時

  • (list :debounce 0.5 "M-."): 手動で遅延あり

  • nil: 無効化

通常は自動かつ即時のままにしておいて、ファイルのロードによりプレビュー処理が高価だと思われるコマンドでのみ無効にするのが安全だしお勧めだ。内部的にはConsultがthis-commandの値を用いて:preview-keyがカスタマイズされているかどうかを判断している。これはあなたが自作の関数やコマンドでconsult-*コマンドをラップした場合には、あなたのカスタムコマンドが考慮されるようにその関数の名前をconsult-customize呼び出しにも追加する必要があるという意味だ。

    (consult-customize
     consult-ripgrep consult-git-grep consult-grep consult-man
     consult-bookmark consult-recent-file consult-xref
     consult--source-bookmark consult--source-file-register
     consult--source-recent-file consult--source-project-recent-file
     ;; my/command-wrapping-consult    ;; my/command内部では自動プレビューを無効にする
     :preview-key '(:debounce 0.4 any) ;; Option 1: 遅延プレビュー
     ;; :preview-key "M-.")            ;; Option 2: 手動プレビュー

この場合、カレント候補にEmbarkアクションを用いるのと、手動でプレビューをトリガーするのとでは何が違うのか不思議に思う人もいるだろう。主な違いは手動によるプレビューでオープンされたファイルは、補完セッションが終わった後に再び閉じられる点である。プレビューの間は性能向上のために一部機能が無効になる。カスタマイズ用の変数consult-preview-variablesconsult-preview-allowed-hooksの例を確認して欲しい。実行されるフックはconsult-preview-allowed-hooksにリストアップされたフックだけだ。この変数が適用されているのはfind-file-hookchange-major-mode-hook、それにprog-mode-hookのようなモードフックだけである。プレビュー中に追加でフォントロックを有効にするためには、対応するフックをallow(許可)リストに追加する。以下のデモではorg-modernhl-todoをallowリストに追加する例だ。

    ;; prog-modeフックにローカルモードを追加
    (add-to-list 'consult-preview-allowed-hooks 'hl-todo-mode)
    (add-to-list 'consult-preview-allowed-hooks 'elide-head-mode)
    ;; 有効なグローバルモード
    (add-to-list 'consult-preview-allowed-hooks 'global-org-modern-mode)
    (add-to-list 'consult-preview-allowed-hooks 'global-hl-todo-mode)

consult-preview-partial-sizeより大きいサイズでは部分的なプレビューになる。テーマのプレビューは時間がかかるので、プレビューと同じようにconsult-themeを遅延させると役に立つかもしれない。遅延させることにより、よりスムーズなUIエクスペリエンスが得られるだろう。

    ;; どのキーでもプレビューするが0.5秒遅延させる
    (consult-customize consult-theme :preview-key '(:debounce 0.5 any))
    ;; M-.は即時プレビュー、up/downなら0.5秒後、その他キーは1秒後
    (consult-customize consult-theme
                       :preview-key
                       '("M-."
                         :debounce 0.5 "<up>" "<down>"
                         :debounce 1 any))

ナローイングとグルーピング

補完グループにたいしてConsultには特別なサポートがある。機能のグルーピング(grouping: グループ化)をサポートする補完UIでは、UIがグループを細い線で区切ってグループのタイトルを票するのだ。複数タイプの候補や、consult-bufferコマンド(バッファーと最近オープンしたファイルの両方を表示する)のように複数ソースから選んだ候補によって構築された候補リストには、グルーピングが役に立つかもしれない。consult-customizeマクロで対応するコマンドの:groupプロパティにnilをセットすればグループのタイプは無効化できることに注意。

ナローイング用のプレフィックスやナローイングキーを押下することで、補完候補を特定の候補グループに制限できる。consult-bufferコマンドの使用時には、プレフィックスb SPCで候補リストをそのバッファーだけに制限できる。その後にDELを押下すると、完全な候補リストが再表示されるのだ。更にナローイングのプレフィックスキーとワイドニング(訳注: Emacsではwidenはnarrowを解除するコマンド))のキーと同等の効果を得るキーは設定可能だ。設定変数consult-narrow-keyおよびconsult-widen-keyを確認して欲しい。

consult-narrow-keyを押下した後にC-hを押下すれば利用可能なナローイングキーが表示されるだろう。何らかのプレフィックスキーの後にC-hを押下するとprefix-help-commandが呼び出される。このコマンドはデフォルトではヘルプウィンドウにキーバインディングを表示するのだ。コンフィグの例で示すように何らかのキー、たとえば?にバインド可能なconsult-narrow-helpコマンド、consult-narrow-mapC-hといったより簡潔な代替えを設定してもよいだろう。which-keyがインストール済みなら、consult-narrow-keyの押下後にナローイングキーが自動的にwhich-keyウィンドウに表示される筈だ。

非同期検索

Consultは候補リストの非同期生成をサポートしている。これはユーザーが正規表現をタイプ中にマッチしたリストを動的に生成する、consult-grepのような検索機能によって使用されている機能だ。grep のプロセスはバックグラウンドで実行される。正規表現が変更されるとバックグラウンドのプロセスを終了して、その変更された正規表現で新たなプロセスが開始される。

見つかったマッチはインストール済みのEmacs補完スタイルを用いて絞り込まれる。これはたとえば補完スタイルにorderlessを使っていれば、強力な機能かもしれない。

この2段階のフィルタリングを可能にしているのは入力文字列の分割(splitting)だ。入力文字列の一部はgrep の入力となり、その入力の一部がフィルタリングの入力として使用される。複数の分割スタイルがある。consult-async-split-styles-alistにはnilcommasemicolonperlが設定されている。デフォルトの分割スタイルは変数consult-async-split-styleに設定されている。

分割スタイルcommasemicolonではカンマやセミコロンの前の1つ目の単語はgrep、残りの文字列はフィルタリングに使用される。分割スタイルnilでは何も分割せず、入力全体がgrepに渡される。

分割スタイルperlでは入力文字がPerl正規表現と似た構文の句読点文字(punctuation character)で分割される。

例:

  • #defun: grepで"defun"を検索

  • #consult embark: grepで"consult"と"embark"の両方を任意の順番で検索

  • #first.*second: 後に"second"を伴う"first"を検索

  • #\(consult\|embark\): grepで"consult"か"embark"を検索(Emacsスタイルの正規表現使用に注意)

  • #defun#consult: grepで"defun"を検索、単語"consult"でフィルタリング

  • /defun/consult: 他の句読点文字でも使用可

  • #to#: grepで"to"を強制的に検索(デフォルトではgrepのパターンはconsult-async-min-inputより長くなければならないため)

  • #defun -- --invert-match#: grepに引数--invert-matchを渡す

findgrepといった非同期プロセスはエラーログ用のバッファー_*consult-async*(先頭のスペースに注意)を作成する。これは問題解決の際に役に立つ。プロンプトにはプロセスの状態を示す小さなインジケーターが表示される:

  • : 通常のプロンプトのコロンは入力の前に表示される

  • * プロセスが実行中にwarningフェイスで表示される

  • : プロセスが成功(エラーコードが0でexit)したときsuccessフェイスで表示される

  • ! プロセスが失敗(エラーコードが0以外でexit)したときerrorフェイスで表示される

  • ; 割り込み(更に入力が与えられた等)の際にerrorフェイスで表示される

複数ソース

複数の静的および非同期の候補ソースを組み合わせることができる。これはconsult-bufferコマンドで1つのメニューからクイックアクセスできるように、バッファー風の候補を表示する際に使用されている機能である。consult-bufferにはデフォルトではバッファー、ブックマーク、最近のファイル、それにプロジェクト固有のバッファーとファイルが含まれている。consult-buffer-sourcesはソースのリストを設定する変数だ。このリストには任意のカスタムソースを追加できる。

一例としてブックマーク用のソースは以下のように定義されている:

    (defvar consult--source-bookmark
      `(:name     "Bookmark"
        :narrow   ?m
        :category bookmark
        :face     consult-bookmark
        :history  bookmark-history
        :items    ,#'bookmark-all-names
        :action   ,#'consult--bookmark-action))

ソースのフィールド:items:asyncのいずれかの指定は必須である。

  • :items 選択する文字列リスト、または文字列リストをリターンする関数。文字列にはテキストプロパティでメタデータをもたせることができる。そのメタデータは:annotate:action:stateの関数から利用できる。このリストをペアーで設定することもできる。その場合にはcarの文字列が表示、実際の候補にはcdrが使用される。

  • :async 非同期ソース用の:itemsの置き換え。詳細についてはdoc文字列(docstring)を参照のこと。

以下はオプションのソースフィールド:

  • :name ソースの名前。ナローイング、グループタイトル、注釈に用いられる。

  • :narrow ナローイング文字。(char . string)のようなペアー、またはペアーのリスト。

  • :category 補完カテゴリー。

  • :preview-key プレビューキー、またはプレビューをトリガーするキー。

  • :enabled ソースが有効ならtをリターンする関数。

  • :hidden このソースの候補がデフォルトで非表示ならt

  • :face 候補のハイライトに用いるフェイス。

  • :annotate 候補それぞれに呼び出されて文字列をリターンする注釈関数。

  • :history 選択した候補を追加するヒストリー変数の名前。

  • :default ソースの最初のアイテムがデフォルト値ならt

  • :action 選択した候補に呼び出す関数。

  • :new 新たな候補名で呼び出される関数。:require-matchnilの場合のみ。

  • :state ソースにたいする状態(state)コンストラクタ。state関数をリターンしなければならない。

  • 他にもユースケースに応じて具体的なソースフィールドを追加可能。

ソースフィールドの:state:actionにはもっと詳しく説明しておく価値があるだろう。:action関数は1つの引数を受け取り、選択された候補が選択された後(選択が中止されていない)でのみ呼び出される。これはソースを手軽かつ簡単に定義する手段を提供するための機能だ。より汎用的なのが:stateフィールドだろう。:stateは引数を受け取らないコンストラクタ関数であり、プレビューに必要ないくつかのセットアップを行うことができる関数だ。ACTIONとCANDIDATEを引数として受け取るクロージャ(closure)をリターンしなければならない。ACTION引数の詳細についてはconsult--with-previewのdoc文字列を参照して欲しい。

デフォルトではconsult-bufferがプレビューするのはバッファー、ブックマーク、ファイルである。最近のファイルやブックマークのロードは、結果として高価な処理となる可能性がある。その点については以下のように手動でプレビューを行うように設定できる。

    (consult-customize
     consult--source-bookmark consult--source-file-register
     consult--source-recent-file consult--source-project-recent-file
     :preview-key "M-.")

利便性のためにconsult-buffer-sourceのリストにソースを直接追加できるようになっている。たとえば以下のソースリストではすべてのOrgバッファーに加えて、新たにOrgバッファーを作成できるようにした例だ。

    (defvar org-source
      (list :name     "Org Buffer"
            :category 'buffer
            :narrow   ?o
            :face     'consult-buffer
            :history  'buffer-name-history
            :state    #'consult--buffer-state
            :new
            (lambda (name)
              (with-current-buffer (get-buffer-create name)
                (insert "#+title: " name "\n\n")
                (org-mode)
                (consult--buffer-action (current-buffer))))
            :items
            (lambda ()
              (consult--buffer-query :mode 'org-mode :as #'consult--buffer-pair))))
    
    (add-to-list 'consult-buffer-sources 'org-source 'append)

他のメジャーモードにたいしても同様なソースを作成できる。ソースに関する追加の例についてはConsult wikiを参照のこと。consult-bufferや内部APIのconsult--multiのドキュメントも参考にして欲しい。consult--multi関数は新たなマルチソースコマンドの作成に使用できるだろう。

Embarkとの統合

注意 embark-consultパッケージはMELPAからインストールできる。これはConsult特有のEmbarkアクションとOccurバッファーのエクスポートを提供するパッケージだ。

Embarkはコンテキストに応じたアクションを提案する、コンテキストメニューに匹敵する多目的パッケージだ。Embark manualにはその能力に関して広範な記述があるので参照して欲しい。

アクション(actionとはカレントで選択された候補(Embarkの用語でtarget)を処理できるコマンドのこと。たとえばファイルを補完するときには、delete-fileコマンドが提供されるだろう。Embarkを使うことによりカレントで選択された候補にたいして、M-xで任意のコマンドが実行できるのだ。

更にEmbarkは候補を収集(collect)してEmbarkのcollectバッファーに表示する、embark-collectコマンドを提供している。このバッファーに収集された候補にたいして、更にアクションを適用できるのだ。これに関連する機能が、候補リストを特別なタイプのバッファーにエクスポートするembark-exportコマンドである。たとえばファイルの補完では、Diredバッファーがオープンされるといった具合だ。

Consultのコンテキストにおいて特に魅力的なのはconsult-lineconsult-outlineconsult-markconsult-global-markでマッチした行がエクスポート可能だという点だろう。マッチした行をOccurバッファーにエクスポートすれば、occur-edit-mode(eを押下すればよい)で編集が可能なのである。同じようにconsult-grepconsult-ripgrepconsult-git-grepが見つけたマッチのGrepバッファーへのエクスポートもEmbarkはサポートしている。wgrepをインストールしていれば、ファイルを跨いでGrepバッファーのマッチを編集できるのだ。以下の3つのワークフローには対称性がある。

  • consult-line -> embark-exportoccur-modeバッファーにエクスポート -> occur-edit-modeでバッファー内のマッチを編集

  • consult-grep -> embark-exportgrep-modeバッファーにエクスポート -> wgrepですべてのマッチが編集可

  • consult-find -> embark-exportdired-modeバッファーにエクスポート -> 編集はwdired-change-to-wdired-mode

コンフィグ

ConsultはEmacsビルトインのパッケージマネージャーでELPAMELPAからインストールできる。 それ以外の非標準のパッケージマネージャーを使えば、開発用のレポジトリから直接インストールすることもできるだろう。

コンフィグへの追加例を投稿できる場として、Consult wikiも存在する。

重要: コンフィグではlexical bindingを有効にしておくようお勧めする。Consult関連のコードスニペットの多くはlambdaとclosureを使用するので、レキシカルバインディングが必要なのだ。

use-packageの例

Consultが提供するのはコマンドだけであり、キーバインディングやモードは何も提供していない。したがって差し出がましくないパッケージではあるものの、セットアップの努力を少し費やす必要があるだろう。以下のコンフィグ例は他のEmacs機能と干渉するリスクを最小限にしたため、長くはあるが詰まるところキーバインディングを設定しているだけだ。

Consultコマンドを使用するには、頻繁にアクセスするコマンドにキーバインディングを追加することをお勧めする。滅多に呼び出さないコマンドならM-xで呼び出せれば十分だ。あなたのワークフローにとって有用だと思えるコマンドだけバインドすればよいだろう。ここに示す設定はuse-packageマクロ(パッケージのコンフィグを管理する便利なツール)に依存している。

注意: 追加のコンフィグ例を提供する場としてConsult wikiが存在する。

    ;; Consult用コンフィグ例
    (use-package consult
      ;; キーバインディングの置き換え; `use-package'によりlazyロードされる
      :bind (;; `mode-specific-map'のC-cバインディング
             ("C-c M-x" . consult-mode-command)
             ("C-c h" . consult-history)
             ("C-c k" . consult-kmacro)
             ("C-c m" . consult-man)
             ("C-c i" . consult-info)
             ([remap Info-search] . consult-info)
             ;; `ctl-x-map'のC-xバインディング
             ("C-x M-:" . consult-complex-command)     ;; 元はrepeat-complex-command
             ("C-x b" . consult-buffer)                ;; 元はswitch-to-buffer
             ("C-x 4 b" . consult-buffer-other-window) ;; 元はswitch-to-buffer-other-window
             ("C-x 5 b" . consult-buffer-other-frame)  ;; 元はswitch-to-buffer-other-frame
             ("C-x t b" . consult-buffer-other-tab)    ;; 元はswitch-to-buffer-other-tab
             ("C-x r b" . consult-bookmark)            ;; 元はbookmark-jump
             ("C-x p b" . consult-project-buffer)      ;; 元はproject-switch-to-buffer
             ;; レジスター高速アクセス用カスタムM-#バインディング
             ("M-#" . consult-register-load)
             ("M-'" . consult-register-store)          ;; 元はabbrev-prefix-mark (unrelated)
             ("C-M-#" . consult-register)
             ;; その他のカスタムバインディング
             ("M-y" . consult-yank-pop)                ;; 元はyank-pop
             ;; `goto-map'のM-gバインディング
             ("M-g e" . consult-compile-error)
             ("M-g f" . consult-flymake)               ;; 代替えはconsult-flycheck
             ("M-g g" . consult-goto-line)             ;; 元はgoto-line
             ("M-g M-g" . consult-goto-line)           ;; 元はgoto-line
             ("M-g o" . consult-outline)               ;; 代替えはconsult-org-heading
             ("M-g m" . consult-mark)
             ("M-g k" . consult-global-mark)
             ("M-g i" . consult-imenu)
             ("M-g I" . consult-imenu-multi)
             ;; `search-map'のM-sバインディング
             ("M-s d" . consult-find)                  ;; 代替えはconsult-fd
             ("M-s c" . consult-locate)
             ("M-s g" . consult-grep)
             ("M-s G" . consult-git-grep)
             ("M-s r" . consult-ripgrep)
             ("M-s l" . consult-line)
             ("M-s L" . consult-line-multi)
             ("M-s k" . consult-keep-lines)
             ("M-s u" . consult-focus-lines)
             ;; Isearchとの統合
             ("M-s e" . consult-isearch-history)
             :map isearch-mode-map
             ("M-e" . consult-isearch-history)         ;; 元はisearch-edit-string
             ("M-s e" . consult-isearch-history)       ;; 元はisearch-edit-string
             ("M-s l" . consult-line)                  ;; consult-lineのisearch検出に必要
             ("M-s L" . consult-line-multi)            ;; consult-lineのisearch検出に必要
             ;; ミニバッファーのヒストリー
             :map minibuffer-local-map
             ("M-s" . consult-history)                 ;; 元はnext-matching-history-element
             ("M-r" . consult-history))                ;; 元はprevious-matching-history-element
    
      ;; *Completions*バッファーのポイント位置で自動プレビューを有効にする
      ;; デフォルトの補完UIを使用する場合に関する設定
      :hook (completion-list-mode . consult-preview-at-point-mode)
    
      ;; :initのコンフィグは常に実行(遅延させない)
      :init
    
      ;; consult-register-load'、`consult-register-store'
      ;; 、ビルトインコマンド用のレジスタープレビューを調節する
      ;; レジスターのフォーマットの改善、細い分割線追加、レジスターのソート
      ;; ウィンドウのモードラインを非表示にする

      (advice-add #'register-preview :override #'consult-register-window)
      (setq register-preview-delay 0.5)
    
      ;; プレビュー付きでxrefを選択するために Consultを使用
      (setq xref-show-xrefs-function #'consult-xref
            xref-show-definitions-function #'consult-xref)
    
      ;; パッケージのlazyロード後に:configセクションの
      ;; 他の変数とモードを設定する
      :config

      ;; プレビューのオプション設定
      ;; デフォルト値の'anyはどのようにキーでもプレビューをトリガーする
      ;; (setq consult-preview-key 'any)
      ;; (setq consult-preview-key "M-.")
      ;; (setq consult-preview-key '("S-<down>" "S-<up>"))
      ;; 一部のコマンドとバッファーソースでは`consult-customize'マクロを使って
      ;; コマンドごとに:preview-keyを設定すると役に立つ
      (consult-customize
       consult-theme :preview-key '(:debounce 0.2 any)
       consult-ripgrep consult-git-grep consult-grep consult-man
       consult-bookmark consult-recent-file consult-xref
       consult--source-bookmark consult--source-file-register
       consult--source-recent-file consult--source-project-recent-file
       ;; :preview-key "M-."
       :preview-key '(:debounce 0.4 any))
    
      ;; ナローイングキーのオプション設定
      ;; <とC-+の両方を合理的に機能させる
      (setq consult-narrow-key "<") ;; "C-+"
    
      ;; ミニバッファーでナローイングヘルプを利用可能にするオプション
      ;; かわりに`embark-prefix-help-command'やwhich-keyを使う方が好みかもしれない
      ;; (keymap-set consult-narrow-map (concat consult-narrow-key " ?") #'consult-narrow-help)
    )

カスタム変数

ヒント: Marginaliaをインストールしていれば、M-x customize-variable RET ^consultをタイプしてConsult固有のカスタマイズ可能変数のカレント値と省略版の説明が確認できるだろう。C-h a ^consultとタイプすれば、かわりにConsultのすべての変数と関数の説明が確認できる筈だ。

変数 説明
consult-after-jump-hook ある場所へジャンプ後に呼び出す関数
consult-async-input-debounce 非同期コマンド入力のデバウンス(debounce: 一定間隔経過後に処理)
consult-async-input-throttle 非同期コマンドの入力スロットル(throttle: 一定間隔で処理)
consult-async-min-input 入力の最小文字数
consult-async-refresh-delay 非同期コマンドのリフレッシュの遅延
consult-async-split-style 非同期コマンドが用いる分割スタイル
consult-async-split-styles-alist 非同期コマンドが利用可能な分割スタイル
consult-async-indicator 非同期のインジケーター文字
consult-bookmark-narrow consult-bookmarkのナローイング設定
consult-buffer-filter consult-bufferのフィルター
consult-buffer-sources 仮想バッファーソースのリスト
consult-fd-args fdにたいするコマンドライン引数
consult-find-args findにたいするコマンドライン引数
consult-fontify-max-size この制限を超えるバッファーはフォント化(fontify)されない
consult-fontify-preserve 行ベースのコマンド用のフォント化(fontification)を保持
consult-git-grep-args git-grepにたいするコマンドライン引数
consult-goto-line-numbers consult-goto-lineで行番号を表示
consult-grep-max-columns マッチした行の最大列数
consult-grep-args grepにたいするコマンドライン引数
consult-imenu-config consult-imenuにたいするモード固有の設定
consult-line-numbers-widen ナローイングがアクティブ時の絶対行番号の表示
consult-line-start-from-top 上端からconsult-lineの検索を開始
consult-locate-args locateにたいするコマンドライン引数
consult-man-args manにたいするコマンドライン引数
consult-mode-command-filter consult-mode-commandのフィルター
consult-mode-histories モード固有のヒストリー変数
consult-narrow-key 補完中のナローイングのプレフィックスキー
consult-point-placement マッチにジャンプする際のポイント配置
consult-preview-key プレビューをトリガーするキー
consult-preview-allowed-hooks プレビュー中に許可されたフックのリスト
consult-preview-excluded-buffers プレビューから除外するバッファーを判断する述語
consult-preview-excluded-files プレビュー中にファイル名にマッチさせるregexp
consult-preview-max-count プレビュー中にオープンしたままにするファイルの最大数
consult-preview-partial-size これを超えるサイズのファイルは部分的にプレビューする
consult-preview-partial-chunk 部分的にプレビューする際のファイル部分のサイズ
consult-preview-variables プレビュー中にバインドする変数のalist
consult-project-buffer-sources 仮想的なプロジェクトバッファーソースのリスト
consult-project-function カレントプロジェクトのルートをリターンする関数
consult-register-prefix 補完中のレジスターキーのプレフィックス文字列
consult-ripgrep-args ripgrepにたいするコマンドライン引数
consult-themes 選択用に与えられるテーマのリスト
consult-widen-key 補完中にwidenするキー

プロジェクトのサポート

Consultに複数ある検索コマンドのうち、consult-grepのようにカレントプロジェクトを見つけ出して、もし見つかったらデフォルトではプロジェクトのトップレベルのディレクトリーを検索するコマンドがある。それ以外の場合にはdefault-directoryにフォールバックするコマンドだ。デフォルトではConsultはEmacsのビルトインのプロジェクト発見サポート(project-currentproject-root)を使用する。カスタマイズ変数consult-project-functionを介して代替えの手法を設定することができる。

    ;; オプションで別プロジェクトのルート関数を設定
    ;; 1. project.el (デフォルト)
    (setq consult-project-function #'consult--default-project--function)
    ;; 2. vc.el (vc-root-dir)
    (setq consult-project-function (lambda (_) (vc-root-dir)))
    ;; 3. locate-dominating-file
    (setq consult-project-function (lambda (_) (locate-dominating-file "." ".git")))
    ;; 4. projectile.el (projectile-project-root)
    (autoload 'projectile-project-root "projectile")
    (setq consult-project-function (lambda (_) (projectile-project-root)))
    ;; 5. プロジェクトサポートを無効にする
    (setq consult-project-function nil)

個々のコマンドの微調整

注意: Consultは個別のコマンドにたいするきめ細かなカスタマイズをサポートしている。この設定機能は経験を積んだユーザーの特化した要求に応えるために存在する機能だConsult wikiには更に多くのコンフィグ例が集められている。

consult-customizeマクロを使用すればコマンドやバッファーソースにたいして、個別に柔軟なカスタマイズが可能になる。内部APIのconsult--readに渡すすべてのオプションはオーバーライド可能だ。consult--readな内部APIなので、このパッケージの将来のバージョンにおいて削除、置き換え、改名される可能性があることに注意して欲しい。

以下に役に立つであろうオプションを挙げておこう:

  • :prompt プロンプト文字列をセット

  • :preview-key プレビューキーをセット(デフォルトはconsult-preview-key)

  • :initial 初期入力をセット

  • :initial-narrow 初期のナローキーをセット

  • :default デフォルト値をセット

  • :history ヒストリー変数のシンボルをセット

  • :add-history 未来のヒストリーにアイテム(たとえばポイント位置のシンボル)を追加

  • :sort ソートの有効/無効

  • :group nilにセットすると候補のグルーピングとタイトルが無効になる

  • :inherit-input-methodnilにすると入力メソッドを継承する

    (consult-customize
     ;; `consult-theme'のプレビューを完全に無効にする
     consult-theme :preview-key nil
     ;; `consult-buffer'のプレビューをキー`M-.'にセット
     consult-buffer :preview-key "M-."
     ;; `consult-line'のプロンプト変更、プレビュー用に複数キーバインディングを指定
     ;; `minibuffer-local-completion-map'や`vertico-map'でプレビューや次候補を
     ; 選択するために<S-up>と<S-down>のバインドが必要なことに注意
     consult-line :prompt "Search: "
     :preview-key '("S-<down>" "S-<up>"))

この設定値は実行時、補完セッションの開始直前に評価される。つまり初期入力や未来のヒストリーの調節に、たとえばthing-at-pointを使うことができるのだ。

    (consult-customize
     consult-line
     :add-history (seq-some #'thing-at-point '(region symbol)))
    
    (defalias 'consult-line-thing-at-point 'consult-line)
    
    (consult-customize
     consult-line-thing-at-point
     :initial (thing-at-point 'symbol))

一般的には以下のテクニックにしたがえば、あなた個人のニーズに合わせてコマンドを変更できるだろう。

  1. コマンドやソースのセッティングの変更にはconsult-customizeを使う

  2. 変更した引数をConsultの関数に渡すラップ関数を独自に作成する

  3. consult-buffer用には独自に複数ソースのバッファーを作成する

  4. 内部的な挙動の変更にはadviceを作成する

  5. パッチの記述や提案

推奨パッケージ

以下の組み合わせはわたしが使っているお勧めのパッケージだ:

  • consult: このパッケージ

  • vertico: 高速で最小限の垂直補完システム

  • marginalia: 補完候補用の注釈

  • embark and embark-consult: 補完候補に作用可能なアクションコマンド

  • orderless: 候補にたいして柔軟なフィルタリングを提供する補完スタイル

  • wgrep: grepバッファーの編集。embark-exportを通じてconsult-grepで使用する

Vertico以外にもConsultがサポートしている優れた補完UIが複数存在する。是非試してみて、あなたに最適な対話モデルを見つけ出して欲しい。

  • *Completions*バッファーをポップアップするビルトインの補完UI

  • ビルトインのicomplete-vertical-mode

  • mct by Protesilaos Stavrou: デフォルトの補完UI上に構築されたミニバッファーと補完の連携

パッケージはすべて独立しており強制依存関係は存在しないので、代替えコンポーネントに置き換え可能であることに注目して欲しい。更にデフォルトの補完とConsultで開始して、後からコンポーネントを追加して組み合わせることもできるのだ。たとえば注釈が不要ならMarginaliaは省略してもよいだろう。Embarkパッケージについては強く推奨するが、他のコンポーネントと親しむためにまずはEmbark抜きで始めてみるか、あるいはまずEmbarkを使ってみて後から他のコンポーネントを追加してみるのもよいと思う。

Consult wikiにlist of auxiliary packagesとしてパッケージを文書化しておいた。これらは特別なプログラムや、Emacsエコシステムの他のより広範なパッケージとConsultを統合するためのパッケージだ。

バグレポート

Consultの問題が疑われるバグを見つけたら、どうか以下のステップを踏襲していただきたい:

  1. あなたの問題が以前に報告済みの問題かどうか(そして最終的に解決されていないかどうか)をissueトラッカーで検索する

  2. インストールしたパッケージからバグが疑われるパッケージをすべて削除する

  3. 関連パッケージの最新バージョンを再インストールする。"package.el"は時々コンパイルミスを起こすので、単独で更新しても十分ではない。パッケージのリストにはConsult、Compat、Vertico、その他の補完UI、Marginalia、Embark、Orderlessが含まれる。

  4. デフォルトの補完UIを使用しているか、あるいはvertico-modemct-modeicomplete-modeのいずれかが1つだけが有効になっていることを確認する。サポートされていないselectrum-modeivy-modehelm-modeido-modeido-ubiquitous-modeは無効にしておかなければならない。

  5. 変数completion-stylesが正しく設定されているか確認する。substringまたはorderlessを含めたリストをcompletion-stylesにセットしてみる。

  6. Emacsの最新の安定バージョンで問題の再現を試みる。コマンドラインからemacs -Qにより必要最低限の機能のEmacsインスタンスを開始する。以下の最小限のコードスニペットをscratchバッファーで実行する。この方法ならコンフィグのセッティングによる副作用を除外できるだろう。問題の再現に他のパッケージが関係しているようなら、それらを最小限の設定スニペットに含める。

以下はVerticoでのemacs -Q用の最小セットアップ:

    (package-initialize)
    (require 'consult)
    (require 'vertico)
    (vertico-mode)
    (setq completion-styles '(substring basic))

以下はデフォルト補完システムでのemacs -Q用の最小セットアップ:

    (package-initialize)
    (require 'consult)
    (setq completion-styles '(substring basic))

以下は必要となる重要な情報なので、是非バグレポートと一緒に提供していただきたい:

  • 問題を再現可能な最小限の設定スニペット

  • 補完UI(デフォルトの補完か、Vertico、Mct、あるいはIcompleteか

  • 例外をトリガーするバグの場合にはスタックトレース

  • Emacsのバージョン(新しいバージョンではバグが訂正された、あるいは紛れ込んだのかもしれないので)

  • オペレーティングシステム(Emacs の挙動はLinux、Mac、Windowsの間で微妙に異なるので)

  • Emacsパッケージのインストールに使用したパッケージマネージャー(たとえば"straight.el"や"package.el"など)。これは更新における問題を除外するためだ。あなたはDoom Emacs ディストリビューションの一部としてConsultをインストールしたのか?

  • Evilを使用していないだろうか? Consultはそのまま使用できるEvil統合は提供していないが、evil-collection弐いくつかのサポートが存在する。

Consult関連のコードスニペットを評価する際にはlexical bindingを有効にすること。Consultはlambdaやclosureに依存することがよくあるからだ。

ハック

非同期補完コマンドの作成

動的かつ生成が高価であるようなソースの場合には、completing-readが最良の選択ではないかもしれない。completing-readの薄いラッパーであるconsult--readもこの機能を提供しており、その役目を任せられる筈だ。たとえば入力をスペースで分割する以下のような低速なスクリプトで考えてみると:

testibus
    #!/usr/bin/env bash
    # simulate work
    sleep .1
    # 補完候補の生成
    printf "%s\n" "$*" | tr " " "\n" | sort

このスクリプトをtestibus hello worldのように呼び出すとしよう。これをConsultの補完に用いるためにconsult--process-collectionを使用する:

    (consult--read
     (consult--process-collection
      (lambda (input) (list "testibus" (string-trim input))))
     :prompt "run testibus: ")

かわりにLispで補完候補を生成する場合にはconsult--dynamic-collectionを使えばよい:

    (consult--read
     (consult--dynamic-collection
      (lambda (input)
        (sleep-for 0.1) ;; Simulate work
        (split-string input nil t)))
     :prompt "run testibus: ")

計算に時間を要する処理にたいして補完UIが更新できるように、consult--dynamic-collectionはコールバックを受け取ることができる。

    (consult--read
     (consult--dynamic-collection
      (lambda (input callback)
        (dotimes (i 3)
          (sleep-for 0.1) ;; 処理のシミュレート
          (funcall callback (mapcar (lambda (s) (format "%s%s" s i))
                                    (split-string input nil t))))))
     :prompt "run testibus: ")

非同期で補完を収集するconsult--dynamic-collectionおよびconsult--process-collectionは、ソースconsult--multiにたいして使用できるのだ。ソースplistの:asyncフィールドでこれらを指定すればよいだろう。

ライブプレビュー

ライブプレビューの実装には状態(state)の定義やconsult--with-previewによって定義されるプレビュー関数が必要だ。プレビュー関数の役目は候補を受け取って、何らかの処理(つまり'preview)を行うことである。ライブプレビューをサポートする最もシンプルな形式は以下のようになるだろう:

    (defun testibus--preview (action cand)
      (pcase action
        ('preview
         (with-current-buffer-window " *testibus*" 'action nil
           (erase-buffer)
           (insert (format "input: %s\n" cand))))))

action引数のライフサイクルについてはconsult--with-previewのdoc文字列を参照して欲しい。一度定義してしまえばconsult--readでプレビュー関数として使用できる:

    (consult--read
     (consult--dynamic-collection
      (lambda (input callback)
        (dotimes (i 3)
          (sleep-for 0.1) ;; Simulate work
          (funcall callback (mapcar (lambda (s) (format "%s%s" s i))
                                    (split-string input nil t))))))
     :prompt "run testibus: "
     :state #'testibus--preview)

貢献してくれる人たちへ

Consultはコミュニティの努力が産み出した。是非議論に参加して欲しい。貢献は大歓迎だが、まずは貢献の可能性について議論したいかもしれない。このパッケージはGNU ELPAの一部なので、貢献にはFSFへの権利の譲渡が必要になる。

何か提案がある場合にはConsult issue trackerおよびConsult wishlistを確認して欲しい。機能に関する以前の議論が多数見つかる筈だ。issueトラッカーを検索して欲しい。もしかしたらあなたの問題や機能リクエストは、既に以前議論されていたかもしれないからだ。小さ目のコンフィグやコマンドスニペットを共有したい場合には、Consult wikiに投稿して欲しい。

謝辞

これはOleh Krehel氏のCounselから発想を得て作成されたパッケージだ。一部のConsultコマンドにはCounselパッケージや、Selectrumパッケージのwikiを起源するコマンドもある。このパッケージの唯一の存在意義はこれらの偉大なパッケージを寄贈してくれた人たち、そしてたくさんのユーザーからのフィードバックに感謝を表すことにある。ありがとう!

コードに貢献してくれた人たち: Aymeric Agon-RambossonAmos BirdAshton WiersdorfAdam SpiersAugusto StoffelClemens RadermacherZhengyiGeoffrey LesselIllia OstapyshynjakanakaevangeliJD SmithJean-Philippe BernardymattiasdrpMohamed AbdelnourMohsin KaleemFox KiesterOmar Antolín CamarenaEarl HyattOmar PoloPiotr KwiecinskiRobert WeinerSergey KostyaevAlexandru ScvorțovTecosaurSylvain RousseauTom FitzhenryIñigo SernaAlex Kreisher

有意義な議論やアドバイスを与えてくれた人たち: Enrique Kessler MartínezAdam PorterBruce d'ArcusClemens RadermacherDmitry GutovHoward MelmanItai Y. EfratJD SmithManuel UbertiStefan MonnierOmar Antolín CamarenaSteve PurcellRadon RosboroughTom FitzhenryProtesilaos Stavrou

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?