2

I try to call vim within go program, which code similar to this:

package main

import (
        "fmt"
        "os"
        "os/exec"
)

func main() {
        err := exec.Command("vim", "a.txt").Run()
        if err != nil {
                fmt.Println(err)
        }
        os.Exit(0)
}

I ran go run mycode.go then got:

exit status 1

I have tried several ways to succeed this e.g. replace Run() by Start(), Output(), ..., but it seems not work. Finally, What I try to do is I try to call vim and stop my current go program. I just want to see vim appear, that's all.

2
  • What happens when you put the absolute path to vim? Commented Jan 12, 2016 at 13:20
  • Just nothing changes. Commented Jan 12, 2016 at 13:23

1 Answer 1

7

In order for vim to render its interface, you need to attach the standard input/output streams to the process:

package main

import (
        "fmt"
        "os"
        "os/exec"
)

func main() {
        cmd := exec.Command("vim", "a.txt")
        cmd.Stdin = os.Stdin
        cmd.Stdout = os.Stdout
        cmd.Stderr = os.Stderr
        err := cmd.Run()
        if err != nil {
                fmt.Println(err)
        }
        os.Exit(0)
}

Not attaching the streams is similar to running the following command from your shell:

vim < /dev/null > /dev/null 2> /dev/null
Sign up to request clarification or add additional context in comments.

2 Comments

To be more precise, Vim, being a full-screen text editor expects at least its standard input and output streams to be connected to a device having capabilities of a terminal. That is, if you'd run your program which spawns Vim with its stdin/strout redirected to /dev/null vim would seize to work in exactly the same way. So the key reason Vim failed to work is that it can only sensibly work on a terminal.
To make my comment complete, sometimes one might need to run a program wich expects to be connected to a terminal device in an unattended way (one example is running something asking for a password interactively, such as a stock OpenSSH client). For this, pseudo terminal subsystem might be used, via a package such as github.com/kr/pty. JFTR, terminal emulators, like xterm, and terminal multiplexers such as screen and tmux use PTYs to run their client programs.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.