我想能够从运行在终端的node.js程序中打开Vim
,创建一些内容,保存并退出Vim
,然后抓取文件的内容。如何从node.js打开终端应用程序?
我试图做这样的事情:
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()
行,那么TTY在Vim中是OK的,但我卡在插入模式下,并且Esc
键不起作用。如果我点击Ctrl-C
,它将退出子进程和父进程。
你能摆脱对使用情况下,一些轻?你想通过运行它的命令与Vim进行交互还是只需要将文件写入磁盘? – 2012-02-03 00:55:47
是否打算要求用户使用编辑器来创建内容?还是你打算从'node.js'内完全驱动'vim'? – sarnold 2012-02-03 00:59:15
我希望能够打开'vim',以便我可以创建内容,并在完成后退出,并让节点获取临时文件的内容,然后将该文件作为来自节点的HTTP请求的一部分发送。 – mkopala 2012-02-03 01:11:48