LoginSignup
4
3

More than 5 years have passed since last update.

スクリプトの途中でvimを使いたい

Last updated at Posted at 2015-02-17

初投稿です。

したいこと

  • Node.jsの
  • スクリプトの途中で
  • vimで入力できるようにしたい

結論

こう
var spawn = require('child_process').spawn;

var vim = spawn('vim', ['filename'], {
  stdio: [
    process.stdin,
    process.stdout,
    process.stderr,
  ],
});

vim.on('exit', function (code) {
  console.log('exit code: ' + code);
  // 終了したらここにくる
});


以下、過程です。

みちのり

自分用ツールをnodejsで作っていて、
複数行のテキストを入力したくなり、
「gitのコミットメッセージ入力みたいにvim開くとイカスのでは」
という思いでやってみました。

悪い例1
var spawn = require('child_process').spawn;

var vim = spawn('vim');
悪い例1を実行
$ node sample.js
:q   # 何も出ない
:q!  # :qでもだめ
^C$  # しかたなく Ctrl+c

標準出力を出してみます。

悪い例2
var spawn = require('child_process').spawn;

var vim = spawn('vim');

// 出す
vim.stdout.on('data', function (data) {
  console.log(data);
});

// 出す
vim.stderr.on('data', function (data) {
  console.log(data);
});
悪い例2を実行
$ node sample.js
<Buffer 56 69 6d 3a 20 57 61 72 6e 69 6e 67 3a 20 4f 75 74 70 75 74 20 69 73 20 6e 6f 74 20 74 6f 20 61 20 74 65 72 6d 69 6e 61 6c 0a 56 69 6d 3a 20 57 61 72 6e ...>
<Buffer 1b 5b 3f 31 30 34 39 68 1b 5b 3f 31 68 1b 3d>
<Buffer 1b 5b 31 3b 32 34 72 1b 5b 3f 31 32 3b 32 35 68 1b 5b 3f 31 32 6c 1b 5b 3f 32 35 68 1b 5b 32 37 6d 1b 5b 6d 1b 5b 48 1b 5b 32 4a>
<Buffer 1b 5b 3f 32 35 6c 1b 5b 31 3b 31 48 1b 5b 31 6d 1b 5b 33 33 6d 20 20 31 20 1b 5b 6d 0d 0a 1b 5b 31 6d 1b 5b 33 34 6d 7e 20 20 20 20 20 20 20 20 20 20 20 ...>
<Buffer 66 72 65 65 6c 79 20 64 69 73 74 72 69 62 75 74 61 62 6c 65 1b 5b 31 33 3b 32 39 48 53 70 6f 6e 73 6f 72 20 56 69 6d 20 64 65 76 65 6c 6f 70 6d 65 6e 74 ...>

dataはBufferのようです。
(アスキーコード 表 でググったのは秘密)

文字列でだす
  console.log(data.toString());
結果
Vim: Warning: Output is not to a terminal
Vim: Warning: Input is not from a terminal

標準入力・出力を端末とつないでねとのこと。
spawn()の第三引数でストリームを指定して、
on()でexitを待ちます。
以上。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3