Add :cquit! command and prevent :cquit from ignoring unsaved changes (#1414)

* Add `:cquit!` command and prevent `:cquit` from ignoring unsaved changes

* `cargo xtask docgen`
This commit is contained in:
Omnikar 2022-01-02 21:31:24 -05:00 committed by GitHub
parent ea095ca5fb
commit ed97ecceb8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 17 deletions

View file

@ -20,6 +20,7 @@
| `:quit-all`, `:qa` | Close all views. | | `:quit-all`, `:qa` | Close all views. |
| `:quit-all!`, `:qa!` | Close all views forcefully (ignoring unsaved changes). | | `:quit-all!`, `:qa!` | Close all views forcefully (ignoring unsaved changes). |
| `:cquit`, `:cq` | Quit with exit code (default 1). Accepts an optional integer exit code (:cq 2). | | `:cquit`, `:cq` | Quit with exit code (default 1). Accepts an optional integer exit code (:cq 2). |
| `:cquit!`, `:cq!` | Quit with exit code (default 1) forcefully (ignoring unsaved changes). Accepts an optional integer exit code (:cq! 2). |
| `:theme` | Change the editor theme. | | `:theme` | Change the editor theme. |
| `:clipboard-yank` | Yank main selection into system clipboard. | | `:clipboard-yank` | Yank main selection into system clipboard. |
| `:clipboard-yank-join` | Yank joined selections into system clipboard. A separator can be provided as first argument. Default value is newline. | | `:clipboard-yank-join` | Yank joined selections into system clipboard. A separator can be provided as first argument. Default value is newline. |

View file

@ -2322,12 +2322,7 @@ pub mod cmd {
write_all_impl(cx, args, event, true, true) write_all_impl(cx, args, event, true, true)
} }
fn quit_all_impl( fn quit_all_impl(editor: &mut Editor, force: bool) -> anyhow::Result<()> {
editor: &mut Editor,
_args: &[Cow<str>],
_event: PromptEvent,
force: bool,
) -> anyhow::Result<()> {
if !force { if !force {
buffers_remaining_impl(editor)?; buffers_remaining_impl(editor)?;
} }
@ -2343,18 +2338,18 @@ pub mod cmd {
fn quit_all( fn quit_all(
cx: &mut compositor::Context, cx: &mut compositor::Context,
args: &[Cow<str>], _args: &[Cow<str>],
event: PromptEvent, _event: PromptEvent,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
quit_all_impl(cx.editor, args, event, false) quit_all_impl(cx.editor, false)
} }
fn force_quit_all( fn force_quit_all(
cx: &mut compositor::Context, cx: &mut compositor::Context,
args: &[Cow<str>], _args: &[Cow<str>],
event: PromptEvent, _event: PromptEvent,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
quit_all_impl(cx.editor, args, event, true) quit_all_impl(cx.editor, true)
} }
fn cquit( fn cquit(
@ -2368,12 +2363,21 @@ pub mod cmd {
.unwrap_or(1); .unwrap_or(1);
cx.editor.exit_code = exit_code; cx.editor.exit_code = exit_code;
let views: Vec<_> = cx.editor.tree.views().map(|(view, _)| view.id).collect(); quit_all_impl(cx.editor, false)
for view_id in views { }
cx.editor.close(view_id);
}
Ok(()) fn force_cquit(
cx: &mut compositor::Context,
args: &[Cow<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;
quit_all_impl(cx.editor, true)
} }
fn theme( fn theme(
@ -2877,6 +2881,13 @@ pub mod cmd {
fun: cquit, fun: cquit,
completer: None, completer: None,
}, },
TypableCommand {
name: "cquit!",
aliases: &["cq!"],
doc: "Quit with exit code (default 1) forcefully (ignoring unsaved changes). Accepts an optional integer exit code (:cq! 2).",
fun: force_cquit,
completer: None,
},
TypableCommand { TypableCommand {
name: "theme", name: "theme",
aliases: &[], aliases: &[],