首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从出发开始?

如何从出发开始?
EN

Stack Overflow用户
提问于 2014-02-02 16:55:48
回答 2查看 3.4K关注 0票数 9

我有一个用Golang编写的命令行工具,我需要从它开始使用vim。然而,它不起作用,也没有任何错误或许多其他可以处理。我已经把代码简化成这样了:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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)
}

但在这种情况下,程序会被无限期地卡住。

知道会有什么问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-02 20:42:02

从调用程序中传递stdinstdout,只要从终端(可能是命令行程序)运行它,将为您启动vim,并在用户编辑完文件后返回控制。

代码语言:javascript
复制
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)
}
票数 22
EN

Stack Overflow用户

发布于 2014-02-02 19:35:24

VIM需要一个合适的终端,并检测一个终端的缺失。

如果您使用StderrPipe并在vim运行时读取它,您将看到以下内容:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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)可以帮你解决以下问题:

代码语言:javascript
复制
tty := term.NewTTY(os.Stdin)

cmd := exec.Command("vim", "test.txt")
cmd.Stdin = t
cmd.Stdout = t

// ...
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21513321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档