エスケープシーケンスで、既存の行、文字を書き換える

TOC

  1. 目的
  2. 方法
  3. カーソルを動かしてみる
  4. 書き換えてみる
  5. これを使って何かできそう
  6. 参考

こんにちはー

Vim は、ターミナル上で動くアプリですが、カーソルの位置を変えて、
既存の行、文字の内容を上書きしたりできます。

こういうのって、どうやるのかなあと調べていたら、
どうやら、エスケープシーケンスというのを使うらしいです。

というわけで、使ってみました。

目的

  • ターミナル上の既存の行、文字を書き換える

方法

  • エスケープシーケンスを使用して、カーソルを動かす

カーソルを動かしてみる

絶対座標でカーソルを変更します。
次のような形です。

1
\e[行;列H

今回は Ruby でやってみたいと思います。

1
2
# 左上から 2行、3列目にカーソルを移動
printf "\e[2;3H"

カーソルが移動されます。

書き換えてみる

この後、文字列を出力すれば、文字が上書きされるわけです。

実際のコードは次のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13

# 画面をクリアしておく
printf "\e[2J"

# 1行目1列に apple と出力
printf "\e[1;1H"
printf "apple"

sleep 1

# 1秒後、再び1行目1列に出力して上書きする
printf "\e[1;0H"
printf "banana"

2016-05-18 21h21_26

1行目1列は、ターミナルの左上なので、
文字がすでにある可能性があります。
そのため、上のコードでは、最初に \e[2J というエスケープシーケンスで、
ターミナルをクリアしておきます。

これを使って何かできそう

2016-05-18 21h22_47

| がある場所で、a キーを押すと、> がはね返るようにしました。
ゲームとかで応用できそうです。

参考

エスケープシーケンスの一覧が載っていて便利です。
今回は絶対座標で変更しましたが、「上にn行」みたいなずらし方の方法もあり、こちらに載っています。