zshプロンプトでパスをフォーマットする方法は?


23

読みやすい色のパスが欲しいです。たとえば、単純に%〜を使用して返す代わりに、パス区切り文字を強調表示~/path/to/fooするように書式設定したいと思います~$RED/$NOCOLORpath$RED/$NOCOLORto$RED/$NOCOLORfoo

PROMPTのコンテンツを定義して、各ディスプレイでパス式を再評価できますか?${${(%):-%~}//\//_some_format_expression/}明らかにそのようなものは機能しません。

または、これをさらにハックして、ディレクトリを変更するたびにPROMPT値を強制的にリセットする必要がありますか?

パスの書式設定の目標を達成する任意のソリューションを歓迎します。

ありがとう:)


まだ存在する場合は、これに対するベストアンサーをマークすることをお勧めします。)
ダンローゼンスターク

回答:


36

zsh

これを試して:

setopt PROMPT_SUBST
PROMPT='%{$(pwd|grep --color=always /)%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '

プロンプトの内訳は次のとおりです。

  • PROMPT_SUBSTは、プロンプトでのコマンド置換(およびパラメーター展開と算術展開)をオンにします
  • %{...%} -エスケープシーケンス
  • $(pwd|grep --color=always /)-現在のディレクトリを印刷して強調表示します/-色は$ GREP_COLORS環境変数(またはデフォルト値)に依存します-太字の赤はデフォルトです
  • %${#PWD}G-現在のディレクトリの名前の文字数をグリッチ値として使用します。これにより、シェル%{は、ANSIエスケープシーケンスを含む文字列の実際の長さではなく、これを前の文字シーケンス( " "の後)の長さと見なします。これにより、プロンプトの終わりに対するカーソルの位置に関してシェルが混乱するのを防ぎます。
    - - - - - - - これは、あなたの質問に答える部の端です - - - - - - -
  • %(!.%F{red}.%F{cyan}) -これが特権シェル(ルート)の場合、前景色を赤に設定し、そうでなければシアン
  • %n -ユーザー名を出力する
  • %f -前景色をデフォルトにリセットします
  • @ -リテラルのアットマーク
  • %F{yellow} -前景色を黄色にする
  • %m -ホスト名を出力する
  • %f -前景色をデフォルトにリセットします
  • %(!.%F{red}.) -これが特権シェル(ルート)の場合、前景色を赤に設定します
  • %#- #特権シェルまたは%非特権シェルの出力
  • %f -前景色をデフォルトにリセットします

質問はパスに関するものであるため、強調するためにこのプロンプトでパスを最初に配置しました。

代替テキスト

以下は、$GREP_COLORS変数を操作することにより、root(特権)であるかどうかに応じてスラッシュの色を変更するzshのバージョンです。

setopt PROMPT_SUBST
PROMPT='%{$(pwd|([[ $EUID == 0 ]] && GREP_COLORS="mt=01;31" grep --color=always /|| GREP_COLORS="mt=01;34" grep --color=always /))%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '

バッシュ

Bashでも同様のプロンプトを実行できます。この例では、ユーザーとホスト名を最初に配置し、UIDが0の場合はスラッシュの色も変わり$PS1ます。警告:これはBashのプロンプト変数を上書きします。何か特別なことをしている場合、またはその変数を直接設定して、これが有効になっているときに動作が変化することを期待しない限り、これは問題になりません。また、これは「usercolor」と呼ばれる変数を使用します。これは他の何かと衝突する可能性がありますが、この全体を関数に入れて変数をローカルと宣言することもできます。

PROMPT_COMMAND='usercolor="\[\033[0;36m\]";[[ $EUID == 0 ]] && usercolor="\[\033[1;31m\]";PS1="$(pwd)";PS1="$usercolor\u\[\033[0m\]@\[\033[0;33m\]\h\[\033[0m\]:${PS1//\//$usercolor/\[\033[0m\]}$usercolor\\$\[\033[0m\] "'

代替テキスト

Bashにはパラメーター拡張置換を使用して条件付きで(grepを使用するのではなく)スラッシュを色付けするzshの「グリッチ」機能がないという事実を利用しました。


私を愚か者と呼ぶが、私が持っていた唯一の間違った部分は、PROMPT定義で一重引用符の代わりに二重引用符を使用したことでした。ありがとう:)
ニコラスドゥマゼット

@NicDumZ、面白い、私は昨日他の場所でその問題に約20分を費やした:)
ダン・ローゼンスターク

1
これは非常に(マニアックで)クールです。おかげで...
ダンRosenstark

Bashでこれを行う方法、またはBashでなぜ機能しないのですか?Bashの場合、端末を起動した最初のディレクトリで停止するだけで、移動しても更新されません。私は$(pwd | grep --color = always /)をPS1に入れただけで、奇妙な動作になりました。編集:ああ!Bashセクションは見ませんでした(笑)。
イブラヒム

実際、私はより複雑なプロンプトでBashのPS1トリックを使用しようとしていますが、機能していません。私のPWDが再びスタックします。ただし、スニペットはそのまま機能します。PROMPT_COMMANDの目的は何ですか?これは私が持っているものです:github.com/ibrahima/dotfiles/blob/master/.bashrc.d/prompt.shでPS1="$(pwd)"; PS1="${debian_chroot:+($debian_chroot)}\[$bldgrn\]\u@$(fgcolor $hostnamecolor)\h$(resetcolor)\[$txtrst\]:\[$bldblu\]${PS1//\//$txtred/$bldblu}\[\e[00m\]$bldred\$(parse_git_branch)\[$txtrst\] \[$undcyn\]\T \d\[$txtrst\] 95\$ "定義された色
Ibrahim

4

いくつかの試行錯誤の後、オーバーライドするソリューションを提供できますchpwd

doprompt() {
  local my_path=${(%):-%~}
  PROMPT="${yourstuff}${my_path//\//${PR_BOLD_RED}/${reset_color}}${otherstuff}"
}
doprompt

chpwd() {
  doprompt
  # unrelated: set window title
  [[ -t 1 ]] || return;
  print -Pn "\e]2;%n@%m: %~\a";
}
  • 一時的なmy_path変数を取り除くためにこのコードを改善する方法はありますか?%〜の中の/を直接置き換えることはできません...
  • 動的な構文を使用して各ディレクトリの変更を呼び出さないようにするソリューションdopromptは、おそらくよりクリーンです。

4

純粋なzshソリューション:

PROMPT='%n@%m: %{$PR_BOLD_RED%}${${(%):-%~}//\//${PR_BOLD_RED}/%f}%f '
  • ${(%):-%~} 現在のパスです。
  • ${xxxxx//\//${PR_BOLD_RED}/%f} xxxxx内のすべての/を太字の赤色に置き換えます
  • そしてもちろん、PROMPT_SUBSTをオンにする必要があります。

私はテストで二重引用符を使用していましたが、これは置換を許可しません。すべてが単一引用符で正常に機能します。


$PR_BOLD_RED別の場所で定義しておく必要があります。2番目の「赤」の後の閉じ中括弧(のみ)PROMPT='%n@%m: %{%B%F{red}%}${${(%):-%~}//\//%B%F{red\}/%b%f}%b%f '非常に奇妙なエスケープを含めて使用する必要があります。
追って通知があるまで一時停止します。

はい、Aaron Toponceのネーミングpthree.org/wp-content/uploads/2009/03/zsh_promptを使用しています。それに加えて、私は何もエスケープする必要はありません、それは提供されたとおりに動作します。
ニコラスドゥマゼット2009年

0

これが私の試みです(NicDumZに基づく):

setopt PROMPT_SUBST
# red, green, yellow, blue, magenta, cyan, white, black
# B (bold), K(background color), F(foreground color)

function doprompt {
# this is just the directory (%d could be %~ -- I prefer full path always)
PROMPT='%F{yellow}${${(%):-%d}//\//%F{magenta\}%B/%b%F{yellow\}}%f'
}

function chpwd() {
    doprompt
}

違いは、色付きのパスを使用しているため、スラッシュが色付けされたらパスの元の色に戻す必要があることです。私の場合、パスは通常黄色であり、スラッシュはマゼンタで色付けされ、その後黄色に戻ります。また、%F%fシーケンスを使用する方が好みです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.