2012-08-23 5 views
5

Goプログラムから外部エディタを起動し、エディタを閉じてからプログラムの実行を続行する方法を理解しようとしています。私はプログラムを実行するとGoプログラム内から外部エディタを起動しようとしています

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.") 
    } 

} 

が、私はこれを取得:

[email protected]:~/code/go/src/launcheditor$ go run launcheditor.go 
2012/08/23 10:50:37 Error while editing. Error: exit status 1 
[email protected]:~/code/go/src/launcheditor$ 

は私もexec.Runを使用して試してみました()の代わりのexecのSO答えるthisに基づいて、私は現在、このコードを持っています。 Start()、しかしそれはどちらもうまくいかないようです(ただし、同じ場所では失敗しません)。

私はVimの代わりにGvimを使用しても動作させることができますが、Vimとnanoの両方で動作することを拒否します。私はVimとnanoが外部ウィンドウを作成するのではなく、ターミナルエミュレータの内部で動いていると考えています。

答えて

7

どうやら、あなたはOSにCmdを対象に標準入力、標準出力と標準エラーを設定する必要があります.Std(in | out | err)。この(オブジェクトがcmdと呼ばれていると仮定して)のような:

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

クレジットこれを解決するためのfreenodeのの#ゴーナットの男に行きます。

1

ここcmd := exec.Command("vim", fpath)で、あなたは多かれ少なかれをやっている:

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

シェルはexec.Commandにはない、PATH環境変数を使用しています。 vimバイナリを検索し、フルパスをexec.Commandに渡す必要があります。 exec.LookPathあなたのためにそれを行います。

+0

私は試しましたが、それでも動作しません。また、これは説明をすることはできません。単に "gvim"をうまく使っているからです。 – cgt

+1

がチェックされています。あなたが正しい。理由はまだ分かりません。それを見る。 – zzzz

2

これは私のために動作しますが、それは別の端末(編集後自動的に閉じます)を開くという欠点がある:

cmd := exec.Command("/usr/bin/xterm", "-e", "vim "+fpath) 
関連する問題