【问题标题】:Trying to launch an external editor from within a Go program尝试从 Go 程序中启动外部编辑器
【发布时间】:2012-08-23 08:57:16
【问题描述】:

我试图弄清楚如何从 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 有关,而不是创建外部窗口。

【问题讨论】:

    标签: linux editor go


    【解决方案1】:

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

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

    解决这个问题的功劳归于 freenode 上#go-nuts 上的人。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        cmd := exec.Command("vim", fpath),你或多或少做了一些事情:

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

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

        【讨论】:

        • 我试过了,还是不行。此外,这不能解释为仅使用“gvim”可以正常工作。
        • 已检查。你是对的。还不知道原因。调查一下。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多