我有一个用Golang编写的命令行工具,我需要从它开始使用vim。然而,它不起作用,也没有任何错误或许多其他可以处理。我已经把代码简化成这样了:
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("vim", "test.txt")
err := cmd.Run()
fmt.Println(err)
}当我运行这个程序时,我可以在2-3秒内看到vim进程,但是应用程序实际上并没有打开。然后,程序以“退出状态1”退出( vim进程关闭)。
我也尝试过这样来捕获stderr:
package main
import (
"bytes"
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("vim", "test.txt")
var stderr bytes.Buffer
cmd.Stderr = &stderr
err := cmd.Run()
fmt.Println(err)
fmt.Println(stderr)
}但在这种情况下,程序会被无限期地卡住。
知道会有什么问题吗?
发布于 2014-02-02 20:42:02
从调用程序中传递stdin和stdout,只要从终端(可能是命令行程序)运行它,将为您启动vim,并在用户编辑完文件后返回控制。
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
cmd := exec.Command("vim", "test.txt")
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
err := cmd.Run()
fmt.Println(err)
}发布于 2014-02-02 19:35:24
VIM需要一个合适的终端,并检测一个终端的缺失。
如果您使用StderrPipe并在vim运行时读取它,您将看到以下内容:
2014/02/02 20:25:49 Vim: Warning: Output is not to a terminal
2014/02/02 20:25:49 Vim: Warning: Input is not from a terminal在执行时读取stderr的示例(on play):
func logger(pipe io.ReadCloser) {
reader := bufio.NewReader(pipe)
for {
output, err := reader.ReadString('\n')
if err != nil {
log.Println(err)
return
}
log.Print(string(output))
}
}
pipe, err := cmd.StderrPipe()
go logger(pipe)
cmd.Run()要运行vim,您可能需要模仿终端。
也许goat (doc)可以帮你解决以下问题:
tty := term.NewTTY(os.Stdin)
cmd := exec.Command("vim", "test.txt")
cmd.Stdin = t
cmd.Stdout = t
// ...https://stackoverflow.com/questions/21513321
复制相似问题