🚀
fish shell+pecoで簡単なスニペットを使う
bashやzsh、PowerShellとpecoでスニペットを使う記事はよく出てきますが、fishの記事は見当たらなかったので載せておきます。
fishのスクリプトを書いたことがほとんどないので、もっと良い方法があればご指摘いただけると助かります。
機能
-
.snippets
ファイルの読み込み- gitリポジトリ内で実行した場合は、リポジトリルートに配置したファイルを読み込み
- それ以外 or 存在しない場合はホームディレクトリに配置したファイルを読み込み
- キーボードショートカット
Ctrl+t
での呼び出し
関数
本体
~/.config/fish/config.fish
に追記するか、~/.config/fish/conf.d
の中に適当なfishファイルを作成して保存してください。
function peco_snippets
set repo_root (git rev-parse --show-toplevel 2>/dev/null)
if [ $repo_root ]; and test -e "$repo_root/.snippets"
set target "$repo_root/.snippets"
else
set target ~/.snippets
end
cat $target | peco | read snippet
if [ $snippet ]
commandline $snippet
end
end
キーバインド設定
すでに存在する場合は中身を追記してください。
function fish_user_key_bindings
bind \ct peco_snippets
end
処理
リポジトリのルートパスを取得します。
リポジトリ外で実行するとエラーが起きるため、エラー出力は捨てます。
set repo_root (git rev-parse --show-toplevel 2>/dev/null)
以下の通りにターゲットを切り替えます。
- repo_rootに値がセット済(=リポジトリ内)
& リポジトリのルートに.snippets
ファイルが存在する場合:$repo_root/.snippets
- それ以外:
~/.snippets
if [ $repo_root ]; and test -e "$repo_root/.snippets"
set target "$repo_root/.snippets"
else
set target ~/.snippets
end
catの結果をpecoに渡し、pecoで値が選択された場合は入力中のコマンドとして出力します。
cat $target | peco | read snippet
if [ $snippet ]
commandline $snippet
end
実行
Ctrl+t
を押すとpecoが開くので、使用したいスニペットを選んでenterで決定します。
Discussion