Skip to main content

apm/
editor.rs

1use anyhow::{bail, Result};
2use std::path::Path;
3
4pub fn resolve() -> String {
5    std::env::var("VISUAL")
6        .ok()
7        .filter(|e| !e.is_empty())
8        .or_else(|| std::env::var("EDITOR").ok().filter(|e| !e.is_empty()))
9        .unwrap_or_else(|| "vi".to_string())
10}
11
12pub fn open(path: &Path) -> Result<()> {
13    let editor = resolve();
14    let mut parts = editor.split_whitespace();
15    let bin = parts.next().unwrap();
16    let status = std::process::Command::new(bin)
17        .args(parts)
18        .arg(path)
19        .stdin(std::process::Stdio::inherit())
20        .stdout(std::process::Stdio::inherit())
21        .stderr(std::process::Stdio::inherit())
22        .status()
23        .map_err(|e| anyhow::anyhow!("could not launch editor '{editor}': {e}"))?;
24
25    if !status.success() {
26        bail!("editor exited with non-zero status");
27    }
28    Ok(())
29}