経緯
すでにコマンド・ラインから彩色した文字を標示する方法を以下のサイトで説明しました;
その後、私は幾つかのスクリプトを作っていて、この「彩色するecho関数群」を楽しんでいます;
そこで、「彩色するecho関数群」を2つの事例に応用出来たので紹介します;
- Here-Documents: a standard shell feature.
- printf: shell built-in command.
実例
何はともあれ、テストしたスクリプトのターミナル出力を示します。スクリプトを後に紹介します。
|
Figure 1. Coloring outputs in “here-documents” & “printf” |
スクリプトの簡単な説明
I “here-documents”
・彩色する部分を彩色するecho関数に引数として渡し、
・更に、コマンド・サブスティチューション; $(…);に挿入した。
# EXAMPLE Ia "abc def ghi"
# | ***
# ⇣
# EXAMPLE Ib "abc $( bc_ 'def'' ) ghi」
# ---------***--
II “printf”
この問題を解くのに、下記の資料が参考になりました。この本の「promptsに関する説明」では、 zsh Form「%1~」に彩色するエスケープ・シーケンスを添付しています;
・From Bash to Z Shell”, p149.
そこで「printf format」でも、フォーマット記述子にエスケープ・シーケンスを添付しようと考えました。下の例では、フォーマット記述子「%3d」に操作するとします;
- 彩色のエスケープ・シーケンスは記述子「%3d」の前後に配置されます
- \e[36;1m: 彩色する開始シークエンス
- \e[m: 彩色の停止シークエンス
# EXAMPLE IIa "%2d %3d %s"
# | ***
# ⇣
# EXAMPLE IIb "%2d \e[36;1m%3d\e[m %s"
# | --------***----
# ⇣
# EXAMPLE IIc "%2d $bc_%3d$fin %s"
# ----***----
スクリプト
スクリプトを示します。彩色するecho関数群のうちで、必要なものは先頭に直接書いておきました。従ってこのスクリプトでの単独テストをできます。
#!/bin/zsh
# t.colors: shows Coloring outputs for here-documents and printf.
# Usage: t.colors⏎
# A paort of Coloring Echoes --------------------
btg(){echo -n "\e[1;38;42m${@}\e[m"}
b_y(){echo -n "\e[1;7;33m${@}\e[m"}
br_(){echo -n "\e[31;1m${@}\e[m"}
bg_(){echo -n "\e[32;1m${@}\e[m"}
bc_(){echo -n "\e[36;1m${@}\e[m"}
by_(){echo -n "\e[33;1m${@}\e[m"}
bt_(){echo -n "\e[38;1m${@}\e[m"}
b_w(){echo -n "\e[1;7;37m${@}\e[m"}
et_(){echo -n "\e[38m${@}\e[m"}
e_n(){echo "\e[38m${@}\e[m"}
#---------------------------- main --------------------------
prg_name=${0##*/}
fluits=( orange kiwi )
unit_prices=( 200 60 )
cat <<-EOF_example_Ia
========================================================================
EXAMPLE Ia of here-documents.
(1) Here is an $fluits[1].
(2) There is a $fluits[2].
...
EOF_example_Ia
cat <<-EOF_example_Ib
========================================================================
$(btg ' EXAMPLE Ib ') for $(b_w ' here-documents ').
$(b_y '(1)') Here is an $(br_ $fluits[1]).
$(b_y '(2)') There is a $(bg_ $fluits[2]).
...
EOF_example_Ib
echo '========================================================================'
echo " EXAMPLE IIa for printf."
echo " # @price fluit"
echo ' ---------------------'
for j in {1..2}; do
# *** ****
printf " %d %3d %-8s\n"\
$j $((unit_prices[$j])) " $fluits[$j] "
done
echo '\n'
echo '========================================================================'
et_ ' ';btg ' EXAMPLE IIb ';et_ ' for ';b_w ' printf ';e_n '.'
echo " # @price fluit"
echo ' ---------------------'
for j in {1..2}; do
# --------***---- ----------****-----
printf " %d \e[36;1m%3d\e[m \e[1;7;33m%-8s\e[0m\n"\
$j $((unit_prices[$j])) " $fluits[$j]"
done
echo '\n'
bc_='\e[36;1m'; fin='\e[m'; b_y='\e[1;7;33m'
echo '========================================================================'
et_ ' ';btg ' EXAMPLE IIc ';et_ ' for ';b_w ' printf ';\
et_ ' using ';b_w ' short-cut ';e_n '.'
echo " # @price fluit"
echo ' ---------------------'
for j in {1..2}; do
# ----***---- ----****----
printf " %d $bc_%3d$fin $b_y%-8s$fin\n"\
$j $((unit_prices[$j])) " $fluits[$j]"
done
echo '\n'
echo '========================================================================'
感想
「EXAMPLE IIc」で、変数;$bc_,;が導入された。このスペルは同じ色を表現するecho関数と同じスペルに設定できた。そこで「coloring short-cut variables」を先に定義して、逆に「coloring echo functions」を定義したいと思います。
・bc_=‘\e[36;1m’; fin=‘\e[m’
・bc_(){echo -n “$bc_${@}$fin”}
今回までで、zshの彩色環境は整った。今後は補完スクリプトの整備がしたいです。
____
この記事の履歴
- 開始 2015-06-02(火) 21:12:46
- 追加 2015-06-03(水) 13:23:38 感想: coloring short-cut variables