journal/editorwrap.go

42 lines
1.1 KiB
Go

package main
import (
"io"
"os"
"syscall"
)
var NanoEditorCmd = []string{"/usr/bin/nano", "--restricted", "--saveonexit", "--ignorercfiles", "--unix"}
var Editors map[string][]string = map[string][]string{
"nano": NanoEditorCmd,
}
func GetTextFromEditor(editorCmd []string, existingText string) (string, error) {
tmpfile, err := os.CreateTemp(existingText, ".jrnl") // default mode is 0600
if err != nil { return existingText, err }
defer os.Remove(tmpfile.Name()) // this may fail due to redundant call of os.Remove
_, err = tmpfile.Write([]byte(existingText))
if err != nil { return existingText, err }
// call editor command
ecmdln := make([]string, len(editorCmd))
copy(ecmdln, editorCmd)
ecmdln = append(ecmdln, tmpfile.Name())
proc, err := os.StartProcess(
editorCmd[0],
ecmdln,
&os.ProcAttr{
Dir: "/",
Env: os.Environ(),
Files: []*os.File{
os.Stdin, os.Stdout, os.Stderr,
},
Sys: &syscall.SysProcAttr{},
},
)
if err != nil { return existingText, err }
_, err = proc.Wait()
if err != nil { return existingText, err }
// read back text from file
result, err := io.ReadAll(tmpfile)
return string(result), err
}