2012-08-23 8 views
5

Ich versuche herauszufinden, wie man einen externen Editor aus einem Go-Programm heraus startet, auf den Benutzer wartet, um den Editor zu schließen, und dann die Ausführung des Programms fortzusetzen. Basierend auf this SO beantworten, habe ich zur Zeit diesen Code:Der Versuch, einen externen Editor aus einem Go-Programm heraus zu starten

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

} 

Wenn ich das Programm laufen, ich diese:

[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$ 

Ich habe auch versucht exec.Run() anstelle von exec verwenden. Start(), aber das scheint auch nicht zu funktionieren (obwohl es nicht am selben Ort fehlschlägt).

Ich kann es zum Laufen bringen, wenn ich Gvim anstelle von Vim verwende, aber es lehnt ab, mit Vim und Nano zu arbeiten. Ich denke, es hängt damit zusammen, dass Vim und Nano im Terminalemulator laufen, anstatt ein externes Fenster zu erstellen.

Antwort

7

Offenbar müssen Sie stdin, stdout und stderr auf dem Cmd-Objekt os gesetzt .Std (in | out | err). Wie dies (unter der Annahme, dass das Objekt cmd genannt wird):

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

Kredit für diese Lösung geht an die Jungs auf # Go-Nüsse auf Freenode.

1

Hier in cmd := exec.Command("vim", fpath), sind Sie mehr oder weniger tun:

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

Shell verwendet die Umgebungsvariable PATH, exec.Command nicht. Sie müssen die Binärdatei vim suchen und den vollständigen Pfad an exec.Command übergeben. exec.LookPath macht das für Sie.

+0

Ich habe versucht, aber es funktioniert immer noch nicht. Dies kann auch nicht die Erklärung sein, da die Verwendung von "gvim" gut funktioniert. – cgt

+1

Überprüft. Du hast recht. Ich kenne den Grund noch nicht. Etwas nachgehen. – zzzz

2

Dies funktioniert für mich, aber es hat den Nachteil eines anderen Terminals zu öffnen (die wird automatisch nach Ausgabe):

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