Panda Noir

JavaScript の限界を究めるブログです。

Node.jsでVimライクなエディタをつくる

qiita.com

この記事に触発されて、ついでにNodeでコマンドラインツール作ってみたかったので始めてみました。名称はズバリ「JEdit」。

今回の記事では、実装していておもしろかったところを取り上げていこうと思います。

画面クリア

ターミナル上での画面クリアには、制御文字という特殊な文字を使います。制御文字というのは、「端末上の文字を削除する」といった、制御を行う文字のことです。

触発元の記事では "\e[2J\e[1;1H"を使っていますが、これだと端末上に残ってしまい、スクロールすると見えてしまいます。

f:id:panda_noir:20170124131630p:plain

↑こんな感じです。だから、けっこうごり押しですが、

  1. 1行目の1列目へ移動 ("\x1b[1;1H")
  2. その行をクリア ("\x1b[K")
  3. 次の行の1列目へ移動 ("\x1b[2;1H")
  4. 以下繰り返す

という手法をとりました(触発元の記事では\eをプレフィクスとしていますが、動かなかったので\x1bを使用しています)。

背景色と文字色

制御文字を使用すると、文字色も変更することができます。やり方は簡単で

process.stdout.write('\x1b[40m'); // background color
process.stdout.write('\x1b[37m'); // text color

このように標準出力へ書き込むだけです。この例では背景色を黒、文字色を白に設定してあります。ほかにも設定できる色は様々あります。

キー入力を受け取る

なんと、ターミナル上でキー入力を受け取ることができます。まあ、Vimなどを知っていればおどろくべきことでもありませんが。

qiita.com

ここを参考にしました。今回endイベントは使わなかったので、「process.stdinのイベントを監視する」の項目のコードで受け取りました。

始めてみた感想

まだ200行ちょっとしか書いていませんが、それでもファイルを読み込み、表示し、hjklで移動でき、必要に応じて画面がスクロールするところまでできました。なかなか感動ものです。

ただ、Vimライクってだけではつまらないので、「縦書きエディタ」にしようと考えています。ちょろっとコードを書き換えるだけなので簡単そうです。