code: func (e Editor) LaunchTempFile(prefix, suffix string, r io.Reader) ([]byte, string, error) {
  	f, err := tempFile(prefix, suffix)
  	if err != nil {
  		return nil, "", err
  	}
  	defer f.Close()
  	path := f.Name()
  	if _, err := io.Copy(f, r); err != nil {
  		os.Remove(path)
  		return nil, path, err
  	}
  	// This file descriptor needs to close so the next process (Launch) can claim it.
  	f.Close()
  	if err := e.Launch(path); err != nil {
  		return nil, path, err
  	}
  	bytes, err := ioutil.ReadFile(path)
  	return bytes, path, err
  }
docs: // LaunchTempFile reads the provided stream into a temporary file in the given directory
  // and file prefix, and then invokes Launch with the path of that file. It will return
  // the contents of the file after launch, any errors that occur, and the path of the
  // temporary file so the caller can clean it up as needed.