0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

zsh の `PROMPT` で変数や条件分岐を扱う

Last updated at Posted at 2024-04-01

きっかけと困ったことと対応

iTerm を使っていた際は、zsh のprecmdでプロンプトとして好きにテキストを表示していました。
(条件での出しわけとか改行とか、プログラマティックに色々書きやすいから)

が、iTerm ではなく Warp を使用すると、precmdで表示していたテキストがブロックの最後に表示されてしまいました。

Closing as resolved, this has been fixed in recent version of Warp!

2023年の8月に最新バージョンで直ったとされているんですが自分の手元だとまだ起きます。悲しい。

しょうがないので precmd を使うのをやめて、PROMPT1本で勝負することにしました。

PROMPT は単なる環境変数なので、動的に値を変えるようにするためには独自の方法を使用する必要があります。

PROMPT 内で変数や条件分岐を使う方法

独自の関数を使う

いきなり最終的な答えですが、カスタム関数を毎回実行するようにできるので、precmdなどで定義していた内容をこの方法で指定するだけでOKです。

PROMPT_SUBSTオプションが設定されている場合、プロンプト文字列は最初に パラメータ展開、コマンド置換、算術展開が行われる。展開参照。

# この1行が必要
setopt PROMPT_SUBST

# 直接書く
CUSTOM_COMMAND='$(echo HOGEHOGE)'

# 定義済みの function
function hogehoge() {
  echo HOGEHOGE
}
CUSTOM_COMMAND='$(hogehoge)'

注意点としてはシングルクオーテーションを使っているところです。
ダブルクオーテーションにするとその場で実行されてしまうので、期待通りに動きません。$(echo HOGEHOGE)という文字列がそのままPROMPT内に入る必要があります。

一つ関数を用意してそこに好きなコマンドを書けば完了です。

他の記法も一応書いておきます。記述量は減らせるかもしれません。

現在のディレクトリ

# 絶対パス
PROMPT=%/

# ホームディレクトリからの相対パス
PROMPT=%~

これでコマンドの実行ごとに現在のディレクトリを表示してくれます。

改行

方法は

の中の "3.13: How do I get a newline in my prompt?" に書かれています。

PROMPTの中では$'\n'を使うことで改行になります。

PROMPT=line1$'\n'line2

これで2行になります。

条件分岐

%(x.true-text.false-text)

という記法を使うと、PROMPT内で条件分岐を書けます。
x には独自に定められた1文字が入りますが、例えば?を使用すれば、前のコマンドの終了ステータスが成功か失敗かを参照できます。

例えば以下のように書くことで前のコマンドの結果に応じてプロンプトを変更できます。

PROMPT=%(?.SUCCESS.FAILED)

?以外にもあるので上記のドキュメントから使いたいものを選んでください。

使用例

CURRENT_DIRECTORY=%~
PROMPT_NEW_LINE=$'\n'
CUSTOM_COMMAND='$(echo HOGEHOGE)'
PROMPT=%(?,SUCCESS,FAILED)
export PROMPT="${PROMPT_NEW_LINE}...${CURRENT_DIRECTORY}...${CUSTOM_COMMAND}...${PROMPT}..."

プロンプトの最後に改行が入る問題は Warp のアップデート待ち

普通のターミナルソフトならプロンプトの直後にコマンドを打てる(それを想定したPROMPTを書いている人も多いと思う)。

が、Warp に関してはPROMPTの後に現状必ず改行が入る。

これがそのイシュー。一見サクッとした機能追加に見えて、実は Warp のコアを修正する必要があるらしく、めちゃくちゃ重いアップデートになるとのこと。

特殊なことをしてると大変だ...他の機能も含め、Warp の今後のアップデートに期待です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?