Go言語で外部プログラムの標準出力・入力を扱う方法について
実現したいこと
Go言語を用いて、Gitのリベース処理を自動化するコマンドを作りたいです。
細かいコミットが重なったために、リベースでSquashしようとすると以下のようなコマンドを実行して、
git rebase -i HEAD~3
すると、git-rebase-todoがエディタで立ち上がると思います。しかし、その都度エディタが立ち上がり対象のコミットに対してsquashに書き換えるのが面倒です。そこをコマンドでサクっと修正できるようにしたいと考えています。
試したこと
Go言語でまずはvimを起動させて値を取得するというコードを実装してみましたが、上手くいきません。
vimCmd := exec.Command("vim", "text.txt")
vimStdout, _ := vimCmd.StdoutPipe()
vimStderr, _ := vimCmd.StderrPipe()
vimCmd.Start()
/* 以下3行は有効にするとvimエディタが起動(例外で落ちる) */
//vimCmd.Stdin = os.Stdin
//vimCmd.Stdout = os.Stdout
//vimCmd.Stderr = os.Stderr
go func() {
scannerOut := bufio.NewScanner(vimStdout)
scannerErr := bufio.NewScanner(vimStderr)
for scannerOut.Scan() {
for scannerErr.Scan() {
lineErr := scannerErr.Text()
fmt.Println("[stdErr] ", lineErr)
}
lineOut := scannerOut.Text()
fmt.Println("[output] ", lineOut)
}
}()
vimCmd.Wait()
実行すると以下のメッセージが出力されます。
[stdErr] Vim: 警告: 端末への出力ではありません
[stdErr] Vim: 警告: 端末からの入力ではありません
実現したいこと を達成するためにアプローチ自体が間違っていれば、それについてもアドバイスを頂けたらと思います。