登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-23 09:03:35 324浏览 收藏

golang学习网今天将给大家带来《Vim 忘记了当作为子进程调用时如何使用左箭头键。怎么修?》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

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

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

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

我已经设置了 stderr 和 stdout,但没有意识到还有必要设置 stdin。 here 给出了一些解释原因的详细信息。

今天关于《Vim 忘记了当作为子进程调用时如何使用左箭头键。怎么修?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>