node.js - 如何从 node.js 打开终端应用程序?

标签 node.js vim terminal coffeescript readline

我希望能够从运行在终端的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() 行,那么 TTY 在 Vim 中是可以的,但是我卡在插入模式,并且 Esc 键没有不行。如果我点击 Ctrl-C 它会退出子进程和父进程。

最佳答案

你可以从主进程继承stdio。

const child_process = require('child_process')
var editor = process.env.EDITOR || 'vi';

var child = child_process.spawn(editor, ['/tmp/somefile.txt'], {
    stdio: 'inherit'
});

child.on('exit', function (e, code) {
    console.log("finished");
});

更多选项:http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

关于node.js - 如何从 node.js 打开终端应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9122282/

相关文章:

javascript - 运行 js discord bot 时出错

javascript - 如何获取从 Node 服务器到 AngularJS Controller 的请求路径变量值

使用拼写关键字自动完成时vim卡住

java - 使用 Java 向 Docker 容器发送 'exec' 命令

iphone - 有没有办法使用命令行创建新的 XCode 项目?

linux - 当我在 Linux 终端中执行 "Recipe for target ' 时,“"make xconfig"gconfig'失败”是什么意思?

php - 如何通过 lambda 脚本将 JSON 数据发布到另一台服务器

node.js - 如何从本地主机向我的 docker 容器发送 HTTP 请求?

view - Vim 在文件夹查看模式下更改配置

vim - vim中的紫色线条