🐠

fish-shell に追加された fish_should_add_to_history について

2025/03/09に公開

はじめに

普段使っている Mac mini で久しぶりに brew upgrade したら fish-shell が 4.0.0 に更新されました。
メジャーバージョンアップなのでリリースノートを眺めていたら fish_should_add_to_history という新しい関数が追加されているのを発見。
ちょっと試してみました。

概要

man fish_should_add_to_history の説明にある通り、コマンドを履歴に残すかどうか制御するための関数です。

この関数はコマンドを履歴に追加する前に実行されて、その実行結果(戻り値)によりコマンドが履歴に残るかどうかが決まります。

  • 戻り値が 0 の場合
    • 履歴に残る
  • 戻り値が 0 以外の場合
    • 履歴に残らない
      • 次のコマンドを実行するまでは up() や down() でコマンドを再表示して実行することは可能

この関数を実装しているかどうかにより、履歴保存の挙動は以下のように変わります。

  • 実装していない場合
    • スペースで始まらないコマンドは履歴に保存される
      • デフォルトの挙動
  • 実装している場合
    • 実装した処理内容に準じて保存される
      • 明示的に実装しなければ、スペースで始まるコマンドも履歴に保存される

実装例

試しに実装してみたものです。

以下の二種類のコマンドが履歴に残らないようになっています。

  • 引数がある場合は残しておきたいものの、引数がない場合は煩わしいので残しておきたくないコマンド
  • 引数があっても煩わしいので残しておきたくないコマンド
~/.config/fish/functions/fish_should_add_to_history.fish
function fish_should_add_to_history
    # 履歴に残したくないコマンド(引数なし)
    set -l commands 'bg' 'cd' 'exit' 'fg' 'history' 'jobs' 'la' 'll' 'ls' 'pwd' 'top' 'tree'

    contains $argv $commands; and return 1

    # 履歴に残したくないコマンド(引数あり)
    set -l commandsWithArgs 'which'

    for c in $commandsWithArgs
        string match -q -r "^$c" $argv; and return 1
    end

    return 0
end

実装次第では他にも色々できそう。

おわりに

普段はリリースノートを見たりしないんですが、思わぬところでこういう発見があったりしますね。
こういう便利な機能を見つけたら、積極的に利用していきたいものです。

Discussion