Node.js 如何在终端中实现表单?

Node.js 如何在终端中实现表单?,node.js,bash,command-line-interface,zsh,Node.js,Bash,Command Line Interface,Zsh,我编写了很多bash/zsh/nodejs脚本,并希望允许一个选项以基于终端的形式交互地指定一些选项 例如,假设我运行这样一个程序: foo -name=test -dir=/tmp -output=tmp/it.txt 我希望能够显示一个表单,该表单将这些选项作为默认值,并且可能在列表中有我可以选择的其他值 是否有一些已经存在的方法可以做到这一点 我想如果我能在一些json中指定这些选项,然后将它们传递给一个在之后启动我的程序,那就太好了 例如,在名为args.json { "pro

我编写了很多bash/zsh/nodejs脚本,并希望允许一个选项以基于终端的形式交互地指定一些选项

例如,假设我运行这样一个程序:

foo -name=test -dir=/tmp -output=tmp/it.txt
我希望能够显示一个表单,该表单将这些选项作为默认值,并且可能在列表中有我可以选择的其他值

是否有一些已经存在的方法可以做到这一点

我想如果我能在一些json中指定这些选项,然后将它们传递给一个在之后启动我的程序,那就太好了

例如,在名为
args.json

{
    "program": "foo",
    "args": {
        "name": "test",
        "dir": "/tmp",
        "output": "tmp/it.txt"
    }
}
我可以跑

form_runner args.json

它会显示一个表单,让我在终端中以交互方式填写表单,通过点击
enter
,它会运行程序。

如果你想在纯nodejs中完成,使用它会很容易

如果您想用bash来实现,或者(需要X)将是一个选项

下面是使用祝福的示例程序。您可以使用
npm安装
节点运行它

var blessed = require('blessed'), fs = require('fs'), child_process = require('child_process');

const TITLE_PROG="program:";

fs.readFile(process.argv[2], function(err,data){
  var js = JSON.parse(data)
  var screen = blessed.screen({
    autoPadding: true,
    smartCSR: true
  });
  var form = blessed.form({
    parent: screen,
    width: 60,
    height: 4,
    keys: true
  });
  blessed.text({
    parent: form,
    fg: 'cyan',
    content: TITLE_PROG
  })
  var prog = blessed.textbox({
    parent: form,
    name:'program',
    inputOnFocus: true,
    value: js['program'],
    left: TITLE_PROG.length + 1
  })
  var texts = Object.keys(js['args']).forEach(function(key,index){
    blessed.text({
      parent: form,
      top: index + 1,
      content: key + ':',
      fg:'green'
    })
    blessed.textbox({
      parent: form,
      inputOnFocus: true,
      name: key,
      value: js['args'][key],
      top: index + 1,
      left: key.length + 2
    })
  })

  form.on('submit', function(data){
    screen.leave();
    var prog = data['program'] 
    delete data['program']
    var cmd = prog + ' ' + Object.keys(data).map(function(key){return '-' + key + ' "' + data[key] + '"'}).join(' ')
    child_process.exec(cmd,function(error,stdout,stderr){
      screen.leave();
      console.log('stdout: ' + stdout)
      console.log('stderr: ' + stderr)
      if(error !== null){
        console.log('error: ' + error)
        process.exit(error.code);
      }
      process.exit(0);
    })
  })
  screen.key(['enter'], function(){
    form.submit();
  });

  screen.key(['escape','C-c'], function(){
    screen.leave();
    process.exit(0);
  });

  prog.focus()

  screen.render();

})

如果您想在纯nodejs中实现这一点,那么使用它将很容易

如果您想用bash来实现,或者(需要X)将是一个选项

下面是使用祝福的示例程序。您可以使用
npm安装
节点运行它

var blessed = require('blessed'), fs = require('fs'), child_process = require('child_process');

const TITLE_PROG="program:";

fs.readFile(process.argv[2], function(err,data){
  var js = JSON.parse(data)
  var screen = blessed.screen({
    autoPadding: true,
    smartCSR: true
  });
  var form = blessed.form({
    parent: screen,
    width: 60,
    height: 4,
    keys: true
  });
  blessed.text({
    parent: form,
    fg: 'cyan',
    content: TITLE_PROG
  })
  var prog = blessed.textbox({
    parent: form,
    name:'program',
    inputOnFocus: true,
    value: js['program'],
    left: TITLE_PROG.length + 1
  })
  var texts = Object.keys(js['args']).forEach(function(key,index){
    blessed.text({
      parent: form,
      top: index + 1,
      content: key + ':',
      fg:'green'
    })
    blessed.textbox({
      parent: form,
      inputOnFocus: true,
      name: key,
      value: js['args'][key],
      top: index + 1,
      left: key.length + 2
    })
  })

  form.on('submit', function(data){
    screen.leave();
    var prog = data['program'] 
    delete data['program']
    var cmd = prog + ' ' + Object.keys(data).map(function(key){return '-' + key + ' "' + data[key] + '"'}).join(' ')
    child_process.exec(cmd,function(error,stdout,stderr){
      screen.leave();
      console.log('stdout: ' + stdout)
      console.log('stderr: ' + stderr)
      if(error !== null){
        console.log('error: ' + error)
        process.exit(error.code);
      }
      process.exit(0);
    })
  })
  screen.key(['enter'], function(){
    form.submit();
  });

  screen.key(['escape','C-c'], function(){
    screen.leave();
    process.exit(0);
  });

  prog.focus()

  screen.render();

})

如果您想在纯nodejs中实现这一点,那么使用它将很容易

如果您想用bash来实现,或者(需要X)将是一个选项

下面是使用祝福的示例程序。您可以使用
npm安装
节点运行它

var blessed = require('blessed'), fs = require('fs'), child_process = require('child_process');

const TITLE_PROG="program:";

fs.readFile(process.argv[2], function(err,data){
  var js = JSON.parse(data)
  var screen = blessed.screen({
    autoPadding: true,
    smartCSR: true
  });
  var form = blessed.form({
    parent: screen,
    width: 60,
    height: 4,
    keys: true
  });
  blessed.text({
    parent: form,
    fg: 'cyan',
    content: TITLE_PROG
  })
  var prog = blessed.textbox({
    parent: form,
    name:'program',
    inputOnFocus: true,
    value: js['program'],
    left: TITLE_PROG.length + 1
  })
  var texts = Object.keys(js['args']).forEach(function(key,index){
    blessed.text({
      parent: form,
      top: index + 1,
      content: key + ':',
      fg:'green'
    })
    blessed.textbox({
      parent: form,
      inputOnFocus: true,
      name: key,
      value: js['args'][key],
      top: index + 1,
      left: key.length + 2
    })
  })

  form.on('submit', function(data){
    screen.leave();
    var prog = data['program'] 
    delete data['program']
    var cmd = prog + ' ' + Object.keys(data).map(function(key){return '-' + key + ' "' + data[key] + '"'}).join(' ')
    child_process.exec(cmd,function(error,stdout,stderr){
      screen.leave();
      console.log('stdout: ' + stdout)
      console.log('stderr: ' + stderr)
      if(error !== null){
        console.log('error: ' + error)
        process.exit(error.code);
      }
      process.exit(0);
    })
  })
  screen.key(['enter'], function(){
    form.submit();
  });

  screen.key(['escape','C-c'], function(){
    screen.leave();
    process.exit(0);
  });

  prog.focus()

  screen.render();

})

如果您想在纯nodejs中实现这一点,那么使用它将很容易

如果您想用bash来实现,或者(需要X)将是一个选项

下面是使用祝福的示例程序。您可以使用
npm安装
节点运行它

var blessed = require('blessed'), fs = require('fs'), child_process = require('child_process');

const TITLE_PROG="program:";

fs.readFile(process.argv[2], function(err,data){
  var js = JSON.parse(data)
  var screen = blessed.screen({
    autoPadding: true,
    smartCSR: true
  });
  var form = blessed.form({
    parent: screen,
    width: 60,
    height: 4,
    keys: true
  });
  blessed.text({
    parent: form,
    fg: 'cyan',
    content: TITLE_PROG
  })
  var prog = blessed.textbox({
    parent: form,
    name:'program',
    inputOnFocus: true,
    value: js['program'],
    left: TITLE_PROG.length + 1
  })
  var texts = Object.keys(js['args']).forEach(function(key,index){
    blessed.text({
      parent: form,
      top: index + 1,
      content: key + ':',
      fg:'green'
    })
    blessed.textbox({
      parent: form,
      inputOnFocus: true,
      name: key,
      value: js['args'][key],
      top: index + 1,
      left: key.length + 2
    })
  })

  form.on('submit', function(data){
    screen.leave();
    var prog = data['program'] 
    delete data['program']
    var cmd = prog + ' ' + Object.keys(data).map(function(key){return '-' + key + ' "' + data[key] + '"'}).join(' ')
    child_process.exec(cmd,function(error,stdout,stderr){
      screen.leave();
      console.log('stdout: ' + stdout)
      console.log('stderr: ' + stderr)
      if(error !== null){
        console.log('error: ' + error)
        process.exit(error.code);
      }
      process.exit(0);
    })
  })
  screen.key(['enter'], function(){
    form.submit();
  });

  screen.key(['escape','C-c'], function(){
    screen.leave();
    process.exit(0);
  });

  prog.focus()

  screen.render();

})

你试过吗?为什么不写一个呢?我想不会花太长时间的。你看过吗?@ymonad-brized看起来是目前为止最好的选择。。。非常感谢!你应该加上这个作为答案!你试过吗?为什么不写一个呢?我想不会花太长时间的。你看过吗?@ymonad-brized看起来是目前为止最好的选择。。。非常感谢!你应该加上这个作为答案!你试过吗?为什么不写一个呢?我想不会花太长时间的。你看过吗?@ymonad-brized看起来是目前为止最好的选择。。。非常感谢!你应该加上这个作为答案!你试过吗?为什么不写一个呢?我想不会花太长时间的。你看过吗?@ymonad-brized看起来是目前为止最好的选择。。。非常感谢!你应该加上这个作为答案!太好了!非常感谢你的努力,因为这石头!太好了!非常感谢你的努力,因为这石头!太好了!非常感谢你的努力,因为这石头!太好了!非常感谢你的努力,因为这石头!