| author | created | draft | tags | title | ||
|---|---|---|---|---|---|---|
プレハブ小屋 |
2026-02-25 13:32:53 +0900 |
true |
|
fzf 利用ノート |
fzf は CLI であり、次のようなものからなる一覧から、目当てのものを対話的に(つまりキーボードを使って)絞り込むプログラムだ:
- ファイル
- コマンド履歴
- プロセス
- ホスト
- ブックマーク
- Git コミット
fzf は良い性質をいくつか備えている。Bash と統合しやすいだけでなく、高速性と汎用性が特に優れている。
fzf を試しに少し触ってみただけでも強烈な可能性を感じるので、この機会に習得してみよう。
この CLI ツールを WSL (Ubuntu) で利用する前提で綴る。シェルは Bash bash(1) を用いる。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04.3 LTS
Release: 24.04
Codename: noble評価に用いた fzf のバージョン情報は次節に記す。
公式に推奨されているパッケージ管理方式は Homebrew だ。インストールコマンドはこうだ:
brew install fzfインストール直後はこのようになる:
$ brew list fzf
/home/linuxbrew/.linuxbrew/Cellar/fzf/0.68.0/bin/fzf
/home/linuxbrew/.linuxbrew/Cellar/fzf/0.68.0/bin/fzf-preview.sh
/home/linuxbrew/.linuxbrew/Cellar/fzf/0.68.0/bin/fzf-tmux
/home/linuxbrew/.linuxbrew/Cellar/fzf/0.68.0/install
/home/linuxbrew/.linuxbrew/Cellar/fzf/0.68.0/plugin/fzf.vim
/home/linuxbrew/.linuxbrew/Cellar/fzf/0.68.0/sbom.spdx.json
/home/linuxbrew/.linuxbrew/Cellar/fzf/0.68.0/share/man/ (2 files)
/home/linuxbrew/.linuxbrew/Cellar/fzf/0.68.0/shell/ (5 files)
/home/linuxbrew/.linuxbrew/Cellar/fzf/0.68.0/uninstallHomebrew 自体の環境管理(例えば、タブ補完設定ファイルを source するコードを用意すること)については本稿では記さない。
対話的操作モード下のシェル実行制御ファイル (e.g. .bashrc) に fzf を使いやすくするコードを追記しろ:
[ -x "$(command -v fzf)" ] && eval "$(fzf --bash)"これにより、次のような機能が有効になる:
- キーバインディング各種
- 曖昧補完
- コマンドラインでのタブ補完
キーバインディングに関しては、eval 実行までに対応する環境変数を明示的に定義することで既定のコマンドを上書きしたり無効にしたりすることが可能だ。
以下では上記の eval を仕込んでいる場合の既定構成を採用したうえでの操作を仮定する。
Bash などのシェルが備えているパス補完機能では、補完したいパスが入力文字列を完成パス文字列の連結した部分として含んでいる必要があるが、曖昧補完では連結性が問われない。
一般的なコマンドライン入力中にキャレットがコマンド引数の場所にある頃合いで
- 必要なら曖昧文字列をタイプし
- 文字列
**をタイプし - Tab を押す
ことで、fzf 一覧画面がコマンド行の前後どちらかに現れる。一覧は曖昧文字列に合致するファイルパスで構成される。
次の状況で ** とタイプしてから Tab を押すと、可能性のある候補一覧が現れる:
| 状況 | 何の一覧が現れるか |
|---|---|
general-command /path/to/**<Tab> |
ディレクトリー /path/to にあるファイル |
cd /path/to/**<Tab> |
ディレクトリー /path/to のサブディレクトリー |
export **<Tab> |
環境変数 |
kill **<Tab> |
プロセス ID |
unalias **<Tab> |
alias で定義してあるコマンド |
unset **<Tab> |
これも環境変数 |
- 複数の検索語句を
で区切って入力可能。言い換えると例えばABとA Bは補完結果が異なる。 - メタキャラクターのような概念がある。例:
'word: word を部分文字列として含むものに合致する^word: word から始まるものに合致する$word: word で終わるものに合致する!word: word を含まぬものに合致する
- 語を区切るのに
|を用いると OR の意味で使える。例:.md$ | .markdown$
オプション --nth 系、--preview などの引数では項目行の列を番号で参照することが可能だ。
- テンプレートでない値の場合には括弧を使わない。
- テンプレートでは数を中括弧で囲む。例:
{1},{2}. - いちばん左の列の番号は 0 ではなく 1 だ。
- 番号を右から左に振ることが可能であり、それには負の番号を用いる。例:
{-1},{-2}. - 範囲を一組の括弧で指定することが可能。例:
{3..5}.- 端点を省略すると残余全ての意。例:
{2..},{..-3},{..}. - どの場合でも列を左から右に参照する。
- 端点を省略すると残余全ての意。例:
{n}は項目番号ではなく、一覧における行番号を意味する。
有効な例:
echo foo bar baz | fzf --with-nth 2..
echo foo bar baz | fzf --accept-nth 2
fzf --delimiter , --with-nth '{n},{1},{3},{2},{1..2}'プレビュー機能のプレイスホルダーと混同するのは誤り?
曖昧検索をいっさい用いたくない場合は fzf --exact を使え。
fzf --preview preview-cmd の形式で一覧表示を行うと、一覧画面で項目選択が更新されるたびにコマンド preview-cmd が走るようになる。
例えば:
fzf --preview 'bat --color=always {-1}' | ...git branch | fzf --preview 'git show --color=always {-1}' | ...
また、オプション --bind にも preview という動作が設けられている。後述。
使えそうなオプションに絞って記す。
-e,--exact: 曖昧検索を用いない-i,--ignore-case: アルファベットの大文字小文字を区別しない-n,--nth=N: ミニバッファーからの検索が有効になる列番号を指定する- 列番号は
1から始まる(以下同様) - カンマ区切りで列番号を複数与えてもよい(以下同様)
- 列番号は
--with-nth=N: 陳列する列を指定する- 番号直接指定ではなく
{2} {3} {1}のような文字列も与えてもよい - ここでは
{n}が行番号に置き換わる(ただし行番号は0から始まる)
- 番号直接指定ではなく
accepth-nth=N:fzfに出力させる列を指定する--with-nthと同じテンプレルールが適用される
-d,--delimiter=STR: 上記入力側nth系オプションの区切り文字- 既定では
awk(1) のような区切り方をする
- 既定では
--disabled: 検索自体を用いない
--read0:fzfにパイプする一覧が NUL 文字区切りであるときに指定する--print0:fzfの出力する一覧を NUL 文字区切りにする--ansi: ANSI 色コード (e.g.\033[1;31m,\033[32;44m,\033[0m) を処理する
--style=(default|minimal|full): スタイルをプリセットにより指定--color=...: 色合いを構成するオプション(習得優先度が低いので割愛)--no-color: 無彩にする--no-bold: 太字を用いない--black: 背景を黒にする
--height=HEIGHT: レイアウトにも依存するが、fzf領域の高さを指定する%指定が結果を想像しやすい- 負の値を指定すると、端末窓の高さからの差が採用される
~を頭につけて指定すると、入力規模から高さが決定する
--min-height=HEIGHT:--heightが%指定された場合の最小高さ- TODO: 例を記したい
見てくれを重視する事例で重要になるオプション。
--layout=LAYOUT: 一覧とミニバッファの位置関係を定めるdefault: 画面の床から陳列するreverse: 画面の天井から陳列する(ミニバッファが天井)reverse-list: 画面の天井から陳列する
--reverse:--layout=reverseの意--border=STYLE: 全体に対する窓枠をどう描くかを指定する(下記参照)--border-label=LABEL: 枠に見出しをつける- ただし
--borderが特定の値である場合に限り動作する
- ただし
--border-label-pos=POS: 見出し配置を指定- 桁位置指定:正の数または負の数の場合は、左または右から何文字の位置かを表す
- 上下指定:天井 (
top) か床下 (bottom) を指定可能 - 桁位置指定と上下指定を
:で区切って併置することも可能
--margin=MARGIN: 一覧区画外側の余白を指定する- 四方向は CSS のような TRBL 方式で指定可能(他の四方向を扱うオプションも同様)
- 値としては端末窓寸法からの
%値または文字数を取る
--padding=PADDING: 一覧区画内側の余白を指定する- ただし
--borderを指定しているときに限り動作する
- ただし
| 値 | 見てくれ |
|---|---|
rounded |
ドラクエのような丸角枠 |
sharp |
矩形枠 |
bold |
矩形枠(太め) |
double |
二重線枠 |
horizontal |
天井と床下に枠線 |
vertical |
両脇柱に枠線 |
line |
自動決定した辺に枠線 |
top |
天井だけ枠線 |
bottom |
床下だけ枠線 |
left |
左柱だけ枠線 |
right |
右柱だけ枠線 |
none |
枠線なし |
有用なオプションが意外に多い。
-m,--multi: 複数選択を有効にする- Tab キーで選択オンオフ切り替え
- 選択の上限数を引数により指定可能
--highlight-line: 現在行全体を強調表示(背景?)--cycle: カルーセル方式を採用--wrap=(char|word): 行折り返しを有効にするchar: 文字単位で折り返すことを許すword: 単語境界でのみ折り返すことを許す
--wrap-sign=INDICATOR: 行折り返し記号を指定する--wrap-word:--wrap=wordと同等--raw: ミニバッファーからの絞り込みから外れた項目でも一覧から隠さない--tac: 入力の順序を前後逆にする--gap=N: 行間隔に挿し込む空行数を指定する--gap-line=STR:--gapによる空行を表す文字列を指定する--pointer=STR: 現在行を表すカーソルに使う記号--marker=STR: 選択済み行を表すカーソルに使う記号--tabstop=SPACES: タブ文字を何文字のに変換するか--scrollbar=CHAR: スクロールバーを構成する記号- 上下に大きい記号が適している
- 二文字使う場合は二つ目がプレビュー窓用
--list-border=STYLE:--borderの一覧区画版- 有効な値の集合は前節の表から
lineを除いた集合に等しい
- 有効な値の集合は前節の表から
--list-label=LABEL:--border-labelの一覧区画版--list-label-pos=POS:--border-label-posの一覧区画版
Emacs の術語を借りる。
--no-input: ミニバッファーを隠す--prompt=STR: Bash で言うPS1的な文字列を指定する- 空白文字で終了するとよい
--info=STYLE: ステータス?を示す位置を指定するinline-rightがいい感じ
--info-command=COMMAND: TODO--no-info:--info=hiddenと同一--separator=STR: 一覧区画とミニバッファーの間の横線部分--ghost=TEXT: ミニバッファーで Win32 APISetCueBannerのようなことが可能--input-border=STYLE:--borderのミニバッファー版--input-label=LABEL:--border-labelのミニバッファー版--input-label-pos=POS:--border-label-posのミニバッファー版
--preview=COMMAND: 上述--preview-border=STYLE:--preview-window=border-STYLE と同じ--preview-label=LABEL:--border-labelのプレビュー窓版--preview-windowの値によっては無意味
--preview-label-pos=POS:--border-label-posのプレビュー窓版--preview-window=ARGS: TODO
注:ヘッダーとフッターの陳列位置の上下関係は --layout の値によって定まる。
--header=STR: 見出し文字列(スクロールしても現れ続ける)--header-lines=N: ヘッダー行数(スクロールしても現れ続ける行数)--header-first: ヘッダーの位置をミニバッファーの「前」に変える--header-border=STYLE:--borderのヘッダー版--header-label=LABEL:--border-labelのヘッダー版--header-label-pos=POS:--border-label-posのヘッダー版--header-lines-border=STYLE
フッターは一覧を挟んでミニバッファーの反対側に位置する。
--footer=STR: フッター文字列(スクロールしても現れ続ける)--footer-border=STYLE:--footer-borderのフッター版--footer-label=LABEL:--footer-labelのフッター版--footer-label-pos=POS:--footer-label-posのフッター版
何のためにあるのか不明なオプション群。
-q,--query=STR-0,--exit-0
--bind=BINDINGS: 入力キーやイベントと動作を関連付けるためのオプション- 式を
,区切りで指定する - 式とは
KEY:ACTIONまたはEVENT:ACTIONの形式 - 複数のキーやイベントに単一の動作を関連付けるのに
,で区切ってもよい
- 式を
公式からの引用:
fzf --bind 'start,ctrl-r:reload:ps -ef'
fzf --bind='ctrl-j:accept,ctrl-k:kill-line'ここでは start, reload, ctrl-j, ctrl-k が入力キーまたはイベントの識別子だ。
ps -ef, accept, kill-line が動作を指定する。
まだ習うことはない。
--walker=TYPE: 下の表の値をカンマ区切りで組み合わせてよい- 既定では
file,follow,hiddenの組み合わせが用いられる - 環境変数
FZF_DEFAULT_COMMANDが定義されていると指定は無効になる
- 既定では
--walker-root=DIR:$PWD以外のディレクトリーから巡回するときに指定する--walker-skip=DIRS: ディレクトリー巡回時に飛ばす場所をカンマ区切りで指定する- 既定値は
.git,node_modulesだそうだから、類似のディレクトリーを含めておく
- 既定値は
| 値 | 動作 |
|---|---|
file |
ファイルを含める |
dir |
ディレクトリーを含める |
hidden |
隠しディレクトリーを含める |
follow |
シンボリックリンクをたどる |
fzf に任せていいはず。
私は Bash しか使わないので次の一つを知っていればいい。しかも一度しか使わない。
--bash: Bash 用の統合コードを出力する(先述)
マウスイベントを無視するオプションだけ覚えていればいい。
--no-mouse: マウスを無効にする
--version:fzfバージョンを出力して終了する--help: ヘルプメッセージを出力して終了する--man:man fzfと同様
Ctrl+R を押すと、Bash の history 相当の情報が一覧に示される。
- 一覧画面で再度 Ctrl+R を押すと、曖昧入力に合致している項目が時系列順に排列され直す。もう一度押すと関連順に直る。
- 一覧画面で Ctrl+/ を押すと、行折り返しのオンオフが切り替わる。
環境変数 FZF_CTRL_R_OPTS にこのコマンドに対する追加的なコマンドラインオプションを定義すると、それが考慮される。
実際には環境変数 FZF_CTRL_T_COMMAND が定義されていればそれを呼び出す。未設定の場合には次のコマンドを実行する:
Ctrl+T を押すと、現在ディレクトリー以下にあるファイルの一覧がコマンドラインの側に現れる。
次のコマンドと同等:
fzf --walker file,dir,follow,hidden環境変数 FZF_CTRL_T_OPTS にこのコマンドに対する追加的なコマンドラインオプションを定義すると、それが考慮される。
実際には環境変数 FZF_ALT_C_COMMAND が定義されていればそれを呼び出す。未設定の場合には次のコマンドを実行する:
fzf --walker dir,follow,hiddencd の後に何文字かタイプして Tab キーを押す手順と比較すると、ストロークが若干省略できる程度の楽ができる。サブディレクトリーを複数参照する場合には便利。
環境変数 FZF_ALT_C_OPTS にこのコマンドに対する追加的なコマンドラインオプションを定義すると、それが考慮される。
オプション --bind を使用するとキー入力・イベント発生を特定の動作に結びつけられる。
つまり、キーバインディングやイベントバインディングを指定できる。
キーの組み合わせを指定するには fzf が定める識別子を用いる:
ctrl-a, ...,ctrl-zctrl-alt-a, ...,ctrl-alt-zctrl-space,ctrl-/, etc.ctrl-up, etc.,ctrl-home, etc.ctrl-alt-up, etc.ctrl-shift-up, etc.ctrl-alt-shift-up, etc.enter,space,backspace
動作を促すのはキー入力のほかに、fzf が定めるイベントによっても可能だ。私が使えそうなものを下に記す:
| 識別子 | イベント |
|---|---|
start |
fzf が開始した |
load |
入力ストリームが完了し、一覧の初期処理が完了した |
resize |
端末窓の寸法が変化した |
result |
出力準備完了 |
change |
ミニバッファーの入力文字列が変化した |
multi |
複数選択が変化した |
one |
一致がただ一件になった |
zero |
一致がなくなった |
上記のキーやイベントを : により結びつけられる動作はたくさん設けられている。いくつかを次に記す:
| 識別子 | 既定キー or イベント | 動作メモ |
|---|---|---|
abort |
ctrl-g, esc, etc. |
exit 130 |
accept |
enter |
変種があと二つある |
become(...) |
fzf プロセスを特定のコマンドに置換する |
|
best |
最善合致へ動く | |
bg-cancel |
bg-transform 系動作を中止する:下を見ろ |
|
cancel |
ミニバッファーが空でない場合それを消去 or fzf を中止 |
|
change 系 |
||
clear-screen |
ctrl-l |
Bash (readline) clear 同等 |
clear-multi |
複数選択を消去 | |
clear-query |
ミニバッファー内容を消去 | |
close |
プレビュー窓があればそれを閉じる | |
deselect |
||
deselect-all |
||
disable-search |
検索機能を使わせない | |
down |
ctrl-j down |
|
down-match |
ctrl-n |
キャレットの下の合致に移動する |
down-selected |
キャレットの下の選択項目に移動する | |
execute(...) 系 |
外部コマンド実行:下を見ろ | |
first |
キャレットを先頭合致へ移す | |
ignore |
? | |
last |
キャレットを末尾合致へ移す | |
page-down |
pgdn |
|
page-up |
pgup |
|
pos(...) |
キャレットを引数の位置に移す | |
preview(...) |
プレビュー構成:下を見ろ | |
preview-down |
shift-down |
|
preview-up |
shift-up |
|
print(...) |
文字列を出力キューに追加&正常終了時に出力 | |
put |
指定文字をプロンプトに表示する | |
put(...) |
指定文字列をプロンプトに表示する | |
refresh-preview |
||
rebind(...) |
unbind して解除した結びつきを再び bind する |
|
reload(...) 系 |
動的読み込み:下を見ろ | |
replace-query |
ミニバッファー文字列を現在の選択内容で置き換える | |
search(...) |
指定文字列で検索を発動 | |
select |
||
select-all |
合致すべてを選択 | |
toggle |
||
toggle-all |
||
toggle-wrap |
||
toggle-wrap-word |
ctrl-/ alt-/ |
|
transform(...) 系 |
外部コマンドの出力を使用して状態を変換する | |
trigger(...) |
下を見ろ | |
unbind(...) |
bind を解除 |
|
unix-line-discard |
ctrl-u |
ミニバッファー文字列をキルリングへ |
unix-word-rubout |
ctrl-w |
|
up |
ctrl-k, up |
キャレットを上に移す |
up-match |
ctrl-p |
キャレットの上の合致に移動する |
up-selected |
キャレットの上の選択項目に移動する | |
yank |
ctrl-y |
キルリングから貼り付け |
上の表で (...) を含む動作は引数を取ることを示している。詳しくは二つ次の節を見ろ。
fzf --bind 'ctrl-a:change-prompt(コマンド? )'
fzf --bind 'ctrl-w:preview(bat --color=always {})' --preview-window hidden動作同士を記号 + で連結すると、それらが左から順に動作する。例:
fzf --multi --bind 'ctrl-a:select-all+accept'動作に対する実引数が丸括弧を含む場合、fzf は式の解析に失敗することがある。その場合、別の括弧対で代替するしかない。
action[...]
action{...}
action<...>
etc.
もう一つ特殊な代替括弧に「コロンから末尾まで」という手口がある。長いコマンドを記述するときなどに有用だ。
動作 execute や preview で適用可能なプレイスホルダーがいくつかある。
| パターン | 実行時の値 |
|---|---|
{} |
引用符で囲まれた現在項目 |
{+} |
選択項目(空集合の場合は現在項目)を空白文字区切りで並べ、それぞれが引用符で囲まれたもの |
{*} |
{+} の合致項目版 |
動作 execute の急所は、シェルコマンドを fzf を止めることなく実行することだ。
次のコマンドは一覧でファイルを選択して Enter を押すと Visual Studio
Code でそれを開くものだ。このとき、端末窓側では fzf がまだ実行中であることが利点だ:
fzf --bind "enter:execute(code -r {})"
fzf --multi --bind "enter:execute(code -r {+})"- コマンドが短時間で完了すると予期され、その出力を必要としない場合は、代わりに
execute-silentを使用すると良い。画面切り替えなしでコマンドを静かに実行する。 - 非同期実行を望むならばコマンドをバックグラウンド実行すればよい。
- 端末窓側で
fzfが実行中でないほうがいい場合はexecuteではなくbecomeを利用しろ。
動作 reload で fzf 実行中に一覧を更新することが可能だ。公式の例を引用する:
ps -ef | fzf --bind 'ctrl-r:reload(ps -ef)' --header 'Press CTRL-R to reload' --header-lines=1 --layout=reverse同期的に更新してもかまわないのならば reload-sync を使え。
名前が transform から始まる動作群は外部コマンドの出力を使用して fzf の状態を変化させる。この動作の出力は単一のテキスト行であるのが普通だ。
公式の例を引用する。次の fzf コマンドは一覧でキャレットを移すとヘッダー行に現在項目に関する
file --brief の結果が示される:
fzf --bind 'focus:transform-header:file --brief {}'実引数によっては、プレイスホルダーにバックスラッシュを用いたエスケイプを施す必要があることに気をつけろ。 例えば、実引数を文字列として見たときに、その文字列が引用符を含む場合にエスケイプ の必要がある。
名前が transform から始まる動作群はすべて同期的だ。そのコマンド実行中は fzf が固まる。そこで名前が bg-transform から始まる動作群を代わりに用いると、対応する動作が非同期的になる。
- 単発の
transform系動作で済む状況ならば、その対応bg-transform動作を採用するのがよい。 bg-transform系動作を中止するにはbg-cancelを使える。
TODO: --preview, --preview-window, :change-preview-window をまとめる
動作版 preview を使用すると、オプション版 --preview で指定される命令のほかにプレビュー命令を追加的に指定することが可能だ。
次の例を観察しろ:
fzf --preview 'file -b {}' --bind 'p:preview:bat --color=always {}'- プレビュー窓には現在項目に対する
file -bの出力が「通常プレビュー」として示される - 現在項目がある状態で p を押すと
batによる出力がfzfプレビュー窓に示される
次のコマンドを観察しろ:
fzf --preview-window hidden --bind 'p:preview:bat --color=always {}'- 初期状態で
fzfにプレビュー窓がない - 現在項目がある状態で p を押すと
fzfの状態は上の例と同じになる
動作 change-preview-window の実引数の書き方はよそにはない。
次の例を観察しろ:
fzf --bind 'ctrl-/:change-preview-window(right,70%|down,40%,border-horizontal|hidden|right)' --preview='bat --color=always {}'Ctrl+/ を押すたびに、プレビュー窓の性質が四つの組み合わせの間で反復する
オプション --preview-window の指定は change-preview-window に継承される。動作に空欄を含めると、プレビューオプションの指定がされたことになる。次のコマンドはその例だ:
fzf --preview-window 'right,40%,border-left' --bind 'ctrl-/:change-preview-window(70%|down,border-top|hidden|)' --preview='bat --color=always {}'- ファイル
$XDG_CONFIG_HOME/fzf/fzfrcを用意する - そのファイルに毎回指定するコマンドラインオプションを列挙する
- 次節で述べる
exportを確実に実行するように仕込む
次の二つをおぼえておけばいい:
| 環境変数 | 意味 |
|---|---|
FZF_DEFAULT_OPTS |
実行時に指定がないオプション群の取り決め |
FZF_DEFAULT_OPTS_FILE |
そのようなオプションの取り決めを記載するファイルのパス |
普通は二番目の環境変数を .bashrc などで定義しておき、そのファイルに常用する
fzf オプションを列挙しておけばいいはずだ。
export FZF_DEFAULT_OPTS_FILE="$XDG_CONFIG_HOME/fzf/fzfrc"また、fzf には子プロセスに情報を伝える目的の独自の環境変数がたくさんある。
- オプション
--scheme=(default|path|history)の意味など - TODO
zoxideとの連携を記すか、zoxide利用ノートでfzfとの連携を記す。
Ctrl+R による履歴検索機能が個人的一押し。これだけのために fzf をインストールする価値がある。
ファイルパスがタイプに不向きな文字を含んでいる場合にも fzf は便利だ。例えば
fzf --multi --print0 | xargs -0 ... のように使える。... のところに
mv や diff などのコマンドを書ける。
コツ一覧:
-
コマンドラインオプションの
--nth/--width-nth/--accepth-nthを自由に使えるようになれ。 -
枠を指定し過ぎるとデータを陳列する空間が狭くなる。
-
既定のキーバインディングをだいたい暗記しろ。プレビュー窓のスクロールなどをマウスでやっていてはいけない。
-
プレビュー指定やコマンド指定におけるプレースホルダー
{},{+},{*}を理解しろ。 -
change-preview-window動作を念入りに指定すると利便性が上がる場合が多いと考えられる。 -
TODO: 他のキーを使いたい場合
-
TODO: レシピ集