LoginSignup
14
14

More than 5 years have passed since last update.

水平線を引く

Last updated at Posted at 2015-01-15

こうする:

$ 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 ステータスを表示するとき:

Screenshot from 2015-01-15 12:28:58.png

中央寄せするなら、${#<変数名>} で文字列の長さが取れるのを利用して:

$ echo $COLUMNS $SHELL ${#SHELL} $(((COLUMNS+${#SHELL})/2))
80 /bin/zsh 8 44
$ echo ${(l.(COLUMNS+${#SHELL})/2.)SHELL}
                                    /bin/zsh

参考

14
14
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
14
14