Hello Wor.log

IT系大学生4人による備忘録のようなもの

ターミナル上でカーソル移動

こんにちは、CPPXのXです。

ターミナル。使ってますよね。
みんな大好きターミナル上で自由を得るための技を紹介します。

windowsの cmd、powershellだと動きません・・・

概要

ターミナル上でカーソル移動して、好きな場所に文字を出現させようという記事です。

念のために言っておくと、ここでいうカーソルとは、マウスカーソルではなく入力カーソルです。
キャレットとも呼ばれます。

特に難しいこと無く、誰でも出来るものなので是非。

注意

  • 記事中で、^[ のようなものを書きます。
    これは、Ctrl+v を押した後にEscを押して出てくる文字を意味します。
    ターミナル中だと、^[ の色が変わるので分かりやすいかと思います。
  • ^[ は \e と等価です。
    こちらを用いても問題無いです。
  • echoコマンドは、オプションを付けない場合、出力時に改行を行うため、カーソルが最下部に位置している際に、ページ送りが発生して表示がずれる場合があります。
    これを防ぐには、-n オプションを付けます。
    -n オプションを付けると、改行をしなくなります。
    本稿では付けていません。特に理由は無いです。

カーソルを好きな場所に出現させてみる

さっそくです。

ターミナルの左上に文字を出現させてみましょう。

echo "^[[0;0Haiueo"

文字化けではないです。
^[[ の後の数字で座標を決定します。
行;列 のように指定出来るので、今回は0;0で左上を指定しています。

座標は以下のように左上を(0,0)として、下に行くほど行がプラス、右に行くほど列がプラスされます。

f:id:cppx:20170619230048p:plain

座標指定以外にも、現在地から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

としても ^[ 形式で表示出来る事が分かります。