| 12345678910111213141516171819202122232425262728293031 |
- import { defer } from "@/util/defer"
- import { rm } from "node:fs/promises"
- import { tmpdir } from "node:os"
- import { join } from "node:path"
- import { CliRenderer } from "@opentui/core"
- export namespace Editor {
- export async function open(opts: { value: string; renderer: CliRenderer }): Promise<string | undefined> {
- const editor = process.env["EDITOR"]
- if (!editor) return
- const filepath = join(tmpdir(), `${Date.now()}.md`)
- await using _ = defer(async () => rm(filepath, { force: true }))
- await Bun.write(filepath, opts.value)
- opts.renderer.suspend()
- opts.renderer.currentRenderBuffer.clear()
- const parts = editor.split(" ")
- const proc = Bun.spawn({
- cmd: [...parts, filepath],
- stdin: "inherit",
- stdout: "inherit",
- stderr: "inherit",
- })
- await proc.exited
- const content = await Bun.file(filepath).text()
- opts.renderer.resume()
- opts.renderer.requestRender()
- return content || undefined
- }
- }
|