Mercurial > forks > helix
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.",