当作为子过程调用时,Vim忘记了如何使用左箭头键。怎么修?

时间:2018-08-27 20:57:49

标签: git go vim git-commit

我最近写了一些golang代码,它将“ git commit”作为子进程运行。 Git依次将vim作为子进程调用,以便我可以编辑提交消息。但是,我发现以这种方式执行vim时,退格键无法按预期工作。提交后,终端输出将被破坏,就像某个组件对每行的列数有很多跟踪一样。后一种行为已通过reset命令修复。

输出中出现一个非常有趣的线索:

Vim: Warning: Input is not from a terminal

因此,似乎终端信息没有传播到子进程。

当我直接使用vim或直接在命令行上运行git commit时,我没有这些问题。您对我如何解决和解决此问题有任何想法吗?

我在Mac上使用的是vim 8.1:

VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug  9 2018 16:08:01)
macOS version
Included patches: 1-235
Compiled by Homebrew
Huge version with MacVim GUI.  Features included (+) or not (-)...

我的golang程序未修改exec.Cmd对象的Cmd.Env变量。当我通过exec.Command(“ which”,“ vim”)在golang中运行“哪个vim”时,我能够确认与命令行相同的位置。但是,我意识到git commit不一定会为vim找到相同的位置。

我的.gitconfig包含:

[core]
editor = vim

但是我看不到其他任何东西显然会改变编辑器的行为。

1 个答案:

答案 0 :(得分:0)

解决方案是明确设置cmd.Stdin:

cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
cmd.Stdin  = os.Stdin

我已经设置了stderr和stdout,但是没有意识到也必须设置stdin。 here给出了解释为什么会出现这种情况的一些详细信息。