我有一个纯粹在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将生成^?
。
任何帮助将不胜感激!
答案 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