🍊

nushellとstarshipで,コマンド履歴を残さないモードであることを可視化する

に公開

概要.

  • シェル・ターミナルで,履歴を残さないモードと通常モードの切り替えを容易にする.
  • コマンドエイリアスで,モード切り替えと同時に環境変数を設定する.
  • starshipで環境変数を参照して表示を切り替える.
  • nushell+starshipの環境で,履歴を残さないモードであることを可視化する.
  • nushell以外のシェルを使用している場合は(例:bash, zshなど),適宜読み替えてほしい.

成果物
とくに変哲のない,通常のStarship表示
履歴を残す状態のときのstarship表示

StarshipによってNO_HISTORYを表示されている
履歴を残さない状態のときのstarship表示

環境

  • Ubuntu 24
  • nushell 0.104.0
  • starship 1.22.1

背景・課題

コマンドラインでの作業をしていると,履歴を残さないモードで作業したいことがある.機密情報を含んでしまうときや,アドホック過ぎて履歴の邪魔になるときなどだ.nushellならば,nu --no-historyで,履歴を残さないモードにできる.しかし,これを毎回打つのは面倒だ.それに,せっかくなら履歴を残さないモードであることを可視化したい.そこで,nushell+starshipの環境において,履歴を残さないモードであることを可視化する方法を紹介する.

解決策

環境変数を利用して状態を管理し,starshipで表示する.

1. コマンドエイリアスを作成する.同時に独自の環境変数を設定する.

config.nuに以下のエイリアスを設定する.snu[1]nuコマンドエイリアスを定義する.実行時には独自の環境変数NO_HISTORY_SHELLを設定する.この環境変数は,履歴を残さないモードであることを示すために使用する.この環境変数名は,各自変更してもらっても構わない.

LLMにnushellの環境変数設定のことを聞くとlet-envを使うように言われるかもしれないが,それは無視しよう.let-envは現在非推奨である.

コマンドエイリアスによって,再帰的にnuコマンドを実行されてしまう可能性を排除するため,^プレフィクスによってローカルコマンドであることを明示する.しかし,このプレフィクスが無くても,私の環境では問題なく動作した.

config.nu
# 履歴を残さないモードで起動,解除するための設定
# シークレットモード(履歴を残さない)で起動
alias snu = do {
    $env.NO_HISTORY_SHELL = 1
    ^nu --no-history
}
# シークレット解除(履歴を残す)で起動
alias nu = do {
    $env.NO_HISTORY_SHELL = 0
    ^nu
}

2. starshipで表示設定を行う.

独自の条件分岐によって表示を切り替えたいときは,starshipのcustom moduleを使用する.条件はwhenのところに記述する.記述した文字列はそのままシェルで実行され,そのコマンドが成功か失敗によって表示が変わる.使用中のシェルに依存するため注意してほしい.

starship.tomlに以下の2つの設定を追加する.

starship.toml
format = """
# 何かしらの設定
${custom.no_history_shell}
# 何かしらの設定
"""

custom moduleの設定は以下のようにする.

starship.toml
[custom.no_history_shell]
# when = 'test "$INCOGNITO_SHELL" = 1' # POSIXシェルのとき
when = "test $env.NO_HISTORY_SHELL == 1" # nushellのとき
description = "シェルのno-history(履歴を保存しない)が有効な場合に表示"
symbol = "NO_HISTORY"
style = "bg:#212736"
format = '[[ $symbol ](fg:#769ff0 bg:#212736)]($style)'

うまくいかなかったら

もしもうまく表示されない場合には,starship module {custom module名}コマンドが役に立つだろう.このコマンドは,指定のカスタムモジュールを評価し,その結果を表示してくれる.具体例として,本記事の場合はstarship module custom.no_history_shellを実行することで,カスタムモジュールの評価結果を確認できる.

starship module custom.no_history_shellコマンドの結果,NO_HISTORYと正常な表示が描画されている.
履歴を残す状態のときの正常なコマンド結果

starship module custom.no_history_shellコマンドを結果,正常な結果として出力はない.
履歴を残さない状態のときの正常なコマンド結果

おわりに

以上の設定により,nushell+starshipの環境において,履歴を残さないモードであることを可視化することができた.

参考文献

  1. https://starship.rs/ja-JP/config/#カスタムコマンド
  2. https://www.nushell.sh/commands/docs/let-env.html
  3. https://www.nushell.sh/ja/book/escaping.html
脚注
  1. シークレット nu の略のつもり.なんだかgnuみたいでいいですね ↩︎

Discussion