add system for editor-specific flags

This commit is contained in:
Cyborus 2023-12-13 00:25:28 -05:00
parent c4810e3e93
commit 4a9f524827
No known key found for this signature in database

View file

@ -70,7 +70,7 @@ async fn readline(msg: &str) -> eyre::Result<String> {
} }
async fn editor(contents: &mut String, ext: Option<&str>) -> eyre::Result<()> { async fn editor(contents: &mut String, ext: Option<&str>) -> eyre::Result<()> {
let editor = std::env::var_os("EDITOR").ok_or_else(|| eyre!("unable to locate editor"))?; let editor = std::path::PathBuf::from(std::env::var_os("EDITOR").ok_or_else(|| eyre!("unable to locate editor"))?);
let (mut file, path) = tempfile(ext).await?; let (mut file, path) = tempfile(ext).await?;
file.write_all(contents.as_bytes()).await?; file.write_all(contents.as_bytes()).await?;
@ -80,7 +80,9 @@ async fn editor(contents: &mut String, ext: Option<&str>) -> eyre::Result<()> {
// on errors // on errors
let res = (|| async { let res = (|| async {
eprint!("waiting on editor\r"); eprint!("waiting on editor\r");
let flags = get_editor_flags(&editor);
let status = tokio::process::Command::new(editor) let status = tokio::process::Command::new(editor)
.args(flags)
.arg(&path) .arg(&path)
.status() .status()
.await?; .await?;
@ -100,6 +102,17 @@ async fn editor(contents: &mut String, ext: Option<&str>) -> eyre::Result<()> {
Ok(()) Ok(())
} }
fn get_editor_flags(editor_path: &std::path::Path) -> &'static [&'static str] {
let editor_name = match editor_path.file_stem().and_then(|s| s.to_str()) {
Some(name) => name,
None => return &[],
};
if editor_name == "code" {
return &["--wait"];
}
&[]
}
async fn tempfile(ext: Option<&str>) -> tokio::io::Result<(tokio::fs::File, std::path::PathBuf)> { async fn tempfile(ext: Option<&str>) -> tokio::io::Result<(tokio::fs::File, std::path::PathBuf)> {
let filename = uuid::Uuid::new_v4(); let filename = uuid::Uuid::new_v4();
let mut path = std::env::temp_dir().join(filename.to_string()); let mut path = std::env::temp_dir().join(filename.to_string());