怎么从去开始vim?

lau*_*ent 7 macos vim system process go

我有一个用Golang编写的命令行工具,我需要从它启动vim.然而,它不起作用,并没有任何错误或其他许多工作.我已经将代码简化为:

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd := exec.Command("vim", "test.txt")
    err := cmd.Run()
    fmt.Println(err)
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我可以看到vim进程2-3秒,但应用程序实际上没有打开.然后程序简单退出(并且vim进程关闭),退出状态为1.

我也尝试过捕获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)
}
Run Code Online (Sandbox Code Playgroud)

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

知道可能是什么问题吗?

Nic*_*ood 16

传入stdinstdout传出调用程序,只要它从终端(可能是命令行程序)运行,它将为您启动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)
}
Run Code Online (Sandbox Code Playgroud)


nem*_*emo 7

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
Run Code Online (Sandbox Code Playgroud)

执行(正在播放)时读取stderr的示例:

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()
Run Code Online (Sandbox Code Playgroud)

要让vim运行,您可能需要模拟终端.

也许山羊(doc)可以帮助你:

tty := term.NewTTY(os.Stdin)

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

// ...
Run Code Online (Sandbox Code Playgroud)