当前位置: 首页 > 面试题库 >

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

汤枫涟
2023-03-14
问题内容

我希望能够Vim从终端中运行的node.js程序打开,创建一些内容,保存并退出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混乱了。我可以编辑并保存文件,并且内容正确打印。出口处也有一堆垃圾打印到终端,并且随后读取行功能被破坏(没有向上/向下箭头,没有制表符完成)。

如果取消注释该cli.pause()行,则在Vim中TTY可以,但是我处于插入模式,并且该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



 类似资料:
  • 要从终端编辑文件,我使用 subl(用于Sublime的文本)来编辑文件;示例:如果我需要编辑应用程序.js文件,我使用 subl 应用程序.js有什么方法可以设置网络Storm以从终端打开吗?

  • 问题内容: 我想从我的node.js应用程序ping服务器。 那可行吗? 谢谢 问题答案: 您可以用来调用系统ping命令

  • 问题内容: 有什么办法可以使可执行文件.jar双击后打开命令行? 我正在制作一个基于文本的冒险游戏。截至目前,它只是带有房间的迷宫。最终它将变得更大,更深入,但是现在我只想了解基本结构。无论如何,要完成这项工作,我一直在从System.out.printf命令和java.util.Scanner获取输出和输入。到目前为止,所有功能都运行良好,但是当我尝试将其发送给不知道如何或者不想从命令行运行程序

  • 问题内容: 我正在为Android开发一个应用程序,我不需要我的应用程序将日历作为其中的一部分(加上它会破坏目的),我的应用程序允许用户收听广播,并且需要选择设置事件到(记住在特定时间收听广播),如果应用程序具有自己的日历,则事件警报仅在用户打开应用程序时才会响起……毫无意义。我一直在寻找但找不到,有没有办法使用意图或其他方式打开Goog​​le日历或Android可能具有的其他日历?我需要将我的

  • 如何在Visual中打开执行shell命令的终端

  • 我想通过运行以下命令从Mac OSX终端运行/打开Visual Studio代码。我在这里找到了说明: https://code.visualstudio.com/docs/setup 显然我需要在我的文件中包含这一点,所以我做了,但没有用。 我在此处编辑了文件: