on master help sign in
Update write_all
62e6232Wojciech Kępka
helix-term/src/commands.rs+43−26
@@ -915,15 +915,7 @@ mod cmd {
915 fn quit(editor: &mut Editor, args: &[&str], event: PromptEvent) {
915 fn quit(editor: &mut Editor, args: &[&str], event: PromptEvent) {
916 // last view and we have unsaved changes
916 // last view and we have unsaved changes
917 if editor.tree.views().count() == 1 {
917 if editor.tree.views().count() == 1 {
918− let modified: Vec<_> = editor
918+ let modified = _modified_left(editor);
919− .documents()
920− .filter(|doc| doc.is_modified())
921− .map(|doc| {
922− doc.relative_path()
923− .and_then(|path| path.to_str())
924− .unwrap_or("[scratch]")
925− })
926− .collect();
927
919
928 if !modified.is_empty() {
920 if !modified.is_empty() {
929 let err = format!(
921 let err = format!(
@@ -1033,27 +1025,52 @@ mod cmd {
1033 force_quit(editor, &[], event);
1025 force_quit(editor, &[], event);
1034 }
1026 }
1035
1027
1028+ fn _modified_left(editor: &mut Editor) -> Vec<&str> {
1029+ editor
1030+ .documents()
1031+ .filter(|doc| doc.is_modified())
1032+ .map(|doc| {
1033+ doc.relative_path()
1034+ .and_then(|path| path.to_str())
1035+ .unwrap_or("[scratch]")
1036+ })
1037+ .collect()
1038+ }
1039+
1036 fn _write_all(editor: &mut Editor, args: &[&str], event: PromptEvent, quit: bool, force: bool) {
1040 fn _write_all(editor: &mut Editor, args: &[&str], event: PromptEvent, quit: bool, force: bool) {
1037− let ids = editor
1041+ let mut errors = String::new();
1038− .tree
1039− .views()
1040− .map(|(view, _)| (view.id, view.doc))
1041− .collect::<Vec<_>>();
1042−
1043− for (view_id, doc_id) in ids {
1044− if let Some(doc) = editor.documents.get_mut(doc_id) {
1045− let view = editor.tree.get(view_id);
1046− if let Err(e) = _write(view, doc, None::<&str>) {
1047− editor.set_error(e.to_string());
1048− } else if quit {
1049− editor.close(view_id, false);
1050− continue;
1051− }
1052
1042
1043+ // save all documents
1044+ for (id, mut doc) in &mut editor.documents {
1045+ if doc.path().is_none() {
1046+ errors.push_str("cannot write a buffer without a filename\n");
1047+ continue;
1048+ }
1049+ tokio::spawn(doc.save());
1050+ }
1051+ editor.set_error(errors);
1052+
1053+ if quit {
1053− if force {
1054+ if !force {
1054− editor.close(view_id, false);
1055+ // check if there are some unsaved buffers
1056+ let modified = _modified_left(editor);
1057+
1058+ if !modified.is_empty() {
1059+ let err = format!(
1060+ "{} unsaved buffer(s) remaining: {:?}",
1061+ modified.len(),
1062+ modified
1063+ );
1064+ editor.set_error(err);
1065+ return;
1055 }
1066 }
1056 }
1067 }
1068+
1069+ // close all views
1070+ let views: Vec<_> = editor.tree.views().map(|(view, _)| view.id).collect();
1071+ for view_id in views {
1072+ editor.close(view_id, false);
1073+ }
1057 }
1074 }
1058 }
1075 }
1059
1076