🚀

fish shell+pecoで簡単なスニペットを使う

2022/03/15に公開

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で決定します。

他のShellで使う

Discussion