尝试从Go程序中启动外部编辑器

时间:2012-08-23 08:57:16

标签: linux editor go

我试图弄清楚如何从Go程序中启动外部编辑器,等待用户关闭编辑器,然后继续执行程序。基于this SO回答,我目前有这段代码:

package main

import (
    "log"
    "os"
    "os/exec"
)

func main() {
    fpath := os.TempDir() + "/thetemporaryfile.txt"
    f, err := os.Create(fpath)
    if err != nil {
        log.Printf("1")
        log.Fatal(err)
    }
    f.Close()

    cmd := exec.Command("vim", fpath)
    err = cmd.Start()
    if err != nil {
        log.Printf("2")
        log.Fatal(err)
    }
    err = cmd.Wait()
    if err != nil {
        log.Printf("Error while editing. Error: %v\n", err)
    } else {
        log.Printf("Successfully edited.")
    }

}

当我运行程序时,我明白了:

chris@DPC3:~/code/go/src/launcheditor$ go run launcheditor.go 
2012/08/23 10:50:37 Error while editing. Error: exit status 1
chris@DPC3:~/code/go/src/launcheditor$ 

我也尝试使用exec.Run()代替exec.Start(),但这似乎也不起作用(虽然它不会在同一个地方失败)。

如果我使用Gvim而不是Vim,我可以使用它,但它拒绝使用Vim和nano。我认为这与终端模拟器内运行的Vim和​​nano有关,而不是创建一个外部窗口。

3 个答案:

答案 0 :(得分:11)

显然,您必须将Stdin对象上的StdoutStderrCmd设置为os.Std(in|out|err)。像这样(假设对象被称为cmd):

cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr

解决这个问题的好处归于freenode上的#go-nuts上的那些人。

答案 1 :(得分:3)

这对我有用,但它的缺点是打开另一个终端(在编辑后会自动关闭):

cmd := exec.Command("/usr/bin/xterm", "-e", "vim "+fpath)

答案 2 :(得分:1)

cmd := exec.Command("vim", fpath)中,你做的或多或少:

$ PATH= vim foo.txt
bash: vim: No such file or directory
$

Shell使用PATH环境变量,exec.Command没有。您必须查找vim二进制文件并将其完整路径传递给exec.Commandexec.LookPath为你做到了。