从节点git钩子产生vim

时间:2014-06-01 21:21:21

标签: node.js git vim coffeescript githooks

我有一个纯粹在coffeescript中的项目,用于部署的git钩子也用cs编写。我并不是真的想要脱离语言只是为了使用bash来快速提交消息格式化程序,但是我从commit-msg钩子中产生了一个问题。

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

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

...它可以很好地生成一个可以从父项stdio转出来的vim进程,但是当我在钩子中使用它时出错了。 Vim声明stdio不是来自终端,然后一旦打开打字导致转义字符在整个地方弹出。例如,Backspace将生成^?

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

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

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

Vim实际上在stdin上执行ioctl操作,这些操作因/dev/null句柄而失败。解决方案是使用直接指向键盘的stdin生成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