helix-term/commands: implement cquit (#1096)

This allows you to exit helix with an exit code, e.g. `:cq 2`.
imgbot
Cole Helbling 3 years ago committed by GitHub
parent f5e070e808
commit 87e61a0894
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -599,7 +599,7 @@ impl Application {
Ok(()) Ok(())
} }
pub async fn run(&mut self) -> Result<(), Error> { pub async fn run(&mut self) -> Result<i32, Error> {
self.claim_term().await?; self.claim_term().await?;
// Exit the alternate screen and disable raw mode before panicking // Exit the alternate screen and disable raw mode before panicking
@ -622,6 +622,6 @@ impl Application {
self.restore_term()?; self.restore_term()?;
Ok(()) Ok(self.editor.exit_code)
} }
} }

@ -2042,6 +2042,25 @@ mod cmd {
quit_all_impl(&mut cx.editor, args, event, true) quit_all_impl(&mut cx.editor, args, event, true)
} }
fn cquit(
cx: &mut compositor::Context,
args: &[&str],
_event: PromptEvent,
) -> anyhow::Result<()> {
let exit_code = args
.first()
.and_then(|code| code.parse::<i32>().ok())
.unwrap_or(1);
cx.editor.exit_code = exit_code;
let views: Vec<_> = cx.editor.tree.views().map(|(view, _)| view.id).collect();
for view_id in views {
cx.editor.close(view_id, false);
}
Ok(())
}
fn theme( fn theme(
cx: &mut compositor::Context, cx: &mut compositor::Context,
args: &[&str], args: &[&str],
@ -2411,6 +2430,13 @@ mod cmd {
fun: force_quit_all, fun: force_quit_all,
completer: None, completer: None,
}, },
TypableCommand {
name: "cquit",
aliases: &["cq"],
doc: "Quit with exit code (default 1). Accepts an optional integer exit code (:cq 2).",
fun: cquit,
completer: None,
},
TypableCommand { TypableCommand {
name: "theme", name: "theme",
aliases: &[], aliases: &[],

@ -38,8 +38,13 @@ fn setup_logging(logpath: PathBuf, verbosity: u64) -> Result<()> {
Ok(()) Ok(())
} }
fn main() -> Result<()> {
let exit_code = main_impl()?;
std::process::exit(exit_code);
}
#[tokio::main] #[tokio::main]
async fn main() -> Result<()> { async fn main_impl() -> Result<i32> {
let cache_dir = helix_core::cache_dir(); let cache_dir = helix_core::cache_dir();
if !cache_dir.exists() { if !cache_dir.exists() {
std::fs::create_dir_all(&cache_dir).ok(); std::fs::create_dir_all(&cache_dir).ok();
@ -109,7 +114,8 @@ FLAGS:
// TODO: use the thread local executor to spawn the application task separately from the work pool // TODO: use the thread local executor to spawn the application task separately from the work pool
let mut app = Application::new(args, config).context("unable to create new application")?; let mut app = Application::new(args, config).context("unable to create new application")?;
app.run().await.unwrap();
Ok(()) let exit_code = app.run().await?;
Ok(exit_code)
} }

@ -129,6 +129,8 @@ pub struct Editor {
pub idle_timer: Pin<Box<Sleep>>, pub idle_timer: Pin<Box<Sleep>>,
pub last_motion: Option<Motion>, pub last_motion: Option<Motion>,
pub exit_code: i32,
} }
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
@ -167,6 +169,7 @@ impl Editor {
idle_timer: Box::pin(sleep(config.idle_timeout)), idle_timer: Box::pin(sleep(config.idle_timeout)),
last_motion: None, last_motion: None,
config, config,
exit_code: 0,
} }
} }

Loading…
Cancel
Save