2012-08-23 14 views
5

Estoy intentando descubrir cómo ejecutar un editor externo desde un programa Go, esperar a que el usuario cierre el editor y luego continuar con la ejecución del programa. Sobre la base de this respuesta, así, tengo actualmente este código:Intentando ejecutar un editor externo desde un programa 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.") 
    } 

} 

Cuando ejecuto el programa, me sale esto:

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

También he intentado usar exec.Run() en lugar de exec. Start(), pero eso tampoco parece funcionar (aunque no falla en el mismo lugar).

Puedo hacer que funcione si uso Gvim en lugar de Vim, pero se niega a trabajar con Vim y nano. Creo que está relacionado con Vim y nano que se ejecutan dentro del emulador de terminal en lugar de crear una ventana externa.

Respuesta

7

Al parecer, usted tiene que fijar Stdin, stdout y stderr en el objeto Comando de OS .Std (in | out | err). Como esto (suponiendo que el objeto se llama cmd):

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

de crédito para resolver este va a los chicos en # go-tuercas en freenode.

1

Aquí en cmd := exec.Command("vim", fpath), estás haciendo más o menos:

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

Shell utiliza la variable de entorno PATH, exec.Command no. Debe buscar el binario vim y pasar su ruta completa al exec.Command. exec.LookPath hace eso por usted.

+0

Lo intenté, pero todavía no funciona. Además, esta no puede ser la explicación, ya que usar solo "gvim" funciona bien. – cgt

+1

verificado. Tienes razón. No sé el motivo todavía. Buscando dentro. – zzzz

2

Esto funciona para mí, pero tiene la desventaja de abrir otro terminal (que se cerrará automáticamente tras edición):

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