Ответ 1
Обновление: Мой ответ был применен в то время, когда он был создан, но для современных версий Node просмотрите этот другой ответ.
Во-первых, ваше использование spawn неверно. Вот документы. http://nodejs.org/docs/latest/api/child_processes.html#child_process.spawn
В вашем примере кода кажется, что вы ожидаете, что vim автоматически всплывет и возьмет на себя терминал, но он не будет. Важно помнить, что даже если вы можете создать процесс, вам нужно убедиться, что данные из процесса перейдут на ваш терминал для отображения.
В этом случае вам нужно взять данные из stdin и отправить его в vim, и вам нужно взять данные, выводимые vim, и установить их на ваш терминал, иначе вы ничего не увидите. Вам также нужно установить tty в необработанный режим, иначе node перехватит некоторые из последовательностей клавиш, поэтому vim не будет корректно вести себя.
Далее, не делайте readFileSync. Если вы столкнулись с ситуацией, когда вы считаете, что вам нужно использовать метод синхронизации, то, скорее всего, вы делаете что-то неправильно.
Вот пример, который я собрал. Я не могу ручаться за то, что он работает в каждом отдельном случае, но он должен охватывать большинство случаев.
var tty = require('tty');
var child_process = require('child_process');
var fs = require('fs');
function spawnVim(file, cb) {
var vim = child_process.spawn( 'vim', [file])
function indata(c) {
vim.stdin.write(c);
}
function outdata(c) {
process.stdout.write(c);
}
process.stdin.resume();
process.stdin.on('data', indata);
vim.stdout.on('data', outdata);
tty.setRawMode(true);
vim.on('exit', function(code) {
tty.setRawMode(false);
process.stdin.pause();
process.stdin.removeListener('data', indata);
vim.stdout.removeListener('data', outdata);
cb(code);
});
}
var filename = '/tmp/somefile.txt';
spawnVim(filename, function(code) {
if (code == 0) {
fs.readFile(filename, function(err, data) {
if (!err) {
console.log(data.toString());
}
});
}
});
Обновление
Я вижу. Я не думаю, что readline совместим со всем этим, как вы хотели бы, к сожалению. Проблема в том, что когда вы создаете интерфейс, node предполагает, что он будет иметь полный контроль над этим потоком с этой точки вперед. Когда мы перенаправляем эти данные в vim, readline все еще обрабатывает нажатия клавиш, но vim также делает то же самое.
Единственный способ, который я вижу, - это вручную отключить все из интерфейса cli
, прежде чем вы начнете vim.
Прежде чем вы начнете процесс, нам нужно закрыть интерфейс и, к сожалению, вручную удалить прослушиватель клавиатуры, потому что, по крайней мере, на данный момент node не удаляет его автоматически.
process.stdin.removeAllListeners 'keypress'
cli.close()
tty.setRawMode true
Затем в обратном вызове "exit" вам нужно будет снова вызвать createInterface.