2012-08-23 4 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를 사용하여 시도() 대신 간부의 SO 답변 this을 바탕으로, 나는 현재이 코드가 있습니다. 시작(),하지만 그 중 하나를 작동하지 않는 것 (비록 그것은 같은 장소에서 실패하지 않습니다).

Vim 대신 Gvim을 사용하면 제대로 작동하지만 Vim과 nano 모두에서 작동하지 않습니다. 외부 창을 만드는 대신 Vim과 nano가 터미널 에뮬레이터 내에서 실행되는 것과 관련이 있다고 생각합니다. cmd := exec.Command("vim", fpath)에서 여기

답변

7

을 .Std (in | out | err). 이처럼 (객체가 cmd라고 가정) :

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

신용이 문제를 해결하기위한 것은 Freenode의의 # 이동 너트에 남자로 이동합니다.

1

, 당신은 더 많거나 적은을하고있는 :

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

쉘은 PATH 환경 변수를 사용하여, exec.Command은하지 않습니다. vim 바이너리를 찾아서 전체 경로를 exec.Command으로 전달해야합니다. exec.LookPath가 해당 작업을 수행합니다.

+0

시도했지만 여전히 작동하지 않습니다. 또한, "gvim"을 잘 사용하면 설명이 될 수 없습니다. – cgt

+1

선택됨. 네가 옳아. 이유를 아직 모릅니다. 그것으로보고. – zzzz

2

이것은 나를 위해 작동하지만 (판 후 자동으로 닫기) 다른 터미널을 여는 단점이있다 : 당신은 운영 체제에 Cmd를 객체에 표준 입력, 표준 출력 및 표준 오류를 설정해야합니다, 분명히

cmd := exec.Command("/usr/bin/xterm", "-e", "vim "+fpath) 
관련 문제