【发布时间】:2012-02-25 16:40:46
【问题描述】:
我希望能够从运行在终端的node.js程序打开Vim,创建一些内容,保存退出Vim,然后抓取文件的内容。
我正在尝试做这样的事情:
filename = '/tmp/tmpfile-' + process.pid
editor = process.env['EDITOR'] ? 'vi'
spawn editor, [filename], (err, stdout, stderr) ->
text = fs.readFileSync filename
console.log text
但是,当它运行时,它只是挂起终端。
我也用exec 尝试过,得到了同样的结果。
更新:
由于这个过程是从在readline 运行的提示符下键入的命令启动的,因此这很复杂。我将最新版本的相关部分完全提取到一个文件中。这是它的全部内容:
{spawn} = require 'child_process'
fs = require 'fs'
tty = require 'tty'
rl = require 'readline'
cli = rl.createInterface process.stdin, process.stdout, null
cli.prompt()
filename = '/tmp/tmpfile-' + process.pid
proc = spawn 'vim', [filename]
#cli.pause()
process.stdin.resume()
indata = (c) ->
proc.stdin.write c
process.stdin.on 'data', indata
proc.stdout.on 'data', (c) ->
process.stdout.write c
proc.on 'exit', () ->
tty.setRawMode false
process.stdin.removeListener 'data', indata
# Grab content from the temporary file and display it
text = fs.readFile filename, (err, data) ->
throw err if err?
console.log data.toString()
# Try to resume readline prompt
cli.prompt()
它的工作方式如上所示,它会显示几秒钟的提示,然后启动到 Vim,但 TTY 被搞砸了。我可以编辑和保存文件,并且内容打印正确。退出时终端也打印了一堆垃圾,之后 Readline 功能被破坏(没有向上/向下箭头,没有 Tab 补全)。
如果我取消注释 cli.pause() 行,那么在 Vim 中 TTY 是正常的,但我卡在插入模式,Esc 键不起作用。如果我点击Ctrl-C,它将退出子进程和父进程。
【问题讨论】:
-
你能解释一下这个用例吗?你是想通过运行 Vim 命令来与 Vim 交互,还是只是将文件写入磁盘?
-
是否有意要求用户使用编辑器来创建内容?或者您打算完全从
node.js内部驱动vim? -
您可以尝试打开/关闭原始模式吗? nodejs.org/docs/latest/api/tty.html#tty.setRawMode
-
我似乎使用了错误的工具来完成这项工作:-) 这将是
bash中的一行。不过,将应用程序的其余部分放在 node.js 中,它工作得很好,而且我可以更轻松地在服务器 API 和这个客户端代码之间移动代码。我想这是一次很好的学习经历。 -
是的,在 node 中做这件事看起来确实很奇怪,但是弄清楚如何去做是很有趣的。我会看看能不能在一个小时内解决你的 readline 问题。
标签: node.js vim terminal coffeescript readline