changeset 3805:961f700d9f0d

Add `:reload-all` command (#4663)
author Filipe Azevedo <filipe@azevedo.io>
date Sun, 20 Nov 2022 18:39:26 +0000
parents 6b0ee10e5b24
children d63d57b77663
files book/src/generated/typable-cmd.md helix-term/src/commands/typed.rs
diffstat 2 files changed, 52 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/book/src/generated/typable-cmd.md	Sat Nov 19 20:54:47 2022 -0500
+++ b/book/src/generated/typable-cmd.md	Sun Nov 20 18:39:26 2022 +0000
@@ -44,6 +44,7 @@
 | `:show-directory`, `:pwd` | Show the current working directory. |
 | `:encoding` | Set encoding. Based on `https://encoding.spec.whatwg.org`. |
 | `:reload` | Discard changes and reload from the source file. |
+| `:reload-all` | Discard changes and reload all documents from the source files. |
 | `:update` | Write changes only if the file has been modified. |
 | `:lsp-workspace-command` | Open workspace command picker |
 | `:lsp-restart` | Restarts the Language Server that is in use by the current doc |
--- a/helix-term/src/commands/typed.rs	Sat Nov 19 20:54:47 2022 -0500
+++ b/helix-term/src/commands/typed.rs	Sun Nov 20 18:39:26 2022 +0000
@@ -1034,6 +1034,50 @@
     })
 }
 
+fn reload_all(
+    cx: &mut compositor::Context,
+    _args: &[Cow<str>],
+    event: PromptEvent,
+) -> anyhow::Result<()> {
+    if event != PromptEvent::Validate {
+        return Ok(());
+    }
+
+    let scrolloff = cx.editor.config().scrolloff;
+    let view_id = view!(cx.editor).id;
+
+    let docs_view_ids: Vec<(DocumentId, Vec<ViewId>)> = cx
+        .editor
+        .documents_mut()
+        .map(|doc| {
+            let mut view_ids: Vec<_> = doc.selections().keys().cloned().collect();
+
+            if view_ids.is_empty() {
+                doc.ensure_view_init(view_id);
+                view_ids.push(view_id);
+            };
+
+            (doc.id(), view_ids)
+        })
+        .collect();
+
+    for (doc_id, view_ids) in docs_view_ids {
+        let doc = doc_mut!(cx.editor, &doc_id);
+
+        // Every doc is guaranteed to have at least 1 view at this point.
+        let view = view_mut!(cx.editor, view_ids[0]);
+        doc.reload(view)?;
+
+        for view_id in view_ids {
+            let view = view_mut!(cx.editor, view_id);
+
+            view.ensure_cursor_in_view(doc, scrolloff);
+        }
+    }
+
+    Ok(())
+}
+
 /// Update the [`Document`] if it has been modified.
 fn update(
     cx: &mut compositor::Context,
@@ -2052,6 +2096,13 @@
             completer: None,
         },
         TypableCommand {
+            name: "reload-all",
+            aliases: &[],
+            doc: "Discard changes and reload all documents from the source files.",
+            fun: reload_all,
+            completer: None,
+        },
+        TypableCommand {
             name: "update",
             aliases: &[],
             doc: "Write changes only if the file has been modified.",