やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

ターミナルの画面を装飾したい(ANSI Escape Code)

 ANSI Escape Codeを使う。

成果物

情報源

概要

 bashechoをつかい\e[mなどの特殊文字ANSI Escape Codeをつかって装飾する。

echo -e "\e[1m太字強調\e[m"

 太字強調のほかにも装飾できる。詳しくはANSI Escape Code参照。

 太字強調する。方法はつぎの3通りある。

  • echo
  • printf
  • tput
echo -e "\e[1m太字強調\e[m"
printf '\033[1m%s\033[m\n' '太字強調'
tput bold && echo "太字強調" && tput sgr0

echo

echo -e "\e[1mここを太字強調する\e[m"

 末尾の改行をなくすには-nオプションをつかう。

echo -en "\e[1mここを太字強調する\e[m"

printf

printf '\033[1m%s\033[m\n' 'ここを太字強調する'

 末尾の改行をなくすには\nを消す。

printf '\033[1m%s\033[m' 'ここを太字強調する'

tput

tput bold && echo "ここを太字強調する" && tput sgr0

 末尾の改行をなくすには-nオプションをつかう。

tput bold && echo -n "ここを太字強調する" && tput sgr0

所感

 可読性が悪い。装飾する位置にANSI Escape Codeを入れるせい。改行もあるから段組みした装飾はとてつもなく大変になるだろう。

 テキスト、装飾、枠をそれぞれ別々に定義できたらよかったのに。指定した枠に、指定したテキストや装飾をあとから指定したかった。

 たとえば以下のように。開始位置2行目8列目。幅10高さ20字。その位置に「装飾する文字列」というテキストを出力する。装飾は太字&ブリンク&文字色=赤。

make_frame SOME_FRAME 2 8 10 20
show_frame SOME_FRAME --text '装飾する文字列' --decoration bold blink --font-color red

 枠はなくとも、せめて装飾だけは簡単にやりたい。\e[mのような終了コードなんて書きたくない。しかも太字やアンダーラインなど装飾の種類によって専用の終了コードまであるとか……。

 つぎのように簡単に装飾したかった。

decoration '装飾する文字列' bold italic blink underline fg=red bg=green newline

 末尾に改行コードをつけるか否かについては配慮したほうがよさそうなのでnewlineの有無で判定する。あるいは以下のようにしてもよいか。

deco '改行しない' bold italic blink underline fg=red bg=green 
decon '改行する' bold italic blink underline fg=red bg=green 

対象環境

$ uname -a
Linux raspberrypi 5.4.83-v7l+ #1379 SMP Mon Dec 14 13:11:54 GMT 2020 armv7l GNU/Linux