editor.ts 980 B

12345678910111213141516171819202122232425262728293031
  1. import { defer } from "@/util/defer"
  2. import { rm } from "node:fs/promises"
  3. import { tmpdir } from "node:os"
  4. import { join } from "node:path"
  5. import { CliRenderer } from "@opentui/core"
  6. export namespace Editor {
  7. export async function open(opts: { value: string; renderer: CliRenderer }): Promise<string | undefined> {
  8. const editor = process.env["EDITOR"]
  9. if (!editor) return
  10. const filepath = join(tmpdir(), `${Date.now()}.md`)
  11. await using _ = defer(async () => rm(filepath, { force: true }))
  12. await Bun.write(filepath, opts.value)
  13. opts.renderer.suspend()
  14. opts.renderer.currentRenderBuffer.clear()
  15. const parts = editor.split(" ")
  16. const proc = Bun.spawn({
  17. cmd: [...parts, filepath],
  18. stdin: "inherit",
  19. stdout: "inherit",
  20. stderr: "inherit",
  21. })
  22. await proc.exited
  23. const content = await Bun.file(filepath).text()
  24. opts.renderer.resume()
  25. opts.renderer.requestRender()
  26. return content || undefined
  27. }
  28. }