LoginSignup
doikoji
@doikoji (土井 考爾)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

zshのPROMPT変更がどうあっても反映されない

解決したいこと

zshのPROMPT設定が反映されない。

発生している問題・エラー

このほど、さくらのVPSで新しいサーバを契約してubuntuの環境設定作業中なのですが、zshのpromptのスタイルがどうあっても変更されてくれません。

設定ファイル.zshrcには以下のように設定しています。

.zshrc
PROMPT='%F{red}%n@%m %h [%c] %F{reset} '
RPROMPT='%F{red}[ %~ ] %F{reset}'

この設定はこれまで複数のubuntu機で使っていたもので、以下のようなプロンプトが出るはずなのです。
1_240418a.PNG

然るに、新環境では、どうあっても次のようになってしまいます。
1_240418b.PNG

コマンドラインからPROMPTの再設定を試みても効果がありません。RPROMPTの方が問題なく如何様にも変更可能です。

何が変更を妨げているのでしょうか? 考えられる原因にどういうものがあるでしょうか? まったく見当がつかず困惑しています。ヒントでもいいのでご教示いただけると助かります。

環境の概要

% uname -a
Linux ik1-220-80395 5.4.0-125-generic #141-Ubuntu SMP Wed Aug 10 13:42:03 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
% cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.6 LTS"
VERSION_ID="20.04"
% zsh --version
zsh 5.8 (x86_64-ubuntu-linux-gnu)
0

3Answer

コマンドラインからPROMPTの再設定を試みても効果がありません。

コマンドラインに PROMPT='%F{red}%n@%m %h [%c] %F{reset} ' と入力してエンターすると次の行からプロンプトが変化するはずですが、そうならないということですね?

zsh にはプロンプトを表示する直前に関数を実行できるフック機能、 precmd があります。フックによって PROMPT が上書きされている可能性があります。

関数をフックとして登録する方法はいくつかあって突き止めづらいので、ロードされた設定ファイルの中で PROMPT をセットしている関数がないか探すのが早いと思います。

zsh -o source_trace のように zsh を起動すると起動時にロードされた設定ファイル名が一覧表示されるので、その中から探してみてください。

1

どれも同じ内容でしょうか?

$ echo PROMPT
$ echo prompt
$ echo PS1

シェルがネストしていますか?

$ ps
0

ありがとうございます。
hookとか以前に聞いたような覚えはありますが、まったく気にしていなかったので今回もまったく連想に至りませんでした。

さて、改めて新旧のマシンの.zshrcを見返してみたところ、新しい方にだけ設定されている記述がありました。

autoload -Uz promptinit
promptinit
prompt adam1

このadam1とやらの中に私が見たプロンプトスタイルの設定が確かに存在するようです。

また、コマンドラインからPROMPT=hogeとかしても全く変更されない状況は、@uasiさんが示唆する仮説で確かに説明できそうです。

しかし、zsh -o source_traceしてみた結果は、

+/etc/zsh/zshenv:1> <sourcetrace>
+/etc/zsh/zshrc:1> <sourcetrace>
+/home/koji/.zcompdump:1> <sourcetrace>
+/home/koji/.zshrc:1> <sourcetrace>
+/home/koji/.zcompdump:1> <sourcetrace>

となっており、この中にhookに関する設定は見当たらないようです。
というわけでPROMPTの書き換えができない理由は依然としてよくわかりません。

なお、.zshrcの中には他にプロンプトに関連していそうな次のような記述を見つけました。

zstyle ':completion:*' list-prompt %SAt %p: Hit TAB for more, or the character to insert%s
zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s

これが何か影響しているのかとも思いましたが、この辺で私の気力の方が尽きました。
他に急いでやりたい仕事が幾つもある状況でもあり、追及は中断して、古い.zshrcを新しいマシンに上書きし(こちらにはpromptコマンドもzstyleコマンドも設定がありません)、再起動するという後ろ向きの方法で対処することにしました。

このように対症療法で今回は済ませますが、後学のためにこの情報を纏めて置けるものなら後日時間が出来たときにまとめて記事にしておきたいと思いますので、引き続き、有用な情報があればご教示いただければありがたいです。

0

Comments

  1. 以下のコードでロードしたプロンプトのスタイルは precmd フックでセットされるため、 PROMPT を設定しても反映されない状況の説明がつきます。以下のコードはスタイルをセットする以外のことはしないので、単に削除すれば PROMPT の設定が効くようになります。

    autoload -Uz promptinit
    promptinit
    prompt adam1
    

    なお、autoload -Uz promptinitpromptinit 関数を同名の設定ファイルから読み込んで定義するコマンドです。これで読み込まれるファイル名は zsh -o source_trace には現れません。

  2. zstyle の方はプロンプトへの入力中にタブキーを押すと表示される補完リストの表示内容と関係していそうです。

Your answer might help someone💌