ryota2357

zshプロンプトをカスタマイズする

投稿日:

tag icon svg Zsh

プラグインを入れずにカスタマイズをする。

基本

まず、プロンプトのカスタマイズは .zshrc などで PROMPT などに値を代入することで行える。

試しに、

# .zshrc
PROMPT="$"

とすると、

$のみ

のようになり、またさらに以下のようにすると、

# .zshrc
PROMPT="$"
RPROMPT="///"

$と///

となる(左に /// が追加された)。

僕のプロンプト

僕はできる限りシンプルにしたかったので、以下のような見た目になっている。
(普段はこれに tmux を起動して、その他の情報を載せてたりする)

スクリーンショット 2022-04-03 18.03.57.png

これの設定ファイルは下に折りたたんだ。この説明は最後で行う。

設定ファイル
left-prompt() {
  local dir="%F{11}%~%f"
  local next="%F{47}❯%f "
  echo -e "\n${user}${dir}\n${next}"
}
right-prompt() {
  local time="%F{242}%T%f"
  echo "${time}"
}

PROMPT=`left-prompt`
RPROMPT=`right-prompt`

unset -f left-prompt
unset -f right-prompt

情報の追加

現在のディレクトリと時間を表示するためには %~%T を用いると表示できる。

例えば、

PROMPT="%~ > "
RPROMPT="%T"

とすると、

スクリーンショット 2022-04-03 18.04.19.png

のようになる。

下の表はhttps://tegetegekibaru.blogspot.com/2012/08/zsh_2.htmlより、そのままコピペさせていただいた。上の例のようにパラメータを PROMPT などに渡せば良い。

パラメータ出力内容
%Mホスト名localhost.localdomain
%mホスト名localhost
%nユーザ名root
%#ユーザ種別#(root の場合) %(root 以外)
%yログイン端末名pts/0
%lログイン端末名pst/0(tty*の場合は tty を省略)
%?直前のコマンドの戻り値0
%h %!コマンド実行数 (history 数)1
%d %/カレントディレクトリ/root/currentdir
%~カレントディレクトリ~/currentdir
%Cカレントディレクトリcurrentdir
%c %.カレントディレクトリcurrentdir ($PWD=$HOME の場合は~)
%D日付12-07-31 (yy-mm-dd)
%W日付07/31/12 (mm/dd/yy)
%w日付Sun 31 (day dd)
%*時間15:50:30 (hh:mm:ss)
%T時間15:50 (hh:mm)
%t %@時間03:50PM (hh:mm(am/pm format))

装飾

ただの白文字ではつまらないので装飾したい。

%F{色番号}色をつける内容%f

とすると色がつけられる。 つまり %F%fで 囲われたところに色がつく。色はターミナルの 256 色(0~255)で指定する。

例えば、

PROMPT="%F{45}%~%f > "

とすると、

color

色番号の一覧は次の ruby スクリプトを実行することで見ることができる。(このスクリプトは数年前にどっかで拾った)

# -*- coding: utf-8 -*-

@fg = "\x1b[38;5;"
@bg = "\x1b[48;5;"
@rs = "\x1b[0m"

def color(code)
  number = '%3d' % code
  "#{@bg}#{code}m #{number}#{@rs}#{@fg}#{code}m #{number}#{@rs} "
end

256.times do |n|
  print color(n)
  print "\n" if (n + 1).modulo(8).zero?
end
print "\n"

256color-list

太文字

%B%b で囲う。

太文字

下線

%U%u で囲う。

下線

背景色

%S%F%f%s で囲う。(%S%s をつける)

背景

わかりやすく設定する

エスケープ文字を使って PROMPT を設定するの読みにくい。
変数や関数を用いてわかりやすくすると良いと思う。

僕の設定を再掲する。

僕の

local をつけると変数のスコープを制限できるので zsh が汚れず良い。
left-prompt()right-prompt() の関数を用いることで PROMPT, RPROMPT の意味がわかりやすくなる。
関数の返り値の扱いは echo`function` を使ってる人がいたので真似した(あってるの?)

left-prompt() {
  local dir="%F{11}%~%f"
  local next="%F{47}❯%f "
  echo -e "\n${user}${dir}\n${next}"
}
right-prompt() {
  local time="%F{242}%T%f"
  echo "${time}"
}

PROMPT=`left-prompt`
RPROMPT=`right-prompt`

unset -f left-prompt
unset -f right-prompt

関数の宣言もスクリプトローカルにしたかったのだけど、やり方がわからなかった。
ひとまず最後に unset するとこで同じ結果は得られるのでそうした。

参考