2012-08-23 8 views
5

Я пытаюсь выяснить, как запустить внешний редактор из программы Go, дождаться закрытия пользователем редактора и продолжить выполнение программы. На основе this SO ответа, я в настоящее время этот код:Попытка запуска внешнего редактора из программы 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. Start(), но это, похоже, не работает (хотя оно не терпит неудачу в одном и том же месте).

Я могу заставить его работать, если я использую Gvim вместо Vim, но он отказывается работать как с Vim, так и с nano. Я думаю, что это связано с тем, что Vim и nano работают внутри эмулятора терминала вместо создания внешнего окна.

ответ

7

Судя по всему, вы должны установить STDIN, STDOUT и STDERR на объекте Cmd к зева .std (в | из | 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 
$ 

Shell использует переменную PATH среды, exec.Command нет. Вам нужно найти двоичный файл vim и передать его полный путь до exec.Command. exec.LookPath делает это за вас.

+0

Я пробовал, но он все еще не работает. Кроме того, это не может быть объяснением, так как использование просто «gvim» отлично работает. – cgt

+1

Проверено. Ты прав. Пока не знаю причины. Вглядываясь в него. – zzzz

2

Это работает для меня, но это имеет тот недостаток, что открытие еще одного терминала (который автоматически закрывается после издания):

cmd := exec.Command("/usr/bin/xterm", "-e", "vim "+fpath) 
Смежные вопросы