-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Autosave all when the terminal loses focus #3178
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -559,17 +559,11 @@ pub(super) fn buffers_remaining_impl(editor: &mut Editor) -> anyhow::Result<()> | |
Ok(()) | ||
} | ||
|
||
fn write_all_impl( | ||
pub fn write_all_impl( | ||
cx: &mut compositor::Context, | ||
_args: &[Cow<str>], | ||
event: PromptEvent, | ||
quit: bool, | ||
force: bool, | ||
write_scratch: bool, | ||
) -> anyhow::Result<()> { | ||
if event != PromptEvent::Validate { | ||
return Ok(()); | ||
} | ||
|
||
let mut errors: Vec<&'static str> = Vec::new(); | ||
let auto_format = cx.editor.config().auto_format; | ||
let jobs = &mut cx.jobs; | ||
|
@@ -580,12 +574,13 @@ fn write_all_impl( | |
.documents | ||
.values() | ||
.filter_map(|doc| { | ||
if doc.path().is_none() { | ||
errors.push("cannot write a buffer without a filename\n"); | ||
if !doc.is_modified() { | ||
return None; | ||
} | ||
|
||
if !doc.is_modified() { | ||
if doc.path().is_none() { | ||
if write_scratch { | ||
errors.push("cannot write a buffer without a filename\n"); | ||
} | ||
return None; | ||
} | ||
|
||
|
@@ -611,20 +606,6 @@ fn write_all_impl( | |
cx.editor.save::<PathBuf>(id, None, force)?; | ||
} | ||
|
||
if quit { | ||
cx.block_try_flush_writes()?; | ||
|
||
if !force { | ||
buffers_remaining_impl(cx.editor)?; | ||
} | ||
|
||
// close all views | ||
let views: Vec<_> = cx.editor.tree.views().map(|(view, _)| view.id).collect(); | ||
for view_id in views { | ||
cx.editor.close(view_id); | ||
} | ||
} | ||
|
||
if !errors.is_empty() && !force { | ||
bail!("{:?}", errors); | ||
} | ||
|
@@ -634,49 +615,50 @@ fn write_all_impl( | |
|
||
fn write_all( | ||
cx: &mut compositor::Context, | ||
args: &[Cow<str>], | ||
_args: &[Cow<str>], | ||
event: PromptEvent, | ||
) -> anyhow::Result<()> { | ||
if event != PromptEvent::Validate { | ||
return Ok(()); | ||
} | ||
|
||
write_all_impl(cx, args, event, false, false) | ||
write_all_impl(cx, false, true) | ||
} | ||
|
||
fn write_all_quit( | ||
cx: &mut compositor::Context, | ||
args: &[Cow<str>], | ||
_args: &[Cow<str>], | ||
event: PromptEvent, | ||
) -> anyhow::Result<()> { | ||
if event != PromptEvent::Validate { | ||
return Ok(()); | ||
} | ||
|
||
write_all_impl(cx, args, event, true, false) | ||
write_all_impl(cx, false, true)?; | ||
quit_all_impl(cx, false) | ||
} | ||
|
||
fn force_write_all_quit( | ||
cx: &mut compositor::Context, | ||
args: &[Cow<str>], | ||
_args: &[Cow<str>], | ||
event: PromptEvent, | ||
) -> anyhow::Result<()> { | ||
if event != PromptEvent::Validate { | ||
return Ok(()); | ||
} | ||
|
||
write_all_impl(cx, args, event, true, true) | ||
let _ = write_all_impl(cx, true, true); | ||
quit_all_impl(cx, true) | ||
} | ||
|
||
fn quit_all_impl(editor: &mut Editor, force: bool) -> anyhow::Result<()> { | ||
fn quit_all_impl(cx: &mut compositor::Context, force: bool) -> anyhow::Result<()> { | ||
cx.block_try_flush_writes()?; | ||
if !force { | ||
buffers_remaining_impl(editor)?; | ||
buffers_remaining_impl(cx.editor)?; | ||
} | ||
|
||
// close all views | ||
let views: Vec<_> = editor.tree.views().map(|(view, _)| view.id).collect(); | ||
let views: Vec<_> = cx.editor.tree.views().map(|(view, _)| view.id).collect(); | ||
for view_id in views { | ||
editor.close(view_id); | ||
cx.editor.close(view_id); | ||
} | ||
|
||
Ok(()) | ||
|
@@ -691,8 +673,7 @@ fn quit_all( | |
return Ok(()); | ||
} | ||
|
||
cx.block_try_flush_writes()?; | ||
quit_all_impl(cx.editor, false) | ||
quit_all_impl(cx, false) | ||
} | ||
|
||
fn force_quit_all( | ||
|
@@ -704,7 +685,7 @@ fn force_quit_all( | |
return Ok(()); | ||
} | ||
|
||
quit_all_impl(cx.editor, true) | ||
quit_all_impl(cx, true) | ||
} | ||
|
||
fn cquit( | ||
|
@@ -722,8 +703,7 @@ fn cquit( | |
.unwrap_or(1); | ||
|
||
cx.editor.exit_code = exit_code; | ||
cx.block_try_flush_writes()?; | ||
quit_all_impl(cx.editor, false) | ||
quit_all_impl(cx, false) | ||
} | ||
|
||
fn force_cquit( | ||
|
@@ -741,7 +721,7 @@ fn force_cquit( | |
.unwrap_or(1); | ||
cx.editor.exit_code = exit_code; | ||
|
||
quit_all_impl(cx.editor, true) | ||
quit_all_impl(cx, true) | ||
} | ||
|
||
fn theme( | ||
|
@@ -2141,7 +2121,7 @@ pub static TYPABLE_COMMAND_MAP: Lazy<HashMap<&'static str, &'static TypableComma | |
.collect() | ||
}); | ||
|
||
pub fn command_mode(cx: &mut Context) { | ||
pub(super) fn command_mode(cx: &mut Context) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why the change here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Before my making |
||
let mut prompt = Prompt::new( | ||
":".into(), | ||
Some(':'), | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it would be better to have this as an array to prevent breaking config breakage if new auto save events are added, like you mentioned in the opening comment:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This doesn't have to be a breaking change. The type could just become an enum where the value is allowed to be either a boolean or a list of strings. This is what the auto pairs config option does. True could just translate to the default list internally.
In fact, this is even better for being able to disable the feature. It makes much more sense to set
auto-save = false
thanauto-save = []
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, having it function like
auto-pairs
for expansion was my rough thinking. Happy to change to a list now if that's the preferred way.