【问题标题】:Spawning vim from a node git hook从节点 git 钩子生成 vim
【发布时间】:2014-06-01 21:21:21
【问题描述】:

我有一个纯粹用咖啡脚本编写的项目,用于部署的 git 钩子也是用 cs 编写的。我真的不想脱离这种语言,只是为了使用 bash 来快速提交消息格式化程序,但是我在从 commit-msg 钩子中生成 vim 时遇到了问题。

我已经看到here 在管道到 vim 时,stdio 不一定正确设置为 tty 流。我知道这可能会导致问题,但我不完全知道如何使用 nodes spawn 命令让 vim 正确加载。目前我...

vim = (require 'child_process').spawn('vim', [file], stdio: 'inherit')
vim.on 'exit', (err) ->
  console.log "Exited! [#{err}]"
  cb?()

...它可以很好地生成一个可以从父 stdio 读/写的 vim 进程,但是当我在钩子中使用它时,事情就出错了。 Vim 声明 stdio 不是来自终端,然后一旦打开输入就会导致转义字符到处弹出。例如,退格会产生^?

任何帮助将不胜感激!

【问题讨论】:

    标签: node.js git vim coffeescript githooks


    【解决方案1】:

    经过一些实验,得到了这个工作。

    当运行 git hooks 时,git 会挂起正常的 stdin 句柄。我只能假设这是由于大多数钩子都具有标准输入传递的参数,但无论哪种方式,这意味着当我调用 vim 并要求它从我们的父进程 stdio 继承时,vim 收到/dev/null 作为标准输入流。

    Vim 实际上在标准输入上执行 ioctl 操作,这些操作失败并带有 /dev/null 句柄。解决方案是使用直接指向键盘的标准输入生成 vim,或 /dev/tty。这允许正确的 vim 交互,并且可以直接从 githook 运行。

    完整的解决方案是here,但总结起来......

    ttyFd   = fs.openSync '/dev/tty', 'r'
    
    spawnVim = (file, cb) ->
      vim = (require 'child_process').spawn('vim', [file], customFds: [ttyFd,1,2])
      vim.on 'exit', cb
    

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 1970-01-01
      • 2017-11-10
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      相关资源
      最近更新 更多