ターミナル上でカーソル移動
こんにちは、CPPXのXです。
ターミナル。使ってますよね。
みんな大好きターミナル上で自由を得るための技を紹介します。
※windowsの cmd、powershellだと動きません・・・
概要
ターミナル上でカーソル移動して、好きな場所に文字を出現させようという記事です。
念のために言っておくと、ここでいうカーソルとは、マウスカーソルではなく入力カーソルです。
キャレットとも呼ばれます。
特に難しいこと無く、誰でも出来るものなので是非。
注意
- 記事中で、^[ のようなものを書きます。
これは、Ctrl+v を押した後にEscを押して出てくる文字を意味します。
ターミナル中だと、^[ の色が変わるので分かりやすいかと思います。 - ^[ は \e と等価です。
こちらを用いても問題無いです。 - echoコマンドは、オプションを付けない場合、出力時に改行を行うため、カーソルが最下部に位置している際に、ページ送りが発生して表示がずれる場合があります。
これを防ぐには、-n オプションを付けます。
-n オプションを付けると、改行をしなくなります。
本稿では付けていません。特に理由は無いです。
カーソルを好きな場所に出現させてみる
さっそくです。
ターミナルの左上に文字を出現させてみましょう。
echo "^[[0;0Haiueo"
文字化けではないです。
^[[ の後の数字で座標を決定します。
行;列 のように指定出来るので、今回は0;0で左上を指定しています。
座標は以下のように左上を(0,0)として、下に行くほど行がプラス、右に行くほど列がプラスされます。
座標指定以外にも、現在地からn行上に行く、n列右に行くとかもあります。
echo "^[[5Aaiueo" echo "^[[5Daiueo"
^[[ 直後の数値でどのくらいずれるかを指定し、Aでn行上に、Bで下、Cで左、Dで右に移動します。
現在地を保存しておく方法もあります。
echo "^[[s^[[3;0Haiueo^[[u"
^[[s で現在地を保存し、^[[u で保存した場所に戻ります。
カーソルの移動に関してはこの辺りにしておきます。
文字色を変える
カーソル移動とはちょっと違うのですが、同じテクニックで文字色を変更する事が出来ます。
echo "^[[31maiueo"
赤色でaiueoと表示されたかと思います。
mを指定すると、文字の出力形式が変わります。
1で太文字、3で斜体等、色以外の変更もあります。
色に関してですが、このままだと30~36までの7色しか使えません。
256色の指定方を紹介しましょう。
echo "^[[38;5;178maiueo"
ピンクっぽい、紫っぽい色が表示されたかと思います。
38;5;の所は固定し、178と指定している箇所で0~255の256色を指定します。
48;5;とやると、文字背景色が変更されます。
色の一覧が見たい場合は、
for i in $(seq 0 255); do echo -n "^[[38;5;${i}m$i "; done
と出力してみましょう。
きっとお望みの色が見つかります。
tput
今回紹介した技術と、とても関連深いコマンドがあります。
tputです。
今回紹介したものは、全てtputに書き換える事が出来ます。
また、逆も然りでtputでやりたい事は ^[ の形に直すことが出来ます。
以下をtputに修正してみます。
echo "^[[1;1Haiueo"
echo "$(tput cup 0 0)aiueo"
tputを使う利点としては、ぐぐりやすさがあります。
「^[[1;1H」と調べても何も出てきませんが、「tput cup 0 0」と調べればヒットします。
^[ の形で書く利点としては、シェルスクリプト以外(pythonとか)からでも、print(“^[[1;1Haiueo”)等やるとカーソル操作が行える事が挙げられます。
両者の利点を生かすにはどうしたらいいでしょう?
答えは簡単です。
tputでぐぐって ^[ で書けばいいのです。
tputを ^[ に変換する方法を紹介しましょう。
tput cup 0 0 | cat -v
^[[1;1Hが表示されたかと思います。
このようにして、tputで行われた操作が何者なのかを表示する事が出来ます。
おわりに
今回は、ターミナルでのカーソル移動、文字形式変更、tputについて紹介しました。
tputを調べると、非常に多くの操作を見つける事が出来ると思います。
これらの操作を使ってより良いターミナルライフが送られる事を願います。
余談
clear | cat -v
としても ^[ 形式で表示出来る事が分かります。