こうする:
$ echo "${(r:COLUMNS::-:)}"
-----------------------------------------------------------------------
# 破線みたいになるのが嫌なら
$ print -P '%U${(r:COLUMNS:: :)}%u'
# 下線付きの空白文字が表示される
仕組みと応用
${(r:<文字数>::<繰り返す文字>:)}
を zsh が評価すると <文字数>
に達するまで <繰り返す文字>
を繰り返すように展開する。最初の例では環境変数 COLUMNS
を使って、現在の端末の横幅分の文字数を繰り返している。
なのでくり返し文字を 2 文字以上にすることも可能:
$ echo "${(r:33::123456789|:)}"
123456789|123456789|123456789|123
$ echo "${(r:COLUMNS::- - - キリトリ - - - >8 :)}"
- - - キリトリ - - - >8 - - - キリトリ - - - >8 - - - キリトリ - - - >8 - - - キリトリ - - - >8
${(r:<文字数>::<埋める文字>::<文字>)}
とすると、<文字>
の右側を <埋める文字>
で <文字数>
まで埋める:
$ echo "${(r:30::*::foo:)}"
foo***************************
右寄せ左埋めをするときは、r
じゃなくて l
を使う:
$ echo "${(l:30::-::foo:)}"
---------------------------foo
:
以外の他の記号でも区切れる:
$ echo "${(l.30..-..foo.)}"
---------------------------foo
$ echo "${(l|30||=|)}"
==============================
寄せる文字を変数展開したい時は:
$ echo "${USERNAME}"
kui
$ echo "${(l:30:)USERNAME}"
kui
$ echo "${(r.30..#.)USERNAME}"
kui###########################
$ echo "${(r.30..#..---.)USERNAME}"
kui---########################
プロンプトにも使える。例えば、水平線を引きつつ右端に exit ステータスを表示するとき:
中央寄せするなら、${#<変数名>}
で文字列の長さが取れるのを利用して:
$ echo $COLUMNS $SHELL ${#SHELL} $(((COLUMNS+${#SHELL})/2))
80 /bin/zsh 8 44
$ echo ${(l.(COLUMNS+${#SHELL})/2.)SHELL}
/bin/zsh
参考
$ man zshmisc
- http://zsh.sourceforge.net/Doc/Release/Expansion.html