-
consult.elのバージョン2.0のREADME.orgの日本語訳です
-
ライセンス: パッケージのライセンスと同じ、すなわちGPLv3.0ライセンスです
Table of Contents
Emacsの標準APIであるcompleting-read
を中心に置いた補完システム、とりわけデフォルトの補完システム、Vertico、Mct、Icompleteと完全な互換性がある。
このパッケージでは補完システムを具体的に最小となるよう維持している。任意の補完システムと良好に動作するというConsultコマンドの能力は、このパッケージの主なアドバンテージのうちの1つだ。Consultは従来のセットアップとの相性もよく、小規模で独立したコンポーネントから完全な補完環境を構築するのに役に立つだろう。
Consultを補足するパッケージとしてMarginalia、Embark、Orderlessを組み合わせることができる。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-window
、consult-buffer-other-frame
、consult-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-pop
はkill-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-load
とconsult-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-line
がisearch-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-find
、consult-fd
、consult-locate
: regexpにたいしてパスをマッチしてファイルを検索する。consult-grep
と同じようにプロジェクトのルートかカレントディレクトリーが検索のルートディレクトリーとなる。入力文字列はconsult-grep
の場合と同じように1つ目の部分が検索、、2つ目の部分はEmacsのフィルタリングに渡されることになる。consult-find
へのプレフィックス引数はConsultのgrepコマンドと同じように機能する。
コンパイル
-
consult-compile-error
: コンパイルエラーにジャンプする。ライブプレビュー、ナローイング、再帰編集をサポートしている。 -
consult-flymake
: Flymakeのdiagnostic(診断)にジャンプする。ライブプレビューと再帰編集をサポート、ナローイングもこのコマンドはサポートしている。表示をerrors(エラー)、warnings(警告)、notes(ノート)だけにするにはそれぞれe SPC
、w SPC
、n 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-history
はminibuffer-history-variable
に格納されているヒストリーを使用する。completion-at-point
,が気に入っているようなら、Capeパッケージのcape-history
を調べてみたらよいだろう。 -
consult-isearch-history
: このコマンドはIsearchのセッション中にはヒストリーから検索文字列を物色して、新たに選択された文字列での検索を継続する。Isearchの外部にいる場合にはあなたがヒストリーから文字列を選んで、新たなIsearchを開始することができる。consult-isearch-history
はisearch-edit-string
のちょっとした置き換えとして機能するだろう。
モード
-
consult-minor-mode-menu
: マイナーモードを有効あるいは無効にする。ナローイングへのサポートをローカルまたはグローバルに、オンあるいはオフにするにはそれぞれl/g/i/o SPC
t押下すればよい。 -
consult-mode-command
: 現在アクティブなメジャーモードやマイナーモードからコマンドを実行する。l/g/m
というキーを通じたローカルのマイナーモード、グローバルなマイナーモード、そしてメジャーモードのナローイングをサポートしている。
Orgモード
-
consult-org-heading
:consult-imenu
やconsult-outline
のOrgバッファー用の変種だ。ヘッドラインとその祖先となるヘッドラインの間の区切りはスラッシュ。ヘッダレベル、priority(優先度)とTODOでのナローイング、それにライブプレビューと再帰編集をサポートしている。 -
consult-org-agenda
: Orgのagendaヘッダにジャンプする。ヘッダレベル、priorityとTODOでのナローイング、それにライブプレビューと再帰編集をサポートしている。
ヘルプ
-
consult-man
: Unixにapropos
とman -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-variables
やconsult-preview-allowed-hooks
の例を確認して欲しい。実行されるフックはconsult-preview-allowed-hooks
にリストアップされたフックだけだ。この変数が適用されているのはfind-file-hook
、change-major-mode-hook
、それにprog-mode-hook
のようなモードフックだけである。プレビュー中に追加でフォントロックを有効にするためには、対応するフックをallow(許可)リストに追加する。以下のデモではorg-modernとhl-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-map
のC-h
といったより簡潔な代替えを設定してもよいだろう。which-keyがインストール済みなら、consult-narrow-key
の押下後にナローイングキーが自動的にwhich-keyウィンドウに表示される筈だ。
非同期検索
Consultは候補リストの非同期生成をサポートしている。これはユーザーが正規表現をタイプ中にマッチしたリストを動的に生成する、consult-grep
のような検索機能によって使用されている機能だ。grep のプロセスはバックグラウンドで実行される。正規表現が変更されるとバックグラウンドのプロセスを終了して、その変更された正規表現で新たなプロセスが開始される。
見つかったマッチはインストール済みのEmacs補完スタイルを用いて絞り込まれる。これはたとえば補完スタイルにorderless
を使っていれば、強力な機能かもしれない。
この2段階のフィルタリングを可能にしているのは入力文字列の分割(splitting)だ。入力文字列の一部はgrep の入力となり、その入力の一部がフィルタリングの入力として使用される。複数の分割スタイルがある。consult-async-split-styles-alist
にはnil
、comma
、semicolon
、perl
が設定されている。デフォルトの分割スタイルは変数consult-async-split-style
に設定されている。
分割スタイルcomma
とsemicolon
ではカンマやセミコロンの前の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
を渡す
find
やgrep
といった非同期プロセスはエラーログ用のバッファー_*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-match
がnil
の場合のみ。 -
: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-line
、consult-outline
、consult-mark
、consult-global-mark
でマッチした行がエクスポート可能だという点だろう。マッチした行をOccurバッファーにエクスポートすれば、occur-edit-mode
(e
を押下すればよい)で編集が可能なのである。同じようにconsult-grep
、consult-ripgrep
、consult-git-grep
が見つけたマッチのGrepバッファーへのエクスポートもEmbarkはサポートしている。wgrepをインストールしていれば、ファイルを跨いでGrepバッファーのマッチを編集できるのだ。以下の3つのワークフローには対称性がある。
-
consult-line
->embark-export
でoccur-mode
バッファーにエクスポート ->occur-edit-mode
でバッファー内のマッチを編集 -
consult-grep
->embark-export
でgrep-mode
バッファーにエクスポート ->wgrep
ですべてのマッチが編集可 -
consult-find
->embark-export
でdired-mode
バッファーにエクスポート -> 編集はwdired-change-to-wdired-mode
コンフィグ
ConsultはEmacsビルトインのパッケージマネージャーでELPAやMELPAからインストールできる。 それ以外の非標準のパッケージマネージャーを使えば、開発用のレポジトリから直接インストールすることもできるだろう。
コンフィグへの追加例を投稿できる場として、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-current
とproject-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-method
非nil
にすると入力メソッドを継承する
(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))
一般的には以下のテクニックにしたがえば、あなた個人のニーズに合わせてコマンドを変更できるだろう。
-
コマンドやソースのセッティングの変更には
consult-customize
を使う -
変更した引数をConsultの関数に渡すラップ関数を独自に作成する
-
consult-buffer
用には独自に複数ソースのバッファーを作成する -
内部的な挙動の変更にはadviceを作成する
-
パッチの記述や提案
推奨パッケージ
以下の組み合わせはわたしが使っているお勧めのパッケージだ:
-
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の問題が疑われるバグを見つけたら、どうか以下のステップを踏襲していただきたい:
-
あなたの問題が以前に報告済みの問題かどうか(そして最終的に解決されていないかどうか)をissueトラッカーで検索する。
-
インストールしたパッケージからバグが疑われるパッケージをすべて削除する。
-
関連パッケージの最新バージョンを再インストールする。"package.el"は時々コンパイルミスを起こすので、単独で更新しても十分ではない。パッケージのリストにはConsult、Compat、Vertico、その他の補完UI、Marginalia、Embark、Orderlessが含まれる。
-
デフォルトの補完UIを使用しているか、あるいは
vertico-mode
、mct-mode
、icomplete-mode
のいずれかが1つだけが有効になっていることを確認する。サポートされていないselectrum-mode
、ivy-mode
、helm-mode
、ido-mode
、ido-ubiquitous-mode
は無効にしておかなければならない。 -
変数
completion-styles
が正しく設定されているか確認する。substring
またはorderless
を含めたリストをcompletion-styles
にセットしてみる。 -
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
もこの機能を提供しており、その役目を任せられる筈だ。たとえば入力をスペースで分割する以下のような低速なスクリプトで考えてみると:
#!/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-Rambosson、Amos Bird、Ashton Wiersdorf、Adam Spiers、Augusto Stoffel、Clemens Radermacher、Zhengyi、Geoffrey Lessel、Illia Ostapyshyn、jakanakaevangeli、JD Smith、Jean-Philippe Bernardy、mattiasdrp、Mohamed Abdelnour、Mohsin Kaleem、Fox Kiester、Omar Antolín Camarena、Earl Hyatt、Omar Polo、Piotr Kwiecinski、Robert Weiner、Sergey Kostyaev、Alexandru Scvorțov、Tecosaur、Sylvain Rousseau、Tom Fitzhenry、Iñigo Serna、Alex Kreisher
有意義な議論やアドバイスを与えてくれた人たち: Enrique Kessler Martínez、Adam Porter、Bruce d'Arcus、Clemens Radermacher、Dmitry Gutov、Howard Melman、Itai Y. Efrat、JD Smith、Manuel Uberti、Stefan Monnier、Omar Antolín Camarena、Steve Purcell、Radon Rosborough、Tom Fitzhenry、Protesilaos Stavrou