git - Vim 在作为子进程调用时忘记了如何使用左箭头键。怎么修?
问题描述
我最近编写了一些将“git commit”作为子进程运行的 golang 代码。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 中运行“which vim”时,我能够确认与命令行上相同的位置。但是,我意识到 git commit 不一定会为 vim 找到相同的位置。
我的 .gitconfig 包含:
[core]
editor = vim
但我没有看到任何其他看起来明显会改变编辑器行为的东西。
解决方案
解决方案是明确设置 cmd.Stdin:
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
我已经设置了标准错误和标准输出,但没有意识到有必要设置标准输入。这里给出了一些解释为什么会这样的细节。
推荐阅读
- python - 将 PIP_EXTRA_INDEX_URL 传递给 docker build
- ruby - 将特定 URL 添加到 BASE PATH 以使用 Nokogiri 抓取网页
- javascript - 不懂 javascript 的元音计数代码?
- visual-studio - Visual Studio 中的“发布”如何工作?
- ruby-on-rails - Rails 更改长 if/else 语句
- sql - 在一个 SQL 查询中选择最大值和最小值
- css - 移除 Primefaces 组件的左侧填充
- powershell - 如何在 ScriptBlock 中传递 $_ ($PSItem)
- javascript - 获得第一次总计很好,但更改折扣或数量时会给出不正确的结果
- php - 如何修复 PHP 中的“无法打开流:打开文件过多错误”