created: 2023-11-02T10:40:04.370Z

fzf と一緒に使うと便利そうな bash 関数

bash だと READLINE_LINEREADLINE_POINT という変数に値を代入すると、シェルのラインバッファ(入力欄)の内容を書き換えることができる。fzf や peco を使う場合はこれらの変数をよく使う。

ただ、これらの変数は変数なので、パイプの末にとれた値を扱う際にちょっと不便だった。 結果行を変数として受け取りたいので、コマンド置換を使ったこんな形になる。

v=$(cat ... | すごく長いパイプに次ぐパイプ | fzf)
READLINE_LINE=$v
READLINE_POINT=0

これでも別にいいんだけれども、コマンド置換の中身がずらずらと長いとエスケープとか心配になるし、使っていい文字とかもよくわからない。

アイデア

そこでこんな関数を .bashrc の中に置いてみたら便利だった。

function result_into_bash_readline() {
  result=$($1)
  READLINE_LINE=$result
  READLINE_POINT=0
}

普通に 1 行だけ結果を出力するような関数を書いたら、文字列で関数名を渡せば結果行を入力欄にいれられる。

function _fzf_git_files() {
  ....
}

bind -x '"\C-g\C-f": result_into_bash_readline "_fzf_git_files"'

参考

失敗から学ぶユーザインタフェース 世界はBADUI(バッド・ユーアイ)であふれている
[ad] 失敗から学ぶユーザインタフェース 世界はBADUI(バッド・ユーアイ)であふれている
中村 聡史 (大型本)