nushellとstarshipで,コマンド履歴を残さないモードであることを可視化する
概要.
- シェル・ターミナルで,履歴を残さないモードと通常モードの切り替えを容易にする.
- コマンドエイリアスで,モード切り替えと同時に環境変数を設定する.
- starshipで環境変数を参照して表示を切り替える.
- nushell+starshipの環境で,履歴を残さないモードであることを可視化する.
- nushell以外のシェルを使用している場合は(例:bash, zshなど),適宜読み替えてほしい.
成果物
履歴を残す状態のときのstarship表示
履歴を残さない状態のときの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
コマンドを実行されてしまう可能性を排除するため,^
プレフィクスによってローカルコマンドであることを明示する.しかし,このプレフィクスが無くても,私の環境では問題なく動作した.
# 履歴を残さないモードで起動,解除するための設定
# シークレットモード(履歴を残さない)で起動
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つの設定を追加する.
format = """
# 何かしらの設定
${custom.no_history_shell}
# 何かしらの設定
"""
custom moduleの設定は以下のようにする.
[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
を実行することで,カスタムモジュールの評価結果を確認できる.
履歴を残す状態のときの正常なコマンド結果
履歴を残さない状態のときの正常なコマンド結果
おわりに
以上の設定により,nushell+starshipの環境において,履歴を残さないモードであることを可視化することができた.
参考文献
- https://starship.rs/ja-JP/config/#カスタムコマンド
- https://www.nushell.sh/commands/docs/let-env.html
- https://www.nushell.sh/ja/book/escaping.html
-
シークレット nu の略のつもり.なんだかgnuみたいでいいですね ↩︎
Discussion