2012-08-23 14 views
5

Sto cercando di capire come avviare un editor esterno da un programma Go, attendere che l'utente chiuda l'editor e quindi continuare l'esecuzione del programma. Sulla base di this SO rispondere, ho attualmente questo codice:Tentativo di avviare un editor esterno da un programma 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.") 
    } 

} 

Quando eseguo il programma, ottengo questo:

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

ho anche provato ad utilizzare exec.Run() al posto di exec. Start(), ma sembra che non funzioni (anche se non fallisce nello stesso posto).

Posso farlo funzionare se utilizzo Gvim anziché Vim, ma si rifiuta di lavorare sia con Vim che con Nano. Penso che sia correlato a Vim e nano in esecuzione all'interno dell'emulatore del terminale invece di creare una finestra esterna.

risposta

7

A quanto pare, è necessario impostare Stdin, stdout e stderr sull'oggetto Cmd per os .STD (in | out | err). Ti piace questa (supponendo che l'oggetto si chiama cmd):

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

di credito per risolvere questo va ai ragazzi # go-dadi su freenode.

1

Qui in cmd := exec.Command("vim", fpath), si sta facendo più o meno:

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

Shell utilizza la variabile d'ambiente PATH, exec.Command non lo fa. Devi cercare il binario vim e passare il suo percorso completo a exec.Command. exec.LookPath lo fa per te.

+0

Ho provato, ma ancora non funziona. Inoltre, questa non può essere la spiegazione poiché l'uso di "gvim" funziona bene. – cgt

+1

Controllato. Hai ragione. Non so ancora il motivo. Guardando dentro – zzzz

2

Questo funziona per me, ma ha lo svantaggio di aprire un altro terminale (che si chiude automaticamente dopo edizione):

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