From 42e37a571e75aaf4feb1717dfebe8cf215e535dd Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Tue, 22 Nov 2022 21:28:49 -0600 Subject: Apply transactions to all views (#4733) * Add a test case for updating jumplists across windows * Apply transactions to all views on history changes This ensures that jumplist selections follow changes in documents, even when there are multiple views (for example a split where both windows edit the same document). * Leave TODOs for cleaning up View::apply * Use Iterator::reduce to compose history transactions Co-authored-by: Blaž Hrastnik Co-authored-by: Blaž Hrastnik --- helix-term/tests/test/splits.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'helix-term/tests/test') diff --git a/helix-term/tests/test/splits.rs b/helix-term/tests/test/splits.rs index 5807413a..a51de365 100644 --- a/helix-term/tests/test/splits.rs +++ b/helix-term/tests/test/splits.rs @@ -127,3 +127,29 @@ async fn test_split_write_quit_same_file() -> anyhow::Result<()> { Ok(()) } + +#[tokio::test(flavor = "multi_thread")] +async fn test_changes_in_splits_apply_to_all_views() -> anyhow::Result<()> { + // See . + // Transactions must be applied to any view that has the changed document open. + // This sequence would panic since the jumplist entry would be modified in one + // window but not the other. Attempting to update the changelist in the other + // window would cause a panic since it would point outside of the document. + + // The key sequence here: + // * v Create a vertical split of the current buffer. + // Both views look at the same doc. + // * [ Add a line ending to the beginning of the document. + // The cursor is now at line 2 in window 2. + // * Save that selection to the jumplist in window 2. + // * w Switch to window 1. + // * kd Delete line 1 in window 1. + // * q Close window 1, focusing window 2. + // * d Delete line 1 in window 2. + // + // This panicked in the past because the jumplist entry on line 2 of window 2 + // was not updated and after the `kd` step, pointed outside of the document. + test(("#[|]#", "v[wkdqd", "#[|]#")).await?; + + Ok(()) +} -- cgit v1.2.3-70-g09d2