From 9837a6e2880a42359c8c6c0bdc55173f3141aa5e Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 8 Mar 2023 16:42:04 -0800 Subject: [PATCH 01/20] Add failing test for reporting FS change events to language servers --- crates/project/src/project_tests.rs | 89 ++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 3 deletions(-) diff --git a/crates/project/src/project_tests.rs b/crates/project/src/project_tests.rs index ddcfed9dac548f3c03c14e61f23c9d0c9e474964..c0b72cf5b69ab8d2109f085fd29d6d135f6b6a7a 100644 --- a/crates/project/src/project_tests.rs +++ b/crates/project/src/project_tests.rs @@ -438,6 +438,89 @@ async fn test_managing_language_servers( ); } +#[gpui::test] +async fn test_reporting_fs_changes_to_language_servers(cx: &mut gpui::TestAppContext) { + cx.foreground().forbid_parking(); + + let mut language = Language::new( + LanguageConfig { + name: "Rust".into(), + path_suffixes: vec!["rs".to_string()], + ..Default::default() + }, + Some(tree_sitter_rust::language()), + ); + let mut fake_servers = language + .set_fake_lsp_adapter(Arc::new(FakeLspAdapter { + name: "the-language-server", + ..Default::default() + })) + .await; + + let fs = FakeFs::new(cx.background()); + fs.insert_tree( + "/the-root", + json!({ + "a.rs": "", + "b.rs": "", + }), + ) + .await; + + let project = Project::test(fs.clone(), ["/the-root".as_ref()], cx).await; + project.update(cx, |project, _| { + project.languages.add(Arc::new(language)); + }); + cx.foreground().run_until_parked(); + + // Start the language server by opening a buffer with a compatible file extension. + let _buffer = project + .update(cx, |project, cx| { + project.open_local_buffer("/the-root/a.rs", cx) + }) + .await + .unwrap(); + + // Keep track of the FS events reported to the language server. + let fake_server = fake_servers.next().await.unwrap(); + let file_changes = Arc::new(Mutex::new(Vec::new())); + fake_server.handle_notification::({ + let file_changes = file_changes.clone(); + move |params, _| { + let mut file_changes = file_changes.lock(); + file_changes.extend(params.changes); + file_changes.sort_by(|a, b| a.uri.cmp(&b.uri)); + } + }); + + cx.foreground().run_until_parked(); + assert_eq!(file_changes.lock().len(), 0); + + // Perform some file system mutations. + fs.create_file("/the-root/c.rs".as_ref(), Default::default()) + .await + .unwrap(); + fs.remove_file("/the-root/b.rs".as_ref(), Default::default()) + .await + .unwrap(); + + // The language server receives events for both FS mutations. + cx.foreground().run_until_parked(); + assert_eq!( + &*file_changes.lock(), + &[ + lsp::FileEvent { + uri: lsp::Url::from_file_path("/the-root/c.rs").unwrap(), + typ: lsp::FileChangeType::CREATED, + }, + lsp::FileEvent { + uri: lsp::Url::from_file_path("/the-root/b.rs").unwrap(), + typ: lsp::FileChangeType::DELETED, + } + ] + ); +} + #[gpui::test] async fn test_single_file_worktrees_diagnostics(cx: &mut gpui::TestAppContext) { cx.foreground().forbid_parking(); @@ -1585,7 +1668,7 @@ async fn test_edits_from_lsp_with_edits_on_adjacent_lines(cx: &mut gpui::TestApp buffer.text(), " use a::{b, c}; - + fn f() { b(); c(); @@ -1603,7 +1686,7 @@ async fn test_invalid_edits_from_lsp(cx: &mut gpui::TestAppContext) { let text = " use a::b; use a::c; - + fn f() { b(); c(); @@ -1688,7 +1771,7 @@ async fn test_invalid_edits_from_lsp(cx: &mut gpui::TestAppContext) { buffer.text(), " use a::{b, c}; - + fn f() { b(); c(); From 61172c847839eafcca39265df78d8a0ec99a4998 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 9 Mar 2023 18:04:56 -0800 Subject: [PATCH 02/20] Notify language servers of FS changes --- crates/lsp/src/lsp.rs | 3 + crates/project/src/project.rs | 45 +++++++++++- crates/project/src/project_tests.rs | 8 +-- crates/project/src/worktree.rs | 106 +++++++++++++++++++++++++--- 4 files changed, 147 insertions(+), 15 deletions(-) diff --git a/crates/lsp/src/lsp.rs b/crates/lsp/src/lsp.rs index 81568b9e3e449b4a922d6c7e64dfe0df309fbb6c..ad94423e11ad3db1136c2ee1c07b3766690ebd8b 100644 --- a/crates/lsp/src/lsp.rs +++ b/crates/lsp/src/lsp.rs @@ -319,6 +319,9 @@ impl LanguageServer { capabilities: ClientCapabilities { workspace: Some(WorkspaceClientCapabilities { configuration: Some(true), + did_change_watched_files: Some(DynamicRegistrationClientCapabilities { + dynamic_registration: Some(true), + }), did_change_configuration: Some(DynamicRegistrationClientCapabilities { dynamic_registration: Some(true), }), diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 5b2fd412e8a272651c54722adc518a791c6cafc5..9e87b0b1bd939015542cd4acaa0860e12255d9a6 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -4465,7 +4465,10 @@ impl Project { cx.observe(worktree, |_, _, cx| cx.notify()).detach(); if worktree.read(cx).is_local() { cx.subscribe(worktree, |this, worktree, event, cx| match event { - worktree::Event::UpdatedEntries => this.update_local_worktree_buffers(worktree, cx), + worktree::Event::UpdatedEntries(changes) => { + this.update_local_worktree_buffers(&worktree, cx); + this.update_local_worktree_language_servers(&worktree, changes, cx); + } worktree::Event::UpdatedGitRepositories(updated_repos) => { this.update_local_worktree_buffers_git_repos(worktree, updated_repos, cx) } @@ -4496,7 +4499,7 @@ impl Project { fn update_local_worktree_buffers( &mut self, - worktree_handle: ModelHandle, + worktree_handle: &ModelHandle, cx: &mut ModelContext, ) { let snapshot = worktree_handle.read(cx).snapshot(); @@ -4506,7 +4509,7 @@ impl Project { if let Some(buffer) = buffer.upgrade(cx) { buffer.update(cx, |buffer, cx| { if let Some(old_file) = File::from_dyn(buffer.file()) { - if old_file.worktree != worktree_handle { + if old_file.worktree != *worktree_handle { return; } @@ -4578,6 +4581,42 @@ impl Project { } } + fn update_local_worktree_language_servers( + &mut self, + worktree_handle: &ModelHandle, + changes: &HashMap, PathChange>, + cx: &mut ModelContext, + ) { + let worktree_id = worktree_handle.read(cx).id(); + let abs_path = worktree_handle.read(cx).abs_path(); + for ((server_worktree_id, _), server_id) in &self.language_server_ids { + if *server_worktree_id == worktree_id { + if let Some(server) = self.language_servers.get(server_id) { + if let LanguageServerState::Running { server, .. } = server { + server + .notify::( + lsp::DidChangeWatchedFilesParams { + changes: changes + .iter() + .map(|(path, change)| lsp::FileEvent { + uri: lsp::Url::from_file_path(abs_path.join(path)) + .unwrap(), + typ: match change { + PathChange::Added => lsp::FileChangeType::CREATED, + PathChange::Removed => lsp::FileChangeType::DELETED, + PathChange::Updated => lsp::FileChangeType::CHANGED, + }, + }) + .collect(), + }, + ) + .log_err(); + } + } + } + } + } + fn update_local_worktree_buffers_git_repos( &mut self, worktree: ModelHandle, diff --git a/crates/project/src/project_tests.rs b/crates/project/src/project_tests.rs index c0b72cf5b69ab8d2109f085fd29d6d135f6b6a7a..61f207c45a5ac3111cf8db74d779a68a160a3443 100644 --- a/crates/project/src/project_tests.rs +++ b/crates/project/src/project_tests.rs @@ -509,14 +509,14 @@ async fn test_reporting_fs_changes_to_language_servers(cx: &mut gpui::TestAppCon assert_eq!( &*file_changes.lock(), &[ + lsp::FileEvent { + uri: lsp::Url::from_file_path("/the-root/b.rs").unwrap(), + typ: lsp::FileChangeType::DELETED, + }, lsp::FileEvent { uri: lsp::Url::from_file_path("/the-root/c.rs").unwrap(), typ: lsp::FileChangeType::CREATED, }, - lsp::FileEvent { - uri: lsp::Url::from_file_path("/the-root/b.rs").unwrap(), - typ: lsp::FileChangeType::DELETED, - } ] ); } diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 59a98bdcfa9915046b964b19c398024d08ab7643..f0bf81e49ee79ff0e5729e311483492938764386 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -33,7 +33,6 @@ use postage::{ prelude::{Sink as _, Stream as _}, watch, }; - use smol::channel::{self, Sender}; use std::{ any::Any, @@ -65,6 +64,7 @@ pub enum Worktree { pub struct LocalWorktree { snapshot: LocalSnapshot, background_snapshot: Arc>, + background_changes: Arc, PathChange>>>, last_scan_state_rx: watch::Receiver, _background_scanner_task: Option>, poll_task: Option>, @@ -175,7 +175,7 @@ struct ShareState { } pub enum Event { - UpdatedEntries, + UpdatedEntries(HashMap, PathChange>), UpdatedGitRepositories(Vec), } @@ -198,11 +198,17 @@ impl Worktree { let tree = tree.as_local_mut().unwrap(); let abs_path = tree.abs_path().clone(); let background_snapshot = tree.background_snapshot.clone(); + let background_changes = tree.background_changes.clone(); let background = cx.background().clone(); tree._background_scanner_task = Some(cx.background().spawn(async move { let events = fs.watch(&abs_path, Duration::from_millis(100)).await; - let scanner = - BackgroundScanner::new(background_snapshot, scan_states_tx, fs, background); + let scanner = BackgroundScanner::new( + background_snapshot, + background_changes, + scan_states_tx, + fs, + background, + ); scanner.run(events).await; })); }); @@ -451,6 +457,7 @@ impl LocalWorktree { let tree = Self { snapshot: snapshot.clone(), background_snapshot: Arc::new(Mutex::new(snapshot)), + background_changes: Arc::new(Mutex::new(HashMap::default())), last_scan_state_rx, _background_scanner_task: None, share: None, @@ -563,6 +570,7 @@ impl LocalWorktree { match self.scan_state() { ScanState::Idle => { let new_snapshot = self.background_snapshot.lock().clone(); + let changes = mem::take(&mut *self.background_changes.lock()); let updated_repos = Self::changed_repos( &self.snapshot.git_repositories, &new_snapshot.git_repositories, @@ -573,7 +581,7 @@ impl LocalWorktree { *share.snapshots_tx.borrow_mut() = self.snapshot.clone(); } - cx.emit(Event::UpdatedEntries); + cx.emit(Event::UpdatedEntries(changes)); if !updated_repos.is_empty() { cx.emit(Event::UpdatedGitRepositories(updated_repos)); @@ -602,7 +610,7 @@ impl LocalWorktree { } })); - cx.emit(Event::UpdatedEntries); + cx.emit(Event::UpdatedEntries(Default::default())); if !updated_repos.is_empty() { cx.emit(Event::UpdatedGitRepositories(updated_repos)); @@ -994,15 +1002,26 @@ impl LocalWorktree { let inserted_entry; { let mut snapshot = this.background_snapshot.lock(); + let mut changes = this.background_changes.lock(); let mut entry = Entry::new(path, &metadata, &next_entry_id, root_char_bag); entry.is_ignored = snapshot .ignore_stack_for_abs_path(&abs_path, entry.is_dir()) .is_abs_path_ignored(&abs_path, entry.is_dir()); if let Some(old_path) = old_path { snapshot.remove_path(&old_path); + changes.insert(old_path.clone(), PathChange::Removed); } snapshot.scan_started(); + let exists = snapshot.entry_for_path(&entry.path).is_some(); inserted_entry = snapshot.insert_entry(entry, fs.as_ref()); + changes.insert( + inserted_entry.path.clone(), + if exists { + PathChange::Updated + } else { + PathChange::Added + }, + ); snapshot.scan_completed(); } this.poll_snapshot(true, cx); @@ -1111,7 +1130,7 @@ impl RemoteWorktree { fn poll_snapshot(&mut self, cx: &mut ModelContext) { self.snapshot = self.background_snapshot.lock().clone(); - cx.emit(Event::UpdatedEntries); + cx.emit(Event::UpdatedEntries(Default::default())); cx.notify(); } @@ -2048,6 +2067,13 @@ pub enum EntryKind { File(CharBag), } +#[derive(Clone, Copy, Debug)] +pub enum PathChange { + Added, + Removed, + Updated, +} + impl Entry { fn new( path: Arc, @@ -2206,6 +2232,7 @@ impl<'a> sum_tree::Dimension<'a, EntrySummary> for PathKey { struct BackgroundScanner { fs: Arc, snapshot: Arc>, + changes: Arc, PathChange>>>, notify: UnboundedSender, executor: Arc, } @@ -2213,6 +2240,7 @@ struct BackgroundScanner { impl BackgroundScanner { fn new( snapshot: Arc>, + changes: Arc, PathChange>>>, notify: UnboundedSender, fs: Arc, executor: Arc, @@ -2220,6 +2248,7 @@ impl BackgroundScanner { Self { fs, snapshot, + changes, notify, executor, } @@ -2486,12 +2515,14 @@ impl BackgroundScanner { let root_char_bag; let root_abs_path; let next_entry_id; + let prev_snapshot; { let mut snapshot = self.snapshot.lock(); - snapshot.scan_started(); + prev_snapshot = snapshot.snapshot.clone(); root_char_bag = snapshot.root_char_bag; root_abs_path = snapshot.abs_path.clone(); next_entry_id = snapshot.next_entry_id.clone(); + snapshot.scan_started(); } let root_canonical_path = if let Ok(path) = self.fs.canonicalize(&root_abs_path).await { @@ -2510,6 +2541,7 @@ impl BackgroundScanner { // Hold the snapshot lock while clearing and re-inserting the root entries // for each event. This way, the snapshot is not observable to the foreground // thread while this operation is in-progress. + let mut event_paths = Vec::with_capacity(events.len()); let (scan_queue_tx, scan_queue_rx) = channel::unbounded(); { let mut snapshot = self.snapshot.lock(); @@ -2531,6 +2563,7 @@ impl BackgroundScanner { continue; } }; + event_paths.push(path.clone()); let abs_path = root_abs_path.join(&path); match metadata { @@ -2599,6 +2632,7 @@ impl BackgroundScanner { self.update_ignore_statuses().await; self.update_git_repositories(); + self.build_change_set(prev_snapshot, event_paths); self.snapshot.lock().scan_completed(); true } @@ -2714,6 +2748,60 @@ impl BackgroundScanner { snapshot.entries_by_path.edit(entries_by_path_edits, &()); snapshot.entries_by_id.edit(entries_by_id_edits, &()); } + + fn build_change_set(&self, old_snapshot: Snapshot, event_paths: Vec>) { + let new_snapshot = self.snapshot.lock(); + let mut old_paths = old_snapshot.entries_by_path.cursor::(); + let mut new_paths = new_snapshot.entries_by_path.cursor::(); + + let mut change_set = self.changes.lock(); + for path in event_paths { + let path = PathKey(path); + old_paths.seek(&path, Bias::Left, &()); + new_paths.seek(&path, Bias::Left, &()); + + loop { + match (old_paths.item(), new_paths.item()) { + (Some(old_entry), Some(new_entry)) => { + if old_entry.path > path.0 + && new_entry.path > path.0 + && !old_entry.path.starts_with(&path.0) + && !new_entry.path.starts_with(&path.0) + { + break; + } + + match Ord::cmp(&old_entry.path, &new_entry.path) { + Ordering::Less => { + change_set.insert(old_entry.path.clone(), PathChange::Removed); + old_paths.next(&()); + } + Ordering::Equal => { + if old_entry.mtime != new_entry.mtime { + change_set.insert(old_entry.path.clone(), PathChange::Updated); + } + old_paths.next(&()); + new_paths.next(&()); + } + Ordering::Greater => { + change_set.insert(new_entry.path.clone(), PathChange::Added); + new_paths.next(&()); + } + } + } + (Some(old_entry), None) => { + change_set.insert(old_entry.path.clone(), PathChange::Removed); + old_paths.next(&()); + } + (None, Some(new_entry)) => { + change_set.insert(new_entry.path.clone(), PathChange::Added); + new_paths.next(&()); + } + (None, None) => break, + } + } + } + } } fn char_bag_for_path(root_char_bag: CharBag, path: &Path) -> CharBag { @@ -3500,6 +3588,7 @@ mod tests { ); let mut scanner = BackgroundScanner::new( Arc::new(Mutex::new(initial_snapshot.clone())), + Arc::new(Mutex::new(HashMap::default())), notify_tx, fs.clone(), Arc::new(gpui::executor::Background::new()), @@ -3533,6 +3622,7 @@ mod tests { let (notify_tx, _notify_rx) = mpsc::unbounded(); let mut new_scanner = BackgroundScanner::new( Arc::new(Mutex::new(initial_snapshot)), + Arc::new(Mutex::new(HashMap::default())), notify_tx, scanner.fs.clone(), scanner.executor.clone(), From be5868e1c041cdc5286a5ef5ed9b8349738a0e8b Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 13 Mar 2023 18:12:58 -0700 Subject: [PATCH 03/20] Conservatively report fs events that occurred during initial worktree scan Co-authored-by: Nathan Sobo --- crates/project/src/project.rs | 5 ++- crates/project/src/worktree.rs | 60 +++++++++++++++++++++++++--------- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 9e87b0b1bd939015542cd4acaa0860e12255d9a6..0c992486fa369e19f9752419e181e77fe8fcb02a 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -4604,7 +4604,10 @@ impl Project { typ: match change { PathChange::Added => lsp::FileChangeType::CREATED, PathChange::Removed => lsp::FileChangeType::DELETED, - PathChange::Updated => lsp::FileChangeType::CHANGED, + PathChange::Updated + | PathChange::AddedOrUpdated => { + lsp::FileChangeType::CHANGED + } }, }) .collect(), diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index f0bf81e49ee79ff0e5729e311483492938764386..0d3e3b416b03b9d513af047b4e763f8feb880967 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -610,8 +610,6 @@ impl LocalWorktree { } })); - cx.emit(Event::UpdatedEntries(Default::default())); - if !updated_repos.is_empty() { cx.emit(Event::UpdatedGitRepositories(updated_repos)); } @@ -2072,6 +2070,7 @@ pub enum PathChange { Added, Removed, Updated, + AddedOrUpdated, } impl Entry { @@ -2283,21 +2282,37 @@ impl BackgroundScanner { futures::pin_mut!(events_rx); - while let Some(mut events) = events_rx.next().await { + // Process any events that occurred while performing the initial scan. These + // events can't be reported as precisely, because there is no snapshot of the + // worktree before they occurred. + if let Some(mut events) = events_rx.next().await { while let Poll::Ready(Some(additional_events)) = futures::poll!(events_rx.next()) { events.extend(additional_events); } - if self.notify.unbounded_send(ScanState::Updating).is_err() { - break; + return; } - - if !self.process_events(events).await { - break; + if !self.process_events(events, true).await { + return; + } + if self.notify.unbounded_send(ScanState::Idle).is_err() { + return; } + } + // Continue processing events until the worktree is dropped. + while let Some(mut events) = events_rx.next().await { + while let Poll::Ready(Some(additional_events)) = futures::poll!(events_rx.next()) { + events.extend(additional_events); + } + if self.notify.unbounded_send(ScanState::Updating).is_err() { + return; + } + if !self.process_events(events, false).await { + return; + } if self.notify.unbounded_send(ScanState::Idle).is_err() { - break; + return; } } } @@ -2508,7 +2523,11 @@ impl BackgroundScanner { Ok(()) } - async fn process_events(&mut self, mut events: Vec) -> bool { + async fn process_events( + &mut self, + mut events: Vec, + received_before_initialized: bool, + ) -> bool { events.sort_unstable_by(|a, b| a.path.cmp(&b.path)); events.dedup_by(|a, b| a.path.starts_with(&b.path)); @@ -2632,7 +2651,7 @@ impl BackgroundScanner { self.update_ignore_statuses().await; self.update_git_repositories(); - self.build_change_set(prev_snapshot, event_paths); + self.build_change_set(prev_snapshot, event_paths, received_before_initialized); self.snapshot.lock().scan_completed(); true } @@ -2749,7 +2768,12 @@ impl BackgroundScanner { snapshot.entries_by_id.edit(entries_by_id_edits, &()); } - fn build_change_set(&self, old_snapshot: Snapshot, event_paths: Vec>) { + fn build_change_set( + &self, + old_snapshot: Snapshot, + event_paths: Vec>, + received_before_initialized: bool, + ) { let new_snapshot = self.snapshot.lock(); let mut old_paths = old_snapshot.entries_by_path.cursor::(); let mut new_paths = new_snapshot.entries_by_path.cursor::(); @@ -2777,7 +2801,13 @@ impl BackgroundScanner { old_paths.next(&()); } Ordering::Equal => { - if old_entry.mtime != new_entry.mtime { + if received_before_initialized { + // If the worktree was not fully initialized when this event was generated, + // we can't know whether this entry was added during the scan or whether + // it was merely updated. + change_set + .insert(old_entry.path.clone(), PathChange::AddedOrUpdated); + } else if old_entry.mtime != new_entry.mtime { change_set.insert(old_entry.path.clone(), PathChange::Updated); } old_paths.next(&()); @@ -3604,7 +3634,7 @@ mod tests { let len = rng.gen_range(0..=events.len()); let to_deliver = events.drain(0..len).collect::>(); log::info!("Delivering events: {:#?}", to_deliver); - smol::block_on(scanner.process_events(to_deliver)); + smol::block_on(scanner.process_events(to_deliver, false)); scanner.snapshot().check_invariants(); } else { events.extend(randomly_mutate_tree(root_dir.path(), 0.6, &mut rng).unwrap()); @@ -3616,7 +3646,7 @@ mod tests { } } log::info!("Quiescing: {:#?}", events); - smol::block_on(scanner.process_events(events)); + smol::block_on(scanner.process_events(events, false)); scanner.snapshot().check_invariants(); let (notify_tx, _notify_rx) = mpsc::unbounded(); From c730dca3c5e06eec2d8079bd020e8c48833cb8e2 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 14 Mar 2023 10:45:37 -0700 Subject: [PATCH 04/20] Update worktree randomized test to use worktree's public interface and the fake fs --- Cargo.lock | 2 + crates/fs/src/fs.rs | 36 +++- crates/project/Cargo.toml | 2 + crates/project/src/project_tests.rs | 8 + crates/project/src/worktree.rs | 306 ++++++++++++++-------------- 5 files changed, 193 insertions(+), 161 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8990500c567c347921cc98586ec70fea7b9af886..ed799521d6fdd93e0a10e45233c72f610d7ba399 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4625,7 +4625,9 @@ dependencies = [ "client", "clock", "collections", + "ctor", "db", + "env_logger", "fs", "fsevent", "futures 0.3.25", diff --git a/crates/fs/src/fs.rs b/crates/fs/src/fs.rs index f640f35036d3ff3a26566f2058e22cf64d7efa27..fd713ef3b552be734d5ea3813e647a235f7cdd9b 100644 --- a/crates/fs/src/fs.rs +++ b/crates/fs/src/fs.rs @@ -380,6 +380,8 @@ struct FakeFsState { next_inode: u64, next_mtime: SystemTime, event_txs: Vec>>, + events_paused: bool, + buffered_events: Vec, } #[cfg(any(test, feature = "test-support"))] @@ -483,15 +485,21 @@ impl FakeFsState { I: IntoIterator, T: Into, { - let events = paths - .into_iter() - .map(|path| fsevent::Event { + self.buffered_events + .extend(paths.into_iter().map(|path| fsevent::Event { event_id: 0, flags: fsevent::StreamFlags::empty(), path: path.into(), - }) - .collect::>(); + })); + + if !self.events_paused { + self.flush_events(self.buffered_events.len()); + } + } + fn flush_events(&mut self, mut count: usize) { + count = count.min(self.buffered_events.len()); + let events = self.buffered_events.drain(0..count).collect::>(); self.event_txs.retain(|tx| { let _ = tx.try_send(events.clone()); !tx.is_closed() @@ -514,6 +522,8 @@ impl FakeFs { next_mtime: SystemTime::UNIX_EPOCH, next_inode: 1, event_txs: Default::default(), + buffered_events: Vec::new(), + events_paused: false, }), }) } @@ -567,6 +577,18 @@ impl FakeFs { state.emit_event(&[path]); } + pub async fn pause_events(&self) { + self.state.lock().await.events_paused = true; + } + + pub async fn buffered_event_count(&self) -> usize { + self.state.lock().await.buffered_events.len() + } + + pub async fn flush_events(&self, count: usize) { + self.state.lock().await.flush_events(count); + } + #[must_use] pub fn insert_tree<'a>( &'a self, @@ -868,7 +890,7 @@ impl Fs for FakeFs { .ok_or_else(|| anyhow!("cannot remove the root"))?; let base_name = path.file_name().unwrap(); - let state = self.state.lock().await; + let mut state = self.state.lock().await; let parent_entry = state.read_path(parent_path).await?; let mut parent_entry = parent_entry.lock().await; let entry = parent_entry @@ -892,7 +914,7 @@ impl Fs for FakeFs { e.remove(); } } - + state.emit_event(&[path]); Ok(()) } diff --git a/crates/project/Cargo.toml b/crates/project/Cargo.toml index 89ed5563abef6d9cccf605e2efded09cdaf9250e..be100b2e87bc424e60e99fb10780d7ac2748b7f7 100644 --- a/crates/project/Cargo.toml +++ b/crates/project/Cargo.toml @@ -58,6 +58,8 @@ thiserror = "1.0.29" toml = "0.5" [dev-dependencies] +ctor = "0.1" +env_logger = "0.9" pretty_assertions = "1.3.0" client = { path = "../client", features = ["test-support"] } collections = { path = "../collections", features = ["test-support"] } diff --git a/crates/project/src/project_tests.rs b/crates/project/src/project_tests.rs index 61f207c45a5ac3111cf8db74d779a68a160a3443..383c1b5c470d32dbee8898cf31bafd3f6b3cff9e 100644 --- a/crates/project/src/project_tests.rs +++ b/crates/project/src/project_tests.rs @@ -14,6 +14,14 @@ use std::{cell::RefCell, os::unix, rc::Rc, task::Poll}; use unindent::Unindent as _; use util::{assert_set_eq, test::temp_tree}; +#[cfg(test)] +#[ctor::ctor] +fn init_logger() { + if std::env::var("RUST_LOG").is_ok() { + env_logger::init(); + } +} + #[gpui::test] async fn test_symlinks(cx: &mut gpui::TestAppContext) { let dir = temp_tree(json!({ diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 0d3e3b416b03b9d513af047b4e763f8feb880967..7250de9a683a5b02a2122ac484d43f7ae9618332 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -2257,10 +2257,6 @@ impl BackgroundScanner { self.snapshot.lock().abs_path.clone() } - fn snapshot(&self) -> LocalSnapshot { - self.snapshot.lock().clone() - } - async fn run(mut self, events_rx: impl Stream>) { if self.notify.unbounded_send(ScanState::Initializing).is_err() { return; @@ -2657,8 +2653,7 @@ impl BackgroundScanner { } async fn update_ignore_statuses(&self) { - let mut snapshot = self.snapshot(); - + let mut snapshot = self.snapshot.lock().clone(); let mut ignores_to_update = Vec::new(); let mut ignores_to_delete = Vec::new(); for (parent_abs_path, (_, scan_id)) in &snapshot.ignores_by_parent_abs_path { @@ -3115,19 +3110,13 @@ impl<'a> TryFrom<(&'a CharBag, proto::Entry)> for Entry { #[cfg(test)] mod tests { use super::*; - use anyhow::Result; use client::test::FakeHttpClient; use fs::repository::FakeGitRepository; use fs::{FakeFs, RealFs}; use gpui::{executor::Deterministic, TestAppContext}; use rand::prelude::*; use serde_json::json; - use std::{ - env, - fmt::Write, - time::{SystemTime, UNIX_EPOCH}, - }; - + use std::{env, fmt::Write}; use util::test::temp_tree; #[gpui::test] @@ -3572,7 +3561,7 @@ mod tests { } #[gpui::test(iterations = 100)] - fn test_random(mut rng: StdRng) { + async fn test_random_worktree_changes(cx: &mut TestAppContext, mut rng: StdRng) { let operations = env::var("OPERATIONS") .map(|o| o.parse().unwrap()) .unwrap_or(40); @@ -3580,90 +3569,80 @@ mod tests { .map(|o| o.parse().unwrap()) .unwrap_or(20); - let root_dir = tempdir::TempDir::new("worktree-test").unwrap(); + let root_dir = Path::new("/test"); + let fs = FakeFs::new(cx.background()) as Arc; + fs.as_fake().insert_tree(root_dir, json!({})).await; for _ in 0..initial_entries { - randomly_mutate_tree(root_dir.path(), 1.0, &mut rng).unwrap(); - } - log::info!("Generated initial tree"); - - let (notify_tx, _notify_rx) = mpsc::unbounded(); - let fs = Arc::new(RealFs); - let next_entry_id = Arc::new(AtomicUsize::new(0)); - let mut initial_snapshot = LocalSnapshot { - removed_entry_ids: Default::default(), - ignores_by_parent_abs_path: Default::default(), - git_repositories: Default::default(), - next_entry_id: next_entry_id.clone(), - snapshot: Snapshot { - id: WorktreeId::from_usize(0), - entries_by_path: Default::default(), - entries_by_id: Default::default(), - abs_path: root_dir.path().into(), - root_name: Default::default(), - root_char_bag: Default::default(), - scan_id: 0, - completed_scan_id: 0, - }, - }; - initial_snapshot.insert_entry( - Entry::new( - Path::new("").into(), - &smol::block_on(fs.metadata(root_dir.path())) - .unwrap() - .unwrap(), - &next_entry_id, - Default::default(), - ), - fs.as_ref(), - ); - let mut scanner = BackgroundScanner::new( - Arc::new(Mutex::new(initial_snapshot.clone())), - Arc::new(Mutex::new(HashMap::default())), - notify_tx, + randomly_mutate_tree(&fs, root_dir, 1.0, &mut rng).await; + } + log::info!("generated initial tree"); + + let next_entry_id = Arc::new(AtomicUsize::default()); + let client = cx.read(|cx| Client::new(FakeHttpClient::with_404_response(), cx)); + let worktree = Worktree::local( + client.clone(), + root_dir, + true, fs.clone(), - Arc::new(gpui::executor::Background::new()), - ); - smol::block_on(scanner.scan_dirs()).unwrap(); - scanner.snapshot().check_invariants(); + next_entry_id.clone(), + &mut cx.to_async(), + ) + .await + .unwrap(); + + worktree + .update(cx, |tree, _| tree.as_local_mut().unwrap().scan_complete()) + .await; - let mut events = Vec::new(); let mut snapshots = Vec::new(); let mut mutations_len = operations; while mutations_len > 1 { - if !events.is_empty() && rng.gen_bool(0.4) { - let len = rng.gen_range(0..=events.len()); - let to_deliver = events.drain(0..len).collect::>(); - log::info!("Delivering events: {:#?}", to_deliver); - smol::block_on(scanner.process_events(to_deliver, false)); - scanner.snapshot().check_invariants(); + randomly_mutate_tree(&fs, root_dir, 1.0, &mut rng).await; + let buffered_event_count = fs.as_fake().buffered_event_count().await; + if buffered_event_count > 0 && rng.gen_bool(0.3) { + let len = rng.gen_range(0..=buffered_event_count); + log::info!("flushing {} events", len); + fs.as_fake().flush_events(len).await; } else { - events.extend(randomly_mutate_tree(root_dir.path(), 0.6, &mut rng).unwrap()); + randomly_mutate_tree(&fs, root_dir, 0.6, &mut rng).await; mutations_len -= 1; } + cx.foreground().run_until_parked(); if rng.gen_bool(0.2) { - snapshots.push(scanner.snapshot()); + log::info!("storing snapshot {}", snapshots.len()); + let snapshot = + worktree.read_with(cx, |tree, _| tree.as_local().unwrap().snapshot()); + snapshots.push(snapshot); } } - log::info!("Quiescing: {:#?}", events); - smol::block_on(scanner.process_events(events, false)); - scanner.snapshot().check_invariants(); - let (notify_tx, _notify_rx) = mpsc::unbounded(); - let mut new_scanner = BackgroundScanner::new( - Arc::new(Mutex::new(initial_snapshot)), - Arc::new(Mutex::new(HashMap::default())), - notify_tx, - scanner.fs.clone(), - scanner.executor.clone(), - ); - smol::block_on(new_scanner.scan_dirs()).unwrap(); - assert_eq!( - scanner.snapshot().to_vec(true), - new_scanner.snapshot().to_vec(true) - ); + log::info!("quiescing"); + fs.as_fake().flush_events(usize::MAX).await; + cx.foreground().run_until_parked(); + let snapshot = worktree.read_with(cx, |tree, _| tree.as_local().unwrap().snapshot()); + snapshot.check_invariants(); - for mut prev_snapshot in snapshots { + { + let new_worktree = Worktree::local( + client.clone(), + root_dir, + true, + fs.clone(), + next_entry_id, + &mut cx.to_async(), + ) + .await + .unwrap(); + new_worktree + .update(cx, |tree, _| tree.as_local_mut().unwrap().scan_complete()) + .await; + let new_snapshot = + new_worktree.read_with(cx, |tree, _| tree.as_local().unwrap().snapshot()); + assert_eq!(snapshot.to_vec(true), new_snapshot.to_vec(true)); + } + + for (i, mut prev_snapshot) in snapshots.into_iter().enumerate() { let include_ignored = rng.gen::(); if !include_ignored { let mut entries_by_path_edits = Vec::new(); @@ -3683,54 +3662,66 @@ mod tests { prev_snapshot.entries_by_id.edit(entries_by_id_edits, &()); } - let update = scanner - .snapshot() - .build_update(&prev_snapshot, 0, 0, include_ignored); - prev_snapshot.apply_remote_update(update).unwrap(); + let update = snapshot.build_update(&prev_snapshot, 0, 0, include_ignored); + prev_snapshot.apply_remote_update(update.clone()).unwrap(); assert_eq!( - prev_snapshot.to_vec(true), - scanner.snapshot().to_vec(include_ignored) + prev_snapshot.to_vec(include_ignored), + snapshot.to_vec(include_ignored), + "wrong update for snapshot {i}. update: {:?}", + update ); } } - fn randomly_mutate_tree( + async fn randomly_mutate_tree( + fs: &Arc, root_path: &Path, insertion_probability: f64, rng: &mut impl Rng, - ) -> Result> { - let root_path = root_path.canonicalize().unwrap(); - let (dirs, files) = read_dir_recursive(root_path.clone()); - - let mut events = Vec::new(); - let mut record_event = |path: PathBuf| { - events.push(fsevent::Event { - event_id: SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_secs(), - flags: fsevent::StreamFlags::empty(), - path, - }); - }; + ) { + let mut files = Vec::new(); + let mut dirs = Vec::new(); + for path in fs.as_fake().paths().await { + if path.starts_with(root_path) { + if fs.is_file(&path).await { + files.push(path); + } else { + dirs.push(path); + } + } + } if (files.is_empty() && dirs.len() == 1) || rng.gen_bool(insertion_probability) { let path = dirs.choose(rng).unwrap(); let new_path = path.join(gen_name(rng)); if rng.gen() { - log::info!("Creating dir {:?}", new_path.strip_prefix(root_path)?); - std::fs::create_dir(&new_path)?; + log::info!( + "Creating dir {:?}", + new_path.strip_prefix(root_path).unwrap() + ); + fs.create_dir(&new_path).await.unwrap(); } else { - log::info!("Creating file {:?}", new_path.strip_prefix(root_path)?); - std::fs::write(&new_path, "")?; + log::info!( + "Creating file {:?}", + new_path.strip_prefix(root_path).unwrap() + ); + fs.create_file(&new_path, Default::default()).await.unwrap(); } - record_event(new_path); } else if rng.gen_bool(0.05) { let ignore_dir_path = dirs.choose(rng).unwrap(); let ignore_path = ignore_dir_path.join(&*GITIGNORE); - let (subdirs, subfiles) = read_dir_recursive(ignore_dir_path.clone()); + let subdirs = dirs + .iter() + .filter(|d| d.starts_with(&ignore_dir_path)) + .cloned() + .collect::>(); + let subfiles = files + .iter() + .filter(|d| d.starts_with(&ignore_dir_path)) + .cloned() + .collect::>(); let files_to_ignore = { let len = rng.gen_range(0..=subfiles.len()); subfiles.choose_multiple(rng, len) @@ -3746,7 +3737,8 @@ mod tests { ignore_contents, "{}", path_to_ignore - .strip_prefix(&ignore_dir_path)? + .strip_prefix(&ignore_dir_path) + .unwrap() .to_str() .unwrap() ) @@ -3754,11 +3746,16 @@ mod tests { } log::info!( "Creating {:?} with contents:\n{}", - ignore_path.strip_prefix(&root_path)?, + ignore_path.strip_prefix(&root_path).unwrap(), ignore_contents ); - std::fs::write(&ignore_path, ignore_contents).unwrap(); - record_event(ignore_path); + fs.save( + &ignore_path, + &ignore_contents.as_str().into(), + Default::default(), + ) + .await + .unwrap(); } else { let old_path = { let file_path = files.choose(rng); @@ -3777,7 +3774,15 @@ mod tests { let overwrite_existing_dir = !old_path.starts_with(&new_path_parent) && rng.gen_bool(0.3); let new_path = if overwrite_existing_dir { - std::fs::remove_dir_all(&new_path_parent).ok(); + fs.remove_dir( + &new_path_parent, + RemoveOptions { + recursive: true, + ignore_if_not_exists: true, + }, + ) + .await + .unwrap(); new_path_parent.to_path_buf() } else { new_path_parent.join(gen_name(rng)) @@ -3785,53 +3790,46 @@ mod tests { log::info!( "Renaming {:?} to {}{:?}", - old_path.strip_prefix(&root_path)?, + old_path.strip_prefix(&root_path).unwrap(), if overwrite_existing_dir { "overwrite " } else { "" }, - new_path.strip_prefix(&root_path)? + new_path.strip_prefix(&root_path).unwrap() ); - std::fs::rename(&old_path, &new_path)?; - record_event(old_path.clone()); - record_event(new_path); - } else if old_path.is_dir() { - let (dirs, files) = read_dir_recursive(old_path.clone()); - - log::info!("Deleting dir {:?}", old_path.strip_prefix(&root_path)?); - std::fs::remove_dir_all(&old_path).unwrap(); - for file in files { - record_event(file); - } - for dir in dirs { - record_event(dir); - } - } else { - log::info!("Deleting file {:?}", old_path.strip_prefix(&root_path)?); - std::fs::remove_file(old_path).unwrap(); - record_event(old_path.clone()); - } - } - - Ok(events) - } - - fn read_dir_recursive(path: PathBuf) -> (Vec, Vec) { - let child_entries = std::fs::read_dir(&path).unwrap(); - let mut dirs = vec![path]; - let mut files = Vec::new(); - for child_entry in child_entries { - let child_path = child_entry.unwrap().path(); - if child_path.is_dir() { - let (child_dirs, child_files) = read_dir_recursive(child_path); - dirs.extend(child_dirs); - files.extend(child_files); + fs.rename( + &old_path, + &new_path, + fs::RenameOptions { + overwrite: true, + ignore_if_exists: true, + }, + ) + .await + .unwrap(); + } else if fs.is_file(&old_path).await { + log::info!( + "Deleting file {:?}", + old_path.strip_prefix(&root_path).unwrap() + ); + fs.remove_file(old_path, Default::default()).await.unwrap(); } else { - files.push(child_path); + log::info!( + "Deleting dir {:?}", + old_path.strip_prefix(&root_path).unwrap() + ); + fs.remove_dir( + &old_path, + RemoveOptions { + recursive: true, + ignore_if_not_exists: true, + }, + ) + .await + .unwrap(); } } - (dirs, files) } fn gen_name(rng: &mut impl Rng) -> String { From 27ad6a57ce10f831bfc4d6611bb98de58bc7f68f Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 20 Mar 2023 13:10:52 -0700 Subject: [PATCH 05/20] Tweak logging in worktree randomized test --- crates/project/src/worktree.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 7250de9a683a5b02a2122ac484d43f7ae9618332..06bd49fbaf5e4009ac9f7f62244b107ff6e8aa32 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -3697,13 +3697,13 @@ mod tests { if rng.gen() { log::info!( - "Creating dir {:?}", + "creating dir {:?}", new_path.strip_prefix(root_path).unwrap() ); fs.create_dir(&new_path).await.unwrap(); } else { log::info!( - "Creating file {:?}", + "creating file {:?}", new_path.strip_prefix(root_path).unwrap() ); fs.create_file(&new_path, Default::default()).await.unwrap(); @@ -3745,7 +3745,7 @@ mod tests { .unwrap(); } log::info!( - "Creating {:?} with contents:\n{}", + "creating gitignore {:?} with contents:\n{}", ignore_path.strip_prefix(&root_path).unwrap(), ignore_contents ); @@ -3789,7 +3789,7 @@ mod tests { }; log::info!( - "Renaming {:?} to {}{:?}", + "renaming {:?} to {}{:?}", old_path.strip_prefix(&root_path).unwrap(), if overwrite_existing_dir { "overwrite " @@ -3810,13 +3810,13 @@ mod tests { .unwrap(); } else if fs.is_file(&old_path).await { log::info!( - "Deleting file {:?}", + "deleting file {:?}", old_path.strip_prefix(&root_path).unwrap() ); fs.remove_file(old_path, Default::default()).await.unwrap(); } else { log::info!( - "Deleting dir {:?}", + "deleting dir {:?}", old_path.strip_prefix(&root_path).unwrap() ); fs.remove_dir( From 51b093197dea8a1a97ed271f881fa10adf4fd121 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 20 Mar 2023 13:13:25 -0700 Subject: [PATCH 06/20] Add missing import in project tests --- crates/project/src/project_tests.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/project/src/project_tests.rs b/crates/project/src/project_tests.rs index 383c1b5c470d32dbee8898cf31bafd3f6b3cff9e..360e4d0c896d52f7b97c5466b97717ce28f9f087 100644 --- a/crates/project/src/project_tests.rs +++ b/crates/project/src/project_tests.rs @@ -8,6 +8,7 @@ use language::{ OffsetRangeExt, Point, ToPoint, }; use lsp::Url; +use parking_lot::Mutex; use pretty_assertions::assert_eq; use serde_json::json; use std::{cell::RefCell, os::unix, rc::Rc, task::Poll}; From 399f082415c7e80432be93caff0323d0866c3789 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 20 Mar 2023 14:20:47 -0700 Subject: [PATCH 07/20] Update wrong assertions after fixing missing event in FakeFs --- crates/collab/src/tests/integration_tests.rs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/crates/collab/src/tests/integration_tests.rs b/crates/collab/src/tests/integration_tests.rs index c04deca9e5bc07ff1f3b45c35812472499ff0977..82b542cb6b2d70a65a2151010fab85b056050336 100644 --- a/crates/collab/src/tests/integration_tests.rs +++ b/crates/collab/src/tests/integration_tests.rs @@ -1744,10 +1744,6 @@ async fn test_project_reconnect( vec![ "a.txt", "b.txt", - "subdir1", - "subdir1/c.txt", - "subdir1/d.txt", - "subdir1/e.txt", "subdir2", "subdir2/f.txt", "subdir2/g.txt", @@ -1780,10 +1776,6 @@ async fn test_project_reconnect( vec![ "a.txt", "b.txt", - "subdir1", - "subdir1/c.txt", - "subdir1/d.txt", - "subdir1/e.txt", "subdir2", "subdir2/f.txt", "subdir2/g.txt", @@ -1875,10 +1867,6 @@ async fn test_project_reconnect( vec![ "a.txt", "b.txt", - "subdir1", - "subdir1/c.txt", - "subdir1/d.txt", - "subdir1/e.txt", "subdir2", "subdir2/f.txt", "subdir2/g.txt", From d36b2a3129703d3b4913ac1c4abae0cb1f53f7b0 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 20 Mar 2023 15:20:18 -0700 Subject: [PATCH 08/20] :art: Simplify some worktree methods * Consolidate local worktree construction into one method * Simplify remote worktree construction * Reduce indirection around pulling worktree snapshots from the background --- crates/project/src/worktree.rs | 321 +++++++++++++++------------------ 1 file changed, 147 insertions(+), 174 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 06bd49fbaf5e4009ac9f7f62244b107ff6e8aa32..42284f1a1328074c97d333a7fb2c5506e988e303 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -66,7 +66,7 @@ pub struct LocalWorktree { background_snapshot: Arc>, background_changes: Arc, PathChange>>>, last_scan_state_rx: watch::Receiver, - _background_scanner_task: Option>, + _background_scanner_task: Task<()>, poll_task: Option>, share: Option, diagnostics: HashMap, Vec>>>, @@ -192,27 +192,99 @@ impl Worktree { next_entry_id: Arc, cx: &mut AsyncAppContext, ) -> Result> { - let (tree, scan_states_tx) = - LocalWorktree::create(client, path, visible, fs.clone(), next_entry_id, cx).await?; - tree.update(cx, |tree, cx| { - let tree = tree.as_local_mut().unwrap(); - let abs_path = tree.abs_path().clone(); - let background_snapshot = tree.background_snapshot.clone(); - let background_changes = tree.background_changes.clone(); - let background = cx.background().clone(); - tree._background_scanner_task = Some(cx.background().spawn(async move { - let events = fs.watch(&abs_path, Duration::from_millis(100)).await; - let scanner = BackgroundScanner::new( - background_snapshot, - background_changes, - scan_states_tx, - fs, - background, + // After determining whether the root entry is a file or a directory, populate the + // snapshot's "root name", which will be used for the purpose of fuzzy matching. + let abs_path = path.into(); + let metadata = fs + .metadata(&abs_path) + .await + .context("failed to stat worktree path")?; + + Ok(cx.add_model(move |cx: &mut ModelContext| { + let root_name = abs_path + .file_name() + .map_or(String::new(), |f| f.to_string_lossy().to_string()); + + let mut snapshot = LocalSnapshot { + ignores_by_parent_abs_path: Default::default(), + git_repositories: Default::default(), + removed_entry_ids: Default::default(), + next_entry_id, + snapshot: Snapshot { + id: WorktreeId::from_usize(cx.model_id()), + abs_path: abs_path.clone(), + root_name: root_name.clone(), + root_char_bag: root_name.chars().map(|c| c.to_ascii_lowercase()).collect(), + entries_by_path: Default::default(), + entries_by_id: Default::default(), + scan_id: 0, + completed_scan_id: 0, + }, + }; + + if let Some(metadata) = metadata { + snapshot.insert_entry( + Entry::new( + Arc::from(Path::new("")), + &metadata, + &snapshot.next_entry_id, + snapshot.root_char_bag, + ), + fs.as_ref(), ); - scanner.run(events).await; - })); - }); - Ok(tree) + } + + let (scan_states_tx, mut scan_states_rx) = mpsc::unbounded(); + let (mut last_scan_state_tx, last_scan_state_rx) = + watch::channel_with(ScanState::Initializing); + let background_snapshot = Arc::new(Mutex::new(snapshot.clone())); + let background_changes = Arc::new(Mutex::new(HashMap::default())); + + cx.spawn_weak(|this, mut cx| async move { + while let Some(scan_state) = scan_states_rx.next().await { + if let Some(this) = this.upgrade(&cx) { + last_scan_state_tx.blocking_send(scan_state).ok(); + this.update(&mut cx, |this, cx| { + this.as_local_mut().unwrap().poll_snapshot(false, cx) + }); + } else { + break; + } + } + }) + .detach(); + + Worktree::Local(LocalWorktree { + _background_scanner_task: cx.background().spawn({ + let fs = fs.clone(); + let background_snapshot = background_snapshot.clone(); + let background_changes = background_changes.clone(); + let background = cx.background().clone(); + async move { + let events = fs.watch(&abs_path, Duration::from_millis(100)).await; + let scanner = BackgroundScanner::new( + background_snapshot, + background_changes, + scan_states_tx, + fs, + background, + ); + scanner.run(events).await; + } + }), + snapshot, + background_snapshot, + background_changes, + last_scan_state_rx, + share: None, + poll_task: None, + diagnostics: Default::default(), + diagnostic_summaries: Default::default(), + client, + fs, + visible, + }) + })) } pub fn remote( @@ -222,64 +294,48 @@ impl Worktree { client: Arc, cx: &mut MutableAppContext, ) -> ModelHandle { - let remote_id = worktree.id; - let root_char_bag: CharBag = worktree - .root_name - .chars() - .map(|c| c.to_ascii_lowercase()) - .collect(); - let root_name = worktree.root_name.clone(); - let visible = worktree.visible; - - let abs_path = PathBuf::from(worktree.abs_path); - let snapshot = Snapshot { - id: WorktreeId(remote_id as usize), - abs_path: Arc::from(abs_path.deref()), - root_name, - root_char_bag, - entries_by_path: Default::default(), - entries_by_id: Default::default(), - scan_id: 0, - completed_scan_id: 0, - }; - - let (updates_tx, mut updates_rx) = mpsc::unbounded(); - let background_snapshot = Arc::new(Mutex::new(snapshot.clone())); - let (mut snapshot_updated_tx, mut snapshot_updated_rx) = watch::channel(); - let worktree_handle = cx.add_model(|_: &mut ModelContext| { - Worktree::Remote(RemoteWorktree { - project_id: project_remote_id, - replica_id, - snapshot: snapshot.clone(), - background_snapshot: background_snapshot.clone(), - updates_tx: Some(updates_tx), - snapshot_subscriptions: Default::default(), - client: client.clone(), - diagnostic_summaries: Default::default(), - visible, - disconnected: false, - }) - }); + cx.add_model(|cx: &mut ModelContext| { + let snapshot = Snapshot { + id: WorktreeId(worktree.id as usize), + abs_path: Arc::from(PathBuf::from(worktree.abs_path)), + root_name: worktree.root_name.clone(), + root_char_bag: worktree + .root_name + .chars() + .map(|c| c.to_ascii_lowercase()) + .collect(), + entries_by_path: Default::default(), + entries_by_id: Default::default(), + scan_id: 0, + completed_scan_id: 0, + }; - cx.background() - .spawn(async move { - while let Some(update) = updates_rx.next().await { - if let Err(error) = background_snapshot.lock().apply_remote_update(update) { - log::error!("error applying worktree update: {}", error); + let (updates_tx, mut updates_rx) = mpsc::unbounded(); + let background_snapshot = Arc::new(Mutex::new(snapshot.clone())); + let (mut snapshot_updated_tx, mut snapshot_updated_rx) = watch::channel(); + + cx.background() + .spawn({ + let background_snapshot = background_snapshot.clone(); + async move { + while let Some(update) = updates_rx.next().await { + if let Err(error) = + background_snapshot.lock().apply_remote_update(update) + { + log::error!("error applying worktree update: {}", error); + } + snapshot_updated_tx.send(()).await.ok(); + } } - snapshot_updated_tx.send(()).await.ok(); - } - }) - .detach(); + }) + .detach(); - cx.spawn(|mut cx| { - let this = worktree_handle.downgrade(); - async move { + cx.spawn_weak(|this, mut cx| async move { while (snapshot_updated_rx.recv().await).is_some() { if let Some(this) = this.upgrade(&cx) { this.update(&mut cx, |this, cx| { - this.poll_snapshot(cx); let this = this.as_remote_mut().unwrap(); + this.poll_snapshot(cx); while let Some((scan_id, _)) = this.snapshot_subscriptions.front() { if this.observed_snapshot(*scan_id) { let (_, tx) = this.snapshot_subscriptions.pop_front().unwrap(); @@ -293,11 +349,22 @@ impl Worktree { break; } } - } - }) - .detach(); + }) + .detach(); - worktree_handle + Worktree::Remote(RemoteWorktree { + project_id: project_remote_id, + replica_id, + snapshot: snapshot.clone(), + background_snapshot, + updates_tx: Some(updates_tx), + snapshot_subscriptions: Default::default(), + client: client.clone(), + diagnostic_summaries: Default::default(), + visible: worktree.visible, + disconnected: false, + }) + }) } pub fn as_local(&self) -> Option<&LocalWorktree> { @@ -386,13 +453,6 @@ impl Worktree { .map(|(path, summary)| (path.0.clone(), *summary)) } - fn poll_snapshot(&mut self, cx: &mut ModelContext) { - match self { - Self::Local(worktree) => worktree.poll_snapshot(false, cx), - Self::Remote(worktree) => worktree.poll_snapshot(cx), - }; - } - pub fn abs_path(&self) -> Arc { match self { Worktree::Local(worktree) => worktree.abs_path.clone(), @@ -402,91 +462,6 @@ impl Worktree { } impl LocalWorktree { - async fn create( - client: Arc, - path: impl Into>, - visible: bool, - fs: Arc, - next_entry_id: Arc, - cx: &mut AsyncAppContext, - ) -> Result<(ModelHandle, UnboundedSender)> { - let abs_path = path.into(); - let path: Arc = Arc::from(Path::new("")); - - // After determining whether the root entry is a file or a directory, populate the - // snapshot's "root name", which will be used for the purpose of fuzzy matching. - let root_name = abs_path - .file_name() - .map_or(String::new(), |f| f.to_string_lossy().to_string()); - let root_char_bag = root_name.chars().map(|c| c.to_ascii_lowercase()).collect(); - let metadata = fs - .metadata(&abs_path) - .await - .context("failed to stat worktree path")?; - - let (scan_states_tx, mut scan_states_rx) = mpsc::unbounded(); - let (mut last_scan_state_tx, last_scan_state_rx) = - watch::channel_with(ScanState::Initializing); - let tree = cx.add_model(move |cx: &mut ModelContext| { - let mut snapshot = LocalSnapshot { - ignores_by_parent_abs_path: Default::default(), - git_repositories: Default::default(), - removed_entry_ids: Default::default(), - next_entry_id, - snapshot: Snapshot { - id: WorktreeId::from_usize(cx.model_id()), - abs_path, - root_name: root_name.clone(), - root_char_bag, - entries_by_path: Default::default(), - entries_by_id: Default::default(), - scan_id: 0, - completed_scan_id: 0, - }, - }; - if let Some(metadata) = metadata { - let entry = Entry::new( - path, - &metadata, - &snapshot.next_entry_id, - snapshot.root_char_bag, - ); - snapshot.insert_entry(entry, fs.as_ref()); - } - - let tree = Self { - snapshot: snapshot.clone(), - background_snapshot: Arc::new(Mutex::new(snapshot)), - background_changes: Arc::new(Mutex::new(HashMap::default())), - last_scan_state_rx, - _background_scanner_task: None, - share: None, - poll_task: None, - diagnostics: Default::default(), - diagnostic_summaries: Default::default(), - client, - fs, - visible, - }; - - cx.spawn_weak(|this, mut cx| async move { - while let Some(scan_state) = scan_states_rx.next().await { - if let Some(this) = this.upgrade(&cx) { - last_scan_state_tx.blocking_send(scan_state).ok(); - this.update(&mut cx, |this, cx| this.poll_snapshot(cx)); - } else { - break; - } - } - }) - .detach(); - - Worktree::Local(tree) - }); - - Ok((tree, scan_states_tx)) - } - pub fn contains_abs_path(&self, path: &Path) -> bool { path.starts_with(&self.abs_path) } @@ -567,7 +542,7 @@ impl LocalWorktree { fn poll_snapshot(&mut self, force: bool, cx: &mut ModelContext) { self.poll_task.take(); - match self.scan_state() { + match self.last_scan_state_rx.borrow().clone() { ScanState::Idle => { let new_snapshot = self.background_snapshot.lock().clone(); let changes = mem::take(&mut *self.background_changes.lock()); @@ -606,7 +581,9 @@ impl LocalWorktree { smol::Timer::after(Duration::from_millis(100)).await; } if let Some(this) = this.upgrade(&cx) { - this.update(&mut cx, |this, cx| this.poll_snapshot(cx)); + this.update(&mut cx, |this, cx| { + this.as_local_mut().unwrap().poll_snapshot(false, cx) + }); } })); @@ -663,10 +640,6 @@ impl LocalWorktree { } } - fn scan_state(&self) -> ScanState { - self.last_scan_state_rx.borrow().clone() - } - pub fn snapshot(&self) -> LocalSnapshot { self.snapshot.clone() } From cbeb6e692dd5b2e53bc1ef8d8673bf2102e52335 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 20 Mar 2023 17:17:09 -0700 Subject: [PATCH 09/20] Move postage crate version specification to workspace Cargo.toml --- Cargo.toml | 1 + crates/call/Cargo.toml | 2 +- crates/client/Cargo.toml | 2 +- crates/collab_ui/Cargo.toml | 2 +- crates/diagnostics/Cargo.toml | 2 +- crates/editor/Cargo.toml | 2 +- crates/feedback/Cargo.toml | 2 +- crates/file_finder/Cargo.toml | 2 +- crates/go_to_line/Cargo.toml | 2 +- crates/gpui/Cargo.toml | 2 +- crates/language/Cargo.toml | 2 +- crates/live_kit_client/Cargo.toml | 2 +- crates/lsp/Cargo.toml | 2 +- crates/outline/Cargo.toml | 2 +- crates/project/Cargo.toml | 2 +- crates/project_panel/Cargo.toml | 2 +- crates/project_symbols/Cargo.toml | 2 +- crates/recent_projects/Cargo.toml | 2 +- crates/search/Cargo.toml | 2 +- crates/settings/Cargo.toml | 2 +- crates/text/Cargo.toml | 2 +- crates/theme_selector/Cargo.toml | 3 +-- crates/workspace/Cargo.toml | 2 +- crates/zed/Cargo.toml | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index fd713d42421ec9d4349618edf5fb36f0cc6901ee..9f795992d5888d24ef083abe231ed1a4edd1a950 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -71,6 +71,7 @@ serde = { version = "1.0", features = ["derive", "rc"] } serde_derive = { version = "1.0", features = ["deserialize_in_place"] } serde_json = { version = "1.0", features = ["preserve_order", "raw_value"] } rand = { version = "0.8" } +postage = { version = "0.4.1", features = ["futures-traits"] } [patch.crates-io] tree-sitter = { git = "https://github.com/tree-sitter/tree-sitter", rev = "c51896d32dcc11a38e41f36e3deb1a6a9c4f4b14" } diff --git a/crates/call/Cargo.toml b/crates/call/Cargo.toml index 54546adb55d5c26e215a610c3d40a65361d3c1ad..4e738c06510e4a6662969f8d14c32cabef646138 100644 --- a/crates/call/Cargo.toml +++ b/crates/call/Cargo.toml @@ -34,7 +34,7 @@ util = { path = "../util" } anyhow = "1.0.38" async-broadcast = "0.4" futures = "0.3" -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } [dev-dependencies] client = { path = "../client", features = ["test-support"] } diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 6ff66b8ecc4d165cb5dddac2253f85825ea17279..cb6f29a42e5855d8d142c90fcadf5e5d5e5fe1c7 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -27,7 +27,7 @@ isahc = "1.7" lazy_static = "1.4.0" log = { version = "0.4.16", features = ["kv_unstable_serde"] } parking_lot = "0.11.1" -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } rand = "0.8.3" smol = "1.2.5" thiserror = "1.0.29" diff --git a/crates/collab_ui/Cargo.toml b/crates/collab_ui/Cargo.toml index 9b5ca9c1ea9b04995c518a7fd6334a6050de15e2..516a1b4fe4a2ebaa2b5405bbb8a2ca8490039039 100644 --- a/crates/collab_ui/Cargo.toml +++ b/crates/collab_ui/Cargo.toml @@ -42,7 +42,7 @@ workspace = { path = "../workspace" } anyhow = "1.0" futures = "0.3" log = "0.4" -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } serde = { version = "1.0", features = ["derive", "rc"] } serde_derive = { version = "1.0", features = ["deserialize_in_place"] } diff --git a/crates/diagnostics/Cargo.toml b/crates/diagnostics/Cargo.toml index ebb57e0636ae1a6cb97ab6c7753accc553e00404..e28a378a679952bfacdd81cb54738f4c23e458ec 100644 --- a/crates/diagnostics/Cargo.toml +++ b/crates/diagnostics/Cargo.toml @@ -20,7 +20,7 @@ settings = { path = "../settings" } theme = { path = "../theme" } util = { path = "../util" } workspace = { path = "../workspace" } -postage = { version = "0.4", features = ["futures-traits"] } +postage = { workspace = true } [dev-dependencies] unindent = "0.1" diff --git a/crates/editor/Cargo.toml b/crates/editor/Cargo.toml index 6c52ec70e9355047be2a4eb2d30b04736b2edf80..44d0936808cedec50f64f545d3db007acbc30f3e 100644 --- a/crates/editor/Cargo.toml +++ b/crates/editor/Cargo.toml @@ -51,7 +51,7 @@ lazy_static = "1.4" log = { version = "0.4.16", features = ["kv_unstable_serde"] } ordered-float = "2.1.1" parking_lot = "0.11" -postage = { version = "0.4", features = ["futures-traits"] } +postage = { workspace = true } rand = { version = "0.8.3", optional = true } serde = { workspace = true } serde_derive = { version = "1.0", features = ["deserialize_in_place"] } diff --git a/crates/feedback/Cargo.toml b/crates/feedback/Cargo.toml index 51f070dd1d314278ddf5760ad4aa812ec8b7a85e..1c0d0e93ea4549d052286b4161362acacf540b78 100644 --- a/crates/feedback/Cargo.toml +++ b/crates/feedback/Cargo.toml @@ -21,7 +21,7 @@ gpui = { path = "../gpui" } human_bytes = "0.4.1" isahc = "1.7" lazy_static = "1.4.0" -postage = { version = "0.4", features = ["futures-traits"] } +postage = { workspace = true } project = { path = "../project" } search = { path = "../search" } serde = { version = "1.0", features = ["derive", "rc"] } diff --git a/crates/file_finder/Cargo.toml b/crates/file_finder/Cargo.toml index 1d1a4dfb1bc507095a3c09b2d7a1beb3748cb744..a1a3dbf71a3c8f8c5151b7729cb84bdac65b1f94 100644 --- a/crates/file_finder/Cargo.toml +++ b/crates/file_finder/Cargo.toml @@ -19,7 +19,7 @@ settings = { path = "../settings" } util = { path = "../util" } theme = { path = "../theme" } workspace = { path = "../workspace" } -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } [dev-dependencies] gpui = { path = "../gpui", features = ["test-support"] } diff --git a/crates/go_to_line/Cargo.toml b/crates/go_to_line/Cargo.toml index def6361dc2a83dc57c5a199c3c70ff93d059686f..54567b24406c27f094bcc1e235a5e9817694ea97 100644 --- a/crates/go_to_line/Cargo.toml +++ b/crates/go_to_line/Cargo.toml @@ -15,4 +15,4 @@ menu = { path = "../menu" } settings = { path = "../settings" } text = { path = "../text" } workspace = { path = "../workspace" } -postage = { version = "0.4", features = ["futures-traits"] } +postage = { workspace = true } diff --git a/crates/gpui/Cargo.toml b/crates/gpui/Cargo.toml index 65d36753e7bc1e80c4f6bb5ac6a6ff555c326b8e..bd994b5407ba6a3d5af787e50df9c77ebd432b2b 100644 --- a/crates/gpui/Cargo.toml +++ b/crates/gpui/Cargo.toml @@ -36,7 +36,7 @@ parking = "2.0.0" parking_lot = "0.11.1" pathfinder_color = "0.5" pathfinder_geometry = "0.5" -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } rand = "0.8.3" resvg = "0.14" schemars = "0.8" diff --git a/crates/language/Cargo.toml b/crates/language/Cargo.toml index 26e2d8c53baef5ee1c503cac88e426b1c0f0442c..ac4badbe2a35db850793ed569876d6c5070ba433 100644 --- a/crates/language/Cargo.toml +++ b/crates/language/Cargo.toml @@ -43,7 +43,7 @@ futures = "0.3" lazy_static = "1.4" log = { version = "0.4.16", features = ["kv_unstable_serde"] } parking_lot = "0.11.1" -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } rand = { version = "0.8.3", optional = true } regex = "1.5" serde = { version = "1.0", features = ["derive", "rc"] } diff --git a/crates/live_kit_client/Cargo.toml b/crates/live_kit_client/Cargo.toml index 55645732b8f104f327624fc0834657ad940bdb20..71a6235b95e28d1a1178d9a5c6253b7d190fbf79 100644 --- a/crates/live_kit_client/Cargo.toml +++ b/crates/live_kit_client/Cargo.toml @@ -35,7 +35,7 @@ core-graphics = "0.22.3" futures = "0.3" log = { version = "0.4.16", features = ["kv_unstable_serde"] } parking_lot = "0.11.1" -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } async-trait = { version = "0.1", optional = true } lazy_static = { version = "1.4", optional = true } diff --git a/crates/lsp/Cargo.toml b/crates/lsp/Cargo.toml index f37b1c9a4536ebb95a8a10c7053adebb09dad2e4..aa1f49977c9f7761ecd713e8258bde7c0eaa8b1c 100644 --- a/crates/lsp/Cargo.toml +++ b/crates/lsp/Cargo.toml @@ -21,7 +21,7 @@ futures = "0.3" log = { version = "0.4.16", features = ["kv_unstable_serde"] } lsp-types = "0.91" parking_lot = "0.11" -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } serde = { version = "1.0", features = ["derive", "rc"] } serde_derive = { version = "1.0", features = ["deserialize_in_place"] } serde_json = { version = "1.0", features = ["raw_value"] } diff --git a/crates/outline/Cargo.toml b/crates/outline/Cargo.toml index 661c84c8cdc8126aac2fdfc160a3f021367b9e86..552cf548928c34f38043dc910e0e621f702ca11d 100644 --- a/crates/outline/Cargo.toml +++ b/crates/outline/Cargo.toml @@ -18,5 +18,5 @@ settings = { path = "../settings" } text = { path = "../text" } workspace = { path = "../workspace" } ordered-float = "2.1.1" -postage = { version = "0.4", features = ["futures-traits"] } +postage = { workspace = true } smol = "1.2" diff --git a/crates/project/Cargo.toml b/crates/project/Cargo.toml index be100b2e87bc424e60e99fb10780d7ac2748b7f7..2f73daa338656d0606b278472797f1b6d427d69c 100644 --- a/crates/project/Cargo.toml +++ b/crates/project/Cargo.toml @@ -44,7 +44,7 @@ ignore = "0.4" lazy_static = "1.4.0" log = { version = "0.4.16", features = ["kv_unstable_serde"] } parking_lot = "0.11.1" -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } pulldown-cmark = { version = "0.9.1", default-features = false } rand = "0.8.3" regex = "1.5" diff --git a/crates/project_panel/Cargo.toml b/crates/project_panel/Cargo.toml index cc27f40954f6e49ac22693388e53099634a95d79..d245700d58ec1af022d12ef209f78f4690c4c04c 100644 --- a/crates/project_panel/Cargo.toml +++ b/crates/project_panel/Cargo.toml @@ -19,7 +19,7 @@ settings = { path = "../settings" } theme = { path = "../theme" } util = { path = "../util" } workspace = { path = "../workspace" } -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } futures = "0.3" unicase = "2.6" diff --git a/crates/project_symbols/Cargo.toml b/crates/project_symbols/Cargo.toml index e9283b14c9b7d2a9daa35c1ad01eaf3ac142383f..9e79b09d72ec7c398dd7cd29965a6eec797520a1 100644 --- a/crates/project_symbols/Cargo.toml +++ b/crates/project_symbols/Cargo.toml @@ -20,7 +20,7 @@ workspace = { path = "../workspace" } util = { path = "../util" } anyhow = "1.0.38" ordered-float = "2.1.1" -postage = { version = "0.4", features = ["futures-traits"] } +postage = { workspace = true } smol = "1.2" [dev-dependencies] diff --git a/crates/recent_projects/Cargo.toml b/crates/recent_projects/Cargo.toml index 037c6fd4fb765f47af8309ea614019a7d7736cb0..e8d851fa083ab85ef6a05f53c3a5eb07ab8e4667 100644 --- a/crates/recent_projects/Cargo.toml +++ b/crates/recent_projects/Cargo.toml @@ -19,5 +19,5 @@ settings = { path = "../settings" } text = { path = "../text" } workspace = { path = "../workspace" } ordered-float = "2.1.1" -postage = { version = "0.4", features = ["futures-traits"] } +postage = { workspace = true } smol = "1.2" diff --git a/crates/search/Cargo.toml b/crates/search/Cargo.toml index 85215c15b264c6b83fd38f87eba99973837131bb..e8c03a1a5e46db578d1f4dd961acb123a5235ce0 100644 --- a/crates/search/Cargo.toml +++ b/crates/search/Cargo.toml @@ -22,7 +22,7 @@ workspace = { path = "../workspace" } anyhow = "1.0" futures = "0.3" log = { version = "0.4.16", features = ["kv_unstable_serde"] } -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } serde = { version = "1.0", features = ["derive", "rc"] } serde_derive = { version = "1.0", features = ["deserialize_in_place"] } smallvec = { version = "1.6", features = ["union"] } diff --git a/crates/settings/Cargo.toml b/crates/settings/Cargo.toml index 1711bb335bd3efc9de99bda8a5fbfdadfd9c3e59..566fcfe3557649bacffb4e32a5f489b9d5d9e1cd 100644 --- a/crates/settings/Cargo.toml +++ b/crates/settings/Cargo.toml @@ -22,7 +22,7 @@ futures = "0.3" theme = { path = "../theme" } util = { path = "../util" } json_comments = "0.2" -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } schemars = "0.8" serde = { workspace = true } serde_derive = { version = "1.0", features = ["deserialize_in_place"] } diff --git a/crates/text/Cargo.toml b/crates/text/Cargo.toml index 5fda4b613c03b88504e80a428aaaea05186efc0d..362a060c1f5b1cd85b6acb294e570eb8c37004aa 100644 --- a/crates/text/Cargo.toml +++ b/crates/text/Cargo.toml @@ -22,7 +22,7 @@ digest = { version = "0.9", features = ["std"] } lazy_static = "1.4" log = { version = "0.4.16", features = ["kv_unstable_serde"] } parking_lot = "0.11" -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } rand = { version = "0.8.3", optional = true } smallvec = { version = "1.6", features = ["union"] } util = { path = "../util" } diff --git a/crates/theme_selector/Cargo.toml b/crates/theme_selector/Cargo.toml index 80ff31106948dec501b4d13863491964d9105ca6..2c922200b2ac8722bfa3a360318edf1ae49b296a 100644 --- a/crates/theme_selector/Cargo.toml +++ b/crates/theme_selector/Cargo.toml @@ -19,6 +19,5 @@ workspace = { path = "../workspace" } util = { path = "../util" } log = { version = "0.4.16", features = ["kv_unstable_serde"] } parking_lot = "0.11.1" -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } smol = "1.2.5" - diff --git a/crates/workspace/Cargo.toml b/crates/workspace/Cargo.toml index 06b20684c60f157cdbd3ed9516792f13f528f691..9a6813f6271756e06da33ab2275f4ba80a5b0e4d 100644 --- a/crates/workspace/Cargo.toml +++ b/crates/workspace/Cargo.toml @@ -43,7 +43,7 @@ lazy_static = "1.4" env_logger = "0.9.1" log = { version = "0.4.16", features = ["kv_unstable_serde"] } parking_lot = "0.11.1" -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } serde = { version = "1.0", features = ["derive", "rc"] } serde_derive = { version = "1.0", features = ["deserialize_in_place"] } serde_json = { version = "1.0", features = ["preserve_order"] } diff --git a/crates/zed/Cargo.toml b/crates/zed/Cargo.toml index 6a2422f87ca8657d5cbca7b393c7ca7f5f602ea1..4ae59fe4295aa33c5fcce81a4861298be3835f22 100644 --- a/crates/zed/Cargo.toml +++ b/crates/zed/Cargo.toml @@ -82,7 +82,7 @@ libc = "0.2" log = { version = "0.4.16", features = ["kv_unstable_serde"] } num_cpus = "1.13.0" parking_lot = "0.11.1" -postage = { version = "0.4.1", features = ["futures-traits"] } +postage = { workspace = true } rand = "0.8.3" regex = "1.5" rsa = "0.4" From d742c758bc3dd8d893a1f79916e915f1606d0bf4 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 20 Mar 2023 18:22:23 -0700 Subject: [PATCH 10/20] Restructure communication from BackgroundScanner to LocalWorktree The worktree no longer pulls the background snapshot from the background scanner. Instead, the background scanner sends both snapshots to the worktree. Along with these, it sends the path change sets. Also, add randomized test coverage for the worktree UpdatedEntries events. --- crates/project/src/worktree.rs | 407 +++++++++++++++++++-------------- 1 file changed, 235 insertions(+), 172 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 42284f1a1328074c97d333a7fb2c5506e988e303..afce1b5abee635541d5cc8c46c9fddb97892cfb5 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -64,10 +64,8 @@ pub enum Worktree { pub struct LocalWorktree { snapshot: LocalSnapshot, background_snapshot: Arc>, - background_changes: Arc, PathChange>>>, - last_scan_state_rx: watch::Receiver, + is_scanning: (watch::Sender, watch::Receiver), _background_scanner_task: Task<()>, - poll_task: Option>, share: Option, diagnostics: HashMap, Vec>>>, diagnostic_summaries: TreeMap, @@ -123,6 +121,7 @@ impl std::fmt::Debug for GitRepositoryEntry { } } +#[derive(Debug)] pub struct LocalSnapshot { ignores_by_parent_abs_path: HashMap, (Arc, usize)>, git_repositories: Vec, @@ -159,11 +158,12 @@ impl DerefMut for LocalSnapshot { #[derive(Clone, Debug)] enum ScanState { - Idle, /// The worktree is performing its initial scan of the filesystem. - Initializing, + Initializing(LocalSnapshot), + Initialized(LocalSnapshot), /// The worktree is updating in response to filesystem events. Updating, + Updated(LocalSnapshot, HashMap, PathChange>), Err(Arc), } @@ -235,49 +235,37 @@ impl Worktree { } let (scan_states_tx, mut scan_states_rx) = mpsc::unbounded(); - let (mut last_scan_state_tx, last_scan_state_rx) = - watch::channel_with(ScanState::Initializing); let background_snapshot = Arc::new(Mutex::new(snapshot.clone())); - let background_changes = Arc::new(Mutex::new(HashMap::default())); cx.spawn_weak(|this, mut cx| async move { - while let Some(scan_state) = scan_states_rx.next().await { - if let Some(this) = this.upgrade(&cx) { - last_scan_state_tx.blocking_send(scan_state).ok(); - this.update(&mut cx, |this, cx| { - this.as_local_mut().unwrap().poll_snapshot(false, cx) - }); - } else { - break; - } + while let Some((state, this)) = scan_states_rx.next().await.zip(this.upgrade(&cx)) { + this.update(&mut cx, |this, cx| { + this.as_local_mut() + .unwrap() + .background_scanner_updated(state, cx); + }); } }) .detach(); + let background_scanner_task = cx.background().spawn({ + let fs = fs.clone(); + let background_snapshot = background_snapshot.clone(); + let background = cx.background().clone(); + async move { + let events = fs.watch(&abs_path, Duration::from_millis(100)).await; + BackgroundScanner::new(background_snapshot, scan_states_tx, fs, background) + .run(events) + .await; + } + }); + Worktree::Local(LocalWorktree { - _background_scanner_task: cx.background().spawn({ - let fs = fs.clone(); - let background_snapshot = background_snapshot.clone(); - let background_changes = background_changes.clone(); - let background = cx.background().clone(); - async move { - let events = fs.watch(&abs_path, Duration::from_millis(100)).await; - let scanner = BackgroundScanner::new( - background_snapshot, - background_changes, - scan_states_tx, - fs, - background, - ); - scanner.run(events).await; - } - }), snapshot, background_snapshot, - background_changes, - last_scan_state_rx, + is_scanning: watch::channel_with(true), share: None, - poll_task: None, + _background_scanner_task: background_scanner_task, diagnostics: Default::default(), diagnostic_summaries: Default::default(), client, @@ -335,7 +323,9 @@ impl Worktree { if let Some(this) = this.upgrade(&cx) { this.update(&mut cx, |this, cx| { let this = this.as_remote_mut().unwrap(); - this.poll_snapshot(cx); + this.snapshot = this.background_snapshot.lock().clone(); + cx.emit(Event::UpdatedEntries(Default::default())); + cx.notify(); while let Some((scan_id, _)) = this.snapshot_subscriptions.front() { if this.observed_snapshot(*scan_id) { let (_, tx) = this.snapshot_subscriptions.pop_front().unwrap(); @@ -539,66 +529,49 @@ impl LocalWorktree { Ok(updated) } - fn poll_snapshot(&mut self, force: bool, cx: &mut ModelContext) { - self.poll_task.take(); - - match self.last_scan_state_rx.borrow().clone() { - ScanState::Idle => { - let new_snapshot = self.background_snapshot.lock().clone(); - let changes = mem::take(&mut *self.background_changes.lock()); - let updated_repos = Self::changed_repos( - &self.snapshot.git_repositories, - &new_snapshot.git_repositories, - ); - self.snapshot = new_snapshot; - - if let Some(share) = self.share.as_mut() { - *share.snapshots_tx.borrow_mut() = self.snapshot.clone(); - } - + fn background_scanner_updated( + &mut self, + scan_state: ScanState, + cx: &mut ModelContext, + ) { + match scan_state { + ScanState::Initializing(new_snapshot) => { + *self.is_scanning.0.borrow_mut() = true; + self.set_snapshot(new_snapshot, cx); + } + ScanState::Initialized(new_snapshot) => { + *self.is_scanning.0.borrow_mut() = false; + self.set_snapshot(new_snapshot, cx); + } + ScanState::Updating => { + *self.is_scanning.0.borrow_mut() = true; + } + ScanState::Updated(new_snapshot, changes) => { + *self.is_scanning.0.borrow_mut() = false; cx.emit(Event::UpdatedEntries(changes)); - - if !updated_repos.is_empty() { - cx.emit(Event::UpdatedGitRepositories(updated_repos)); - } + self.set_snapshot(new_snapshot, cx); } - - ScanState::Initializing => { - let is_fake_fs = self.fs.is_fake(); - - let new_snapshot = self.background_snapshot.lock().clone(); - let updated_repos = Self::changed_repos( - &self.snapshot.git_repositories, - &new_snapshot.git_repositories, - ); - self.snapshot = new_snapshot; - - self.poll_task = Some(cx.spawn_weak(|this, mut cx| async move { - if is_fake_fs { - #[cfg(any(test, feature = "test-support"))] - cx.background().simulate_random_delay().await; - } else { - smol::Timer::after(Duration::from_millis(100)).await; - } - if let Some(this) = this.upgrade(&cx) { - this.update(&mut cx, |this, cx| { - this.as_local_mut().unwrap().poll_snapshot(false, cx) - }); - } - })); - - if !updated_repos.is_empty() { - cx.emit(Event::UpdatedGitRepositories(updated_repos)); - } + ScanState::Err(error) => { + *self.is_scanning.0.borrow_mut() = false; + log::error!("error scanning worktree {:?}", error); } + } + } - _ => { - if force { - self.snapshot = self.background_snapshot.lock().clone(); - } - } + fn set_snapshot(&mut self, new_snapshot: LocalSnapshot, cx: &mut ModelContext) { + let updated_repos = Self::changed_repos( + &self.snapshot.git_repositories, + &new_snapshot.git_repositories, + ); + self.snapshot = new_snapshot; + + if let Some(share) = self.share.as_mut() { + *share.snapshots_tx.borrow_mut() = self.snapshot.clone(); } + if !updated_repos.is_empty() { + cx.emit(Event::UpdatedGitRepositories(updated_repos)); + } cx.notify(); } @@ -631,11 +604,15 @@ impl LocalWorktree { } pub fn scan_complete(&self) -> impl Future { - let mut scan_state_rx = self.last_scan_state_rx.clone(); + let mut is_scanning_rx = self.is_scanning.1.clone(); async move { - let mut scan_state = Some(scan_state_rx.borrow().clone()); - while let Some(ScanState::Initializing | ScanState::Updating) = scan_state { - scan_state = scan_state_rx.recv().await; + let mut is_scanning = is_scanning_rx.borrow().clone(); + while is_scanning { + if let Some(value) = is_scanning_rx.recv().await { + is_scanning = value; + } else { + break; + } } } } @@ -827,11 +804,14 @@ impl LocalWorktree { delete.await?; this.update(&mut cx, |this, cx| { let this = this.as_local_mut().unwrap(); - { - let mut snapshot = this.background_snapshot.lock(); - snapshot.delete_entry(entry_id); + + this.background_snapshot.lock().delete_entry(entry_id); + + if let Some(path) = this.snapshot.delete_entry(entry_id) { + cx.emit(Event::UpdatedEntries( + [(path, PathChange::Removed)].into_iter().collect(), + )); } - this.poll_snapshot(true, cx); }); Ok(()) })) @@ -953,13 +933,8 @@ impl LocalWorktree { cx: &mut ModelContext, ) -> Task> { let fs = self.fs.clone(); - let root_char_bag; - let next_entry_id; - { - let snapshot = self.background_snapshot.lock(); - root_char_bag = snapshot.root_char_bag; - next_entry_id = snapshot.next_entry_id.clone(); - } + let root_char_bag = self.snapshot.root_char_bag; + let next_entry_id = self.snapshot.next_entry_id.clone(); cx.spawn_weak(|this, mut cx| async move { let metadata = fs .metadata(&abs_path) @@ -970,32 +945,43 @@ impl LocalWorktree { .ok_or_else(|| anyhow!("worktree was dropped"))?; this.update(&mut cx, |this, cx| { let this = this.as_local_mut().unwrap(); - let inserted_entry; + let mut entry = Entry::new(path, &metadata, &next_entry_id, root_char_bag); + entry.is_ignored = this + .snapshot + .ignore_stack_for_abs_path(&abs_path, entry.is_dir()) + .is_abs_path_ignored(&abs_path, entry.is_dir()); + { let mut snapshot = this.background_snapshot.lock(); - let mut changes = this.background_changes.lock(); - let mut entry = Entry::new(path, &metadata, &next_entry_id, root_char_bag); - entry.is_ignored = snapshot - .ignore_stack_for_abs_path(&abs_path, entry.is_dir()) - .is_abs_path_ignored(&abs_path, entry.is_dir()); - if let Some(old_path) = old_path { - snapshot.remove_path(&old_path); - changes.insert(old_path.clone(), PathChange::Removed); - } snapshot.scan_started(); - let exists = snapshot.entry_for_path(&entry.path).is_some(); - inserted_entry = snapshot.insert_entry(entry, fs.as_ref()); - changes.insert( - inserted_entry.path.clone(), - if exists { - PathChange::Updated - } else { - PathChange::Added - }, - ); + if let Some(old_path) = &old_path { + snapshot.remove_path(old_path); + } + snapshot.insert_entry(entry.clone(), fs.as_ref()); snapshot.scan_completed(); } - this.poll_snapshot(true, cx); + + let mut changes = HashMap::default(); + + this.snapshot.scan_started(); + if let Some(old_path) = &old_path { + this.snapshot.remove_path(old_path); + changes.insert(old_path.clone(), PathChange::Removed); + } + let exists = this.snapshot.entry_for_path(&entry.path).is_some(); + let inserted_entry = this.snapshot.insert_entry(entry, fs.as_ref()); + changes.insert( + inserted_entry.path.clone(), + if exists { + PathChange::Updated + } else { + PathChange::Added + }, + ); + this.snapshot.scan_completed(); + + eprintln!("refreshed {:?}", changes); + cx.emit(Event::UpdatedEntries(changes)); Ok(inserted_entry) }) }) @@ -1099,12 +1085,6 @@ impl RemoteWorktree { self.snapshot.clone() } - fn poll_snapshot(&mut self, cx: &mut ModelContext) { - self.snapshot = self.background_snapshot.lock().clone(); - cx.emit(Event::UpdatedEntries(Default::default())); - cx.notify(); - } - pub fn disconnected_from_host(&mut self) { self.updates_tx.take(); self.snapshot_subscriptions.clear(); @@ -1264,28 +1244,25 @@ impl Snapshot { Ok(entry) } - fn delete_entry(&mut self, entry_id: ProjectEntryId) -> bool { - if let Some(removed_entry) = self.entries_by_id.remove(&entry_id, &()) { - self.entries_by_path = { - let mut cursor = self.entries_by_path.cursor(); - let mut new_entries_by_path = - cursor.slice(&TraversalTarget::Path(&removed_entry.path), Bias::Left, &()); - while let Some(entry) = cursor.item() { - if entry.path.starts_with(&removed_entry.path) { - self.entries_by_id.remove(&entry.id, &()); - cursor.next(&()); - } else { - break; - } + fn delete_entry(&mut self, entry_id: ProjectEntryId) -> Option> { + let removed_entry = self.entries_by_id.remove(&entry_id, &())?; + self.entries_by_path = { + let mut cursor = self.entries_by_path.cursor(); + let mut new_entries_by_path = + cursor.slice(&TraversalTarget::Path(&removed_entry.path), Bias::Left, &()); + while let Some(entry) = cursor.item() { + if entry.path.starts_with(&removed_entry.path) { + self.entries_by_id.remove(&entry.id, &()); + cursor.next(&()); + } else { + break; } - new_entries_by_path.push_tree(cursor.suffix(&()), &()); - new_entries_by_path - }; + } + new_entries_by_path.push_tree(cursor.suffix(&()), &()); + new_entries_by_path + }; - true - } else { - false - } + Some(removed_entry.path) } pub(crate) fn apply_remote_update(&mut self, update: proto::UpdateWorktree) -> Result<()> { @@ -2204,7 +2181,7 @@ impl<'a> sum_tree::Dimension<'a, EntrySummary> for PathKey { struct BackgroundScanner { fs: Arc, snapshot: Arc>, - changes: Arc, PathChange>>>, + changes: HashMap, PathChange>, notify: UnboundedSender, executor: Arc, } @@ -2212,7 +2189,6 @@ struct BackgroundScanner { impl BackgroundScanner { fn new( snapshot: Arc>, - changes: Arc, PathChange>>>, notify: UnboundedSender, fs: Arc, executor: Arc, @@ -2220,9 +2196,9 @@ impl BackgroundScanner { Self { fs, snapshot, - changes, notify, executor, + changes: Default::default(), } } @@ -2231,10 +2207,34 @@ impl BackgroundScanner { } async fn run(mut self, events_rx: impl Stream>) { - if self.notify.unbounded_send(ScanState::Initializing).is_err() { - return; - } + // While performing the initial scan, send a new snapshot to the main + // thread on a recurring interval. + let initializing_task = self.executor.spawn({ + let executor = self.executor.clone(); + let snapshot = self.snapshot.clone(); + let notify = self.notify.clone(); + let is_fake_fs = self.fs.is_fake(); + async move { + loop { + if is_fake_fs { + #[cfg(any(test, feature = "test-support"))] + executor.simulate_random_delay().await; + } else { + smol::Timer::after(Duration::from_millis(100)).await; + } + + executor.timer(Duration::from_millis(100)).await; + if notify + .unbounded_send(ScanState::Initializing(snapshot.lock().clone())) + .is_err() + { + break; + } + } + } + }); + // Scan the entire directory. if let Err(err) = self.scan_dirs().await { if self .notify @@ -2245,7 +2245,13 @@ impl BackgroundScanner { } } - if self.notify.unbounded_send(ScanState::Idle).is_err() { + drop(initializing_task); + + if self + .notify + .unbounded_send(ScanState::Initialized(self.snapshot.lock().clone())) + .is_err() + { return; } @@ -2264,7 +2270,14 @@ impl BackgroundScanner { if !self.process_events(events, true).await { return; } - if self.notify.unbounded_send(ScanState::Idle).is_err() { + if self + .notify + .unbounded_send(ScanState::Updated( + self.snapshot.lock().clone(), + mem::take(&mut self.changes), + )) + .is_err() + { return; } } @@ -2280,7 +2293,14 @@ impl BackgroundScanner { if !self.process_events(events, false).await { return; } - if self.notify.unbounded_send(ScanState::Idle).is_err() { + if self + .notify + .unbounded_send(ScanState::Updated( + self.snapshot.lock().clone(), + mem::take(&mut self.changes), + )) + .is_err() + { return; } } @@ -2737,7 +2757,7 @@ impl BackgroundScanner { } fn build_change_set( - &self, + &mut self, old_snapshot: Snapshot, event_paths: Vec>, received_before_initialized: bool, @@ -2746,7 +2766,8 @@ impl BackgroundScanner { let mut old_paths = old_snapshot.entries_by_path.cursor::(); let mut new_paths = new_snapshot.entries_by_path.cursor::(); - let mut change_set = self.changes.lock(); + use PathChange::{Added, AddedOrUpdated, Removed, Updated}; + for path in event_paths { let path = PathKey(path); old_paths.seek(&path, Bias::Left, &()); @@ -2765,7 +2786,7 @@ impl BackgroundScanner { match Ord::cmp(&old_entry.path, &new_entry.path) { Ordering::Less => { - change_set.insert(old_entry.path.clone(), PathChange::Removed); + self.changes.insert(old_entry.path.clone(), Removed); old_paths.next(&()); } Ordering::Equal => { @@ -2773,26 +2794,25 @@ impl BackgroundScanner { // If the worktree was not fully initialized when this event was generated, // we can't know whether this entry was added during the scan or whether // it was merely updated. - change_set - .insert(old_entry.path.clone(), PathChange::AddedOrUpdated); + self.changes.insert(old_entry.path.clone(), AddedOrUpdated); } else if old_entry.mtime != new_entry.mtime { - change_set.insert(old_entry.path.clone(), PathChange::Updated); + self.changes.insert(old_entry.path.clone(), Updated); } old_paths.next(&()); new_paths.next(&()); } Ordering::Greater => { - change_set.insert(new_entry.path.clone(), PathChange::Added); + self.changes.insert(new_entry.path.clone(), Added); new_paths.next(&()); } } } (Some(old_entry), None) => { - change_set.insert(old_entry.path.clone(), PathChange::Removed); + self.changes.insert(old_entry.path.clone(), Removed); old_paths.next(&()); } (None, Some(new_entry)) => { - change_set.insert(new_entry.path.clone(), PathChange::Added); + self.changes.insert(new_entry.path.clone(), Added); new_paths.next(&()); } (None, None) => break, @@ -3567,6 +3587,49 @@ mod tests { .update(cx, |tree, _| tree.as_local_mut().unwrap().scan_complete()) .await; + // After the initial scan is complete, the `UpdatedEntries` event can + // be used to follow along with all changes to the worktree's snapshot. + worktree.update(cx, |tree, cx| { + let mut paths = tree + .as_local() + .unwrap() + .paths() + .cloned() + .collect::>(); + + cx.subscribe(&worktree, move |tree, _, event, _| { + if let Event::UpdatedEntries(changes) = event { + for (path, change_type) in changes.iter() { + let path = path.clone(); + let ix = match paths.binary_search(&path) { + Ok(ix) | Err(ix) => ix, + }; + match change_type { + PathChange::Added => { + assert_ne!(paths.get(ix), Some(&path)); + paths.insert(ix, path); + } + PathChange::Removed => { + assert_eq!(paths.get(ix), Some(&path)); + paths.remove(ix); + } + PathChange::Updated => { + assert_eq!(paths.get(ix), Some(&path)); + } + PathChange::AddedOrUpdated => { + if paths[ix] != path { + paths.insert(ix, path); + } + } + } + } + let new_paths = tree.paths().cloned().collect::>(); + assert_eq!(paths, new_paths, "incorrect changes: {:?}", changes); + } + }) + .detach(); + }); + let mut snapshots = Vec::new(); let mut mutations_len = operations; while mutations_len > 1 { From b10b0dbd757dd2537c65867786808d96d6597d64 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 21 Mar 2023 11:21:58 -0700 Subject: [PATCH 11/20] Only mutate background snapshot in the background scanner --- crates/project/src/worktree.rs | 284 +++++++++++++++------------------ 1 file changed, 131 insertions(+), 153 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index afce1b5abee635541d5cc8c46c9fddb97892cfb5..656268a02c56b2a918c00e8be2103b0549aaa491 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -9,7 +9,7 @@ use fs::LineEnding; use fs::{repository::GitRepository, Fs}; use futures::{ channel::{ - mpsc::{self, UnboundedSender}, + mpsc::{self, UnboundedReceiver, UnboundedSender}, oneshot, }, Stream, StreamExt, @@ -29,6 +29,7 @@ use language::{ Buffer, DiagnosticEntry, PointUtf16, Rope, RopeFingerprint, Unclipped, }; use parking_lot::Mutex; +use postage::barrier; use postage::{ prelude::{Sink as _, Stream as _}, watch, @@ -55,7 +56,6 @@ use util::{ResultExt, TryFutureExt}; #[derive(Copy, Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)] pub struct WorktreeId(usize); -#[allow(clippy::large_enum_variant)] pub enum Worktree { Local(LocalWorktree), Remote(RemoteWorktree), @@ -63,7 +63,7 @@ pub enum Worktree { pub struct LocalWorktree { snapshot: LocalSnapshot, - background_snapshot: Arc>, + path_changes_tx: mpsc::UnboundedSender<(Vec, barrier::Sender)>, is_scanning: (watch::Sender, watch::Receiver), _background_scanner_task: Task<()>, share: Option, @@ -156,14 +156,17 @@ impl DerefMut for LocalSnapshot { } } -#[derive(Clone, Debug)] enum ScanState { /// The worktree is performing its initial scan of the filesystem. Initializing(LocalSnapshot), Initialized(LocalSnapshot), /// The worktree is updating in response to filesystem events. Updating, - Updated(LocalSnapshot, HashMap, PathChange>), + Updated { + snapshot: LocalSnapshot, + changes: HashMap, PathChange>, + barrier: Option, + }, Err(Arc), } @@ -234,8 +237,8 @@ impl Worktree { ); } + let (path_changes_tx, path_changes_rx) = mpsc::unbounded(); let (scan_states_tx, mut scan_states_rx) = mpsc::unbounded(); - let background_snapshot = Arc::new(Mutex::new(snapshot.clone())); cx.spawn_weak(|this, mut cx| async move { while let Some((state, this)) = scan_states_rx.next().await.zip(this.upgrade(&cx)) { @@ -250,21 +253,21 @@ impl Worktree { let background_scanner_task = cx.background().spawn({ let fs = fs.clone(); - let background_snapshot = background_snapshot.clone(); + let snapshot = snapshot.clone(); let background = cx.background().clone(); async move { let events = fs.watch(&abs_path, Duration::from_millis(100)).await; - BackgroundScanner::new(background_snapshot, scan_states_tx, fs, background) - .run(events) + BackgroundScanner::new(snapshot, scan_states_tx, fs, background) + .run(events, path_changes_rx) .await; } }); Worktree::Local(LocalWorktree { snapshot, - background_snapshot, is_scanning: watch::channel_with(true), share: None, + path_changes_tx, _background_scanner_task: background_scanner_task, diagnostics: Default::default(), diagnostic_summaries: Default::default(), @@ -546,10 +549,15 @@ impl LocalWorktree { ScanState::Updating => { *self.is_scanning.0.borrow_mut() = true; } - ScanState::Updated(new_snapshot, changes) => { + ScanState::Updated { + snapshot: new_snapshot, + changes, + barrier, + } => { *self.is_scanning.0.borrow_mut() = false; cx.emit(Event::UpdatedEntries(changes)); self.set_snapshot(new_snapshot, cx); + drop(barrier); } ScanState::Err(error) => { *self.is_scanning.0.borrow_mut() = false; @@ -660,9 +668,7 @@ impl LocalWorktree { // Eagerly populate the snapshot with an updated entry for the loaded file let entry = this .update(&mut cx, |this, cx| { - this.as_local() - .unwrap() - .refresh_entry(path, abs_path, None, cx) + this.as_local().unwrap().refresh_entry(path, None, cx) }) .await?; @@ -780,10 +786,13 @@ impl LocalWorktree { cx: &mut ModelContext, ) -> Option>> { let entry = self.entry_for_id(entry_id)?.clone(); - let abs_path = self.absolutize(&entry.path); + let path = entry.path.clone(); + let abs_path = self.absolutize(&path); + let (tx, mut rx) = barrier::channel(); + let delete = cx.background().spawn({ + let abs_path = abs_path.clone(); let fs = self.fs.clone(); - let abs_path = abs_path; async move { if entry.is_file() { fs.remove_file(&abs_path, Default::default()).await @@ -802,17 +811,14 @@ impl LocalWorktree { Some(cx.spawn(|this, mut cx| async move { delete.await?; - this.update(&mut cx, |this, cx| { - let this = this.as_local_mut().unwrap(); - - this.background_snapshot.lock().delete_entry(entry_id); - - if let Some(path) = this.snapshot.delete_entry(entry_id) { - cx.emit(Event::UpdatedEntries( - [(path, PathChange::Removed)].into_iter().collect(), - )); - } + this.update(&mut cx, |this, _| { + this.as_local_mut() + .unwrap() + .path_changes_tx + .unbounded_send((vec![abs_path], tx)) + .unwrap(); }); + rx.recv().await; Ok(()) })) } @@ -826,29 +832,21 @@ impl LocalWorktree { let old_path = self.entry_for_id(entry_id)?.path.clone(); let new_path = new_path.into(); let abs_old_path = self.absolutize(&old_path); - let abs_new_path = self.absolutize(new_path.as_ref()); - let rename = cx.background().spawn({ - let fs = self.fs.clone(); - let abs_new_path = abs_new_path.clone(); - async move { - fs.rename(&abs_old_path, &abs_new_path, Default::default()) - .await - } + let abs_new_path = self.absolutize(&new_path); + let fs = self.fs.clone(); + let rename = cx.background().spawn(async move { + fs.rename(&abs_old_path, &abs_new_path, Default::default()) + .await }); Some(cx.spawn(|this, mut cx| async move { rename.await?; - let entry = this - .update(&mut cx, |this, cx| { - this.as_local_mut().unwrap().refresh_entry( - new_path.clone(), - abs_new_path, - Some(old_path), - cx, - ) - }) - .await?; - Ok(entry) + this.update(&mut cx, |this, cx| { + this.as_local_mut() + .unwrap() + .refresh_entry(new_path.clone(), Some(old_path), cx) + }) + .await })) } @@ -862,33 +860,25 @@ impl LocalWorktree { let new_path = new_path.into(); let abs_old_path = self.absolutize(&old_path); let abs_new_path = self.absolutize(&new_path); - let copy = cx.background().spawn({ - let fs = self.fs.clone(); - let abs_new_path = abs_new_path.clone(); - async move { - copy_recursive( - fs.as_ref(), - &abs_old_path, - &abs_new_path, - Default::default(), - ) - .await - } + let fs = self.fs.clone(); + let copy = cx.background().spawn(async move { + copy_recursive( + fs.as_ref(), + &abs_old_path, + &abs_new_path, + Default::default(), + ) + .await }); Some(cx.spawn(|this, mut cx| async move { copy.await?; - let entry = this - .update(&mut cx, |this, cx| { - this.as_local_mut().unwrap().refresh_entry( - new_path.clone(), - abs_new_path, - None, - cx, - ) - }) - .await?; - Ok(entry) + this.update(&mut cx, |this, cx| { + this.as_local_mut() + .unwrap() + .refresh_entry(new_path.clone(), None, cx) + }) + .await })) } @@ -900,90 +890,51 @@ impl LocalWorktree { ) -> Task> { let path = path.into(); let abs_path = self.absolutize(&path); - let write = cx.background().spawn({ - let fs = self.fs.clone(); - let abs_path = abs_path.clone(); - async move { - if let Some((text, line_ending)) = text_if_file { - fs.save(&abs_path, &text, line_ending).await - } else { - fs.create_dir(&abs_path).await - } + let fs = self.fs.clone(); + let write = cx.background().spawn(async move { + if let Some((text, line_ending)) = text_if_file { + fs.save(&abs_path, &text, line_ending).await + } else { + fs.create_dir(&abs_path).await } }); cx.spawn(|this, mut cx| async move { write.await?; - let entry = this - .update(&mut cx, |this, cx| { - this.as_local_mut() - .unwrap() - .refresh_entry(path, abs_path, None, cx) - }) - .await?; - Ok(entry) + this.update(&mut cx, |this, cx| { + this.as_local_mut().unwrap().refresh_entry(path, None, cx) + }) + .await }) } fn refresh_entry( &self, path: Arc, - abs_path: PathBuf, old_path: Option>, cx: &mut ModelContext, ) -> Task> { let fs = self.fs.clone(); - let root_char_bag = self.snapshot.root_char_bag; - let next_entry_id = self.snapshot.next_entry_id.clone(); - cx.spawn_weak(|this, mut cx| async move { - let metadata = fs - .metadata(&abs_path) - .await? - .ok_or_else(|| anyhow!("could not read saved file metadata"))?; - let this = this - .upgrade(&cx) - .ok_or_else(|| anyhow!("worktree was dropped"))?; - this.update(&mut cx, |this, cx| { - let this = this.as_local_mut().unwrap(); - let mut entry = Entry::new(path, &metadata, &next_entry_id, root_char_bag); - entry.is_ignored = this - .snapshot - .ignore_stack_for_abs_path(&abs_path, entry.is_dir()) - .is_abs_path_ignored(&abs_path, entry.is_dir()); - - { - let mut snapshot = this.background_snapshot.lock(); - snapshot.scan_started(); - if let Some(old_path) = &old_path { - snapshot.remove_path(old_path); - } - snapshot.insert_entry(entry.clone(), fs.as_ref()); - snapshot.scan_completed(); - } - - let mut changes = HashMap::default(); - - this.snapshot.scan_started(); - if let Some(old_path) = &old_path { - this.snapshot.remove_path(old_path); - changes.insert(old_path.clone(), PathChange::Removed); - } - let exists = this.snapshot.entry_for_path(&entry.path).is_some(); - let inserted_entry = this.snapshot.insert_entry(entry, fs.as_ref()); - changes.insert( - inserted_entry.path.clone(), - if exists { - PathChange::Updated - } else { - PathChange::Added - }, - ); - this.snapshot.scan_completed(); + let abs_path = self.abs_path.clone(); + let path_changes_tx = self.path_changes_tx.clone(); + cx.spawn_weak(move |this, mut cx| async move { + let abs_path = fs.canonicalize(&abs_path).await?; + let paths = if let Some(old_path) = old_path { + vec![abs_path.join(&path), abs_path.join(&old_path)] + } else { + vec![abs_path.join(&path)] + }; - eprintln!("refreshed {:?}", changes); - cx.emit(Event::UpdatedEntries(changes)); - Ok(inserted_entry) - }) + let (tx, mut rx) = barrier::channel(); + path_changes_tx.unbounded_send((paths, tx)).unwrap(); + rx.recv().await; + this.upgrade(&cx) + .ok_or_else(|| anyhow!("worktree was dropped"))? + .update(&mut cx, |this, _| { + this.entry_for_path(path) + .cloned() + .ok_or_else(|| anyhow!("failed to read path after update")) + }) }) } @@ -2188,14 +2139,14 @@ struct BackgroundScanner { impl BackgroundScanner { fn new( - snapshot: Arc>, + snapshot: LocalSnapshot, notify: UnboundedSender, fs: Arc, executor: Arc, ) -> Self { Self { fs, - snapshot, + snapshot: Arc::new(Mutex::new(snapshot)), notify, executor, changes: Default::default(), @@ -2206,7 +2157,13 @@ impl BackgroundScanner { self.snapshot.lock().abs_path.clone() } - async fn run(mut self, events_rx: impl Stream>) { + async fn run( + mut self, + events_rx: impl Stream>, + mut changed_paths: UnboundedReceiver<(Vec, barrier::Sender)>, + ) { + use futures::{select_biased, FutureExt as _}; + // While performing the initial scan, send a new snapshot to the main // thread on a recurring interval. let initializing_task = self.executor.spawn({ @@ -2260,7 +2217,7 @@ impl BackgroundScanner { // Process any events that occurred while performing the initial scan. These // events can't be reported as precisely, because there is no snapshot of the // worktree before they occurred. - if let Some(mut events) = events_rx.next().await { + if let Poll::Ready(Some(mut events)) = futures::poll!(events_rx.next()) { while let Poll::Ready(Some(additional_events)) = futures::poll!(events_rx.next()) { events.extend(additional_events); } @@ -2272,10 +2229,11 @@ impl BackgroundScanner { } if self .notify - .unbounded_send(ScanState::Updated( - self.snapshot.lock().clone(), - mem::take(&mut self.changes), - )) + .unbounded_send(ScanState::Updated { + snapshot: self.snapshot.lock().clone(), + changes: mem::take(&mut self.changes), + barrier: None, + }) .is_err() { return; @@ -2283,10 +2241,29 @@ impl BackgroundScanner { } // Continue processing events until the worktree is dropped. - while let Some(mut events) = events_rx.next().await { - while let Poll::Ready(Some(additional_events)) = futures::poll!(events_rx.next()) { - events.extend(additional_events); + loop { + let events; + let barrier; + select_biased! { + request = changed_paths.next().fuse() => { + let Some((paths, b)) = request else { break; }; + events = paths + .into_iter() + .map(|path| fsevent::Event { + path, + event_id: 0, + flags: fsevent::StreamFlags::NONE + }) + .collect::>(); + barrier = Some(b); + } + e = events_rx.next().fuse() => { + let Some(e) = e else { break; }; + events = e; + barrier = None; + } } + if self.notify.unbounded_send(ScanState::Updating).is_err() { return; } @@ -2295,10 +2272,11 @@ impl BackgroundScanner { } if self .notify - .unbounded_send(ScanState::Updated( - self.snapshot.lock().clone(), - mem::take(&mut self.changes), - )) + .unbounded_send(ScanState::Updated { + snapshot: self.snapshot.lock().clone(), + changes: mem::take(&mut self.changes), + barrier, + }) .is_err() { return; @@ -3132,7 +3110,7 @@ mod tests { let tree = Worktree::local( client, - Arc::from(Path::new("/root")), + Path::new("/root"), true, fs, Default::default(), @@ -3193,7 +3171,7 @@ mod tests { let client = cx.read(|cx| Client::new(FakeHttpClient::with_404_response(), cx)); let tree = Worktree::local( client, - Arc::from(Path::new("/root")), + Path::new("/root"), true, fs.clone(), Default::default(), From 5da2b123b56f570cc44086d100b1292937ac87e8 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 21 Mar 2023 11:53:04 -0700 Subject: [PATCH 12/20] Allow refreshing worktree entries while the initial scan is in-progress --- crates/language/src/buffer_tests.rs | 1 - crates/project/src/worktree.rs | 567 ++++++++++++++-------------- 2 files changed, 293 insertions(+), 275 deletions(-) diff --git a/crates/language/src/buffer_tests.rs b/crates/language/src/buffer_tests.rs index 3e65ec3120445bb69604c056b200d4b8f66b6863..765c0f96738d92194ee181ca67b3e44eb6339e2e 100644 --- a/crates/language/src/buffer_tests.rs +++ b/crates/language/src/buffer_tests.rs @@ -809,7 +809,6 @@ fn test_enclosing_bracket_ranges_where_brackets_are_not_outermost_children( }"}], ); - eprintln!("-----------------------"); // Regression test: even though the parent node of the parentheses (the for loop) does // intersect the given range, the parentheses themselves do not contain the range, so // they should not be returned. Only the curly braces contain the range. diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 656268a02c56b2a918c00e8be2103b0549aaa491..33714e762ff94d43d7dd6f99a806c763ea33dafc 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -12,7 +12,7 @@ use futures::{ mpsc::{self, UnboundedReceiver, UnboundedSender}, oneshot, }, - Stream, StreamExt, + select_biased, Stream, StreamExt, }; use fuzzy::CharBag; use git::{DOT_GIT, GITIGNORE}; @@ -75,8 +75,8 @@ pub struct LocalWorktree { } pub struct RemoteWorktree { - pub snapshot: Snapshot, - pub(crate) background_snapshot: Arc>, + snapshot: Snapshot, + background_snapshot: Arc>, project_id: u64, client: Arc, updates_tx: Option>, @@ -116,7 +116,6 @@ impl std::fmt::Debug for GitRepositoryEntry { f.debug_struct("GitRepositoryEntry") .field("content_path", &self.content_path) .field("git_dir_path", &self.git_dir_path) - .field("libgit_repository", &"LibGitRepository") .finish() } } @@ -158,8 +157,13 @@ impl DerefMut for LocalSnapshot { enum ScanState { /// The worktree is performing its initial scan of the filesystem. - Initializing(LocalSnapshot), - Initialized(LocalSnapshot), + Initializing { + snapshot: LocalSnapshot, + barrier: Option, + }, + Initialized { + snapshot: LocalSnapshot, + }, /// The worktree is updating in response to filesystem events. Updating, Updated { @@ -167,7 +171,6 @@ enum ScanState { changes: HashMap, PathChange>, barrier: Option, }, - Err(Arc), } struct ShareState { @@ -538,32 +541,30 @@ impl LocalWorktree { cx: &mut ModelContext, ) { match scan_state { - ScanState::Initializing(new_snapshot) => { + ScanState::Initializing { snapshot, barrier } => { *self.is_scanning.0.borrow_mut() = true; - self.set_snapshot(new_snapshot, cx); + self.set_snapshot(snapshot, cx); + drop(barrier); } - ScanState::Initialized(new_snapshot) => { + ScanState::Initialized { snapshot } => { *self.is_scanning.0.borrow_mut() = false; - self.set_snapshot(new_snapshot, cx); + self.set_snapshot(snapshot, cx); } ScanState::Updating => { *self.is_scanning.0.borrow_mut() = true; } ScanState::Updated { - snapshot: new_snapshot, + snapshot, changes, barrier, } => { *self.is_scanning.0.borrow_mut() = false; cx.emit(Event::UpdatedEntries(changes)); - self.set_snapshot(new_snapshot, cx); + self.set_snapshot(snapshot, cx); drop(barrier); } - ScanState::Err(error) => { - *self.is_scanning.0.borrow_mut() = false; - log::error!("error scanning worktree {:?}", error); - } } + cx.notify(); } fn set_snapshot(&mut self, new_snapshot: LocalSnapshot, cx: &mut ModelContext) { @@ -580,7 +581,6 @@ impl LocalWorktree { if !updated_repos.is_empty() { cx.emit(Event::UpdatedGitRepositories(updated_repos)); } - cx.notify(); } fn changed_repos( @@ -759,15 +759,25 @@ impl LocalWorktree { is_dir: bool, cx: &mut ModelContext, ) -> Task> { - self.write_entry_internal( - path, + let path = path.into(); + let abs_path = self.absolutize(&path); + let fs = self.fs.clone(); + let write = cx.background().spawn(async move { if is_dir { - None + fs.create_dir(&abs_path).await } else { - Some(Default::default()) - }, - cx, - ) + fs.save(&abs_path, &Default::default(), Default::default()) + .await + } + }); + + cx.spawn(|this, mut cx| async move { + write.await?; + this.update(&mut cx, |this, cx| { + this.as_local_mut().unwrap().refresh_entry(path, None, cx) + }) + .await + }) } pub fn write_file( @@ -777,7 +787,20 @@ impl LocalWorktree { line_ending: LineEnding, cx: &mut ModelContext, ) -> Task> { - self.write_entry_internal(path, Some((text, line_ending)), cx) + let path = path.into(); + let abs_path = self.absolutize(&path); + let fs = self.fs.clone(); + let write = cx + .background() + .spawn(async move { fs.save(&abs_path, &text, line_ending).await }); + + cx.spawn(|this, mut cx| async move { + write.await?; + this.update(&mut cx, |this, cx| { + this.as_local_mut().unwrap().refresh_entry(path, None, cx) + }) + .await + }) } pub fn delete_entry( @@ -882,32 +905,6 @@ impl LocalWorktree { })) } - fn write_entry_internal( - &self, - path: impl Into>, - text_if_file: Option<(Rope, LineEnding)>, - cx: &mut ModelContext, - ) -> Task> { - let path = path.into(); - let abs_path = self.absolutize(&path); - let fs = self.fs.clone(); - let write = cx.background().spawn(async move { - if let Some((text, line_ending)) = text_if_file { - fs.save(&abs_path, &text, line_ending).await - } else { - fs.create_dir(&abs_path).await - } - }); - - cx.spawn(|this, mut cx| async move { - write.await?; - this.update(&mut cx, |this, cx| { - this.as_local_mut().unwrap().refresh_entry(path, None, cx) - }) - .await - }) - } - fn refresh_entry( &self, path: Arc, @@ -1380,7 +1377,10 @@ impl LocalSnapshot { .cloned() } - pub(crate) fn in_dot_git(&mut self, path: &Path) -> Option<&mut GitRepositoryEntry> { + pub(crate) fn repo_with_dot_git_containing( + &mut self, + path: &Path, + ) -> Option<&mut GitRepositoryEntry> { // Git repositories cannot be nested, so we don't need to reverse the order self.git_repositories .iter_mut() @@ -1682,7 +1682,7 @@ impl GitRepositoryEntry { path.starts_with(self.content_path.as_ref()) } - // Note that theis path should be relative to the worktree root. + // Note that this path should be relative to the worktree root. pub(crate) fn in_dot_git(&self, path: &Path) -> bool { path.starts_with(self.git_dir_path.as_ref()) } @@ -2162,61 +2162,143 @@ impl BackgroundScanner { events_rx: impl Stream>, mut changed_paths: UnboundedReceiver<(Vec, barrier::Sender)>, ) { - use futures::{select_biased, FutureExt as _}; - - // While performing the initial scan, send a new snapshot to the main - // thread on a recurring interval. - let initializing_task = self.executor.spawn({ - let executor = self.executor.clone(); - let snapshot = self.snapshot.clone(); - let notify = self.notify.clone(); - let is_fake_fs = self.fs.is_fake(); - async move { - loop { - if is_fake_fs { - #[cfg(any(test, feature = "test-support"))] - executor.simulate_random_delay().await; - } else { - smol::Timer::after(Duration::from_millis(100)).await; - } + use futures::FutureExt as _; - executor.timer(Duration::from_millis(100)).await; - if notify - .unbounded_send(ScanState::Initializing(snapshot.lock().clone())) - .is_err() - { - break; - } + // Retrieve the basic properties of the root node. + let root_char_bag; + let root_abs_path; + let root_inode; + let root_is_dir; + let next_entry_id; + { + let mut snapshot = self.snapshot.lock(); + snapshot.scan_started(); + root_char_bag = snapshot.root_char_bag; + root_abs_path = snapshot.abs_path.clone(); + root_inode = snapshot.root_entry().map(|e| e.inode); + root_is_dir = snapshot.root_entry().map_or(false, |e| e.is_dir()); + next_entry_id = snapshot.next_entry_id.clone(); + } + + // Populate ignores above the root. + let ignore_stack; + for ancestor in root_abs_path.ancestors().skip(1) { + if let Ok(ignore) = build_gitignore(&ancestor.join(&*GITIGNORE), self.fs.as_ref()).await + { + self.snapshot + .lock() + .ignores_by_parent_abs_path + .insert(ancestor.into(), (ignore.into(), 0)); + } + } + { + let mut snapshot = self.snapshot.lock(); + ignore_stack = snapshot.ignore_stack_for_abs_path(&root_abs_path, true); + if ignore_stack.is_all() { + if let Some(mut root_entry) = snapshot.root_entry().cloned() { + root_entry.is_ignored = true; + snapshot.insert_entry(root_entry, self.fs.as_ref()); } } - }); + }; - // Scan the entire directory. - if let Err(err) = self.scan_dirs().await { - if self - .notify - .unbounded_send(ScanState::Err(Arc::new(err))) - .is_err() - { - return; + if root_is_dir { + let mut ancestor_inodes = TreeSet::default(); + if let Some(root_inode) = root_inode { + ancestor_inodes.insert(root_inode); } + + let (tx, rx) = channel::unbounded(); + self.executor + .block(tx.send(ScanJob { + abs_path: root_abs_path.to_path_buf(), + path: Arc::from(Path::new("")), + ignore_stack, + ancestor_inodes, + scan_queue: tx.clone(), + })) + .unwrap(); + drop(tx); + + // Spawn a worker thread per logical CPU. + self.executor + .scoped(|scope| { + // One the first worker thread, listen for change requests from the worktree. + // For each change request, after refreshing the given paths, report + // a progress update for the snapshot. + scope.spawn(async { + let reporting_timer = self.delay().fuse(); + futures::pin_mut!(reporting_timer); + + loop { + select_biased! { + job = changed_paths.next().fuse() => { + let Some((abs_paths, barrier)) = job else { break }; + self.update_entries_for_paths(abs_paths, None).await; + if self.notify.unbounded_send(ScanState::Initializing { + snapshot: self.snapshot.lock().clone(), + barrier: Some(barrier), + }).is_err() { + break; + } + } + + _ = reporting_timer => { + reporting_timer.set(self.delay().fuse()); + if self.notify.unbounded_send(ScanState::Initializing { + snapshot: self.snapshot.lock().clone(), + barrier: None, + }).is_err() { + break; + } + } + + job = rx.recv().fuse() => { + let Ok(job) = job else { break }; + if let Err(err) = self + .scan_dir(root_char_bag, next_entry_id.clone(), &job) + .await + { + log::error!("error scanning {:?}: {}", job.abs_path, err); + } + } + } + } + }); + + // On all of the remaining worker threads, just scan directories. + for _ in 1..self.executor.num_cpus() { + scope.spawn(async { + while let Ok(job) = rx.recv().await { + if let Err(err) = self + .scan_dir(root_char_bag, next_entry_id.clone(), &job) + .await + { + log::error!("error scanning {:?}: {}", job.abs_path, err); + } + } + }); + } + }) + .await; } - drop(initializing_task); + self.snapshot.lock().scan_completed(); if self .notify - .unbounded_send(ScanState::Initialized(self.snapshot.lock().clone())) + .unbounded_send(ScanState::Initialized { + snapshot: self.snapshot.lock().clone(), + }) .is_err() { return; } - futures::pin_mut!(events_rx); - // Process any events that occurred while performing the initial scan. These // events can't be reported as precisely, because there is no snapshot of the // worktree before they occurred. + futures::pin_mut!(events_rx); if let Poll::Ready(Some(mut events)) = futures::poll!(events_rx.next()) { while let Poll::Ready(Some(additional_events)) = futures::poll!(events_rx.next()) { events.extend(additional_events); @@ -2224,7 +2306,10 @@ impl BackgroundScanner { if self.notify.unbounded_send(ScanState::Updating).is_err() { return; } - if !self.process_events(events, true).await { + if !self + .process_events(events.into_iter().map(|e| e.path).collect(), true) + .await + { return; } if self @@ -2242,24 +2327,17 @@ impl BackgroundScanner { // Continue processing events until the worktree is dropped. loop { - let events; + let abs_paths; let barrier; select_biased! { request = changed_paths.next().fuse() => { - let Some((paths, b)) = request else { break; }; - events = paths - .into_iter() - .map(|path| fsevent::Event { - path, - event_id: 0, - flags: fsevent::StreamFlags::NONE - }) - .collect::>(); + let Some((paths, b)) = request else { break }; + abs_paths = paths; barrier = Some(b); } - e = events_rx.next().fuse() => { - let Some(e) = e else { break; }; - events = e; + events = events_rx.next().fuse() => { + let Some(events) = events else { break }; + abs_paths = events.into_iter().map(|e| e.path).collect(); barrier = None; } } @@ -2267,7 +2345,7 @@ impl BackgroundScanner { if self.notify.unbounded_send(ScanState::Updating).is_err() { return; } - if !self.process_events(events, false).await { + if !self.process_events(abs_paths, false).await { return; } if self @@ -2284,85 +2362,12 @@ impl BackgroundScanner { } } - async fn scan_dirs(&mut self) -> Result<()> { - let root_char_bag; - let root_abs_path; - let root_inode; - let is_dir; - let next_entry_id; - { - let mut snapshot = self.snapshot.lock(); - snapshot.scan_started(); - root_char_bag = snapshot.root_char_bag; - root_abs_path = snapshot.abs_path.clone(); - root_inode = snapshot.root_entry().map(|e| e.inode); - is_dir = snapshot.root_entry().map_or(false, |e| e.is_dir()); - next_entry_id = snapshot.next_entry_id.clone(); - }; - - // Populate ignores above the root. - for ancestor in root_abs_path.ancestors().skip(1) { - if let Ok(ignore) = build_gitignore(&ancestor.join(&*GITIGNORE), self.fs.as_ref()).await - { - self.snapshot - .lock() - .ignores_by_parent_abs_path - .insert(ancestor.into(), (ignore.into(), 0)); - } - } - - let ignore_stack = { - let mut snapshot = self.snapshot.lock(); - let ignore_stack = snapshot.ignore_stack_for_abs_path(&root_abs_path, true); - if ignore_stack.is_all() { - if let Some(mut root_entry) = snapshot.root_entry().cloned() { - root_entry.is_ignored = true; - snapshot.insert_entry(root_entry, self.fs.as_ref()); - } - } - ignore_stack - }; - - if is_dir { - let path: Arc = Arc::from(Path::new("")); - let mut ancestor_inodes = TreeSet::default(); - if let Some(root_inode) = root_inode { - ancestor_inodes.insert(root_inode); - } - - let (tx, rx) = channel::unbounded(); - self.executor - .block(tx.send(ScanJob { - abs_path: root_abs_path.to_path_buf(), - path, - ignore_stack, - ancestor_inodes, - scan_queue: tx.clone(), - })) - .unwrap(); - drop(tx); - - self.executor - .scoped(|scope| { - for _ in 0..self.executor.num_cpus() { - scope.spawn(async { - while let Ok(job) = rx.recv().await { - if let Err(err) = self - .scan_dir(root_char_bag, next_entry_id.clone(), &job) - .await - { - log::error!("error scanning {:?}: {}", job.abs_path, err); - } - } - }); - } - }) - .await; - - self.snapshot.lock().scan_completed(); + async fn delay(&self) { + #[cfg(any(test, feature = "test-support"))] + if self.fs.is_fake() { + return self.executor.simulate_random_delay().await; } - - Ok(()) + smol::Timer::after(Duration::from_millis(100)).await; } async fn scan_dir( @@ -2492,85 +2497,125 @@ impl BackgroundScanner { async fn process_events( &mut self, - mut events: Vec, + abs_paths: Vec, received_before_initialized: bool, ) -> bool { - events.sort_unstable_by(|a, b| a.path.cmp(&b.path)); - events.dedup_by(|a, b| a.path.starts_with(&b.path)); + let (scan_queue_tx, scan_queue_rx) = channel::unbounded(); - let root_char_bag; - let root_abs_path; - let next_entry_id; - let prev_snapshot; - { + let prev_snapshot = { let mut snapshot = self.snapshot.lock(); - prev_snapshot = snapshot.snapshot.clone(); - root_char_bag = snapshot.root_char_bag; - root_abs_path = snapshot.abs_path.clone(); - next_entry_id = snapshot.next_entry_id.clone(); snapshot.scan_started(); - } + snapshot.clone() + }; - let root_canonical_path = if let Ok(path) = self.fs.canonicalize(&root_abs_path).await { - path + let event_paths = if let Some(event_paths) = self + .update_entries_for_paths(abs_paths, Some(scan_queue_tx)) + .await + { + event_paths } else { return false; }; + + // Scan any directories that were created as part of this event batch. + self.executor + .scoped(|scope| { + for _ in 0..self.executor.num_cpus() { + scope.spawn(async { + while let Ok(job) = scan_queue_rx.recv().await { + if let Err(err) = self + .scan_dir( + prev_snapshot.root_char_bag, + prev_snapshot.next_entry_id.clone(), + &job, + ) + .await + { + log::error!("error scanning {:?}: {}", job.abs_path, err); + } + } + }); + } + }) + .await; + + // Attempt to detect renames only over a single batch of file-system events. + self.snapshot.lock().removed_entry_ids.clear(); + + self.update_ignore_statuses().await; + self.update_git_repositories(); + self.build_change_set( + prev_snapshot.snapshot, + event_paths, + received_before_initialized, + ); + self.snapshot.lock().scan_completed(); + true + } + + async fn update_entries_for_paths( + &self, + mut abs_paths: Vec, + scan_queue_tx: Option>, + ) -> Option>> { + abs_paths.sort_unstable(); + abs_paths.dedup_by(|a, b| a.starts_with(&b)); + + let root_abs_path = self.snapshot.lock().abs_path.clone(); + let root_canonical_path = self.fs.canonicalize(&root_abs_path).await.ok()?; let metadata = futures::future::join_all( - events + abs_paths .iter() - .map(|event| self.fs.metadata(&event.path)) + .map(|abs_path| self.fs.metadata(&abs_path)) .collect::>(), ) .await; - // Hold the snapshot lock while clearing and re-inserting the root entries - // for each event. This way, the snapshot is not observable to the foreground - // thread while this operation is in-progress. - let mut event_paths = Vec::with_capacity(events.len()); - let (scan_queue_tx, scan_queue_rx) = channel::unbounded(); - { - let mut snapshot = self.snapshot.lock(); - for event in &events { - if let Ok(path) = event.path.strip_prefix(&root_canonical_path) { + let mut snapshot = self.snapshot.lock(); + if scan_queue_tx.is_some() { + for abs_path in &abs_paths { + if let Ok(path) = abs_path.strip_prefix(&root_canonical_path) { snapshot.remove_path(path); } } + } - for (event, metadata) in events.into_iter().zip(metadata.into_iter()) { - let path: Arc = match event.path.strip_prefix(&root_canonical_path) { - Ok(path) => Arc::from(path.to_path_buf()), - Err(_) => { - log::error!( - "unexpected event {:?} for root path {:?}", - event.path, - root_canonical_path - ); - continue; - } - }; - event_paths.push(path.clone()); - let abs_path = root_abs_path.join(&path); - - match metadata { - Ok(Some(metadata)) => { - let ignore_stack = - snapshot.ignore_stack_for_abs_path(&abs_path, metadata.is_dir); - let mut fs_entry = Entry::new( - path.clone(), - &metadata, - snapshot.next_entry_id.as_ref(), - snapshot.root_char_bag, - ); - fs_entry.is_ignored = ignore_stack.is_all(); - snapshot.insert_entry(fs_entry, self.fs.as_ref()); + let mut event_paths = Vec::with_capacity(abs_paths.len()); + for (abs_path, metadata) in abs_paths.into_iter().zip(metadata.into_iter()) { + let path: Arc = match abs_path.strip_prefix(&root_canonical_path) { + Ok(path) => Arc::from(path.to_path_buf()), + Err(_) => { + log::error!( + "unexpected event {:?} for root path {:?}", + abs_path, + root_canonical_path + ); + continue; + } + }; + event_paths.push(path.clone()); + let abs_path = root_abs_path.join(&path); + + match metadata { + Ok(Some(metadata)) => { + let ignore_stack = + snapshot.ignore_stack_for_abs_path(&abs_path, metadata.is_dir); + let mut fs_entry = Entry::new( + path.clone(), + &metadata, + snapshot.next_entry_id.as_ref(), + snapshot.root_char_bag, + ); + fs_entry.is_ignored = ignore_stack.is_all(); + snapshot.insert_entry(fs_entry, self.fs.as_ref()); - let scan_id = snapshot.scan_id; - if let Some(repo) = snapshot.in_dot_git(&path) { - repo.repo.lock().reload_index(); - repo.scan_id = scan_id; - } + let scan_id = snapshot.scan_id; + if let Some(repo) = snapshot.repo_with_dot_git_containing(&path) { + repo.repo.lock().reload_index(); + repo.scan_id = scan_id; + } + if let Some(scan_queue_tx) = &scan_queue_tx { let mut ancestor_inodes = snapshot.ancestor_inodes_for_path(&path); if metadata.is_dir && !ancestor_inodes.contains(&metadata.inode) { ancestor_inodes.insert(metadata.inode); @@ -2585,42 +2630,16 @@ impl BackgroundScanner { .unwrap(); } } - Ok(None) => {} - Err(err) => { - // TODO - create a special 'error' entry in the entries tree to mark this - log::error!("error reading file on event {:?}", err); - } + } + Ok(None) => {} + Err(err) => { + // TODO - create a special 'error' entry in the entries tree to mark this + log::error!("error reading file on event {:?}", err); } } - drop(scan_queue_tx); } - // Scan any directories that were created as part of this event batch. - self.executor - .scoped(|scope| { - for _ in 0..self.executor.num_cpus() { - scope.spawn(async { - while let Ok(job) = scan_queue_rx.recv().await { - if let Err(err) = self - .scan_dir(root_char_bag, next_entry_id.clone(), &job) - .await - { - log::error!("error scanning {:?}: {}", job.abs_path, err); - } - } - }); - } - }) - .await; - - // Attempt to detect renames only over a single batch of file-system events. - self.snapshot.lock().removed_entry_ids.clear(); - - self.update_ignore_statuses().await; - self.update_git_repositories(); - self.build_change_set(prev_snapshot, event_paths, received_before_initialized); - self.snapshot.lock().scan_completed(); - true + Some(event_paths) } async fn update_ignore_statuses(&self) { From f7b2713b77338bd54c341104121413fe885fc91c Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 21 Mar 2023 15:41:24 -0700 Subject: [PATCH 13/20] Fix error in joining empty paths --- crates/project/src/worktree.rs | 61 +++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 33714e762ff94d43d7dd6f99a806c763ea33dafc..90da3253d57b539aecc3c8e73651974045ce8b3b 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -809,31 +809,32 @@ impl LocalWorktree { cx: &mut ModelContext, ) -> Option>> { let entry = self.entry_for_id(entry_id)?.clone(); - let path = entry.path.clone(); - let abs_path = self.absolutize(&path); - let (tx, mut rx) = barrier::channel(); + let abs_path = self.abs_path.clone(); + let fs = self.fs.clone(); - let delete = cx.background().spawn({ - let abs_path = abs_path.clone(); - let fs = self.fs.clone(); - async move { - if entry.is_file() { - fs.remove_file(&abs_path, Default::default()).await - } else { - fs.remove_dir( - &abs_path, - RemoveOptions { - recursive: true, - ignore_if_not_exists: false, - }, - ) - .await - } + let delete = cx.background().spawn(async move { + let mut abs_path = fs.canonicalize(&abs_path).await?; + if entry.path.file_name().is_some() { + abs_path = abs_path.join(&entry.path); } + if entry.is_file() { + fs.remove_file(&abs_path, Default::default()).await?; + } else { + fs.remove_dir( + &abs_path, + RemoveOptions { + recursive: true, + ignore_if_not_exists: false, + }, + ) + .await?; + } + anyhow::Ok(abs_path) }); Some(cx.spawn(|this, mut cx| async move { - delete.await?; + let abs_path = delete.await?; + let (tx, mut rx) = barrier::channel(); this.update(&mut cx, |this, _| { this.as_local_mut() .unwrap() @@ -912,15 +913,23 @@ impl LocalWorktree { cx: &mut ModelContext, ) -> Task> { let fs = self.fs.clone(); - let abs_path = self.abs_path.clone(); + let abs_root_path = self.abs_path.clone(); let path_changes_tx = self.path_changes_tx.clone(); cx.spawn_weak(move |this, mut cx| async move { - let abs_path = fs.canonicalize(&abs_path).await?; - let paths = if let Some(old_path) = old_path { - vec![abs_path.join(&path), abs_path.join(&old_path)] + let abs_path = fs.canonicalize(&abs_root_path).await?; + let mut paths = Vec::with_capacity(2); + paths.push(if path.file_name().is_some() { + abs_path.join(&path) } else { - vec![abs_path.join(&path)] - }; + abs_path.clone() + }); + if let Some(old_path) = old_path { + paths.push(if old_path.file_name().is_some() { + abs_path.join(&old_path) + } else { + abs_path.clone() + }); + } let (tx, mut rx) = barrier::channel(); path_changes_tx.unbounded_send((paths, tx)).unwrap(); From c1f53358ba010e36950a9686e1b3b93cadc72c1c Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 21 Mar 2023 15:47:02 -0700 Subject: [PATCH 14/20] Remove unnecessary Arc around background scanner's snapshot --- crates/project/src/worktree.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 90da3253d57b539aecc3c8e73651974045ce8b3b..76273689349ab5b6b1d987858d4323b30bc034ed 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -2140,7 +2140,7 @@ impl<'a> sum_tree::Dimension<'a, EntrySummary> for PathKey { struct BackgroundScanner { fs: Arc, - snapshot: Arc>, + snapshot: Mutex, changes: HashMap, PathChange>, notify: UnboundedSender, executor: Arc, @@ -2155,7 +2155,7 @@ impl BackgroundScanner { ) -> Self { Self { fs, - snapshot: Arc::new(Mutex::new(snapshot)), + snapshot: Mutex::new(snapshot), notify, executor, changes: Default::default(), From eaee5571a01345a4c1dde2ed96cd26f13163df48 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 21 Mar 2023 18:06:17 -0700 Subject: [PATCH 15/20] Use a more stable, readable serialization format for neovim-backed vim tests --- .../src/test/neovim_backed_test_context.rs | 8 +- crates/vim/src/test/neovim_connection.rs | 252 ++-- .../neovim_backed_test_context_works.json | 4 +- crates/vim/test_data/test_a.json | 7 +- crates/vim/test_data/test_b.json | 55 +- crates/vim/test_data/test_backspace.json | 10 +- .../test_capital_f_and_capital_t.json | 571 ++++++++- crates/vim/test_data/test_cc.json | 25 +- crates/vim/test_data/test_change_0.json | 9 +- crates/vim/test_data/test_change_b.json | 25 +- .../vim/test_data/test_change_backspace.json | 17 +- crates/vim/test_data/test_change_e.json | 25 +- .../test_change_end_of_document.json | 17 +- .../test_data/test_change_end_of_line.json | 9 +- crates/vim/test_data/test_change_gg.json | 21 +- crates/vim/test_data/test_change_h.json | 17 +- crates/vim/test_data/test_change_j.json | 17 +- crates/vim/test_data/test_change_k.json | 17 +- crates/vim/test_data/test_change_l.json | 9 +- .../test_change_sentence_object.json | 271 ++++- ..._change_surrounding_character_objects.json | 1021 ++++++++++++++++- crates/vim/test_data/test_change_w.json | 29 +- .../test_data/test_change_word_object.json | 461 +++++++- crates/vim/test_data/test_dd.json | 25 +- crates/vim/test_data/test_delete_0.json | 9 +- crates/vim/test_data/test_delete_b.json | 25 +- crates/vim/test_data/test_delete_e.json | 21 +- .../test_delete_end_of_document.json | 17 +- .../test_data/test_delete_end_of_line.json | 9 +- crates/vim/test_data/test_delete_gg.json | 21 +- crates/vim/test_data/test_delete_h.json | 17 +- crates/vim/test_data/test_delete_j.json | 17 +- crates/vim/test_data/test_delete_k.json | 17 +- crates/vim/test_data/test_delete_l.json | 17 +- crates/vim/test_data/test_delete_left.json | 16 +- .../test_delete_sentence_object.json | 271 ++++- ..._delete_surrounding_character_objects.json | 1015 +++++++++++++++- .../test_data/test_delete_to_end_of_line.json | 7 +- crates/vim/test_data/test_delete_w.json | 21 +- .../test_data/test_delete_word_object.json | 461 +++++++- crates/vim/test_data/test_e.json | 33 +- .../vim/test_data/test_end_of_document.json | 16 +- crates/vim/test_data/test_enter.json | 12 +- .../vim/test_data/test_enter_visual_mode.json | 31 +- crates/vim/test_data/test_f_and_t.json | 558 ++++++++- crates/vim/test_data/test_gg.json | 22 +- crates/vim/test_data/test_h.json | 10 +- .../vim/test_data/test_h_through_unicode.json | 13 +- .../test_data/test_insert_end_of_line.json | 10 +- .../test_insert_first_non_whitespace.json | 16 +- .../vim/test_data/test_insert_line_above.json | 19 +- crates/vim/test_data/test_j.json | 13 +- crates/vim/test_data/test_jump_to_end.json | 15 +- .../test_jump_to_first_non_whitespace.json | 19 +- .../test_jump_to_line_boundaries.json | 29 +- crates/vim/test_data/test_k.json | 16 +- crates/vim/test_data/test_l.json | 16 +- crates/vim/test_data/test_neovim.json | 17 +- crates/vim/test_data/test_o.json | 19 +- crates/vim/test_data/test_p.json | 14 +- crates/vim/test_data/test_percent.json | 59 +- crates/vim/test_data/test_repeated_cb.json | 276 ++++- crates/vim/test_data/test_repeated_ce.json | 276 ++++- crates/vim/test_data/test_repeated_cj.json | 276 ++++- crates/vim/test_data/test_repeated_cl.json | 276 ++++- crates/vim/test_data/test_repeated_word.json | 215 +++- crates/vim/test_data/test_visual_change.json | 42 +- crates/vim/test_data/test_visual_delete.json | 45 +- .../test_data/test_visual_line_change.json | 36 +- .../test_data/test_visual_line_delete.json | 32 +- .../test_visual_sentence_object.json | 1 - .../test_data/test_visual_word_object.json | 231 +++- crates/vim/test_data/test_w.json | 41 +- crates/vim/test_data/test_x.json | 13 +- 74 files changed, 7440 insertions(+), 160 deletions(-) diff --git a/crates/vim/src/test/neovim_backed_test_context.rs b/crates/vim/src/test/neovim_backed_test_context.rs index a6bf5bc6faf6d39d832186e1fe441aa93c2d764b..b8e09d0b91b7edaa5a5333e678c193a5b92cca99 100644 --- a/crates/vim/src/test/neovim_backed_test_context.rs +++ b/crates/vim/src/test/neovim_backed_test_context.rs @@ -2,7 +2,7 @@ use std::ops::{Deref, DerefMut}; use collections::{HashMap, HashSet}; use gpui::ContextHandle; -use language::{OffsetRangeExt, Point}; +use language::OffsetRangeExt; use util::test::marked_text_offsets; use super::{neovim_connection::NeovimConnection, NeovimBackedBindingTestContext, VimTestContext}; @@ -108,11 +108,7 @@ impl<'a> NeovimBackedTestContext<'a> { pub async fn set_shared_state(&mut self, marked_text: &str) -> ContextHandle { let context_handle = self.set_state(marked_text, Mode::Normal); - - let selection = self.editor(|editor, cx| editor.selections.newest::(cx)); - let text = self.buffer_text(); - self.neovim.set_state(selection, &text).await; - + self.neovim.set_state(marked_text).await; context_handle } diff --git a/crates/vim/src/test/neovim_connection.rs b/crates/vim/src/test/neovim_connection.rs index 1850a031711fae2f67208495b665cf5cf2596e7c..538e83a8036f114c84c34f1c4e833ed449fa7c45 100644 --- a/crates/vim/src/test/neovim_connection.rs +++ b/crates/vim/src/test/neovim_connection.rs @@ -9,7 +9,7 @@ use async_trait::async_trait; #[cfg(feature = "neovim")] use gpui::keymap_matcher::Keystroke; -use language::{Point, Selection}; +use language::Point; #[cfg(feature = "neovim")] use lazy_static::lazy_static; @@ -36,11 +36,11 @@ lazy_static! { static ref NEOVIM_LOCK: ReentrantMutex<()> = ReentrantMutex::new(()); } -#[derive(Serialize, Deserialize)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub enum NeovimData { - Text(String), - Selection { start: (u32, u32), end: (u32, u32) }, - Mode(Option), + Put { state: String }, + Key(String), + Get { state: String, mode: Option }, } pub struct NeovimConnection { @@ -117,18 +117,30 @@ impl NeovimConnection { let key = format!("{start}{shift}{ctrl}{alt}{cmd}{}{end}", keystroke.key); + self.data + .push_back(NeovimData::Key(keystroke_text.to_string())); self.nvim .input(&key) .await .expect("Could not input keystroke"); } - // If not running with a live neovim connection, this is a no-op #[cfg(not(feature = "neovim"))] - pub async fn send_keystroke(&mut self, _keystroke_text: &str) {} + pub async fn send_keystroke(&mut self, keystroke_text: &str) { + if matches!(self.data.front(), Some(NeovimData::Get { .. })) { + self.data.pop_front(); + } + assert_eq!( + self.data.pop_front(), + Some(NeovimData::Key(keystroke_text.to_string())), + "operation does not match recorded script. re-record with --features=neovim" + ); + } #[cfg(feature = "neovim")] - pub async fn set_state(&mut self, selection: Selection, text: &str) { + pub async fn set_state(&mut self, marked_text: &str) { + let (text, selection) = parse_state(&marked_text); + let nvim_buffer = self .nvim .get_current_buf() @@ -162,18 +174,41 @@ impl NeovimConnection { if !selection.is_empty() { panic!("Setting neovim state with non empty selection not yet supported"); } - let cursor = selection.head(); + let cursor = selection.start; nvim_window .set_cursor((cursor.row as i64 + 1, cursor.column as i64)) .await .expect("Could not set nvim cursor position"); + + if let Some(NeovimData::Get { mode, state }) = self.data.back() { + if *mode == Some(Mode::Normal) && *state == marked_text { + return; + } + } + self.data.push_back(NeovimData::Put { + state: marked_text.to_string(), + }) } #[cfg(not(feature = "neovim"))] - pub async fn set_state(&mut self, _selection: Selection, _text: &str) {} + pub async fn set_state(&mut self, marked_text: &str) { + if let Some(NeovimData::Get { mode, state: text }) = self.data.front() { + if *mode == Some(Mode::Normal) && *text == marked_text { + return; + } + self.data.pop_front(); + } + assert_eq!( + self.data.pop_front(), + Some(NeovimData::Put { + state: marked_text.to_string() + }), + "operation does not match recorded script. re-record with --features=neovim" + ); + } #[cfg(feature = "neovim")] - pub async fn text(&mut self) -> String { + pub async fn state(&mut self) -> (Option, String, Range) { let nvim_buffer = self .nvim .get_current_buf() @@ -185,22 +220,6 @@ impl NeovimConnection { .expect("Could not get buffer text") .join("\n"); - self.data.push_back(NeovimData::Text(text.clone())); - - text - } - - #[cfg(not(feature = "neovim"))] - pub async fn text(&mut self) -> String { - if let Some(NeovimData::Text(text)) = self.data.pop_front() { - text - } else { - panic!("Invalid test data. Is test deterministic? Try running with '--features neovim' to regenerate"); - } - } - - #[cfg(feature = "neovim")] - pub async fn selection(&mut self) -> Range { let cursor_row: u32 = self .nvim .command_output("echo line('.')") @@ -218,7 +237,30 @@ impl NeovimConnection { .unwrap() - 1; // Neovim columns start at 1 - let (start, end) = if let Some(Mode::Visual { .. }) = self.mode().await { + let nvim_mode_text = self + .nvim + .get_mode() + .await + .expect("Could not get mode") + .into_iter() + .find_map(|(key, value)| { + if key.as_str() == Some("mode") { + Some(value.as_str().unwrap().to_owned()) + } else { + None + } + }) + .expect("Could not find mode value"); + + let mode = match nvim_mode_text.as_ref() { + "i" => Some(Mode::Insert), + "n" => Some(Mode::Normal), + "v" => Some(Mode::Visual { line: false }), + "V" => Some(Mode::Visual { line: true }), + _ => None, + }; + + let (start, end) = if let Some(Mode::Visual { .. }) = mode { self.nvim .input("") .await @@ -243,72 +285,54 @@ impl NeovimConnection { if cursor_row == start_row as u32 - 1 && cursor_col == start_col as u32 { ( - (end_row as u32 - 1, end_col as u32), - (start_row as u32 - 1, start_col as u32), + Point::new(end_row as u32 - 1, end_col as u32), + Point::new(start_row as u32 - 1, start_col as u32), ) } else { ( - (start_row as u32 - 1, start_col as u32), - (end_row as u32 - 1, end_col as u32), + Point::new(start_row as u32 - 1, start_col as u32), + Point::new(end_row as u32 - 1, end_col as u32), ) } } else { - ((cursor_row, cursor_col), (cursor_row, cursor_col)) + ( + Point::new(cursor_row, cursor_col), + Point::new(cursor_row, cursor_col), + ) }; - self.data.push_back(NeovimData::Selection { start, end }); + let state = NeovimData::Get { + mode, + state: encode_range(&text, start..end), + }; + + if self.data.back() != Some(&state) { + self.data.push_back(state.clone()); + } - Point::new(start.0, start.1)..Point::new(end.0, end.1) + (mode, text, start..end) } #[cfg(not(feature = "neovim"))] - pub async fn selection(&mut self) -> Range { - // Selection code fetches the mode. This emulates that. - let _mode = self.mode().await; - if let Some(NeovimData::Selection { start, end }) = self.data.pop_front() { - Point::new(start.0, start.1)..Point::new(end.0, end.1) + pub async fn state(&mut self) -> (Option, String, Range) { + if let Some(NeovimData::Get { state: text, mode }) = self.data.front() { + let (text, range) = parse_state(text); + (*mode, text, range) } else { - panic!("Invalid test data. Is test deterministic? Try running with '--features neovim' to regenerate"); + panic!("operation does not match recorded script. re-record with --features=neovim"); } } - #[cfg(feature = "neovim")] - pub async fn mode(&mut self) -> Option { - let nvim_mode_text = self - .nvim - .get_mode() - .await - .expect("Could not get mode") - .into_iter() - .find_map(|(key, value)| { - if key.as_str() == Some("mode") { - Some(value.as_str().unwrap().to_owned()) - } else { - None - } - }) - .expect("Could not find mode value"); - - let mode = match nvim_mode_text.as_ref() { - "i" => Some(Mode::Insert), - "n" => Some(Mode::Normal), - "v" => Some(Mode::Visual { line: false }), - "V" => Some(Mode::Visual { line: true }), - _ => None, - }; - - self.data.push_back(NeovimData::Mode(mode.clone())); - - mode + pub async fn selection(&mut self) -> Range { + self.state().await.2 } - #[cfg(not(feature = "neovim"))] pub async fn mode(&mut self) -> Option { - if let Some(NeovimData::Mode(mode)) = self.data.pop_front() { - mode - } else { - panic!("Invalid test data. Is test deterministic? Try running with '--features neovim' to regenerate"); - } + self.state().await.0 + } + + pub async fn text(&mut self) -> String { + self.state().await.1 } fn test_data_path(test_case_id: &str) -> PathBuf { @@ -325,8 +349,27 @@ impl NeovimConnection { "Could not read test data. Is it generated? Try running test with '--features neovim'", ); - serde_json::from_str(&json) - .expect("Test data corrupted. Try regenerating it with '--features neovim'") + let mut result = VecDeque::new(); + for line in json.lines() { + result.push_back( + serde_json::from_str(line) + .expect("invalid test data. regenerate it with '--features neovim'"), + ); + } + result + } + + #[cfg(feature = "neovim")] + fn write_test_data(test_case_id: &str, data: &VecDeque) { + let path = Self::test_data_path(test_case_id); + let mut json = Vec::new(); + for entry in data { + serde_json::to_writer(&mut json, entry).unwrap(); + json.push(b'\n'); + } + std::fs::create_dir_all(path.parent().unwrap()) + .expect("could not create test data directory"); + std::fs::write(path, json).expect("could not write out test data"); } } @@ -349,11 +392,7 @@ impl DerefMut for NeovimConnection { #[cfg(feature = "neovim")] impl Drop for NeovimConnection { fn drop(&mut self) { - let path = Self::test_data_path(&self.test_case_id); - std::fs::create_dir_all(path.parent().unwrap()) - .expect("Could not create test data directory"); - let json = serde_json::to_string(&self.data).expect("Could not serialize test data"); - std::fs::write(path, json).expect("Could not write out test data"); + Self::write_test_data(&self.test_case_id, &self.data); } } @@ -383,3 +422,52 @@ impl Handler for NvimHandler { ) { } } + +fn parse_state(marked_text: &str) -> (String, Range) { + let (text, ranges) = util::test::marked_text_ranges(marked_text, true); + let byte_range = ranges[0].clone(); + let mut point_range = Point::zero()..Point::zero(); + let mut ix = 0; + let mut position = Point::zero(); + for c in text.chars().chain(['\0']) { + if ix == byte_range.start { + point_range.start = position; + } + if ix == byte_range.end { + point_range.end = position; + } + let len_utf8 = c.len_utf8(); + ix += len_utf8; + if c == '\n' { + position.row += 1; + position.column = 0; + } else { + position.column += len_utf8 as u32; + } + } + (text, point_range) +} + +#[cfg(feature = "neovim")] +fn encode_range(text: &str, range: Range) -> String { + let mut byte_range = 0..0; + let mut ix = 0; + let mut position = Point::zero(); + for c in text.chars().chain(['\0']) { + if position == range.start { + byte_range.start = ix; + } + if position == range.end { + byte_range.end = ix; + } + let len_utf8 = c.len_utf8(); + ix += len_utf8; + if c == '\n' { + position.row += 1; + position.column = 0; + } else { + position.column += len_utf8 as u32; + } + } + util::test::generate_marked_text(text, &[byte_range], true) +} diff --git a/crates/vim/test_data/neovim_backed_test_context_works.json b/crates/vim/test_data/neovim_backed_test_context_works.json index 807c9010e894d43c47b62277de177b48bd8f4268..3ed9f40f88a8dfb14a551fee6d6a236b10f89f64 100644 --- a/crates/vim/test_data/neovim_backed_test_context_works.json +++ b/crates/vim/test_data/neovim_backed_test_context_works.json @@ -1 +1,3 @@ -[{"Text":""},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"This is a test"},{"Mode":"Normal"},{"Selection":{"start":[0,13],"end":[0,13]}},{"Mode":"Normal"}] \ No newline at end of file +{"Get":{"state":"ˇ","mode":"Normal"}} +{"Put":{"state":"This is a tesˇt"}} +{"Get":{"state":"This is a tesˇt","mode":"Normal"}} diff --git a/crates/vim/test_data/test_a.json b/crates/vim/test_data/test_a.json index 32ea8ac6a6fca1bf41c2c5de3b5d49e4280dabb3..8094974f982c97bda4e9f2ea9ba2373788655b9d 100644 --- a/crates/vim/test_data/test_a.json +++ b/crates/vim/test_data/test_a.json @@ -1 +1,6 @@ -[{"Text":"The quick"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"The quick"},{"Mode":"Insert"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"The qˇuick"}} +{"Key":"a"} +{"Get":{"state":"The quˇick","mode":"Insert"}} +{"Put":{"state":"The quicˇk"}} +{"Key":"a"} +{"Get":{"state":"The quickˇ","mode":"Insert"}} diff --git a/crates/vim/test_data/test_b.json b/crates/vim/test_data/test_b.json index 635edf536b85148c51b484af701e153006b2a7db..4324f9610d284ffb63e78cc0ad50b5b93829477f 100644 --- a/crates/vim/test_data/test_b.json +++ b/crates/vim/test_data/test_b.json @@ -1 +1,54 @@ -[{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[3,10],"end":[3,10]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[3,10],"end":[3,10]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick-brown\n\n\nfox_jumps over\nthe"}} +{"Key":"b"} +{"Get":{"state":"ˇThe quick-brown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The ˇquick-brown\n\n\nfox_jumps over\nthe"}} +{"Key":"b"} +{"Get":{"state":"ˇThe quick-brown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quickˇ-brown\n\n\nfox_jumps over\nthe"}} +{"Key":"b"} +{"Get":{"state":"The ˇquick-brown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quick-ˇbrown\n\n\nfox_jumps over\nthe"}} +{"Key":"b"} +{"Get":{"state":"The quickˇ-brown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quick-brown\nˇ\n\nfox_jumps over\nthe"}} +{"Key":"b"} +{"Get":{"state":"The quick-ˇbrown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quick-brown\n\nˇ\nfox_jumps over\nthe"}} +{"Key":"b"} +{"Get":{"state":"The quick-brown\nˇ\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quick-brown\n\n\nˇfox_jumps over\nthe"}} +{"Key":"b"} +{"Get":{"state":"The quick-brown\n\nˇ\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quick-brown\n\n\nfox_jumps ˇover\nthe"}} +{"Key":"b"} +{"Get":{"state":"The quick-brown\n\n\nˇfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quick-brown\n\n\nfox_jumps over\nˇthe"}} +{"Key":"b"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps ˇover\nthe","mode":"Normal"}} +{"Put":{"state":"ˇThe quick-brown\n\n\nfox_jumps over\nthe"}} +{"Key":"shift-b"} +{"Get":{"state":"ˇThe quick-brown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The ˇquick-brown\n\n\nfox_jumps over\nthe"}} +{"Key":"shift-b"} +{"Get":{"state":"ˇThe quick-brown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quickˇ-brown\n\n\nfox_jumps over\nthe"}} +{"Key":"shift-b"} +{"Get":{"state":"The ˇquick-brown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quick-ˇbrown\n\n\nfox_jumps over\nthe"}} +{"Key":"shift-b"} +{"Get":{"state":"The ˇquick-brown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quick-brown\nˇ\n\nfox_jumps over\nthe"}} +{"Key":"shift-b"} +{"Get":{"state":"The ˇquick-brown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quick-brown\n\nˇ\nfox_jumps over\nthe"}} +{"Key":"shift-b"} +{"Get":{"state":"The quick-brown\nˇ\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quick-brown\n\n\nˇfox_jumps over\nthe"}} +{"Key":"shift-b"} +{"Get":{"state":"The quick-brown\n\nˇ\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quick-brown\n\n\nfox_jumps ˇover\nthe"}} +{"Key":"shift-b"} +{"Get":{"state":"The quick-brown\n\n\nˇfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quick-brown\n\n\nfox_jumps over\nˇthe"}} +{"Key":"shift-b"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps ˇover\nthe","mode":"Normal"}} diff --git a/crates/vim/test_data/test_backspace.json b/crates/vim/test_data/test_backspace.json index d002dfa718ced0aafb6ec330ff5e84adf112b5b3..b11a2562dbc2d8b7a3736ea9813f4e7bd6dbb6f1 100644 --- a/crates/vim/test_data/test_backspace.json +++ b/crates/vim/test_data/test_backspace.json @@ -1 +1,9 @@ -[{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick\nbrown"}} +{"Key":"backspace"} +{"Get":{"state":"ˇThe quick\nbrown","mode":"Normal"}} +{"Put":{"state":"The qˇuick\nbrown"}} +{"Key":"backspace"} +{"Get":{"state":"The ˇquick\nbrown","mode":"Normal"}} +{"Put":{"state":"The quick\nˇbrown"}} +{"Key":"backspace"} +{"Get":{"state":"The quicˇk\nbrown","mode":"Normal"}} diff --git a/crates/vim/test_data/test_capital_f_and_capital_t.json b/crates/vim/test_data/test_capital_f_and_capital_t.json index 4c7f760021ba3718e640f516ba583fde2f3f4b96..8ef45ec623da86056f238ddf148021fb9c857172 100644 --- a/crates/vim/test_data/test_capital_f_and_capital_t.json +++ b/crates/vim/test_data/test_capital_f_and_capital_t.json @@ -1 +1,570 @@ -[{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,5],"end":[1,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,5],"end":[1,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,5],"end":[1,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,11],"end":[1,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,5],"end":[1,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,7],"end":[1,7]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,5],"end":[1,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,7],"end":[1,7]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,5],"end":[1,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,5],"end":[1,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,7],"end":[1,7]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,5],"end":[1,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,7],"end":[1,7]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,5],"end":[1,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n"}} +{"Key":"1"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n","mode":"Normal"}} +{"Put":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n"}} +{"Key":"1"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n","mode":"Normal"}} +{"Put":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n"}} +{"Key":"2"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n","mode":"Normal"}} +{"Put":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n"}} +{"Key":"2"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n","mode":"Normal"}} +{"Put":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n"}} +{"Key":"3"} +{"Key":"shift-f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n","mode":"Normal"}} +{"Put":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n"}} +{"Key":"3"} +{"Key":"shift-t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n","mode":"Normal"}} diff --git a/crates/vim/test_data/test_cc.json b/crates/vim/test_data/test_cc.json index 67492d827e4985322c6fd07c1ecc030b23e83594..d4b4a499bbb0cfef4fabb0c57b6956b975d873d5 100644 --- a/crates/vim/test_data/test_cc.json +++ b/crates/vim/test_data/test_cc.json @@ -1 +1,24 @@ -[{"Text":""},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":""},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nbrown fox\njumps over"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick\n\njumps over"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick\nbrown fox\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick\n\nbrown fox"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"ˇ"}} +{"Key":"c"} +{"Key":"c"} +{"Get":{"state":"ˇ","mode":"Insert"}} +{"Put":{"state":"The ˇquick"}} +{"Key":"c"} +{"Key":"c"} +{"Get":{"state":"ˇ","mode":"Insert"}} +{"Put":{"state":"The quˇick\nbrown fox\njumps over"}} +{"Key":"c"} +{"Key":"c"} +{"Get":{"state":"ˇ\nbrown fox\njumps over","mode":"Insert"}} +{"Put":{"state":"The quick\nbrown ˇfox\njumps over"}} +{"Key":"c"} +{"Key":"c"} +{"Get":{"state":"The quick\nˇ\njumps over","mode":"Insert"}} +{"Put":{"state":"The quick\nbrown fox\njumps ˇover"}} +{"Key":"c"} +{"Key":"c"} +{"Get":{"state":"The quick\nbrown fox\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick\nˇ\nbrown fox"}} +{"Key":"c"} +{"Key":"c"} +{"Get":{"state":"The quick\nˇ\nbrown fox","mode":"Insert"}} diff --git a/crates/vim/test_data/test_change_0.json b/crates/vim/test_data/test_change_0.json index fdc7632f01093e10a73d7fab1e700200628e6206..90668f4a17da9d0d8d5dc9e677f29568ed6c0f83 100644 --- a/crates/vim/test_data/test_change_0.json +++ b/crates/vim/test_data/test_change_0.json @@ -1 +1,8 @@ -[{"Text":"uick\nbrown fox"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick\n\nbrown fox"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"The qˇuick\nbrown fox"}} +{"Key":"c"} +{"Key":"0"} +{"Get":{"state":"ˇuick\nbrown fox","mode":"Insert"}} +{"Put":{"state":"The quick\nˇ\nbrown fox"}} +{"Key":"c"} +{"Key":"0"} +{"Get":{"state":"The quick\nˇ\nbrown fox","mode":"Insert"}} diff --git a/crates/vim/test_data/test_change_b.json b/crates/vim/test_data/test_change_b.json index b1dadfdd6484aaf7302ff924f5a5e252607f2b8f..d43cc04c45ea8ac88af91ac24d5218469b6326de 100644 --- a/crates/vim/test_data/test_change_b.json +++ b/crates/vim/test_data/test_change_b.json @@ -1 +1,24 @@ -[{"Text":"st Test"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"test"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"Test1 test3"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Test \ntest"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Test \n\ntest"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Test test"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"Teˇst Test"}} +{"Key":"c"} +{"Key":"b"} +{"Get":{"state":"ˇst Test","mode":"Insert"}} +{"Put":{"state":"Test ˇtest"}} +{"Key":"c"} +{"Key":"b"} +{"Get":{"state":"ˇtest","mode":"Insert"}} +{"Put":{"state":"Test1 test2 ˇtest3"}} +{"Key":"c"} +{"Key":"b"} +{"Get":{"state":"Test1 ˇtest3","mode":"Insert"}} +{"Put":{"state":"Test test\nˇtest"}} +{"Key":"c"} +{"Key":"b"} +{"Get":{"state":"Test ˇ\ntest","mode":"Insert"}} +{"Put":{"state":"Test test\nˇ\ntest"}} +{"Key":"c"} +{"Key":"b"} +{"Get":{"state":"Test ˇ\n\ntest","mode":"Insert"}} +{"Put":{"state":"Test test-test ˇtest"}} +{"Key":"c"} +{"Key":"shift-b"} +{"Get":{"state":"Test ˇtest","mode":"Insert"}} diff --git a/crates/vim/test_data/test_change_backspace.json b/crates/vim/test_data/test_change_backspace.json index f2e2f66b35cfb183fb1c5dcef0fc78ecd85a9c14..508500163b3302f4943f8a5ef101676c243a7256 100644 --- a/crates/vim/test_data/test_change_backspace.json +++ b/crates/vim/test_data/test_change_backspace.json @@ -1 +1,16 @@ -[{"Text":"Tst"},{"Mode":"Insert"},{"Selection":{"start":[0,1],"end":[0,1]}},{"Mode":"Insert"},{"Text":"est"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"Test"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"Testtest"},{"Mode":"Insert"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"Teˇst"}} +{"Key":"c"} +{"Key":"backspace"} +{"Get":{"state":"Tˇst","mode":"Insert"}} +{"Put":{"state":"Tˇest"}} +{"Key":"c"} +{"Key":"backspace"} +{"Get":{"state":"ˇest","mode":"Insert"}} +{"Put":{"state":"ˇTest"}} +{"Key":"c"} +{"Key":"backspace"} +{"Get":{"state":"ˇTest","mode":"Insert"}} +{"Put":{"state":"Test\nˇtest"}} +{"Key":"c"} +{"Key":"backspace"} +{"Get":{"state":"Testˇtest","mode":"Insert"}} diff --git a/crates/vim/test_data/test_change_e.json b/crates/vim/test_data/test_change_e.json index bd91ec3d63707644c95b9f77cfba6b3da712f1a0..fc9f91fe0220a4b232006153d8e8af21b007075c 100644 --- a/crates/vim/test_data/test_change_e.json +++ b/crates/vim/test_data/test_change_e.json @@ -1 +1,24 @@ -[{"Text":"Te Test"},{"Mode":"Insert"},{"Selection":{"start":[0,2],"end":[0,2]}},{"Mode":"Insert"},{"Text":"T test"},{"Mode":"Insert"},{"Selection":{"start":[0,1],"end":[0,1]}},{"Mode":"Insert"},{"Text":"Test te\ntest"},{"Mode":"Insert"},{"Selection":{"start":[0,7],"end":[0,7]}},{"Mode":"Insert"},{"Text":"Test tes"},{"Mode":"Insert"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Insert"},{"Text":"Test test\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"Test te test"},{"Mode":"Insert"},{"Selection":{"start":[0,7],"end":[0,7]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"Teˇst Test"}} +{"Key":"c"} +{"Key":"e"} +{"Get":{"state":"Teˇ Test","mode":"Insert"}} +{"Put":{"state":"Tˇest test"}} +{"Key":"c"} +{"Key":"e"} +{"Get":{"state":"Tˇ test","mode":"Insert"}} +{"Put":{"state":"Test teˇst\ntest"}} +{"Key":"c"} +{"Key":"e"} +{"Get":{"state":"Test teˇ\ntest","mode":"Insert"}} +{"Put":{"state":"Test tesˇt\ntest"}} +{"Key":"c"} +{"Key":"e"} +{"Get":{"state":"Test tesˇ","mode":"Insert"}} +{"Put":{"state":"Test test\nˇ\ntest"}} +{"Key":"c"} +{"Key":"e"} +{"Get":{"state":"Test test\nˇ","mode":"Insert"}} +{"Put":{"state":"Test teˇst-test test"}} +{"Key":"c"} +{"Key":"shift-e"} +{"Get":{"state":"Test teˇ test","mode":"Insert"}} diff --git a/crates/vim/test_data/test_change_end_of_document.json b/crates/vim/test_data/test_change_end_of_document.json index 8a0cc840be8733d485286b29a33e582906617cef..a3f09e4453f7d414893cc80f394c01dc80a7126e 100644 --- a/crates/vim/test_data/test_change_end_of_document.json +++ b/crates/vim/test_data/test_change_end_of_document.json @@ -1 +1,16 @@ -[{"Text":"The quick\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick\nbrown fox\njumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":"The quick\nbrown fox\njumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"The quick\nbrownˇ fox\njumps over\nthe lazy"}} +{"Key":"c"} +{"Key":"shift-g"} +{"Get":{"state":"The quick\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick\nbrownˇ fox\njumps over\nthe lazy"}} +{"Key":"c"} +{"Key":"shift-g"} +{"Get":{"state":"The quick\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick\nbrown fox\njumps over\nthe lˇazy"}} +{"Key":"c"} +{"Key":"shift-g"} +{"Get":{"state":"The quick\nbrown fox\njumps over\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick\nbrown fox\njumps over\nˇ"}} +{"Key":"c"} +{"Key":"shift-g"} +{"Get":{"state":"The quick\nbrown fox\njumps over\nˇ","mode":"Insert"}} diff --git a/crates/vim/test_data/test_change_end_of_line.json b/crates/vim/test_data/test_change_end_of_line.json index 6d6f45a3a26cbbf0cb8a0b9c8677261b8805ed92..44766df85ea90a33a6b7684530ba323ae7c20293 100644 --- a/crates/vim/test_data/test_change_end_of_line.json +++ b/crates/vim/test_data/test_change_end_of_line.json @@ -1 +1,8 @@ -[{"Text":"The q\nbrown fox"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"The quick\n\nbrown fox"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"The qˇuick\nbrown fox"}} +{"Key":"c"} +{"Key":"$"} +{"Get":{"state":"The qˇ\nbrown fox","mode":"Insert"}} +{"Put":{"state":"The quick\nˇ\nbrown fox"}} +{"Key":"c"} +{"Key":"$"} +{"Get":{"state":"The quick\nˇ\nbrown fox","mode":"Insert"}} diff --git a/crates/vim/test_data/test_change_gg.json b/crates/vim/test_data/test_change_gg.json index b8e250788c3fa8cf0d092de469bf0c7255d3e538..f4271f712010b1cd5102db2a5059f92cb1167535 100644 --- a/crates/vim/test_data/test_change_gg.json +++ b/crates/vim/test_data/test_change_gg.json @@ -1 +1,20 @@ -[{"Text":"\njumps over\nthe lazy"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":""},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nbrown fox\njumps over\nthe lazy"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nbrown fox\njumps over\nthe lazy"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"The quick\nbrownˇ fox\njumps over\nthe lazy"}} +{"Key":"c"} +{"Key":"g"} +{"Key":"g"} +{"Get":{"state":"ˇ\njumps over\nthe lazy","mode":"Insert"}} +{"Put":{"state":"The quick\nbrown fox\njumps over\nthe lˇazy"}} +{"Key":"c"} +{"Key":"g"} +{"Key":"g"} +{"Get":{"state":"ˇ","mode":"Insert"}} +{"Put":{"state":"The qˇuick\nbrown fox\njumps over\nthe lazy"}} +{"Key":"c"} +{"Key":"g"} +{"Key":"g"} +{"Get":{"state":"ˇ\nbrown fox\njumps over\nthe lazy","mode":"Insert"}} +{"Put":{"state":"ˇ\nbrown fox\njumps over\nthe lazy"}} +{"Key":"c"} +{"Key":"g"} +{"Key":"g"} +{"Get":{"state":"ˇ\nbrown fox\njumps over\nthe lazy","mode":"Insert"}} diff --git a/crates/vim/test_data/test_change_h.json b/crates/vim/test_data/test_change_h.json index 75da235bd286939766335d8d7efd11da30022f36..6acfb5d0807dd5f9031d753594a223fd9594dbc9 100644 --- a/crates/vim/test_data/test_change_h.json +++ b/crates/vim/test_data/test_change_h.json @@ -1 +1,16 @@ -[{"Text":"Tst"},{"Mode":"Insert"},{"Selection":{"start":[0,1],"end":[0,1]}},{"Mode":"Insert"},{"Text":"est"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"Test"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"Test\ntest"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"Teˇst"}} +{"Key":"c"} +{"Key":"h"} +{"Get":{"state":"Tˇst","mode":"Insert"}} +{"Put":{"state":"Tˇest"}} +{"Key":"c"} +{"Key":"h"} +{"Get":{"state":"ˇest","mode":"Insert"}} +{"Put":{"state":"ˇTest"}} +{"Key":"c"} +{"Key":"h"} +{"Get":{"state":"ˇTest","mode":"Insert"}} +{"Put":{"state":"Test\nˇtest"}} +{"Key":"c"} +{"Key":"h"} +{"Get":{"state":"Test\nˇtest","mode":"Insert"}} diff --git a/crates/vim/test_data/test_change_j.json b/crates/vim/test_data/test_change_j.json index a8ce6bbc859bd939b7437a6175a3d886e22a6956..827fe18c0dbaf0dc15e55a4036d8961b625bc9b1 100644 --- a/crates/vim/test_data/test_change_j.json +++ b/crates/vim/test_data/test_change_j.json @@ -1 +1,16 @@ -[{"Text":"The quick\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick\nbrown fox\njumps over"},{"Mode":"Normal"},{"Selection":{"start":[2,6],"end":[2,6]}},{"Mode":"Normal"},{"Text":"\njumps over"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick\nbrown fox\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The quick\nbrown ˇfox\njumps over"}} +{"Key":"c"} +{"Key":"j"} +{"Get":{"state":"The quick\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick\nbrown fox\njumps ˇover"}} +{"Key":"c"} +{"Key":"j"} +{"Get":{"state":"The quick\nbrown fox\njumps ˇover","mode":"Normal"}} +{"Put":{"state":"The qˇuick\nbrown fox\njumps over"}} +{"Key":"c"} +{"Key":"j"} +{"Get":{"state":"ˇ\njumps over","mode":"Insert"}} +{"Put":{"state":"The quick\nbrown fox\nˇ"}} +{"Key":"c"} +{"Key":"j"} +{"Get":{"state":"The quick\nbrown fox\nˇ","mode":"Normal"}} diff --git a/crates/vim/test_data/test_change_k.json b/crates/vim/test_data/test_change_k.json index e37a013ec3fdcafa2beb7cf3d028d2a4911e7d86..4f89a82b80a6149f97122f21f11435598ca3a7fb 100644 --- a/crates/vim/test_data/test_change_k.json +++ b/crates/vim/test_data/test_change_k.json @@ -1 +1,16 @@ -[{"Text":"\njumps over"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick\nbrown fox\njumps over"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"\nbrown fox\njumps over"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The quick\nbrown ˇfox\njumps over"}} +{"Key":"c"} +{"Key":"k"} +{"Get":{"state":"ˇ\njumps over","mode":"Insert"}} +{"Put":{"state":"The quick\nbrown fox\njumps ˇover"}} +{"Key":"c"} +{"Key":"k"} +{"Get":{"state":"The quick\nˇ","mode":"Insert"}} +{"Put":{"state":"The qˇuick\nbrown fox\njumps over"}} +{"Key":"c"} +{"Key":"k"} +{"Get":{"state":"The qˇuick\nbrown fox\njumps over","mode":"Normal"}} +{"Put":{"state":"ˇ\nbrown fox\njumps over"}} +{"Key":"c"} +{"Key":"k"} +{"Get":{"state":"ˇ\nbrown fox\njumps over","mode":"Normal"}} diff --git a/crates/vim/test_data/test_change_l.json b/crates/vim/test_data/test_change_l.json index a280506d56c92d9fb677d974dfbf3bdab6710ea6..378c5dc7ca63a109239ccf78783f5f26d48ad680 100644 --- a/crates/vim/test_data/test_change_l.json +++ b/crates/vim/test_data/test_change_l.json @@ -1 +1,8 @@ -[{"Text":"Tet"},{"Mode":"Insert"},{"Selection":{"start":[0,2],"end":[0,2]}},{"Mode":"Insert"},{"Text":"Tes"},{"Mode":"Insert"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"Teˇst"}} +{"Key":"c"} +{"Key":"l"} +{"Get":{"state":"Teˇt","mode":"Insert"}} +{"Put":{"state":"Tesˇt"}} +{"Key":"c"} +{"Key":"l"} +{"Get":{"state":"Tesˇ","mode":"Insert"}} diff --git a/crates/vim/test_data/test_change_sentence_object.json b/crates/vim/test_data/test_change_sentence_object.json index 7827bc8a28b0a855257e73ade93687147a9aad70..11f99c8244fd403587802192bf05142e1dfa511b 100644 --- a/crates/vim/test_data/test_change_sentence_object.json +++ b/crates/vim/test_data/test_change_sentence_object.json @@ -1 +1,270 @@ -[{"Text":" Fox Jumps! Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" Fox Jumps! Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" Fox Jumps! Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick brown?Fox Jumps! Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,16],"end":[0,16]}},{"Mode":"Insert"},{"Text":"The quick brown? Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,17],"end":[0,17]}},{"Mode":"Insert"},{"Text":"The quick brown? Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,17],"end":[0,17]}},{"Mode":"Insert"},{"Text":"The quick brown? Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,17],"end":[0,17]}},{"Mode":"Insert"},{"Text":"The quick brown? Fox Jumps!Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,27],"end":[0,27]}},{"Mode":"Insert"},{"Text":"The quick brown? Fox Jumps! "},{"Mode":"Insert"},{"Selection":{"start":[0,28],"end":[0,28]}},{"Mode":"Insert"},{"Text":"The quick brown? Fox Jumps! "},{"Mode":"Insert"},{"Selection":{"start":[0,28],"end":[0,28]}},{"Mode":"Insert"},{"Text":"The quick brown? Fox Jumps! "},{"Mode":"Insert"},{"Selection":{"start":[0,28],"end":[0,28]}},{"Mode":"Insert"},{"Text":" The quick \nbrown fox jumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" The quick \nbrown fox jumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" The quick \nbrown fox jumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" The quick \nbrown fox jumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" The quick \nbrown fox jumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog.The quick \nbrown fox jumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog. \n"},{"Mode":"Insert"},{"Selection":{"start":[2,14],"end":[2,14]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog. \n"},{"Mode":"Insert"},{"Selection":{"start":[2,14],"end":[2,14]}},{"Mode":"Insert"},{"Text":" Brown fox jumps. "},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" Brown fox jumps. "},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" Brown fox jumps. "},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" Brown fox jumps. "},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" Brown fox jumps. "},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" Brown fox jumps. "},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick brown.)]'\" "},{"Mode":"Insert"},{"Selection":{"start":[0,21],"end":[0,21]}},{"Mode":"Insert"},{"Text":"The quick brown.)]'\" "},{"Mode":"Insert"},{"Selection":{"start":[0,21],"end":[0,21]}},{"Mode":"Insert"},{"Text":"The quick brown.)]'\" Brown fox jumps."},{"Mode":"Insert"},{"Selection":{"start":[0,37],"end":[0,37]}},{"Mode":"Insert"},{"Text":"Fox Jumps! Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"Fox Jumps! Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"Fox Jumps! Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick brown? Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,17],"end":[0,17]}},{"Mode":"Insert"},{"Text":"The quick brown? Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,17],"end":[0,17]}},{"Mode":"Insert"},{"Text":"The quick brown? Over the lazy."},{"Mode":"Insert"},{"Selection":{"start":[0,17],"end":[0,17]}},{"Mode":"Insert"},{"Text":"The quick brown? Fox Jumps!"},{"Mode":"Insert"},{"Selection":{"start":[0,27],"end":[0,27]}},{"Mode":"Insert"},{"Text":"The quick brown? Fox Jumps!"},{"Mode":"Insert"},{"Selection":{"start":[0,27],"end":[0,27]}},{"Mode":"Insert"},{"Text":"The quick brown? Fox Jumps!"},{"Mode":"Insert"},{"Selection":{"start":[0,27],"end":[0,27]}},{"Mode":"Insert"},{"Text":"The quick brown? Fox Jumps!"},{"Mode":"Insert"},{"Selection":{"start":[0,27],"end":[0,27]}},{"Mode":"Insert"},{"Text":"The quick \nbrown fox jumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick \nbrown fox jumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick \nbrown fox jumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick \nbrown fox jumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick \nbrown fox jumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog.\n"},{"Mode":"Insert"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog.\n"},{"Mode":"Insert"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog.\n"},{"Mode":"Insert"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Insert"},{"Text":"Brown fox jumps. "},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"Brown fox jumps. "},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"Brown fox jumps. "},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"Brown fox jumps. "},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"Brown fox jumps. "},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"Brown fox jumps. "},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick brown.)]'\" "},{"Mode":"Insert"},{"Selection":{"start":[0,21],"end":[0,21]}},{"Mode":"Insert"},{"Text":"The quick brown.)]'\" "},{"Mode":"Insert"},{"Selection":{"start":[0,21],"end":[0,21]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick brown? Fox Jumps! Over the lazy."}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Fox Jumps! Over the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick ˇbrown? Fox Jumps! Over the lazy."}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Fox Jumps! Over the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick brownˇ? Fox Jumps! Over the lazy."}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Fox Jumps! Over the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick brown?ˇ Fox Jumps! Over the lazy."}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown?ˇFox Jumps! Over the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick brown? ˇFox Jumps! Over the lazy."}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? ˇ Over the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick brown? Fox Jˇumps! Over the lazy."}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? ˇ Over the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick brown? Fox Jumpsˇ! Over the lazy."}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? ˇ Over the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick brown? Fox Jumps!ˇ Over the lazy."}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumps!ˇOver the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick brown? Fox Jumps! Ovˇer the lazy."}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumps! ˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown? Fox Jumps! Over theˇ lazy."}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumps! ˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown? Fox Jumps! Over the lazyˇ."}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumps! ˇ","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown \nfox jumps over\nthe lazy dog. The quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ The quick \nbrown fox jumps over\n","mode":"Insert"}} +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog. The quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ The quick \nbrown fox jumps over\n","mode":"Insert"}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog. The quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ The quick \nbrown fox jumps over\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy doˇg. The quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ The quick \nbrown fox jumps over\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ. The quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ The quick \nbrown fox jumps over\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog.ˇ The quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog.ˇThe quick \nbrown fox jumps over\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog. ˇThe quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog. ˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog. The quick ˇ\nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog. ˇ\n","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown.)]'\" Brown fox jumps. "}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Brown fox jumps. ","mode":"Insert"}} +{"Put":{"state":"The ˇquick brown.)]'\" Brown fox jumps. "}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Brown fox jumps. ","mode":"Insert"}} +{"Put":{"state":"The quick brownˇ.)]'\" Brown fox jumps. "}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Brown fox jumps. ","mode":"Insert"}} +{"Put":{"state":"The quick brown.)ˇ]'\" Brown fox jumps. "}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Brown fox jumps. ","mode":"Insert"}} +{"Put":{"state":"The quick brown.)]ˇ'\" Brown fox jumps. "}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Brown fox jumps. ","mode":"Insert"}} +{"Put":{"state":"The quick brown.)]'ˇ\" Brown fox jumps. "}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Brown fox jumps. ","mode":"Insert"}} +{"Put":{"state":"The quick brown.)]'\" Brown ˇfox jumps. "}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown.)]'\" ˇ ","mode":"Insert"}} +{"Put":{"state":"The quick brown.)]'\" Brown fox jumpsˇ. "}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown.)]'\" ˇ ","mode":"Insert"}} +{"Put":{"state":"The quick brown.)]'\" Brown fox jumps.ˇ "}} +{"Key":"c"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown.)]'\" Brown fox jumps.ˇ","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown? Fox Jumps! Over the lazy."}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇFox Jumps! Over the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick ˇbrown? Fox Jumps! Over the lazy."}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇFox Jumps! Over the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick brownˇ? Fox Jumps! Over the lazy."}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇFox Jumps! Over the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick brown? ˇFox Jumps! Over the lazy."}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? ˇOver the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick brown? Fox Jˇumps! Over the lazy."}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? ˇOver the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick brown? Fox Jumpsˇ! Over the lazy."}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? ˇOver the lazy.","mode":"Insert"}} +{"Put":{"state":"The quick brown? Fox Jumps!ˇ Over the lazy."}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumps!ˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown? Fox Jumps! Ovˇer the lazy."}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumps!ˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown? Fox Jumps! Over theˇ lazy."}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumps!ˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown? Fox Jumps! Over the lazyˇ."}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumps!ˇ","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown \nfox jumps over\nthe lazy dog. The quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇThe quick \nbrown fox jumps over\n","mode":"Insert"}} +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog. The quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇThe quick \nbrown fox jumps over\n","mode":"Insert"}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog. The quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇThe quick \nbrown fox jumps over\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy doˇg. The quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇThe quick \nbrown fox jumps over\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ. The quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇThe quick \nbrown fox jumps over\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog.ˇ The quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog.ˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog. ˇThe quick \nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog.ˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog. The quick ˇ\nbrown fox jumps over\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog.ˇ\n","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown.)]'\" Brown fox jumps. "}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇBrown fox jumps. ","mode":"Insert"}} +{"Put":{"state":"The ˇquick brown.)]'\" Brown fox jumps. "}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇBrown fox jumps. ","mode":"Insert"}} +{"Put":{"state":"The quick brownˇ.)]'\" Brown fox jumps. "}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇBrown fox jumps. ","mode":"Insert"}} +{"Put":{"state":"The quick brown.)ˇ]'\" Brown fox jumps. "}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇBrown fox jumps. ","mode":"Insert"}} +{"Put":{"state":"The quick brown.)]ˇ'\" Brown fox jumps. "}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇBrown fox jumps. ","mode":"Insert"}} +{"Put":{"state":"The quick brown.)]'ˇ\" Brown fox jumps. "}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇBrown fox jumps. ","mode":"Insert"}} +{"Put":{"state":"The quick brown.)]'\" Brown ˇfox jumps. "}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown.)]'\" ˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown.)]'\" Brown fox jumpsˇ. "}} +{"Key":"c"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown.)]'\" ˇ","mode":"Insert"}} diff --git a/crates/vim/test_data/test_change_surrounding_character_objects.json b/crates/vim/test_data/test_change_surrounding_character_objects.json index 452b0fde10e5b1c6ad1a91003715f0726c2d4737..a88f84cf4b8619e19a97c2f1840bc27298fe255f 100644 --- a/crates/vim/test_data/test_change_surrounding_character_objects.json +++ b/crates/vim/test_data/test_change_surrounding_character_objects.json @@ -1 +1,1020 @@ -[{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th)e qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th)e qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th)e qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th)e qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th)e qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th)e qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th]e qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th]e qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th]e qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th]e qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th]e qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th]e qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Insert"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th}e qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th}e qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th}e qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th}e qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th}e qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th}e qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Insert"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Insert"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Insert"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)ˇe ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ˇ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()quˇi(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ˇck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck broˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)ˇfox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox juˇmps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇ(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇer\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe ˇlazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy dˇ)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)ˇe ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ˇ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()quˇi(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ˇck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck broˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)ˇfox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox juˇmps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇ(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇer\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe ˇlazy d)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy dˇ)o(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg"}} +{"Key":"c"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)ˇe ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ˇ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()quˇi(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ˇck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck broˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)ˇfox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox juˇmps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇ(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇer\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe ˇlazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy dˇ)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)ˇe ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ˇ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()quˇi(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ˇck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck broˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)ˇfox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox juˇmps ov(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇ(er\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇer\nthe lazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe ˇlazy d)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy dˇ)o(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Insert"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg"}} +{"Key":"c"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]ˇe []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e ˇ[]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []quˇi[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ˇck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck broˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]ˇfox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox juˇmps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇ[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇer\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe ˇlazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy dˇ]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]ˇe []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e ˇ[]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []quˇi[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ˇck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck broˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]ˇfox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox juˇmps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇ[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇer\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe ˇlazy d]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy dˇ]o[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]ˇe []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e ˇ[]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []quˇi[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ˇck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck broˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]ˇfox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox juˇmps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇ[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇer\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe ˇlazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy dˇ]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]ˇe []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e ˇ[]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []quˇi[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ˇck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck broˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]ˇfox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox juˇmps ov[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇ[er\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇer\nthe lazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe ˇlazy d]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy dˇ]o[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Insert"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}ˇe {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e ˇ{}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}quˇi{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ˇck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck broˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}ˇfox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox juˇmps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇ{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇer\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe ˇlazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy dˇ}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}ˇe {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e ˇ{}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}quˇi{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ˇck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck broˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}ˇfox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox juˇmps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇ{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇer\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe ˇlazy d}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy dˇ}o{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}ˇe {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e ˇ{}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}quˇi{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ˇck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck broˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}ˇfox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox juˇmps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇ{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇer\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe ˇlazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy dˇ}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}ˇe {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e ˇ{}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}quˇi{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ˇck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck broˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}ˇfox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox juˇmps ov{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇ{er\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇer\nthe lazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe ˇlazy d}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy dˇ}o{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Insert"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg","mode":"Normal"}} diff --git a/crates/vim/test_data/test_change_w.json b/crates/vim/test_data/test_change_w.json index 1d93c94450b46699c6bd73c1dee866e3ab7f050e..586fbdf799046add8f72f707a4e2c84a900962e2 100644 --- a/crates/vim/test_data/test_change_w.json +++ b/crates/vim/test_data/test_change_w.json @@ -1 +1,28 @@ -[{"Text":"Te"},{"Mode":"Insert"},{"Selection":{"start":[0,2],"end":[0,2]}},{"Mode":"Insert"},{"Text":"T test"},{"Mode":"Insert"},{"Selection":{"start":[0,1],"end":[0,1]}},{"Mode":"Insert"},{"Text":"Testtest"},{"Mode":"Insert"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Insert"},{"Text":"Test te\ntest"},{"Mode":"Insert"},{"Selection":{"start":[0,7],"end":[0,7]}},{"Mode":"Insert"},{"Text":"Test tes\ntest"},{"Mode":"Insert"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Insert"},{"Text":"Test test\n\ntest"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"Test te test"},{"Mode":"Insert"},{"Selection":{"start":[0,7],"end":[0,7]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"Teˇst"}} +{"Key":"c"} +{"Key":"w"} +{"Get":{"state":"Teˇ","mode":"Insert"}} +{"Put":{"state":"Tˇest test"}} +{"Key":"c"} +{"Key":"w"} +{"Get":{"state":"Tˇ test","mode":"Insert"}} +{"Put":{"state":"Testˇ test"}} +{"Key":"c"} +{"Key":"w"} +{"Get":{"state":"Testˇtest","mode":"Insert"}} +{"Put":{"state":"Test teˇst\ntest"}} +{"Key":"c"} +{"Key":"w"} +{"Get":{"state":"Test teˇ\ntest","mode":"Insert"}} +{"Put":{"state":"Test tesˇt\ntest"}} +{"Key":"c"} +{"Key":"w"} +{"Get":{"state":"Test tesˇ\ntest","mode":"Insert"}} +{"Put":{"state":"Test test\nˇ\ntest"}} +{"Key":"c"} +{"Key":"w"} +{"Get":{"state":"Test test\nˇ\ntest","mode":"Insert"}} +{"Put":{"state":"Test teˇst-test test"}} +{"Key":"c"} +{"Key":"shift-w"} +{"Get":{"state":"Test teˇ test","mode":"Insert"}} diff --git a/crates/vim/test_data/test_change_word_object.json b/crates/vim/test_data/test_change_word_object.json index e96efcaa7c4e0cd1a988c0625330c05240b871be..18baf78c6e40df55dfa2787c57e911486143e0e3 100644 --- a/crates/vim/test_data/test_change_word_object.json +++ b/crates/vim/test_data/test_change_word_object.json @@ -1 +1,460 @@ -[{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick brown\nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumpsover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog\n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[5,0],"end":[5,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThequick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,3],"end":[6,3]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe- brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,4],"end":[6,4]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe- brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,4],"end":[6,4]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,9],"end":[6,9]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,10],"end":[6,10]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown\n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,15],"end":[6,15]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n\n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[7,0],"end":[7,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n\n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[8,0],"end":[8,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nfox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[9,0],"end":[9,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox- over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[9,6],"end":[9,6]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog\n\n"},{"Mode":"Insert"},{"Selection":{"start":[10,12],"end":[10,12]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[11,0],"end":[11,0]}},{"Mode":"Insert"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick brown\nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumpsover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog\n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[5,0],"end":[5,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,9],"end":[6,9]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,10],"end":[6,10]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown\n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,15],"end":[6,15]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n\n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[7,0],"end":[7,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n\n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[8,0],"end":[8,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nfox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[9,0],"end":[9,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[9,2],"end":[9,2]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog\n\n"},{"Mode":"Insert"},{"Selection":{"start":[10,12],"end":[10,12]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[11,0],"end":[11,0]}},{"Mode":"Insert"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick brown jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[5,0],"end":[5,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThequick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,3],"end":[6,3]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,4],"end":[6,4]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,4],"end":[6,4]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,9],"end":[6,9]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,10],"end":[6,10]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,15],"end":[6,15]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[7,0],"end":[7,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[8,0],"end":[8,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[9,0],"end":[9,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[9,6],"end":[9,6]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[10,12],"end":[10,12]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n"},{"Mode":"Insert"},{"Selection":{"start":[11,0],"end":[11,0]}},{"Mode":"Insert"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick brown jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[5,0],"end":[5,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,9],"end":[6,9]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,10],"end":[6,10]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[6,15],"end":[6,15]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[7,0],"end":[7,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[8,0],"end":[8,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[9,0],"end":[9,0]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n over\nthe lazy dog \n\n"},{"Mode":"Insert"},{"Selection":{"start":[9,2],"end":[9,2]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[10,12],"end":[10,12]}},{"Mode":"Insert"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n"},{"Mode":"Insert"},{"Selection":{"start":[11,0],"end":[11,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick ˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick ˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brownˇ\nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox ˇjumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox ˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox juˇmps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox ˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumpsˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumpsˇover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ\n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThˇe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quˇick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇ \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ\n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ\n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ\n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇfox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumpˇs over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-ˇ over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ\n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick ˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick ˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brownˇ\nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox ˇjumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox ˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox juˇmps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox ˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumpsˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumpsˇover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ\n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThˇe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quˇick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇ \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ\n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ\n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ\n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇfox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumpˇs over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n ˇ over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ \n\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ\n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n"}} +{"Key":"c"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick ˇ\nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick ˇ\nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brownˇ jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox ˇjumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox ˇover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox juˇmps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox ˇover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumpsˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumpsˇ\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThˇe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quˇick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇ\n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumpˇs over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-ˇover\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ","mode":"Insert"}} +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick ˇ\nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick ˇ\nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brownˇ jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox ˇjumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox ˇover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox juˇmps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox ˇover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumpsˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumpsˇ\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThˇe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quˇick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇ\n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ over\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumpˇs over\nthe lazy dog \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n ˇover\nthe lazy dog \n\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ \n\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n"}} +{"Key":"c"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ","mode":"Insert"}} diff --git a/crates/vim/test_data/test_dd.json b/crates/vim/test_data/test_dd.json index fa86b9d3b5821d66e34ec80325ba8f32c0d10c1f..c6dc30882e00804b6125e8f75734ad5d8f1dc732 100644 --- a/crates/vim/test_data/test_dd.json +++ b/crates/vim/test_data/test_dd.json @@ -1 +1,24 @@ -[{"Text":""},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":""},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"brown fox\njumps over"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"The quick\njumps over"},{"Mode":"Normal"},{"Selection":{"start":[1,6],"end":[1,6]}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox"},{"Mode":"Normal"},{"Selection":{"start":[1,6],"end":[1,6]}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇ"}} +{"Key":"d"} +{"Key":"d"} +{"Get":{"state":"ˇ","mode":"Normal"}} +{"Put":{"state":"The ˇquick"}} +{"Key":"d"} +{"Key":"d"} +{"Get":{"state":"ˇ","mode":"Normal"}} +{"Put":{"state":"The qˇuick\nbrown fox\njumps over"}} +{"Key":"d"} +{"Key":"d"} +{"Get":{"state":"brownˇ fox\njumps over","mode":"Normal"}} +{"Put":{"state":"The quick\nbrown ˇfox\njumps over"}} +{"Key":"d"} +{"Key":"d"} +{"Get":{"state":"The quick\njumps ˇover","mode":"Normal"}} +{"Put":{"state":"The quick\nbrown fox\njumps ˇover"}} +{"Key":"d"} +{"Key":"d"} +{"Get":{"state":"The quick\nbrown ˇfox","mode":"Normal"}} +{"Put":{"state":"The quick\nˇ\nbrown fox"}} +{"Key":"d"} +{"Key":"d"} +{"Get":{"state":"The quick\nˇbrown fox","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_0.json b/crates/vim/test_data/test_delete_0.json index 0ecb12f47b5a9c55d74576ced0f4aed833545822..10095cefbbaff382bc70a74b61a1ebf340d4aae4 100644 --- a/crates/vim/test_data/test_delete_0.json +++ b/crates/vim/test_data/test_delete_0.json @@ -1 +1,8 @@ -[{"Text":"uick\nbrown fox"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown fox"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The qˇuick\nbrown fox"}} +{"Key":"d"} +{"Key":"0"} +{"Get":{"state":"ˇuick\nbrown fox","mode":"Normal"}} +{"Put":{"state":"The quick\nˇ\nbrown fox"}} +{"Key":"d"} +{"Key":"0"} +{"Get":{"state":"The quick\nˇ\nbrown fox","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_b.json b/crates/vim/test_data/test_delete_b.json index 59e5a3373a3581c9d389a95ce9c600a7ce69e84c..932a4c19677fb9e00b5e043707a8e01e64b0663b 100644 --- a/crates/vim/test_data/test_delete_b.json +++ b/crates/vim/test_data/test_delete_b.json @@ -1 +1,24 @@ -[{"Text":"st Test"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"test"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Test1 test3"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Test \ntest"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"Test \n\ntest"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"Test test"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"Teˇst Test"}} +{"Key":"d"} +{"Key":"b"} +{"Get":{"state":"ˇst Test","mode":"Normal"}} +{"Put":{"state":"Test ˇtest"}} +{"Key":"d"} +{"Key":"b"} +{"Get":{"state":"ˇtest","mode":"Normal"}} +{"Put":{"state":"Test1 test2 ˇtest3"}} +{"Key":"d"} +{"Key":"b"} +{"Get":{"state":"Test1 ˇtest3","mode":"Normal"}} +{"Put":{"state":"Test test\nˇtest"}} +{"Key":"d"} +{"Key":"b"} +{"Get":{"state":"Testˇ \ntest","mode":"Normal"}} +{"Put":{"state":"Test test\nˇ\ntest"}} +{"Key":"d"} +{"Key":"b"} +{"Get":{"state":"Testˇ \n\ntest","mode":"Normal"}} +{"Put":{"state":"Test test-test ˇtest"}} +{"Key":"d"} +{"Key":"shift-b"} +{"Get":{"state":"Test ˇtest","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_e.json b/crates/vim/test_data/test_delete_e.json index e1bc41562000b4dd16d60607ddd78db2f6197925..ebbad8fc4d4fcb64ce59fc12e4a855216be19fba 100644 --- a/crates/vim/test_data/test_delete_e.json +++ b/crates/vim/test_data/test_delete_e.json @@ -1 +1,20 @@ -[{"Text":"Te Test"},{"Mode":"Normal"},{"Selection":{"start":[0,2],"end":[0,2]}},{"Mode":"Normal"},{"Text":"T test"},{"Mode":"Normal"},{"Selection":{"start":[0,1],"end":[0,1]}},{"Mode":"Normal"},{"Text":"Test te\ntest"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Test tes"},{"Mode":"Normal"},{"Selection":{"start":[0,7],"end":[0,7]}},{"Mode":"Normal"},{"Text":"Test te test"},{"Mode":"Normal"},{"Selection":{"start":[0,7],"end":[0,7]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"Teˇst Test"}} +{"Key":"d"} +{"Key":"e"} +{"Get":{"state":"Teˇ Test","mode":"Normal"}} +{"Put":{"state":"Tˇest test"}} +{"Key":"d"} +{"Key":"e"} +{"Get":{"state":"Tˇ test","mode":"Normal"}} +{"Put":{"state":"Test teˇst\ntest"}} +{"Key":"d"} +{"Key":"e"} +{"Get":{"state":"Test tˇe\ntest","mode":"Normal"}} +{"Put":{"state":"Test tesˇt\ntest"}} +{"Key":"d"} +{"Key":"e"} +{"Get":{"state":"Test teˇs","mode":"Normal"}} +{"Put":{"state":"Test teˇst-test test"}} +{"Key":"d"} +{"Key":"shift-e"} +{"Get":{"state":"Test teˇ test","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_end_of_document.json b/crates/vim/test_data/test_delete_end_of_document.json index a43eb2d6fd28986c1ac7f908bf126ad5012c6aa6..863d15aca1f587a20bf12734966a0c2599324655 100644 --- a/crates/vim/test_data/test_delete_end_of_document.json +++ b/crates/vim/test_data/test_delete_end_of_document.json @@ -1 +1,16 @@ -[{"Text":"The quick"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"The quick"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox\njumps over"},{"Mode":"Normal"},{"Selection":{"start":[2,5],"end":[2,5]}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox\njumps over"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The quick\nbrownˇ fox\njumps over\nthe lazy"}} +{"Key":"d"} +{"Key":"shift-g"} +{"Get":{"state":"The qˇuick","mode":"Normal"}} +{"Put":{"state":"The quick\nbrownˇ fox\njumps over\nthe lazy"}} +{"Key":"d"} +{"Key":"shift-g"} +{"Get":{"state":"The qˇuick","mode":"Normal"}} +{"Put":{"state":"The quick\nbrown fox\njumps over\nthe lˇazy"}} +{"Key":"d"} +{"Key":"shift-g"} +{"Get":{"state":"The quick\nbrown fox\njumpsˇ over","mode":"Normal"}} +{"Put":{"state":"The quick\nbrown fox\njumps over\nˇ"}} +{"Key":"d"} +{"Key":"shift-g"} +{"Get":{"state":"The quick\nbrown fox\nˇjumps over","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_end_of_line.json b/crates/vim/test_data/test_delete_end_of_line.json index 591dac42000566773524971edd491f2e44c89c6a..93f0cc24597a5120d88ccd440507dbf04273f851 100644 --- a/crates/vim/test_data/test_delete_end_of_line.json +++ b/crates/vim/test_data/test_delete_end_of_line.json @@ -1 +1,8 @@ -[{"Text":"The q\nbrown fox"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown fox"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The qˇuick\nbrown fox"}} +{"Key":"d"} +{"Key":"$"} +{"Get":{"state":"The ˇq\nbrown fox","mode":"Normal"}} +{"Put":{"state":"The quick\nˇ\nbrown fox"}} +{"Key":"d"} +{"Key":"$"} +{"Get":{"state":"The quick\nˇ\nbrown fox","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_gg.json b/crates/vim/test_data/test_delete_gg.json index ac6e54f355707cfe28182394d6421a963ed3ddc8..de6aca96651246e417687df93fd5e46386f454a0 100644 --- a/crates/vim/test_data/test_delete_gg.json +++ b/crates/vim/test_data/test_delete_gg.json @@ -1 +1,20 @@ -[{"Text":"jumps over\nthe lazy"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":""},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"brown fox\njumps over\nthe lazy"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"brown fox\njumps over\nthe lazy"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The quick\nbrownˇ fox\njumps over\nthe lazy"}} +{"Key":"d"} +{"Key":"g"} +{"Key":"g"} +{"Get":{"state":"jumpsˇ over\nthe lazy","mode":"Normal"}} +{"Put":{"state":"The quick\nbrown fox\njumps over\nthe lˇazy"}} +{"Key":"d"} +{"Key":"g"} +{"Key":"g"} +{"Get":{"state":"ˇ","mode":"Normal"}} +{"Put":{"state":"The qˇuick\nbrown fox\njumps over\nthe lazy"}} +{"Key":"d"} +{"Key":"g"} +{"Key":"g"} +{"Get":{"state":"brownˇ fox\njumps over\nthe lazy","mode":"Normal"}} +{"Put":{"state":"ˇ\nbrown fox\njumps over\nthe lazy"}} +{"Key":"d"} +{"Key":"g"} +{"Key":"g"} +{"Get":{"state":"ˇbrown fox\njumps over\nthe lazy","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_h.json b/crates/vim/test_data/test_delete_h.json index 490e7377e90c6e2b0d9bc86ce91e68bd497dbb85..cf842a386ec7e764297a5a884ca8d3f91ee3cd19 100644 --- a/crates/vim/test_data/test_delete_h.json +++ b/crates/vim/test_data/test_delete_h.json @@ -1 +1,16 @@ -[{"Text":"Tst"},{"Mode":"Normal"},{"Selection":{"start":[0,1],"end":[0,1]}},{"Mode":"Normal"},{"Text":"est"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Test"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Test\ntest"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"Teˇst"}} +{"Key":"d"} +{"Key":"h"} +{"Get":{"state":"Tˇst","mode":"Normal"}} +{"Put":{"state":"Tˇest"}} +{"Key":"d"} +{"Key":"h"} +{"Get":{"state":"ˇest","mode":"Normal"}} +{"Put":{"state":"ˇTest"}} +{"Key":"d"} +{"Key":"h"} +{"Get":{"state":"ˇTest","mode":"Normal"}} +{"Put":{"state":"Test\nˇtest"}} +{"Key":"d"} +{"Key":"h"} +{"Get":{"state":"Test\nˇtest","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_j.json b/crates/vim/test_data/test_delete_j.json index fc561ca0e5a8607dec8bb613301d272b79bb4ef2..76c2f098d3ed4f59cd6d11c49b202662ca7550b1 100644 --- a/crates/vim/test_data/test_delete_j.json +++ b/crates/vim/test_data/test_delete_j.json @@ -1 +1,16 @@ -[{"Text":"The quick"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox\njumps over"},{"Mode":"Normal"},{"Selection":{"start":[2,6],"end":[2,6]}},{"Mode":"Normal"},{"Text":"jumps over"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The quick\nbrown ˇfox\njumps over"}} +{"Key":"d"} +{"Key":"j"} +{"Get":{"state":"The quˇick","mode":"Normal"}} +{"Put":{"state":"The quick\nbrown fox\njumps ˇover"}} +{"Key":"d"} +{"Key":"j"} +{"Get":{"state":"The quick\nbrown fox\njumps ˇover","mode":"Normal"}} +{"Put":{"state":"The qˇuick\nbrown fox\njumps over"}} +{"Key":"d"} +{"Key":"j"} +{"Get":{"state":"jumpsˇ over","mode":"Normal"}} +{"Put":{"state":"The quick\nbrown fox\nˇ"}} +{"Key":"d"} +{"Key":"j"} +{"Get":{"state":"The quick\nbrown fox\nˇ","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_k.json b/crates/vim/test_data/test_delete_k.json index 3985b9501c8bd2c01b732a89c538317a11c15438..75c032430c9753c7ac88e09956b40cac8313d0db 100644 --- a/crates/vim/test_data/test_delete_k.json +++ b/crates/vim/test_data/test_delete_k.json @@ -1 +1,16 @@ -[{"Text":"jumps over"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"The quick"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox\njumps over"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"brown fox\njumps over"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The quick\nbrown ˇfox\njumps over"}} +{"Key":"d"} +{"Key":"k"} +{"Get":{"state":"jumps ˇover","mode":"Normal"}} +{"Put":{"state":"The quick\nbrown fox\njumps ˇover"}} +{"Key":"d"} +{"Key":"k"} +{"Get":{"state":"The quˇick","mode":"Normal"}} +{"Put":{"state":"The qˇuick\nbrown fox\njumps over"}} +{"Key":"d"} +{"Key":"k"} +{"Get":{"state":"The qˇuick\nbrown fox\njumps over","mode":"Normal"}} +{"Put":{"state":"ˇbrown fox\njumps over"}} +{"Key":"d"} +{"Key":"k"} +{"Get":{"state":"ˇbrown fox\njumps over","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_l.json b/crates/vim/test_data/test_delete_l.json index ca85e2842ba4703a54891bc74d8b39dda02bca4c..60b3a6c9b1ccd305733897e813ea4f9891468eb2 100644 --- a/crates/vim/test_data/test_delete_l.json +++ b/crates/vim/test_data/test_delete_l.json @@ -1 +1,16 @@ -[{"Text":"est"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Tet"},{"Mode":"Normal"},{"Selection":{"start":[0,2],"end":[0,2]}},{"Mode":"Normal"},{"Text":"Tes"},{"Mode":"Normal"},{"Selection":{"start":[0,2],"end":[0,2]}},{"Mode":"Normal"},{"Text":"Tes\ntest"},{"Mode":"Normal"},{"Selection":{"start":[0,2],"end":[0,2]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇTest"}} +{"Key":"d"} +{"Key":"l"} +{"Get":{"state":"ˇest","mode":"Normal"}} +{"Put":{"state":"Teˇst"}} +{"Key":"d"} +{"Key":"l"} +{"Get":{"state":"Teˇt","mode":"Normal"}} +{"Put":{"state":"Tesˇt"}} +{"Key":"d"} +{"Key":"l"} +{"Get":{"state":"Teˇs","mode":"Normal"}} +{"Put":{"state":"Tesˇt\ntest"}} +{"Key":"d"} +{"Key":"l"} +{"Get":{"state":"Teˇs\ntest","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_left.json b/crates/vim/test_data/test_delete_left.json index 06e24f34f74e897fca4be0db195ece311a147b5a..a8a242f1f6a2c2f510064dcaa8f643c11282dc1a 100644 --- a/crates/vim/test_data/test_delete_left.json +++ b/crates/vim/test_data/test_delete_left.json @@ -1 +1,15 @@ -[{"Text":"Test"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"est"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Tst"},{"Mode":"Normal"},{"Selection":{"start":[0,1],"end":[0,1]}},{"Mode":"Normal"},{"Text":"Tet"},{"Mode":"Normal"},{"Selection":{"start":[0,2],"end":[0,2]}},{"Mode":"Normal"},{"Text":"Test\ntest"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇTest"}} +{"Key":"shift-x"} +{"Get":{"state":"ˇTest","mode":"Normal"}} +{"Put":{"state":"Tˇest"}} +{"Key":"shift-x"} +{"Get":{"state":"ˇest","mode":"Normal"}} +{"Put":{"state":"Teˇst"}} +{"Key":"shift-x"} +{"Get":{"state":"Tˇst","mode":"Normal"}} +{"Put":{"state":"Tesˇt"}} +{"Key":"shift-x"} +{"Get":{"state":"Teˇt","mode":"Normal"}} +{"Put":{"state":"Test\nˇtest"}} +{"Key":"shift-x"} +{"Get":{"state":"Test\nˇtest","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_sentence_object.json b/crates/vim/test_data/test_delete_sentence_object.json index 1dfae9eca4c41ec0c0af59d0b8d0b0497a308395..5e657f35d5ac785b4f3be92d2f762f1a46e2ad8d 100644 --- a/crates/vim/test_data/test_delete_sentence_object.json +++ b/crates/vim/test_data/test_delete_sentence_object.json @@ -1 +1,270 @@ -[{"Text":" Fox Jumps! Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":" Fox Jumps! Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":" Fox Jumps! Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick brown?Fox Jumps! Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,16],"end":[0,16]}},{"Mode":"Normal"},{"Text":"The quick brown? Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,17],"end":[0,17]}},{"Mode":"Normal"},{"Text":"The quick brown? Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,17],"end":[0,17]}},{"Mode":"Normal"},{"Text":"The quick brown? Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,17],"end":[0,17]}},{"Mode":"Normal"},{"Text":"The quick brown? Fox Jumps!Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,27],"end":[0,27]}},{"Mode":"Normal"},{"Text":"The quick brown? Fox Jumps! "},{"Mode":"Normal"},{"Selection":{"start":[0,27],"end":[0,27]}},{"Mode":"Normal"},{"Text":"The quick brown? Fox Jumps! "},{"Mode":"Normal"},{"Selection":{"start":[0,27],"end":[0,27]}},{"Mode":"Normal"},{"Text":"The quick brown? Fox Jumps! "},{"Mode":"Normal"},{"Selection":{"start":[0,27],"end":[0,27]}},{"Mode":"Normal"},{"Text":" The quick \nbrown fox jumps over\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":" The quick \nbrown fox jumps over\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":" The quick \nbrown fox jumps over\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":" The quick \nbrown fox jumps over\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":" The quick \nbrown fox jumps over\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog.The quick \nbrown fox jumps over\n"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog. \n"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog. \n"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":" Brown fox jumps. "},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":" Brown fox jumps. "},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":" Brown fox jumps. "},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":" Brown fox jumps. "},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":" Brown fox jumps. "},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":" Brown fox jumps. "},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick brown.)]'\" "},{"Mode":"Normal"},{"Selection":{"start":[0,21],"end":[0,21]}},{"Mode":"Normal"},{"Text":"The quick brown.)]'\" "},{"Mode":"Normal"},{"Selection":{"start":[0,21],"end":[0,21]}},{"Mode":"Normal"},{"Text":"The quick brown.)]'\" Brown fox jumps."},{"Mode":"Normal"},{"Selection":{"start":[0,36],"end":[0,36]}},{"Mode":"Normal"},{"Text":"Fox Jumps! Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Fox Jumps! Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Fox Jumps! Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick brown? Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,17],"end":[0,17]}},{"Mode":"Normal"},{"Text":"The quick brown? Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,17],"end":[0,17]}},{"Mode":"Normal"},{"Text":"The quick brown? Over the lazy."},{"Mode":"Normal"},{"Selection":{"start":[0,17],"end":[0,17]}},{"Mode":"Normal"},{"Text":"The quick brown? Fox Jumps!"},{"Mode":"Normal"},{"Selection":{"start":[0,26],"end":[0,26]}},{"Mode":"Normal"},{"Text":"The quick brown? Fox Jumps!"},{"Mode":"Normal"},{"Selection":{"start":[0,26],"end":[0,26]}},{"Mode":"Normal"},{"Text":"The quick brown? Fox Jumps!"},{"Mode":"Normal"},{"Selection":{"start":[0,26],"end":[0,26]}},{"Mode":"Normal"},{"Text":"The quick brown? Fox Jumps!"},{"Mode":"Normal"},{"Selection":{"start":[0,26],"end":[0,26]}},{"Mode":"Normal"},{"Text":"The quick \nbrown fox jumps over\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick \nbrown fox jumps over\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick \nbrown fox jumps over\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick \nbrown fox jumps over\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick \nbrown fox jumps over\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog.\n"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog.\n"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog.\n"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Brown fox jumps. "},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Brown fox jumps. "},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Brown fox jumps. "},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Brown fox jumps. "},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Brown fox jumps. "},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Brown fox jumps. "},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick brown.)]'\" "},{"Mode":"Normal"},{"Selection":{"start":[0,20],"end":[0,20]}},{"Mode":"Normal"},{"Text":"The quick brown.)]'\" "},{"Mode":"Normal"},{"Selection":{"start":[0,20],"end":[0,20]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick brown? Fox Jumps! Over the lazy."}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Fox Jumps! Over the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick ˇbrown? Fox Jumps! Over the lazy."}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Fox Jumps! Over the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick brownˇ? Fox Jumps! Over the lazy."}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Fox Jumps! Over the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick brown?ˇ Fox Jumps! Over the lazy."}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown?ˇFox Jumps! Over the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick brown? ˇFox Jumps! Over the lazy."}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? ˇ Over the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick brown? Fox Jˇumps! Over the lazy."}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? ˇ Over the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick brown? Fox Jumpsˇ! Over the lazy."}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? ˇ Over the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick brown? Fox Jumps!ˇ Over the lazy."}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumps!ˇOver the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick brown? Fox Jumps! Ovˇer the lazy."}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumps!ˇ ","mode":"Normal"}} +{"Put":{"state":"The quick brown? Fox Jumps! Over theˇ lazy."}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumps!ˇ ","mode":"Normal"}} +{"Put":{"state":"The quick brown? Fox Jumps! Over the lazyˇ."}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumps!ˇ ","mode":"Normal"}} +{"Put":{"state":"ˇThe quick brown \nfox jumps over\nthe lazy dog. The quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ The quick \nbrown fox jumps over\n","mode":"Normal"}} +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog. The quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ The quick \nbrown fox jumps over\n","mode":"Normal"}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog. The quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ The quick \nbrown fox jumps over\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy doˇg. The quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ The quick \nbrown fox jumps over\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ. The quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ The quick \nbrown fox jumps over\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog.ˇ The quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog.ˇThe quick \nbrown fox jumps over\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog. ˇThe quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog.ˇ \n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog. The quick ˇ\nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog.ˇ \n","mode":"Normal"}} +{"Put":{"state":"ˇThe quick brown.)]'\" Brown fox jumps. "}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Brown fox jumps. ","mode":"Normal"}} +{"Put":{"state":"The ˇquick brown.)]'\" Brown fox jumps. "}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Brown fox jumps. ","mode":"Normal"}} +{"Put":{"state":"The quick brownˇ.)]'\" Brown fox jumps. "}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Brown fox jumps. ","mode":"Normal"}} +{"Put":{"state":"The quick brown.)ˇ]'\" Brown fox jumps. "}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Brown fox jumps. ","mode":"Normal"}} +{"Put":{"state":"The quick brown.)]ˇ'\" Brown fox jumps. "}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Brown fox jumps. ","mode":"Normal"}} +{"Put":{"state":"The quick brown.)]'ˇ\" Brown fox jumps. "}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"ˇ Brown fox jumps. ","mode":"Normal"}} +{"Put":{"state":"The quick brown.)]'\" Brown ˇfox jumps. "}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown.)]'\" ˇ ","mode":"Normal"}} +{"Put":{"state":"The quick brown.)]'\" Brown fox jumpsˇ. "}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown.)]'\" ˇ ","mode":"Normal"}} +{"Put":{"state":"The quick brown.)]'\" Brown fox jumps.ˇ "}} +{"Key":"d"} +{"Key":"i"} +{"Key":"s"} +{"Get":{"state":"The quick brown.)]'\" Brown fox jumpsˇ.","mode":"Normal"}} +{"Put":{"state":"ˇThe quick brown? Fox Jumps! Over the lazy."}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇFox Jumps! Over the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick ˇbrown? Fox Jumps! Over the lazy."}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇFox Jumps! Over the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick brownˇ? Fox Jumps! Over the lazy."}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇFox Jumps! Over the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick brown? ˇFox Jumps! Over the lazy."}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? ˇOver the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick brown? Fox Jˇumps! Over the lazy."}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? ˇOver the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick brown? Fox Jumpsˇ! Over the lazy."}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? ˇOver the lazy.","mode":"Normal"}} +{"Put":{"state":"The quick brown? Fox Jumps!ˇ Over the lazy."}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumpsˇ!","mode":"Normal"}} +{"Put":{"state":"The quick brown? Fox Jumps! Ovˇer the lazy."}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumpsˇ!","mode":"Normal"}} +{"Put":{"state":"The quick brown? Fox Jumps! Over theˇ lazy."}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumpsˇ!","mode":"Normal"}} +{"Put":{"state":"The quick brown? Fox Jumps! Over the lazyˇ."}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown? Fox Jumpsˇ!","mode":"Normal"}} +{"Put":{"state":"ˇThe quick brown \nfox jumps over\nthe lazy dog. The quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇThe quick \nbrown fox jumps over\n","mode":"Normal"}} +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog. The quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇThe quick \nbrown fox jumps over\n","mode":"Normal"}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog. The quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇThe quick \nbrown fox jumps over\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy doˇg. The quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇThe quick \nbrown fox jumps over\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ. The quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇThe quick \nbrown fox jumps over\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog.ˇ The quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ.\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog. ˇThe quick \nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ.\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog. The quick ˇ\nbrown fox jumps over\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ.\n","mode":"Normal"}} +{"Put":{"state":"ˇThe quick brown.)]'\" Brown fox jumps. "}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇBrown fox jumps. ","mode":"Normal"}} +{"Put":{"state":"The ˇquick brown.)]'\" Brown fox jumps. "}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇBrown fox jumps. ","mode":"Normal"}} +{"Put":{"state":"The quick brownˇ.)]'\" Brown fox jumps. "}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇBrown fox jumps. ","mode":"Normal"}} +{"Put":{"state":"The quick brown.)ˇ]'\" Brown fox jumps. "}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇBrown fox jumps. ","mode":"Normal"}} +{"Put":{"state":"The quick brown.)]ˇ'\" Brown fox jumps. "}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇBrown fox jumps. ","mode":"Normal"}} +{"Put":{"state":"The quick brown.)]'ˇ\" Brown fox jumps. "}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"ˇBrown fox jumps. ","mode":"Normal"}} +{"Put":{"state":"The quick brown.)]'\" Brown ˇfox jumps. "}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown.)]'\"ˇ ","mode":"Normal"}} +{"Put":{"state":"The quick brown.)]'\" Brown fox jumpsˇ. "}} +{"Key":"d"} +{"Key":"a"} +{"Key":"s"} +{"Get":{"state":"The quick brown.)]'\"ˇ ","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_surrounding_character_objects.json b/crates/vim/test_data/test_delete_surrounding_character_objects.json index 374c38015ea22373c4a4f06752e485e9e5efcdbd..81b1f563e19fd477fc2f217e7f33fdf58b546eaa 100644 --- a/crates/vim/test_data/test_delete_surrounding_character_objects.json +++ b/crates/vim/test_data/test_delete_surrounding_character_objects.json @@ -1 +1,1014 @@ -[{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui()wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov()o(g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th)e qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th)e qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th)e qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th)e qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th)e qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th)e qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th)e ()quiwn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ovo(g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[]o[g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th]e qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th]e qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th]e qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th]e qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th]e qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th]e qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th]e []quiwn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ovo[g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{}o{g"},{"Mode":"Normal"},{"Selection":{"start":[1,14],"end":[1,14]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th}e qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th}e qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th}e qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Th}e qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th}e qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th}e qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th}e {}quiwn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ovo{g"},{"Mode":"Normal"},{"Selection":{"start":[1,13],"end":[1,13]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,12],"end":[2,12]}},{"Mode":"Normal"},{"Text":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"},{"Mode":"Normal"},{"Selection":{"start":[2,13],"end":[2,13]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)ˇe ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ˇ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()quˇi(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ˇck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck broˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)ˇfox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox juˇmps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇ(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇer\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe ˇlazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy dˇ)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)ˇe ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ˇ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()quˇi(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ˇck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck broˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)ˇfox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox juˇmps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇ(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇer\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe ˇlazy d)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy dˇ)o(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇ)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg"}} +{"Key":"d"} +{"Key":"i"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)ˇe ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ˇ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()quˇi(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ˇck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck broˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)ˇfox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox juˇmps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇ(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇer\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe ˇlazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy dˇ)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"("} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"ˇTh)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)ˇe ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ˇ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e (ˇ)qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()ˇqui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()quˇi(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ˇck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck broˇ)wn(\n)fox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()quiˇwn(\n)fox jumps ov(er\nthe lazy d)o(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)ˇfox jumps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox juˇmps ov(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇ(er\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(ˇer\nthe lazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe ˇlazy d)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy dˇ)o(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ovˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)ˇo(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)oˇ(g","mode":"Normal"}} +{"Put":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg"}} +{"Key":"d"} +{"Key":"a"} +{"Key":")"} +{"Get":{"state":"Th)e ()qui(ck bro)wn(\n)fox jumps ov(er\nthe lazy d)o(ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]ˇe []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e ˇ[]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []quˇi[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ˇck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck broˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]ˇfox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox juˇmps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇ[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇer\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe ˇlazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy dˇ]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]ˇe []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e ˇ[]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []quˇi[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ˇck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck broˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]ˇfox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox juˇmps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇ[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇer\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe ˇlazy d]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy dˇ]o[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇ]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]ˇe []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e ˇ[]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []quˇi[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ˇck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck broˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]ˇfox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox juˇmps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇ[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇer\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe ˇlazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy dˇ]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"["} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"ˇTh]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]ˇe []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e ˇ[]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e [ˇ]qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []ˇqui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []quˇi[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ˇck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck broˇ]wn[\n]fox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []quiˇwn[\n]fox jumps ov[er\nthe lazy d]o[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]ˇfox jumps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox juˇmps ov[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇ[er\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[ˇer\nthe lazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe ˇlazy d]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy dˇ]o[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ovˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]ˇo[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]oˇ[g","mode":"Normal"}} +{"Put":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"]"} +{"Get":{"state":"Th]e []qui[ck bro]wn[\n]fox jumps ov[er\nthe lazy d]o[ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}ˇe {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e ˇ{}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}quˇi{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ˇck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck broˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}ˇfox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox juˇmps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇ{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇer\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe ˇlazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy dˇ}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}ˇe {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e ˇ{}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}quˇi{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ˇck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck broˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}ˇfox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox juˇmps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇ{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇer\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe ˇlazy d}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy dˇ}o{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇ}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}ˇe {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e ˇ{}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}quˇi{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ˇck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck broˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}ˇfox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox juˇmps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇ{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇer\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe ˇlazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy dˇ}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"{"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg","mode":"Normal"}} +{"Put":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"ˇTh}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}ˇe {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e ˇ{}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {ˇ}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}ˇqui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}quˇi{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ˇck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck broˇ}wn{\n}fox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}quiˇwn{\n}fox jumps ov{er\nthe lazy d}o{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}ˇfox jumps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox juˇmps ov{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇ{er\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{ˇer\nthe lazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe ˇlazy d}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy dˇ}o{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ovˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}ˇo{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}oˇ{g","mode":"Normal"}} +{"Put":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"}"} +{"Get":{"state":"Th}e {}qui{ck bro}wn{\n}fox jumps ov{er\nthe lazy d}o{ˇg","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_to_end_of_line.json b/crates/vim/test_data/test_delete_to_end_of_line.json index 591dac42000566773524971edd491f2e44c89c6a..e15d5d0c4ae335a81cd3c615988c7bf15aef9b53 100644 --- a/crates/vim/test_data/test_delete_to_end_of_line.json +++ b/crates/vim/test_data/test_delete_to_end_of_line.json @@ -1 +1,6 @@ -[{"Text":"The q\nbrown fox"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown fox"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The qˇuick\nbrown fox"}} +{"Key":"shift-d"} +{"Get":{"state":"The ˇq\nbrown fox","mode":"Normal"}} +{"Put":{"state":"The quick\nˇ\nbrown fox"}} +{"Key":"shift-d"} +{"Get":{"state":"The quick\nˇ\nbrown fox","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_w.json b/crates/vim/test_data/test_delete_w.json index cb05a3b53ae031daf517f70b907f2a143c9dc94e..c385ccb5469b44168feddd7b24a9e3bda7130666 100644 --- a/crates/vim/test_data/test_delete_w.json +++ b/crates/vim/test_data/test_delete_w.json @@ -1 +1,20 @@ -[{"Text":"Te"},{"Mode":"Normal"},{"Selection":{"start":[0,1],"end":[0,1]}},{"Mode":"Normal"},{"Text":"Ttest"},{"Mode":"Normal"},{"Selection":{"start":[0,1],"end":[0,1]}},{"Mode":"Normal"},{"Text":"Test te\ntest"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"Test tes\ntest"},{"Mode":"Normal"},{"Selection":{"start":[0,7],"end":[0,7]}},{"Mode":"Normal"},{"Text":"Test tetest"},{"Mode":"Normal"},{"Selection":{"start":[0,7],"end":[0,7]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"Teˇst"}} +{"Key":"d"} +{"Key":"w"} +{"Get":{"state":"Tˇe","mode":"Normal"}} +{"Put":{"state":"Tˇest test"}} +{"Key":"d"} +{"Key":"w"} +{"Get":{"state":"Tˇtest","mode":"Normal"}} +{"Put":{"state":"Test teˇst\ntest"}} +{"Key":"d"} +{"Key":"w"} +{"Get":{"state":"Test tˇe\ntest","mode":"Normal"}} +{"Put":{"state":"Test tesˇt\ntest"}} +{"Key":"d"} +{"Key":"w"} +{"Get":{"state":"Test teˇs\ntest","mode":"Normal"}} +{"Put":{"state":"Test teˇst-test test"}} +{"Key":"d"} +{"Key":"shift-w"} +{"Get":{"state":"Test teˇtest","mode":"Normal"}} diff --git a/crates/vim/test_data/test_delete_word_object.json b/crates/vim/test_data/test_delete_word_object.json index 7cd6ffbafc93fa2f6a77f37f714870f30bab53be..9c11d89a12b028d8658d92bf1dd5ccae5b771d3c 100644 --- a/crates/vim/test_data/test_delete_word_object.json +++ b/crates/vim/test_data/test_delete_word_object.json @@ -1 +1,460 @@ -[{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumpsover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog\n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[5,0],"end":[5,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThequick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,3],"end":[6,3]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe- brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,4],"end":[6,4]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe- brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,4],"end":[6,4]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,9],"end":[6,9]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,10],"end":[6,10]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown\n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,14],"end":[6,14]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n\n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[7,0],"end":[7,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n\n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[8,0],"end":[8,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nfox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[9,0],"end":[9,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox- over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[9,6],"end":[9,6]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog\n\n"},{"Mode":"Normal"},{"Selection":{"start":[10,11],"end":[10,11]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[11,0],"end":[11,0]}},{"Mode":"Normal"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumpsover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog\n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[5,0],"end":[5,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,9],"end":[6,9]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,10],"end":[6,10]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown\n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,14],"end":[6,14]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n\n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[7,0],"end":[7,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n\n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[8,0],"end":[8,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nfox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[9,0],"end":[9,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[9,2],"end":[9,2]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog\n\n"},{"Mode":"Normal"},{"Selection":{"start":[10,11],"end":[10,11]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[11,0],"end":[11,0]}},{"Mode":"Normal"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"The quick brown jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[1,8],"end":[1,8]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[5,0],"end":[5,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThequick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,3],"end":[6,3]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,4],"end":[6,4]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,4],"end":[6,4]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,9],"end":[6,9]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,9],"end":[6,9]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,15],"end":[6,15]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[7,0],"end":[7,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[8,0],"end":[8,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[9,0],"end":[9,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[9,6],"end":[9,6]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[10,11],"end":[10,11]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog "},{"Mode":"Normal"},{"Selection":{"start":[10,0],"end":[10,0]}},{"Mode":"Normal"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"The quick \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"The quick brown jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[1,8],"end":[1,8]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[5,0],"end":[5,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,0],"end":[6,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,9],"end":[6,9]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,9],"end":[6,9]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[6,15],"end":[6,15]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[7,0],"end":[7,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[8,0],"end":[8,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[9,0],"end":[9,0]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n over\nthe lazy dog \n\n"},{"Mode":"Normal"},{"Selection":{"start":[9,2],"end":[9,2]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[10,11],"end":[10,11]}},{"Mode":"Normal"},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog "},{"Mode":"Normal"},{"Selection":{"start":[10,0],"end":[10,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick ˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick browˇn \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick ˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick browˇn\nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox ˇjumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox ˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox juˇmps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox ˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumpsˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumpsˇover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy doˇg\n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThˇe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quˇick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇ \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick browˇn\n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ\n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ\n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇfox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumpˇs over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-ˇ over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy doˇg\n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n","mode":"Normal"}} +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick ˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick browˇn \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick ˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick browˇn\nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox ˇjumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox ˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox juˇmps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox ˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumpsˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumpsˇover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy doˇg\n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThˇe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quˇick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇ \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick browˇn\n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ\n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ\n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇfox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumpˇs over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n ˇ over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ \n\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy doˇg\n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n"}} +{"Key":"d"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n","mode":"Normal"}} +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quickˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick browˇn \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quickˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brownˇ jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox ˇjumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox ˇover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox juˇmps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox ˇover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumpsˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumpˇs\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy doˇg\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThˇe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quˇick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumpˇs over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-ˇover\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy doˇg\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nˇthe lazy dog ","mode":"Normal"}} +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quickˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick browˇn \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quickˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brownˇ jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox ˇjumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox ˇover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox juˇmps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox ˇover\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumpsˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumpˇs\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy doˇg\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThˇe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quˇick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ over\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumpˇs over\nthe lazy dog \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n ˇover\nthe lazy dog \n\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ \n\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy doˇg\n","mode":"Normal"}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n"}} +{"Key":"d"} +{"Key":"a"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nˇthe lazy dog ","mode":"Normal"}} diff --git a/crates/vim/test_data/test_e.json b/crates/vim/test_data/test_e.json index c4650284ddfc2a71e27e1ad070a3155b1863be8b..06f80dc245a06d86cf8478331d4e4b98d20fdef1 100644 --- a/crates/vim/test_data/test_e.json +++ b/crates/vim/test_data/test_e.json @@ -1 +1,32 @@ -[{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[3,8],"end":[3,8]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[3,13],"end":[3,13]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[4,2],"end":[4,2]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[4,2],"end":[4,2]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[3,8],"end":[3,8]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[3,13],"end":[3,13]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[4,2],"end":[4,2]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[4,2],"end":[4,2]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"Thˇe quick-brown\n\n\nfox_jumps over\nthe"}} +{"Key":"e"} +{"Get":{"state":"The quicˇk-brown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Key":"e"} +{"Get":{"state":"The quickˇ-brown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Key":"e"} +{"Get":{"state":"The quick-browˇn\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Key":"e"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumpˇs over\nthe","mode":"Normal"}} +{"Key":"e"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps oveˇr\nthe","mode":"Normal"}} +{"Key":"e"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps over\nthˇe","mode":"Normal"}} +{"Key":"e"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps over\nthˇe","mode":"Normal"}} +{"Put":{"state":"Thˇe quick-brown\n\n\nfox_jumps over\nthe"}} +{"Key":"shift-e"} +{"Get":{"state":"The quick-browˇn\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quicˇk-brown\n\n\nfox_jumps over\nthe"}} +{"Key":"shift-e"} +{"Get":{"state":"The quick-browˇn\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quickˇ-brown\n\n\nfox_jumps over\nthe"}} +{"Key":"shift-e"} +{"Get":{"state":"The quick-browˇn\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Key":"shift-e"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumpˇs over\nthe","mode":"Normal"}} +{"Key":"shift-e"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps oveˇr\nthe","mode":"Normal"}} +{"Key":"shift-e"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps over\nthˇe","mode":"Normal"}} +{"Key":"shift-e"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps over\nthˇe","mode":"Normal"}} diff --git a/crates/vim/test_data/test_end_of_document.json b/crates/vim/test_data/test_end_of_document.json index 2570db66daf77bf2727a35f0a2e279a871c29c93..2ad056170cdacf2a9d171326eed8fb5910041bb9 100644 --- a/crates/vim/test_data/test_end_of_document.json +++ b/crates/vim/test_data/test_end_of_document.json @@ -1 +1,15 @@ -[{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[3,5],"end":[3,5]}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[3,5],"end":[3,5]}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[3,11],"end":[3,11]}},{"Mode":"Normal"},{"Text":"\n\nbrown fox jumps\nover the lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[3,11],"end":[3,11]}},{"Mode":"Normal"},{"Text":"\n\nbrown fox jumps\nover the lazydog"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The qˇuick\n\nbrown fox jumps\nover the lazy dog"}} +{"Key":"shift-g"} +{"Get":{"state":"The quick\n\nbrown fox jumps\nover ˇthe lazy dog","mode":"Normal"}} +{"Key":"shift-g"} +{"Get":{"state":"The quick\n\nbrown fox jumps\nover ˇthe lazy dog","mode":"Normal"}} +{"Put":{"state":"The quick\n\nbrown fox jumps\nover the laˇzy dog"}} +{"Key":"shift-g"} +{"Get":{"state":"The quick\n\nbrown fox jumps\nover the laˇzy dog","mode":"Normal"}} +{"Put":{"state":"\n\nbrown fox jumps\nover the laˇzy dog"}} +{"Key":"shift-g"} +{"Get":{"state":"\n\nbrown fox jumps\nover the laˇzy dog","mode":"Normal"}} +{"Put":{"state":"ˇ\n\nbrown fox jumps\nover the lazydog"}} +{"Key":"2"} +{"Key":"shift-g"} +{"Get":{"state":"\nˇ\nbrown fox jumps\nover the lazydog","mode":"Normal"}} diff --git a/crates/vim/test_data/test_enter.json b/crates/vim/test_data/test_enter.json index 1bbc077812c5216dbf4046082ae6f737d382e8d6..c010a1ffd23b81789bf93a33bbd9968f7e23641f 100644 --- a/crates/vim/test_data/test_enter.json +++ b/crates/vim/test_data/test_enter.json @@ -1 +1,11 @@ -[{"Text":"The quick brown\nfox jumps"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick brown\nfox jumps"}} +{"Key":"enter"} +{"Get":{"state":"The quick brown\nˇfox jumps","mode":"Normal"}} +{"Put":{"state":"The qˇuick brown\nfox jumps"}} +{"Key":"enter"} +{"Get":{"state":"The quick brown\nˇfox jumps","mode":"Normal"}} +{"Put":{"state":"The quick broˇwn\nfox jumps"}} +{"Key":"enter"} +{"Get":{"state":"The quick brown\nˇfox jumps","mode":"Normal"}} +{"Key":"enter"} +{"Get":{"state":"The quick brown\nˇfox jumps","mode":"Normal"}} diff --git a/crates/vim/test_data/test_enter_visual_mode.json b/crates/vim/test_data/test_enter_visual_mode.json index b13aa23589f03f7752966291bc6b11edd1033e0f..bd4e91977feb066fcead3f5fc6924faac593bcc5 100644 --- a/crates/vim/test_data/test_enter_visual_mode.json +++ b/crates/vim/test_data/test_enter_visual_mode.json @@ -1 +1,30 @@ -[{"Text":"The quick brown\nfox jumps over\nthe lazy dog"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[0,4],"end":[1,10]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown\nfox jumps over\nthe lazy dog"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[1,10],"end":[2,0]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown\nfox jumps over\nthe lazy dog"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[2,4],"end":[2,9]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown\nfox jumps over\nthe lazy dog"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[0,4],"end":[0,0]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown\nfox jumps over\nthe lazy dog"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[1,10],"end":[0,4]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown\nfox jumps over\nthe lazy dog"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[2,4],"end":[1,0]}},{"Mode":{"Visual":{"line":false}}}] \ No newline at end of file +{"Put":{"state":"The ˇquick brown\nfox jumps over\nthe lazy dog"}} +{"Key":"v"} +{"Key":"w"} +{"Key":"j"} +{"Get":{"state":"The «quick brown\nfox jumps ˇ»over\nthe lazy dog","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown\nfox jumps ˇover\nthe lazy dog"}} +{"Key":"v"} +{"Key":"w"} +{"Key":"j"} +{"Get":{"state":"The quick brown\nfox jumps «over\nˇ»the lazy dog","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown\nfox jumps over\nthe ˇlazy dog"}} +{"Key":"v"} +{"Key":"w"} +{"Key":"j"} +{"Get":{"state":"The quick brown\nfox jumps over\nthe «lazy ˇ»dog","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The ˇquick brown\nfox jumps over\nthe lazy dog"}} +{"Key":"v"} +{"Key":"b"} +{"Key":"k"} +{"Get":{"state":"«ˇThe »quick brown\nfox jumps over\nthe lazy dog","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown\nfox jumps ˇover\nthe lazy dog"}} +{"Key":"v"} +{"Key":"b"} +{"Key":"k"} +{"Get":{"state":"The «ˇquick brown\nfox jumps »over\nthe lazy dog","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown\nfox jumps over\nthe ˇlazy dog"}} +{"Key":"v"} +{"Key":"b"} +{"Key":"k"} +{"Get":{"state":"The quick brown\n«ˇfox jumps over\nthe »lazy dog","mode":{"Visual":{"line":false}}}} diff --git a/crates/vim/test_data/test_f_and_t.json b/crates/vim/test_data/test_f_and_t.json index 35f4fd5e1d694efa8ed5d07d93e0013d7d00e997..d370c5585c7b76548cbbbbbaff9648ae66967eca 100644 --- a/crates/vim/test_data/test_f_and_t.json +++ b/crates/vim/test_data/test_f_and_t.json @@ -1 +1,557 @@ -[{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,11],"end":[1,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,11],"end":[1,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,2],"end":[0,2]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,3],"end":[1,3]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,8],"end":[1,8]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,8],"end":[1,8]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,8],"end":[1,8]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,11],"end":[1,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,13],"end":[0,13]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,11],"end":[1,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,11],"end":[1,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,13],"end":[0,13]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,8],"end":[1,8]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,11],"end":[1,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,13],"end":[0,13]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,11],"end":[1,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,11],"end":[1,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,11],"end":[1,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,11],"end":[1,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,13],"end":[0,13]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[1,11],"end":[1,11]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"aaab b bb aaabaaa\n baaa bbb\n \nb\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n"}} +{"Key":"1"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n","mode":"Normal"}} +{"Put":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaˇab b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇ bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇ bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaˇabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaˇabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaˇabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n ˇ baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaaˇ bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaaˇ bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaaˇ bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n"}} +{"Key":"1"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n","mode":"Normal"}} +{"Put":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n"}} +{"Key":"2"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n","mode":"Normal"}} +{"Put":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇ bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇ bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaˇabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaaˇ bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n"}} +{"Key":"2"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n","mode":"Normal"}} +{"Put":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n"}} +{"Key":"3"} +{"Key":"f"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n","mode":"Normal"}} +{"Put":{"state":"ˇaaab b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇ bb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaaˇb b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaabˇ b bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab ˇb bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaˇabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab bˇ bb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaˇabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b ˇbb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bˇb aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bbˇ aaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aˇaabaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaaˇbaaa\n baaa bbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\nˇ baaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n ˇbaaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n bˇaaa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaˇa bbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa ˇbbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bˇbb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbˇb\n \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\nˇ \nb\n","mode":"Normal"}} +{"Put":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n"}} +{"Key":"3"} +{"Key":"t"} +{"Key":"b"} +{"Get":{"state":"aaab b bb aaabaaa\n baaa bbb\n \nˇb\n","mode":"Normal"}} diff --git a/crates/vim/test_data/test_gg.json b/crates/vim/test_data/test_gg.json index 39f86325bc91a4fc338c28d561e6b2529d727c61..7cc8291b131abde121424e509c44f0e2f09e0bc2 100644 --- a/crates/vim/test_data/test_gg.json +++ b/crates/vim/test_data/test_gg.json @@ -1 +1,21 @@ -[{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Normal"},{"Text":"\n\nbrown fox jumps\nover the lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"\n\nbrown fox jumps\nover the lazydog"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The qˇuick\n\nbrown fox jumps\nover the lazy dog"}} +{"Key":"g"} +{"Key":"g"} +{"Get":{"state":"The qˇuick\n\nbrown fox jumps\nover the lazy dog","mode":"Normal"}} +{"Put":{"state":"The quick\n\nbrown fox jumps\nover ˇthe lazy dog"}} +{"Key":"g"} +{"Key":"g"} +{"Get":{"state":"The qˇuick\n\nbrown fox jumps\nover the lazy dog","mode":"Normal"}} +{"Put":{"state":"The quick\n\nbrown fox jumps\nover the laˇzy dog"}} +{"Key":"g"} +{"Key":"g"} +{"Get":{"state":"The quicˇk\n\nbrown fox jumps\nover the lazy dog","mode":"Normal"}} +{"Put":{"state":"\n\nbrown fox jumps\nover the laˇzy dog"}} +{"Key":"g"} +{"Key":"g"} +{"Get":{"state":"ˇ\n\nbrown fox jumps\nover the lazy dog","mode":"Normal"}} +{"Put":{"state":"ˇ\n\nbrown fox jumps\nover the lazydog"}} +{"Key":"2"} +{"Key":"g"} +{"Key":"g"} +{"Get":{"state":"\nˇ\nbrown fox jumps\nover the lazydog","mode":"Normal"}} diff --git a/crates/vim/test_data/test_h.json b/crates/vim/test_data/test_h.json index 6eeff7997f69b435ff6d7ad8597648c52ffd0ae9..4cdf21032686af40b03bc09500ea5d8ac8843ba7 100644 --- a/crates/vim/test_data/test_h.json +++ b/crates/vim/test_data/test_h.json @@ -1 +1,9 @@ -[{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick\nbrown"}} +{"Key":"h"} +{"Get":{"state":"ˇThe quick\nbrown","mode":"Normal"}} +{"Put":{"state":"The qˇuick\nbrown"}} +{"Key":"h"} +{"Get":{"state":"The ˇquick\nbrown","mode":"Normal"}} +{"Put":{"state":"The quick\nˇbrown"}} +{"Key":"h"} +{"Get":{"state":"The quick\nˇbrown","mode":"Normal"}} diff --git a/crates/vim/test_data/test_h_through_unicode.json b/crates/vim/test_data/test_h_through_unicode.json index 86d6d0832d3c6f466318b5d56ad9dada6276c0ee..95b18396d0a8ac534a0b904209523db1dad09a89 100644 --- a/crates/vim/test_data/test_h_through_unicode.json +++ b/crates/vim/test_data/test_h_through_unicode.json @@ -1 +1,12 @@ -[{"Text":"Test├──┐Test"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"Test├──┐Test"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"Test├──┐Test"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Test├──┐Test"},{"Mode":"Normal"},{"Selection":{"start":[0,13],"end":[0,13]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"Testˇ├──┐Test"}} +{"Key":"h"} +{"Get":{"state":"Tesˇt├──┐Test","mode":"Normal"}} +{"Put":{"state":"Test├ˇ──┐Test"}} +{"Key":"h"} +{"Get":{"state":"Testˇ├──┐Test","mode":"Normal"}} +{"Put":{"state":"Test├──ˇ┐Test"}} +{"Key":"h"} +{"Get":{"state":"Test├─ˇ─┐Test","mode":"Normal"}} +{"Put":{"state":"Test├──┐ˇTest"}} +{"Key":"h"} +{"Get":{"state":"Test├──ˇ┐Test","mode":"Normal"}} diff --git a/crates/vim/test_data/test_insert_end_of_line.json b/crates/vim/test_data/test_insert_end_of_line.json index 6b377b0d2057829bc5e8031c83b071f44043b8b1..a37ad24d39ce17f89806a28a1b95bead0d31a2df 100644 --- a/crates/vim/test_data/test_insert_end_of_line.json +++ b/crates/vim/test_data/test_insert_end_of_line.json @@ -1 +1,9 @@ -[{"Text":"\nThe quick\nbrown fox "},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nThe quick\nbrown fox "},{"Mode":"Insert"},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":"Insert"},{"Text":"\nThe quick\nbrown fox "},{"Mode":"Insert"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"ˇ\nThe quick\nbrown fox "}} +{"Key":"shift-a"} +{"Get":{"state":"ˇ\nThe quick\nbrown fox ","mode":"Insert"}} +{"Put":{"state":"\nThe qˇuick\nbrown fox "}} +{"Key":"shift-a"} +{"Get":{"state":"\nThe quickˇ\nbrown fox ","mode":"Insert"}} +{"Put":{"state":"\nThe quick\nbrown ˇfox "}} +{"Key":"shift-a"} +{"Get":{"state":"\nThe quick\nbrown fox ˇ","mode":"Insert"}} diff --git a/crates/vim/test_data/test_insert_first_non_whitespace.json b/crates/vim/test_data/test_insert_first_non_whitespace.json index b64ea3c808ac7e4439c479905a37d732f7c4760f..4d13cdb81c0208484801f40ad0ae5cffd4253380 100644 --- a/crates/vim/test_data/test_insert_first_non_whitespace.json +++ b/crates/vim/test_data/test_insert_first_non_whitespace.json @@ -1 +1,15 @@ -[{"Text":"The quick"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" The quick"},{"Mode":"Insert"},{"Selection":{"start":[0,1],"end":[0,1]}},{"Mode":"Insert"},{"Text":""},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick\nbrown fox"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nThe quick"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"The qˇuick"}} +{"Key":"shift-i"} +{"Get":{"state":"ˇThe quick","mode":"Insert"}} +{"Put":{"state":" The qˇuick"}} +{"Key":"shift-i"} +{"Get":{"state":" ˇThe quick","mode":"Insert"}} +{"Put":{"state":"ˇ"}} +{"Key":"shift-i"} +{"Get":{"state":"ˇ","mode":"Insert"}} +{"Put":{"state":"The qˇuick\nbrown fox"}} +{"Key":"shift-i"} +{"Get":{"state":"ˇThe quick\nbrown fox","mode":"Insert"}} +{"Put":{"state":"ˇ\nThe quick"}} +{"Key":"shift-i"} +{"Get":{"state":"ˇ\nThe quick","mode":"Insert"}} diff --git a/crates/vim/test_data/test_insert_line_above.json b/crates/vim/test_data/test_insert_line_above.json index 45854367aeb1e866346329f46143a7ec1ac9c4b9..ce5d0d7ac19cce149894a805b06ba2e1a226c8ea 100644 --- a/crates/vim/test_data/test_insert_line_above.json +++ b/crates/vim/test_data/test_insert_line_above.json @@ -1 +1,18 @@ -[{"Text":"\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nThe quick"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nThe quick\nbrown fox\njumps over"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick\n\nbrown fox\njumps over"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick\nbrown fox\n\njumps over"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick\n\n\nbrown fox"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"ˇ"}} +{"Key":"shift-o"} +{"Get":{"state":"ˇ\n","mode":"Insert"}} +{"Put":{"state":"The ˇquick"}} +{"Key":"shift-o"} +{"Get":{"state":"ˇ\nThe quick","mode":"Insert"}} +{"Put":{"state":"The qˇuick\nbrown fox\njumps over"}} +{"Key":"shift-o"} +{"Get":{"state":"ˇ\nThe quick\nbrown fox\njumps over","mode":"Insert"}} +{"Put":{"state":"The quick\nbrown ˇfox\njumps over"}} +{"Key":"shift-o"} +{"Get":{"state":"The quick\nˇ\nbrown fox\njumps over","mode":"Insert"}} +{"Put":{"state":"The quick\nbrown fox\njumps ˇover"}} +{"Key":"shift-o"} +{"Get":{"state":"The quick\nbrown fox\nˇ\njumps over","mode":"Insert"}} +{"Put":{"state":"The quick\nˇ\nbrown fox"}} +{"Key":"shift-o"} +{"Get":{"state":"The quick\nˇ\n\nbrown fox","mode":"Insert"}} diff --git a/crates/vim/test_data/test_j.json b/crates/vim/test_data/test_j.json index da373bbcad0fe0b6d4f0f4645d9fd339d7f84e11..64aaf65ef8960f66253d788fa97f4b4306bbee70 100644 --- a/crates/vim/test_data/test_j.json +++ b/crates/vim/test_data/test_j.json @@ -1 +1,12 @@ -[{"Text":"The quick brown\nfox jumps"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps"},{"Mode":"Normal"},{"Selection":{"start":[1,5],"end":[1,5]}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps"},{"Mode":"Normal"},{"Selection":{"start":[1,8],"end":[1,8]}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick brown\nfox jumps"}} +{"Key":"j"} +{"Get":{"state":"The quick brown\nˇfox jumps","mode":"Normal"}} +{"Put":{"state":"The qˇuick brown\nfox jumps"}} +{"Key":"j"} +{"Get":{"state":"The quick brown\nfox jˇumps","mode":"Normal"}} +{"Put":{"state":"The quick broˇwn\nfox jumps"}} +{"Key":"j"} +{"Get":{"state":"The quick brown\nfox jumpˇs","mode":"Normal"}} +{"Put":{"state":"The quick brown\nˇfox jumps"}} +{"Key":"j"} +{"Get":{"state":"The quick brown\nˇfox jumps","mode":"Normal"}} diff --git a/crates/vim/test_data/test_jump_to_end.json b/crates/vim/test_data/test_jump_to_end.json index c556c7cb169a0582c9212d8eb2eb6ec807cc901e..fe9a948d43c76deadd946d4d0084e409ace6f155 100644 --- a/crates/vim/test_data/test_jump_to_end.json +++ b/crates/vim/test_data/test_jump_to_end.json @@ -1 +1,14 @@ -[{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[3,4],"end":[3,4]}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[3,4],"end":[3,4]}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[3,16],"end":[3,16]}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Normal"},{"Text":"The quick\n\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The ˇquick\n\nbrown fox jumps\nover the lazy dog"}} +{"Key":"shift-g"} +{"Get":{"state":"The quick\n\nbrown fox jumps\noverˇ the lazy dog","mode":"Normal"}} +{"Key":"shift-g"} +{"Get":{"state":"The quick\n\nbrown fox jumps\noverˇ the lazy dog","mode":"Normal"}} +{"Put":{"state":"The quick\n\nbrown fox jumps\nover the lazy doˇg"}} +{"Key":"shift-g"} +{"Get":{"state":"The quick\n\nbrown fox jumps\nover the lazy doˇg","mode":"Normal"}} +{"Put":{"state":"The quiˇck\n\nbrown"}} +{"Key":"shift-g"} +{"Get":{"state":"The quick\n\nbrowˇn","mode":"Normal"}} +{"Put":{"state":"The quiˇck\n\n"}} +{"Key":"shift-g"} +{"Get":{"state":"The quick\n\nˇ","mode":"Normal"}} diff --git a/crates/vim/test_data/test_jump_to_first_non_whitespace.json b/crates/vim/test_data/test_jump_to_first_non_whitespace.json index 123b752860b5977a4966cdd5e3de852ca32ac78c..c9926621954773b06baae6c4c840a32e2718604c 100644 --- a/crates/vim/test_data/test_jump_to_first_non_whitespace.json +++ b/crates/vim/test_data/test_jump_to_first_non_whitespace.json @@ -1 +1,18 @@ -[{"Text":"The quick"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":" The quick"},{"Mode":"Normal"},{"Selection":{"start":[0,1],"end":[0,1]}},{"Mode":"Normal"},{"Text":""},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"\nThe quick"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":" \nThe quick"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The qˇuick"}} +{"Key":"^"} +{"Get":{"state":"ˇThe quick","mode":"Normal"}} +{"Put":{"state":" The qˇuick"}} +{"Key":"^"} +{"Get":{"state":" ˇThe quick","mode":"Normal"}} +{"Put":{"state":"ˇ"}} +{"Key":"^"} +{"Get":{"state":"ˇ","mode":"Normal"}} +{"Put":{"state":"The qˇuick\nbrown fox"}} +{"Key":"^"} +{"Get":{"state":"ˇThe quick\nbrown fox","mode":"Normal"}} +{"Put":{"state":"ˇ\nThe quick"}} +{"Key":"^"} +{"Get":{"state":"ˇ\nThe quick","mode":"Normal"}} +{"Put":{"state":" ˇ \nThe quick"}} +{"Key":"^"} +{"Get":{"state":" ˇ \nThe quick","mode":"Normal"}} diff --git a/crates/vim/test_data/test_jump_to_line_boundaries.json b/crates/vim/test_data/test_jump_to_line_boundaries.json index 386a2db23fb168d715e072881e70ffcf5cd918ff..6d4a76ffd60ff99115590238ecf2e7ab7cf7cf01 100644 --- a/crates/vim/test_data/test_jump_to_line_boundaries.json +++ b/crates/vim/test_data/test_jump_to_line_boundaries.json @@ -1 +1,28 @@ -[{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick\nbrown"}} +{"Key":"$"} +{"Get":{"state":"The quicˇk\nbrown","mode":"Normal"}} +{"Put":{"state":"The qˇuick\nbrown"}} +{"Key":"$"} +{"Get":{"state":"The quicˇk\nbrown","mode":"Normal"}} +{"Key":"$"} +{"Get":{"state":"The quicˇk\nbrown","mode":"Normal"}} +{"Put":{"state":"The quick\nˇbrown"}} +{"Key":"$"} +{"Get":{"state":"The quick\nbrowˇn","mode":"Normal"}} +{"Key":"$"} +{"Get":{"state":"The quick\nbrowˇn","mode":"Normal"}} +{"Put":{"state":"ˇThe quick\nbrown"}} +{"Key":"0"} +{"Get":{"state":"ˇThe quick\nbrown","mode":"Normal"}} +{"Put":{"state":"The qˇuick\nbrown"}} +{"Key":"0"} +{"Get":{"state":"ˇThe quick\nbrown","mode":"Normal"}} +{"Put":{"state":"The quicˇk\nbrown"}} +{"Key":"0"} +{"Get":{"state":"ˇThe quick\nbrown","mode":"Normal"}} +{"Put":{"state":"The quick\nˇbrown"}} +{"Key":"0"} +{"Get":{"state":"The quick\nˇbrown","mode":"Normal"}} +{"Put":{"state":"The quick\nbrowˇn"}} +{"Key":"0"} +{"Get":{"state":"The quick\nˇbrown","mode":"Normal"}} diff --git a/crates/vim/test_data/test_k.json b/crates/vim/test_data/test_k.json index cd5242c0f39f22b8b2a3b23e64d2f92297b47ba5..f064fa9fd98025af987dbfc9b2ffb97cd23edacb 100644 --- a/crates/vim/test_data/test_k.json +++ b/crates/vim/test_data/test_k.json @@ -1 +1,15 @@ -[{"Text":"The quick\nbrown fox jumps"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox jumps"},{"Mode":"Normal"},{"Selection":{"start":[0,5],"end":[0,5]}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox jumps"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox jumps"},{"Mode":"Normal"},{"Selection":{"start":[0,7],"end":[0,7]}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox jumps"},{"Mode":"Normal"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick\nbrown fox jumps"}} +{"Key":"k"} +{"Get":{"state":"ˇThe quick\nbrown fox jumps","mode":"Normal"}} +{"Put":{"state":"The qˇuick\nbrown fox jumps"}} +{"Key":"k"} +{"Get":{"state":"The qˇuick\nbrown fox jumps","mode":"Normal"}} +{"Put":{"state":"The quick\nˇbrown fox jumps"}} +{"Key":"k"} +{"Get":{"state":"ˇThe quick\nbrown fox jumps","mode":"Normal"}} +{"Put":{"state":"The quick\nbrown fˇox jumps"}} +{"Key":"k"} +{"Get":{"state":"The quiˇck\nbrown fox jumps","mode":"Normal"}} +{"Put":{"state":"The quick\nbrown fox jumˇps"}} +{"Key":"k"} +{"Get":{"state":"The quicˇk\nbrown fox jumps","mode":"Normal"}} diff --git a/crates/vim/test_data/test_l.json b/crates/vim/test_data/test_l.json index 3d6c4b34936935de580ed3143dcb45e1f06464df..b0db891bce42ed21f161238d1bd46b45c2085d61 100644 --- a/crates/vim/test_data/test_l.json +++ b/crates/vim/test_data/test_l.json @@ -1 +1,15 @@ -[{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,1],"end":[0,1]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[0,8],"end":[0,8]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[1,1],"end":[1,1]}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Mode":"Normal"},{"Selection":{"start":[1,4],"end":[1,4]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick\nbrown"}} +{"Key":"l"} +{"Get":{"state":"Tˇhe quick\nbrown","mode":"Normal"}} +{"Put":{"state":"The qˇuick\nbrown"}} +{"Key":"l"} +{"Get":{"state":"The quˇick\nbrown","mode":"Normal"}} +{"Put":{"state":"The quicˇk\nbrown"}} +{"Key":"l"} +{"Get":{"state":"The quicˇk\nbrown","mode":"Normal"}} +{"Put":{"state":"The quick\nˇbrown"}} +{"Key":"l"} +{"Get":{"state":"The quick\nbˇrown","mode":"Normal"}} +{"Put":{"state":"The quick\nbrowˇn"}} +{"Key":"l"} +{"Get":{"state":"The quick\nbrowˇn","mode":"Normal"}} diff --git a/crates/vim/test_data/test_neovim.json b/crates/vim/test_data/test_neovim.json index 244e909ba4be669ece0f58360907d0626001fe99..5aef81073afcfc0cde4774a300fe7a7e68147d64 100644 --- a/crates/vim/test_data/test_neovim.json +++ b/crates/vim/test_data/test_neovim.json @@ -1 +1,16 @@ -[{"Text":""},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"test"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Key":"i"} +{"Get":{"state":"ˇ","mode":"Insert"}} +{"Key":"shift-T"} +{"Key":"e"} +{"Key":"s"} +{"Key":"t"} +{"Key":" "} +{"Key":"t"} +{"Key":"e"} +{"Key":"s"} +{"Key":"t"} +{"Key":"escape"} +{"Key":"0"} +{"Key":"d"} +{"Key":"w"} +{"Get":{"state":"ˇtest","mode":"Normal"}} diff --git a/crates/vim/test_data/test_o.json b/crates/vim/test_data/test_o.json index fa1a400bc0e2519b14c9da981a77575788f8b096..015890ac36722d13c8a8b8d36a886bd07a907a35 100644 --- a/crates/vim/test_data/test_o.json +++ b/crates/vim/test_data/test_o.json @@ -1 +1,18 @@ -[{"Text":"\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick\n\nbrown fox\njumps over"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick\nbrown fox\n\njumps over"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick\nbrown fox\njumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":"The quick\n\n\nbrown fox"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"ˇ"}} +{"Key":"o"} +{"Get":{"state":"\nˇ","mode":"Insert"}} +{"Put":{"state":"The ˇquick"}} +{"Key":"o"} +{"Get":{"state":"The quick\nˇ","mode":"Insert"}} +{"Put":{"state":"The qˇuick\nbrown fox\njumps over"}} +{"Key":"o"} +{"Get":{"state":"The quick\nˇ\nbrown fox\njumps over","mode":"Insert"}} +{"Put":{"state":"The quick\nbrown ˇfox\njumps over"}} +{"Key":"o"} +{"Get":{"state":"The quick\nbrown fox\nˇ\njumps over","mode":"Insert"}} +{"Put":{"state":"The quick\nbrown fox\njumps ˇover"}} +{"Key":"o"} +{"Get":{"state":"The quick\nbrown fox\njumps over\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick\nˇ\nbrown fox"}} +{"Key":"o"} +{"Get":{"state":"The quick\n\nˇ\nbrown fox","mode":"Insert"}} diff --git a/crates/vim/test_data/test_p.json b/crates/vim/test_data/test_p.json index 2cf45ea2f76efffd6e32a22d4cfeb569db194a15..57fc863392d72fe70c0b5eec9ec6fd9575583150 100644 --- a/crates/vim/test_data/test_p.json +++ b/crates/vim/test_data/test_p.json @@ -1 +1,13 @@ -[{"Text":"The quick brown\nthe lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[1,6],"end":[1,6]}},{"Mode":"Normal"},{"Text":"The quick brown\nthe lazy dog\nfox jumps over"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps overjumps o\nthe lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[1,20],"end":[1,20]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The quick brown\nfox juˇmps over\nthe lazy dog"}} +{"Key":"d"} +{"Key":"d"} +{"Get":{"state":"The quick brown\nthe laˇzy dog","mode":"Normal"}} +{"Key":"p"} +{"Get":{"state":"The quick brown\nthe lazy dog\nˇfox jumps over","mode":"Normal"}} +{"Put":{"state":"The quick brown\nfox ˇjumps over\nthe lazy dog"}} +{"Key":"v"} +{"Key":"w"} +{"Key":"y"} +{"Put":{"state":"The quick brown\nfox jumps oveˇr\nthe lazy dog"}} +{"Key":"p"} +{"Get":{"state":"The quick brown\nfox jumps overjumps ˇo\nthe lazy dog","mode":"Normal"}} diff --git a/crates/vim/test_data/test_percent.json b/crates/vim/test_data/test_percent.json index 9dc0fc655b266fea00a336785306c3afcd7ba2ae..2382cc9e49906ef1ddd94ada878c3363322b509c 100644 --- a/crates/vim/test_data/test_percent.json +++ b/crates/vim/test_data/test_percent.json @@ -1 +1,58 @@ -[{"Text":"console.log(var);"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"console.log(var);"},{"Mode":"Normal"},{"Selection":{"start":[0,15],"end":[0,15]}},{"Mode":"Normal"},{"Text":"console.log(var);"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"console.log(var);"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"console.log(var);"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"console.log(var);"},{"Mode":"Normal"},{"Selection":{"start":[0,16],"end":[0,16]}},{"Mode":"Normal"},{"Text":"console.log('var', [1, 2, 3]);"},{"Mode":"Normal"},{"Selection":{"start":[0,28],"end":[0,28]}},{"Mode":"Normal"},{"Text":"console.log('var', [1, 2, 3]);"},{"Mode":"Normal"},{"Selection":{"start":[0,28],"end":[0,28]}},{"Mode":"Normal"},{"Text":"console.log('var', [1, 2, 3]);"},{"Mode":"Normal"},{"Selection":{"start":[0,27],"end":[0,27]}},{"Mode":"Normal"},{"Text":"console.log('var', [1, 2, 3]);"},{"Mode":"Normal"},{"Selection":{"start":[0,27],"end":[0,27]}},{"Mode":"Normal"},{"Text":"console.log('var', [1, 2, 3]);"},{"Mode":"Normal"},{"Selection":{"start":[0,19],"end":[0,19]}},{"Mode":"Normal"},{"Text":"console.log('var', [1, 2, 3]);"},{"Mode":"Normal"},{"Selection":{"start":[0,19],"end":[0,19]}},{"Mode":"Normal"},{"Text":"console.log('var', [1, 2, 3]);"},{"Mode":"Normal"},{"Selection":{"start":[0,19],"end":[0,19]}},{"Mode":"Normal"},{"Text":"console.log('var', [1, 2, 3]);"},{"Mode":"Normal"},{"Selection":{"start":[0,11],"end":[0,11]}},{"Mode":"Normal"},{"Text":"console.log('var', [1, 2, 3]);"},{"Mode":"Normal"},{"Selection":{"start":[0,29],"end":[0,29]}},{"Mode":"Normal"},{"Text":"let result = curried_fun()();"},{"Mode":"Normal"},{"Selection":{"start":[0,25],"end":[0,25]}},{"Mode":"Normal"},{"Text":"let result = curried_fun()();"},{"Mode":"Normal"},{"Selection":{"start":[0,24],"end":[0,24]}},{"Mode":"Normal"},{"Text":"let result = curried_fun()();"},{"Mode":"Normal"},{"Selection":{"start":[0,27],"end":[0,27]}},{"Mode":"Normal"},{"Text":"let result = curried_fun()();"},{"Mode":"Normal"},{"Selection":{"start":[0,26],"end":[0,26]}},{"Mode":"Normal"},{"Text":"let result = curried_fun()();"},{"Mode":"Normal"},{"Selection":{"start":[0,28],"end":[0,28]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇconsole.log(var);"}} +{"Key":"%"} +{"Get":{"state":"console.log(varˇ);","mode":"Normal"}} +{"Put":{"state":"console.logˇ(var);"}} +{"Key":"%"} +{"Get":{"state":"console.log(varˇ);","mode":"Normal"}} +{"Put":{"state":"console.log(ˇvar);"}} +{"Key":"%"} +{"Get":{"state":"console.logˇ(var);","mode":"Normal"}} +{"Put":{"state":"console.log(vaˇr);"}} +{"Key":"%"} +{"Get":{"state":"console.logˇ(var);","mode":"Normal"}} +{"Put":{"state":"console.log(varˇ);"}} +{"Key":"%"} +{"Get":{"state":"console.logˇ(var);","mode":"Normal"}} +{"Put":{"state":"console.log(var)ˇ;"}} +{"Key":"%"} +{"Get":{"state":"console.log(var)ˇ;","mode":"Normal"}} +{"Put":{"state":"ˇconsole.log('var', [1, 2, 3]);"}} +{"Key":"%"} +{"Get":{"state":"console.log('var', [1, 2, 3]ˇ);","mode":"Normal"}} +{"Put":{"state":"console.logˇ('var', [1, 2, 3]);"}} +{"Key":"%"} +{"Get":{"state":"console.log('var', [1, 2, 3]ˇ);","mode":"Normal"}} +{"Put":{"state":"console.log(ˇ'var', [1, 2, 3]);"}} +{"Key":"%"} +{"Get":{"state":"console.log('var', [1, 2, 3ˇ]);","mode":"Normal"}} +{"Put":{"state":"console.log('var', ˇ[1, 2, 3]);"}} +{"Key":"%"} +{"Get":{"state":"console.log('var', [1, 2, 3ˇ]);","mode":"Normal"}} +{"Put":{"state":"console.log('var', [ˇ1, 2, 3]);"}} +{"Key":"%"} +{"Get":{"state":"console.log('var', ˇ[1, 2, 3]);","mode":"Normal"}} +{"Put":{"state":"console.log('var', [1, ˇ2, 3]);"}} +{"Key":"%"} +{"Get":{"state":"console.log('var', ˇ[1, 2, 3]);","mode":"Normal"}} +{"Put":{"state":"console.log('var', [1, 2, 3ˇ]);"}} +{"Key":"%"} +{"Get":{"state":"console.log('var', ˇ[1, 2, 3]);","mode":"Normal"}} +{"Put":{"state":"console.log('var', [1, 2, 3]ˇ);"}} +{"Key":"%"} +{"Get":{"state":"console.logˇ('var', [1, 2, 3]);","mode":"Normal"}} +{"Put":{"state":"console.log('var', [1, 2, 3])ˇ;"}} +{"Key":"%"} +{"Get":{"state":"console.log('var', [1, 2, 3])ˇ;","mode":"Normal"}} +{"Put":{"state":"let result = curried_funˇ()();"}} +{"Key":"%"} +{"Get":{"state":"let result = curried_fun(ˇ)();","mode":"Normal"}} +{"Key":"%"} +{"Get":{"state":"let result = curried_funˇ()();","mode":"Normal"}} +{"Put":{"state":"let result = curried_fun()ˇ();"}} +{"Key":"%"} +{"Get":{"state":"let result = curried_fun()(ˇ);","mode":"Normal"}} +{"Key":"%"} +{"Get":{"state":"let result = curried_fun()ˇ();","mode":"Normal"}} +{"Put":{"state":"let result = curried_fun()()ˇ;"}} +{"Key":"%"} +{"Get":{"state":"let result = curried_fun()()ˇ;","mode":"Normal"}} diff --git a/crates/vim/test_data/test_repeated_cb.json b/crates/vim/test_data/test_repeated_cb.json index ccb23120911155650b6eba529e70cd8d105ccb7d..437b55ef29bbdf30389e8ba3fb3a9107f7b9bccf 100644 --- a/crates/vim/test_data/test_repeated_cb.json +++ b/crates/vim/test_data/test_repeated_cb.json @@ -1 +1,275 @@ -[{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The ick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Insert"},{"Text":"The brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Insert"},{"Text":"The quick n\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick \n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\njumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox -over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumpsover\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-ver\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"ick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The n\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Insert"},{"Text":"The \n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Insert"},{"Text":"The quick \nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick brown\njumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumpsver\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"ick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"n\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The \nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Insert"},{"Text":"The quick jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nover\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox ver\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox \nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"ick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"n\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Insert"},{"Text":"The quick -over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick brown\nover\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nver\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"ick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":" brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"n\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The -over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Insert"},{"Text":"The quick over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The quick brown\nver\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"b"} +{"Get":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"b"} +{"Get":{"state":"The ˇick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"b"} +{"Get":{"state":"The ˇ brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"b"} +{"Get":{"state":"The quick ˇn\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"b"} +{"Get":{"state":"The quick ˇ\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"b"} +{"Get":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nˇjumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nfox ˇ-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇover\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇver\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"b"} +{"Get":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"b"} +{"Get":{"state":"ˇick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"b"} +{"Get":{"state":"ˇ brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"b"} +{"Get":{"state":"The ˇn\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"b"} +{"Get":{"state":"The ˇ\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"b"} +{"Get":{"state":"The quick ˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"b"} +{"Get":{"state":"The quick brown\nˇjumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nˇ-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nfox ˇover\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇver\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"b"} +{"Get":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"b"} +{"Get":{"state":"ˇick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"b"} +{"Get":{"state":"ˇ brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"b"} +{"Get":{"state":"ˇn\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"b"} +{"Get":{"state":"ˇ\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"b"} +{"Get":{"state":"The ˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"b"} +{"Get":{"state":"The quick ˇjumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"b"} +{"Get":{"state":"The quick brown\nˇ-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nˇover\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nfox ˇver\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nfox ˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"b"} +{"Get":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"b"} +{"Get":{"state":"ˇick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"b"} +{"Get":{"state":"ˇ brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"b"} +{"Get":{"state":"ˇn\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"b"} +{"Get":{"state":"ˇ\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"b"} +{"Get":{"state":"ˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"b"} +{"Get":{"state":"The ˇjumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"b"} +{"Get":{"state":"The quick ˇ-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"b"} +{"Get":{"state":"The quick brown\nˇover\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nˇver\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"b"} +{"Get":{"state":"The quick brown\n\nˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"b"} +{"Get":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"b"} +{"Get":{"state":"ˇick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"b"} +{"Get":{"state":"ˇ brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"b"} +{"Get":{"state":"ˇn\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"b"} +{"Get":{"state":"ˇ\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"b"} +{"Get":{"state":"ˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"b"} +{"Get":{"state":"ˇjumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"b"} +{"Get":{"state":"The ˇ-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"b"} +{"Get":{"state":"The quick ˇover\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"b"} +{"Get":{"state":"The quick brown\nˇver\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"b"} +{"Get":{"state":"The quick brown\nˇ\nthe lazy dog\n","mode":"Insert"}} diff --git a/crates/vim/test_data/test_repeated_ce.json b/crates/vim/test_data/test_repeated_ce.json index 3251127aed9aa15b69e6dfbf164d2eaca15f4949..3032185d648381719b083ed8887473988c3ed3a4 100644 --- a/crates/vim/test_data/test_repeated_ce.json +++ b/crates/vim/test_data/test_repeated_ce.json @@ -1 +1,275 @@ -[{"Text":" quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The qu brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"The quick\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Insert"},{"Text":"The quick brow jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Insert"},{"Text":"The quick brown\n jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox -over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-o\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\n lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":" brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The qu\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"The quick jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Insert"},{"Text":"The quick brow-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Insert"},{"Text":"The quick brown\n-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps- lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-o lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\n dog\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":"\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The qu jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"The quick-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Insert"},{"Text":"The quick browover\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Insert"},{"Text":"The quick brown\nover\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nover\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox \nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps- dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-o dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\n\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":" jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The qu-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"The quickover\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Insert"},{"Text":"The quick brow\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps\n"},{"Mode":"Insert"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-\n"},{"Mode":"Insert"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-o\n"},{"Mode":"Insert"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":"-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quover\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"The quick\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Insert"},{"Text":"The quick brow lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Insert"},{"Text":"The quick brown\n lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps"},{"Mode":"Insert"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-"},{"Mode":"Insert"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-o"},{"Mode":"Insert"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"e"} +{"Get":{"state":"ˇ quick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"e"} +{"Get":{"state":"The quˇ brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"e"} +{"Get":{"state":"The quickˇ\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"e"} +{"Get":{"state":"The quick browˇ jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"e"} +{"Get":{"state":"The quick brown\nˇ jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nˇ jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox ˇ-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-oˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇ lazy dog\n","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"e"} +{"Get":{"state":"ˇ brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"e"} +{"Get":{"state":"The quˇ\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"e"} +{"Get":{"state":"The quickˇ jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"e"} +{"Get":{"state":"The quick browˇ-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"e"} +{"Get":{"state":"The quick brown\nˇ-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nˇ-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox ˇover\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇ lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇ lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-oˇ lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇ dog\n","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"e"} +{"Get":{"state":"ˇ\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"e"} +{"Get":{"state":"The quˇ jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"e"} +{"Get":{"state":"The quickˇ-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"e"} +{"Get":{"state":"The quick browˇover\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"e"} +{"Get":{"state":"The quick brown\nˇover\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nˇover\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox ˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇ dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇ dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-oˇ dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇ\n","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"e"} +{"Get":{"state":"ˇ jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"e"} +{"Get":{"state":"The quˇ-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"e"} +{"Get":{"state":"The quickˇover\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"e"} +{"Get":{"state":"The quick browˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"e"} +{"Get":{"state":"The quick brown\nˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox ˇ lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-oˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇ","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"e"} +{"Get":{"state":"ˇ-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"e"} +{"Get":{"state":"The quˇover\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"e"} +{"Get":{"state":"The quickˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"e"} +{"Get":{"state":"The quick browˇ lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"e"} +{"Get":{"state":"The quick brown\nˇ lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nˇ lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox ˇ dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-oˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"e"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇ","mode":"Insert"}} diff --git a/crates/vim/test_data/test_repeated_cj.json b/crates/vim/test_data/test_repeated_cj.json index 0b8ac804429b4e313ecda571b4b4df579283967e..e20270f97cbe34df4f278322ddb301e3b04f9fae 100644 --- a/crates/vim/test_data/test_repeated_cj.json +++ b/crates/vim/test_data/test_repeated_cj.json @@ -1 +1,275 @@ -[{"Text":"\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":"\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":"\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":""},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":""},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":""},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":""},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":""},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":""},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":""},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":""},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"j"} +{"Get":{"state":"ˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"j"} +{"Get":{"state":"ˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"j"} +{"Get":{"state":"ˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"j"} +{"Get":{"state":"ˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"j"} +{"Get":{"state":"The quick brown\nˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇ","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"j"} +{"Get":{"state":"ˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"j"} +{"Get":{"state":"ˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"j"} +{"Get":{"state":"ˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"j"} +{"Get":{"state":"ˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"j"} +{"Get":{"state":"The quick brown\nˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇ","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"j"} +{"Get":{"state":"ˇ\n","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"j"} +{"Get":{"state":"ˇ\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"j"} +{"Get":{"state":"ˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"j"} +{"Get":{"state":"ˇ\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"j"} +{"Get":{"state":"The quick brown\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇ","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"j"} +{"Get":{"state":"ˇ","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"j"} +{"Get":{"state":"ˇ","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"j"} +{"Get":{"state":"ˇ","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"j"} +{"Get":{"state":"ˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"j"} +{"Get":{"state":"The quick brown\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇ","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"j"} +{"Get":{"state":"ˇ","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"j"} +{"Get":{"state":"ˇ","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"j"} +{"Get":{"state":"ˇ","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"j"} +{"Get":{"state":"ˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"j"} +{"Get":{"state":"The quick brown\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"j"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇ","mode":"Insert"}} diff --git a/crates/vim/test_data/test_repeated_cl.json b/crates/vim/test_data/test_repeated_cl.json index 89f6a104af952a6f35b98818b51f1e2c5a8b5925..397a364e5ac4e19f0c6de91f7b145c6228a2783a 100644 --- a/crates/vim/test_data/test_repeated_cl.json +++ b/crates/vim/test_data/test_repeated_cl.json @@ -1 +1,275 @@ -[{"Text":"he quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quck brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"The quickbrown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Insert"},{"Text":"The quick brow\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox umps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumpsover\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-ver\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-oer\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\nhe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":"e quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The quk brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"The quickrown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Insert"},{"Text":"The quick brow\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nx jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox mps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumpsver\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-er\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-or\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\ne lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":" quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The qu brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"The quickown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Insert"},{"Text":"The quick brow\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\n jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox ps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumpser\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-r\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-o\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\n lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":"quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The qubrown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"The quickwn\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Insert"},{"Text":"The quick brow\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\njumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox s-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumpsr\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-o\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\nlazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"},{"Text":"uick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The qurown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Insert"},{"Text":"The quickn\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Insert"},{"Text":"The quick brow\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[0,14],"end":[0,14]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\numps-over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox -over\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-o\nthe lazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[2,11],"end":[2,11]}},{"Mode":"Insert"},{"Text":"The quick brown\n\nfox jumps-over\nazy dog\n"},{"Mode":"Insert"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"l"} +{"Get":{"state":"ˇhe quick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"l"} +{"Get":{"state":"The quˇck brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"l"} +{"Get":{"state":"The quickˇbrown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"l"} +{"Get":{"state":"The quick browˇ\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"l"} +{"Get":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nˇox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox ˇumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇover\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇver\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-oˇer\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"1"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇhe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"l"} +{"Get":{"state":"ˇe quick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"l"} +{"Get":{"state":"The quˇk brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"l"} +{"Get":{"state":"The quickˇrown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"l"} +{"Get":{"state":"The quick browˇ\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"l"} +{"Get":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nˇx jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox ˇmps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇver\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇer\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-oˇr\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"2"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"l"} +{"Get":{"state":"ˇ quick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"l"} +{"Get":{"state":"The quˇ brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"l"} +{"Get":{"state":"The quickˇown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"l"} +{"Get":{"state":"The quick browˇ\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"l"} +{"Get":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nˇ jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox ˇps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇer\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇr\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-oˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"3"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇ lazy dog\n","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"l"} +{"Get":{"state":"ˇquick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"l"} +{"Get":{"state":"The quˇbrown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"l"} +{"Get":{"state":"The quickˇwn\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"l"} +{"Get":{"state":"The quick browˇ\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"l"} +{"Get":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nˇjumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox ˇs-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇr\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-oˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"4"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇlazy dog\n","mode":"Insert"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"l"} +{"Get":{"state":"ˇuick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"l"} +{"Get":{"state":"The quˇrown\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"l"} +{"Get":{"state":"The quickˇn\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"l"} +{"Get":{"state":"The quick browˇ\n\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"l"} +{"Get":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nˇumps-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox ˇ-over\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-oˇ\nthe lazy dog\n","mode":"Insert"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"c"} +{"Key":"5"} +{"Key":"l"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇazy dog\n","mode":"Insert"}} diff --git a/crates/vim/test_data/test_repeated_word.json b/crates/vim/test_data/test_repeated_word.json index 54caf22a3eee5bb147b0de9579459812d746a73a..caa7ed736740031739e4ae31ed246f2088ceb53d 100644 --- a/crates/vim/test_data/test_repeated_word.json +++ b/crates/vim/test_data/test_repeated_word.json @@ -1 +1,214 @@ -[{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,4],"end":[3,4]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,4],"end":[3,4]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,4],"end":[3,4]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,9],"end":[3,9]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,4],"end":[3,4]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,9],"end":[3,9]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,9],"end":[3,9]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,4],"end":[3,4]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,9],"end":[3,9]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,9],"end":[2,9]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[2,10],"end":[2,10]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,4],"end":[3,4]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[3,9],"end":[3,9]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nfox jumps-over\nthe lazy dog\n"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"1"} +{"Key":"w"} +{"Get":{"state":"The ˇquick brown\n\nfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"1"} +{"Key":"w"} +{"Get":{"state":"The quick ˇbrown\n\nfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"1"} +{"Key":"w"} +{"Get":{"state":"The quick ˇbrown\n\nfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"1"} +{"Key":"w"} +{"Get":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"1"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n","mode":"Normal"}} +{"Key":"1"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe ˇlazy dog\n","mode":"Normal"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"2"} +{"Key":"w"} +{"Get":{"state":"The quick ˇbrown\n\nfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"2"} +{"Key":"w"} +{"Get":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"2"} +{"Key":"w"} +{"Get":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"2"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"2"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"2"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"2"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"2"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"2"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe ˇlazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"2"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe ˇlazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"2"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe lazy ˇdog\n","mode":"Normal"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"3"} +{"Key":"w"} +{"Get":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"3"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"3"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"3"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"3"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"3"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"3"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"3"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe ˇlazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"3"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe lazy ˇdog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"3"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe lazy ˇdog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"3"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe lazy dog\nˇ","mode":"Normal"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"4"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"4"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"4"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"4"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"4"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"4"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"4"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe ˇlazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"4"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe lazy ˇdog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"4"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe lazy dog\nˇ","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"4"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe lazy dog\nˇ","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"4"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe lazy dog\nˇ","mode":"Normal"}} +{"Put":{"state":"ˇThe quick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"5"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quˇick brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"5"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quickˇ brown\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"5"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick browˇn\n\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"5"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\nˇ\nfox jumps-over\nthe lazy dog\n"}} +{"Key":"5"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nˇfox jumps-over\nthe lazy dog\n"}} +{"Key":"5"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe ˇlazy dog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox ˇjumps-over\nthe lazy dog\n"}} +{"Key":"5"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe lazy ˇdog\n","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumpsˇ-over\nthe lazy dog\n"}} +{"Key":"5"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe lazy dog\nˇ","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumps-ˇover\nthe lazy dog\n"}} +{"Key":"5"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe lazy dog\nˇ","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumps-oˇver\nthe lazy dog\n"}} +{"Key":"5"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe lazy dog\nˇ","mode":"Normal"}} +{"Put":{"state":"The quick brown\n\nfox jumps-over\nˇthe lazy dog\n"}} +{"Key":"5"} +{"Key":"w"} +{"Get":{"state":"The quick brown\n\nfox jumps-over\nthe lazy dog\nˇ","mode":"Normal"}} diff --git a/crates/vim/test_data/test_visual_change.json b/crates/vim/test_data/test_visual_change.json index c7f6df44450190fe8954946954aad5283ef7d429..8c252e49c568f4d23a2eb725e6fffbffa5ce4182 100644 --- a/crates/vim/test_data/test_visual_change.json +++ b/crates/vim/test_data/test_visual_change.json @@ -1 +1,41 @@ -[{"Text":"The quick "},{"Mode":"Insert"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Insert"},{"Text":"The ver\nthe lazy dog"},{"Mode":"Insert"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Insert"},{"Text":"The quick brown\nfox jumps he lazy dog"},{"Mode":"Insert"},{"Selection":{"start":[1,10],"end":[1,10]}},{"Mode":"Insert"},{"Text":"The quick brown\nfox jumps over\nthe og"},{"Mode":"Insert"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Insert"},{"Text":"uick brown\nfox jumps over\nthe lazy dog"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"The ver\nthe lazy dog"},{"Mode":"Insert"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Insert"},{"Text":"The quick brown\nazy dog"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"The quick ˇbrown"}} +{"Key":"v"} +{"Key":"w"} +{"Key":"c"} +{"Get":{"state":"The quick ˇ","mode":"Insert"}} +{"Put":{"state":"The ˇquick brown\nfox jumps over\nthe lazy dog"}} +{"Key":"v"} +{"Key":"w"} +{"Key":"j"} +{"Key":"c"} +{"Get":{"state":"The ˇver\nthe lazy dog","mode":"Insert"}} +{"Put":{"state":"The quick brown\nfox jumps ˇover\nthe lazy dog"}} +{"Key":"v"} +{"Key":"w"} +{"Key":"j"} +{"Key":"c"} +{"Get":{"state":"The quick brown\nfox jumps ˇhe lazy dog","mode":"Insert"}} +{"Put":{"state":"The quick brown\nfox jumps over\nthe ˇlazy dog"}} +{"Key":"v"} +{"Key":"w"} +{"Key":"j"} +{"Key":"c"} +{"Get":{"state":"The quick brown\nfox jumps over\nthe ˇog","mode":"Insert"}} +{"Put":{"state":"The ˇquick brown\nfox jumps over\nthe lazy dog"}} +{"Key":"v"} +{"Key":"b"} +{"Key":"k"} +{"Key":"c"} +{"Get":{"state":"ˇuick brown\nfox jumps over\nthe lazy dog","mode":"Insert"}} +{"Put":{"state":"The quick brown\nfox jumps ˇover\nthe lazy dog"}} +{"Key":"v"} +{"Key":"b"} +{"Key":"k"} +{"Key":"c"} +{"Get":{"state":"The ˇver\nthe lazy dog","mode":"Insert"}} +{"Put":{"state":"The quick brown\nfox jumps over\nthe ˇlazy dog"}} +{"Key":"v"} +{"Key":"b"} +{"Key":"k"} +{"Key":"c"} +{"Get":{"state":"The quick brown\nˇazy dog","mode":"Insert"}} diff --git a/crates/vim/test_data/test_visual_delete.json b/crates/vim/test_data/test_visual_delete.json index 50750714d0b9edc386a54fd618c385201cc87c4f..42d7a69849625a653edb20aafd56df5668cd96ff 100644 --- a/crates/vim/test_data/test_visual_delete.json +++ b/crates/vim/test_data/test_visual_delete.json @@ -1 +1,44 @@ -[{"Text":"The quick "},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"The ver\nthe lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"The ver\nthe lquick brown\nfox jumps oazy dog"},{"Mode":"Normal"},{"Selection":{"start":[1,5],"end":[1,5]}},{"Mode":"Normal"},{"Text":"The ver\nthe lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps over\nthe og"},{"Mode":"Normal"},{"Selection":{"start":[2,4],"end":[2,4]}},{"Mode":"Normal"},{"Text":"uick brown\nfox jumps over\nthe lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"The ver\nthe lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"The quick brown\nazy dog"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The quick ˇbrown"}} +{"Key":"v"} +{"Key":"w"} +{"Key":"x"} +{"Get":{"state":"The quickˇ ","mode":"Normal"}} +{"Put":{"state":"The ˇquick brown\nfox jumps over\nthe lazy dog"}} +{"Key":"v"} +{"Key":"w"} +{"Key":"j"} +{"Key":"x"} +{"Get":{"state":"The ˇver\nthe lazy dog","mode":"Normal"}} +{"Key":"j"} +{"Key":"p"} +{"Get":{"state":"The ver\nthe lˇquick brown\nfox jumps oazy dog","mode":"Normal"}} +{"Put":{"state":"The ˇquick brown\nfox jumps over\nthe lazy dog"}} +{"Key":"v"} +{"Key":"w"} +{"Key":"j"} +{"Key":"x"} +{"Get":{"state":"The ˇver\nthe lazy dog","mode":"Normal"}} +{"Put":{"state":"The quick brown\nfox jumps over\nthe ˇlazy dog"}} +{"Key":"v"} +{"Key":"w"} +{"Key":"j"} +{"Key":"x"} +{"Get":{"state":"The quick brown\nfox jumps over\nthe ˇog","mode":"Normal"}} +{"Put":{"state":"The ˇquick brown\nfox jumps over\nthe lazy dog"}} +{"Key":"v"} +{"Key":"b"} +{"Key":"k"} +{"Key":"x"} +{"Get":{"state":"ˇuick brown\nfox jumps over\nthe lazy dog","mode":"Normal"}} +{"Put":{"state":"The quick brown\nfox jumps ˇover\nthe lazy dog"}} +{"Key":"v"} +{"Key":"b"} +{"Key":"k"} +{"Key":"x"} +{"Get":{"state":"The ˇver\nthe lazy dog","mode":"Normal"}} +{"Put":{"state":"The quick brown\nfox jumps over\nthe ˇlazy dog"}} +{"Key":"v"} +{"Key":"b"} +{"Key":"k"} +{"Key":"x"} +{"Get":{"state":"The quick brown\nˇazy dog","mode":"Normal"}} diff --git a/crates/vim/test_data/test_visual_line_change.json b/crates/vim/test_data/test_visual_line_change.json index 8c00d1bb1f66753d0f8593f3b0b1fcd85d1d3869..336108c6cbc668f212d5513cc22411d17cfe77dd 100644 --- a/crates/vim/test_data/test_visual_line_change.json +++ b/crates/vim/test_data/test_visual_line_change.json @@ -1 +1,35 @@ -[{"Text":"\nfox jumps over\nthe lazy dog"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nfox jumps over\nThe quick brown\nthe lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n\nthe lazy dog"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\nfox jumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"},{"Text":"\nthe lazy dog"},{"Mode":"Insert"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Insert"},{"Text":"\nthe lazy dog\nThe quick brown\nfox jumps over"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"The quick brown\n"},{"Mode":"Insert"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Insert"},{"Text":"The quick brown\nfox jumps over\n"},{"Mode":"Insert"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Insert"}] \ No newline at end of file +{"Put":{"state":"The quˇick brown\nfox jumps over\nthe lazy dog"}} +{"Key":"shift-v"} +{"Key":"c"} +{"Get":{"state":"ˇ\nfox jumps over\nthe lazy dog","mode":"Insert"}} +{"Key":"escape"} +{"Key":"j"} +{"Key":"p"} +{"Get":{"state":"\nfox jumps over\nˇThe quick brown\nthe lazy dog","mode":"Normal"}} +{"Put":{"state":"The quick brown\nfox juˇmps over\nthe lazy dog"}} +{"Key":"shift-v"} +{"Key":"c"} +{"Get":{"state":"The quick brown\nˇ\nthe lazy dog","mode":"Insert"}} +{"Put":{"state":"The quick brown\nfox jumps over\nthe laˇzy dog"}} +{"Key":"shift-v"} +{"Key":"c"} +{"Get":{"state":"The quick brown\nfox jumps over\nˇ","mode":"Insert"}} +{"Put":{"state":"The quˇick brown\nfox jumps over\nthe lazy dog"}} +{"Key":"shift-v"} +{"Key":"j"} +{"Key":"c"} +{"Get":{"state":"ˇ\nthe lazy dog","mode":"Insert"}} +{"Key":"escape"} +{"Key":"j"} +{"Key":"p"} +{"Get":{"state":"\nthe lazy dog\nˇThe quick brown\nfox jumps over","mode":"Normal"}} +{"Put":{"state":"The quick brown\nfox juˇmps over\nthe lazy dog"}} +{"Key":"shift-v"} +{"Key":"j"} +{"Key":"c"} +{"Get":{"state":"The quick brown\nˇ","mode":"Insert"}} +{"Put":{"state":"The quick brown\nfox jumps over\nthe laˇzy dog"}} +{"Key":"shift-v"} +{"Key":"j"} +{"Key":"c"} +{"Get":{"state":"The quick brown\nfox jumps over\nˇ","mode":"Insert"}} diff --git a/crates/vim/test_data/test_visual_line_delete.json b/crates/vim/test_data/test_visual_line_delete.json index e291fe1034f725b3ebe0b6112fbeea0e021517d3..4b8248235eda21364e7bf42e5aee3cdab36dc7b6 100644 --- a/crates/vim/test_data/test_visual_line_delete.json +++ b/crates/vim/test_data/test_visual_line_delete.json @@ -1 +1,31 @@ -[{"Text":"fox jumps over\nthe lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"fox jumps over\nThe quick brown\nthe lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick brown\nthe lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[1,6],"end":[1,6]}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps over"},{"Mode":"Normal"},{"Selection":{"start":[1,6],"end":[1,6]}},{"Mode":"Normal"},{"Text":"the lazy dog"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"the lazy dog\nThe quick brown\nfox jumps over"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick brown"},{"Mode":"Normal"},{"Selection":{"start":[0,6],"end":[0,6]}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps over"},{"Mode":"Normal"},{"Selection":{"start":[1,6],"end":[1,6]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The quˇick brown\nfox jumps over\nthe lazy dog"}} +{"Key":"shift-v"} +{"Key":"x"} +{"Get":{"state":"fox juˇmps over\nthe lazy dog","mode":"Normal"}} +{"Key":"p"} +{"Get":{"state":"fox jumps over\nˇThe quick brown\nthe lazy dog","mode":"Normal"}} +{"Put":{"state":"The quick brown\nfox juˇmps over\nthe lazy dog"}} +{"Key":"shift-v"} +{"Key":"x"} +{"Get":{"state":"The quick brown\nthe laˇzy dog","mode":"Normal"}} +{"Put":{"state":"The quick brown\nfox jumps over\nthe laˇzy dog"}} +{"Key":"shift-v"} +{"Key":"x"} +{"Get":{"state":"The quick brown\nfox juˇmps over","mode":"Normal"}} +{"Put":{"state":"The quˇick brown\nfox jumps over\nthe lazy dog"}} +{"Key":"shift-v"} +{"Key":"j"} +{"Key":"x"} +{"Get":{"state":"the laˇzy dog","mode":"Normal"}} +{"Key":"p"} +{"Get":{"state":"the lazy dog\nˇThe quick brown\nfox jumps over","mode":"Normal"}} +{"Put":{"state":"The quick brown\nfox juˇmps over\nthe lazy dog"}} +{"Key":"shift-v"} +{"Key":"j"} +{"Key":"x"} +{"Get":{"state":"The quˇick brown","mode":"Normal"}} +{"Put":{"state":"The quick brown\nfox jumps over\nthe laˇzy dog"}} +{"Key":"shift-v"} +{"Key":"j"} +{"Key":"x"} +{"Get":{"state":"The quick brown\nfox juˇmps over","mode":"Normal"}} diff --git a/crates/vim/test_data/test_visual_sentence_object.json b/crates/vim/test_data/test_visual_sentence_object.json index 0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/crates/vim/test_data/test_visual_sentence_object.json +++ b/crates/vim/test_data/test_visual_sentence_object.json @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/crates/vim/test_data/test_visual_word_object.json b/crates/vim/test_data/test_visual_word_object.json index 751636a5a3bc888a1b4aeb3a33a2bda47aaf5740..5514f7385a8db2a5995a539a29aa31bfcc985fc8 100644 --- a/crates/vim/test_data/test_visual_word_object.json +++ b/crates/vim/test_data/test_visual_word_object.json @@ -1 +1,230 @@ -[{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[0,10],"end":[0,14]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[0,10],"end":[0,14]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[0,15],"end":[0,17]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[1,4],"end":[1,8]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[1,4],"end":[1,8]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[2,12],"end":[2,13]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[5,0],"end":[5,0]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,0],"end":[6,2]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,3],"end":[6,3]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,4],"end":[6,8]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,4],"end":[6,8]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,9],"end":[6,9]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,10],"end":[6,14]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,15],"end":[6,15]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[7,0],"end":[7,1]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[8,0],"end":[8,1]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[9,0],"end":[9,1]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[9,6],"end":[9,10]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[10,12],"end":[10,12]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[11,0],"end":[11,0]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[0,10],"end":[0,14]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[0,10],"end":[0,14]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[0,15],"end":[0,17]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[1,4],"end":[1,8]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[1,4],"end":[1,8]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[1,9],"end":[1,9]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[2,12],"end":[2,13]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[5,0],"end":[5,0]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,0],"end":[6,8]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,0],"end":[6,8]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,0],"end":[6,8]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,0],"end":[6,8]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,9],"end":[6,9]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,10],"end":[6,14]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[6,15],"end":[6,15]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[7,0],"end":[7,1]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[8,0],"end":[8,1]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[9,0],"end":[9,1]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[9,2],"end":[9,10]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[10,12],"end":[10,12]}},{"Mode":{"Visual":{"line":false}}},{"Text":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"},{"Mode":{"Visual":{"line":false}}},{"Selection":{"start":[11,0],"end":[11,0]}},{"Mode":{"Visual":{"line":false}}}] \ No newline at end of file +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick «browˇ»n \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick browˇn \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick «browˇ»n \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown« ˇ» \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox ˇjumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox «jumpˇ»s over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox juˇmps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox «jumpˇ»s over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumpsˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumpsˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog« ˇ» \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThˇe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n«Thˇ»e-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-«quicˇ»k brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quˇick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-«quicˇ»k brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick «browˇ»n \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n« ˇ» \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n« ˇ» \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n« ˇ» fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumpˇs over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-«jumpˇ»s over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick ˇbrown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick «browˇ»n \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick browˇn \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick «browˇ»n \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brownˇ \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown« ˇ» \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox ˇjumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox «jumpˇ»s over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox juˇmps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox «jumpˇ»s over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumpsˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumpsˇ over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dogˇ \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog« ˇ» \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \nˇ\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\nˇ\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\nˇ\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThˇe-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n«The-quicˇ»k brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nTheˇ-quick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n«The-quicˇ»k brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-ˇquick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n«The-quicˇ»k brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quˇick brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\n«The-quicˇ»k brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quickˇ brown \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick ˇbrown \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick «browˇ»n \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ \n \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brownˇ \n \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \nˇ \n \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n« ˇ» \n \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \nˇ \n fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n« ˇ» \n fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \nˇ fox-jumps over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n« ˇ» fox-jumps over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumpˇs over\nthe lazy dog \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n «fox-jumpˇ»s over\nthe lazy dog \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ \n\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dogˇ \n\n","mode":{"Visual":{"line":false}}}} +{"Put":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n"}} +{"Key":"v"} +{"Key":"i"} +{"Key":"shift-w"} +{"Get":{"state":"The quick brown \nfox jumps over\nthe lazy dog \n\n\n\nThe-quick brown \n \n \n fox-jumps over\nthe lazy dog \nˇ\n","mode":{"Visual":{"line":false}}}} diff --git a/crates/vim/test_data/test_w.json b/crates/vim/test_data/test_w.json index b6fadf7ec1f96cee2187a6ef215e80e8d6ed7254..b7b3bd0e63a3b4091c5894d16954ae2880eefce7 100644 --- a/crates/vim/test_data/test_w.json +++ b/crates/vim/test_data/test_w.json @@ -1 +1,40 @@ -[{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,9],"end":[0,9]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[3,10],"end":[3,10]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[4,2],"end":[4,2]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[4,2],"end":[4,2]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[1,0],"end":[1,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[2,0],"end":[2,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[3,0],"end":[3,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[3,10],"end":[3,10]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[4,0],"end":[4,0]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[4,2],"end":[4,2]}},{"Mode":"Normal"},{"Text":"The quick-brown\n\n\nfox_jumps over\nthe"},{"Mode":"Normal"},{"Selection":{"start":[4,2],"end":[4,2]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"The ˇquick-brown\n\n\nfox_jumps over\nthe"}} +{"Key":"w"} +{"Get":{"state":"The quickˇ-brown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Key":"w"} +{"Get":{"state":"The quick-ˇbrown\n\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Key":"w"} +{"Get":{"state":"The quick-brown\nˇ\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Key":"w"} +{"Get":{"state":"The quick-brown\n\nˇ\nfox_jumps over\nthe","mode":"Normal"}} +{"Key":"w"} +{"Get":{"state":"The quick-brown\n\n\nˇfox_jumps over\nthe","mode":"Normal"}} +{"Key":"w"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps ˇover\nthe","mode":"Normal"}} +{"Key":"w"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps over\nˇthe","mode":"Normal"}} +{"Key":"w"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps over\nthˇe","mode":"Normal"}} +{"Key":"w"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps over\nthˇe","mode":"Normal"}} +{"Put":{"state":"The ˇquick-brown\n\n\nfox_jumps over\nthe"}} +{"Key":"shift-w"} +{"Get":{"state":"The quick-brown\nˇ\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quickˇ-brown\n\n\nfox_jumps over\nthe"}} +{"Key":"shift-w"} +{"Get":{"state":"The quick-brown\nˇ\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Put":{"state":"The quick-ˇbrown\n\n\nfox_jumps over\nthe"}} +{"Key":"shift-w"} +{"Get":{"state":"The quick-brown\nˇ\n\nfox_jumps over\nthe","mode":"Normal"}} +{"Key":"shift-w"} +{"Get":{"state":"The quick-brown\n\nˇ\nfox_jumps over\nthe","mode":"Normal"}} +{"Key":"shift-w"} +{"Get":{"state":"The quick-brown\n\n\nˇfox_jumps over\nthe","mode":"Normal"}} +{"Key":"shift-w"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps ˇover\nthe","mode":"Normal"}} +{"Key":"shift-w"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps over\nˇthe","mode":"Normal"}} +{"Key":"shift-w"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps over\nthˇe","mode":"Normal"}} +{"Key":"shift-w"} +{"Get":{"state":"The quick-brown\n\n\nfox_jumps over\nthˇe","mode":"Normal"}} diff --git a/crates/vim/test_data/test_x.json b/crates/vim/test_data/test_x.json index ca85e2842ba4703a54891bc74d8b39dda02bca4c..cb7eb53472aac7173a9517b5ae34fde9e40e3754 100644 --- a/crates/vim/test_data/test_x.json +++ b/crates/vim/test_data/test_x.json @@ -1 +1,12 @@ -[{"Text":"est"},{"Mode":"Normal"},{"Selection":{"start":[0,0],"end":[0,0]}},{"Mode":"Normal"},{"Text":"Tet"},{"Mode":"Normal"},{"Selection":{"start":[0,2],"end":[0,2]}},{"Mode":"Normal"},{"Text":"Tes"},{"Mode":"Normal"},{"Selection":{"start":[0,2],"end":[0,2]}},{"Mode":"Normal"},{"Text":"Tes\ntest"},{"Mode":"Normal"},{"Selection":{"start":[0,2],"end":[0,2]}},{"Mode":"Normal"}] \ No newline at end of file +{"Put":{"state":"ˇTest"}} +{"Key":"x"} +{"Get":{"state":"ˇest","mode":"Normal"}} +{"Put":{"state":"Teˇst"}} +{"Key":"x"} +{"Get":{"state":"Teˇt","mode":"Normal"}} +{"Put":{"state":"Tesˇt"}} +{"Key":"x"} +{"Get":{"state":"Teˇs","mode":"Normal"}} +{"Put":{"state":"Tesˇt\ntest"}} +{"Key":"x"} +{"Get":{"state":"Teˇs\ntest","mode":"Normal"}} From 361b7c3a0c75efa49ad59f6d366b60188600a9bd Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 22 Mar 2023 15:10:16 -0700 Subject: [PATCH 16/20] Clear auto-indent requests when replacing a buffer's entire text --- crates/language/src/buffer.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 09a96342271b00f508094b8426ab5ddf81b04131..de1fc009ad3ed1ba6ce4983b0a7dc9188aab6e1e 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1366,6 +1366,7 @@ impl Buffer { where T: Into>, { + self.autoindent_requests.clear(); self.edit([(0..self.len(), text)], None, cx) } From 3ff5aee4a1038763a29ff873baa7a13124570339 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 23 Mar 2023 15:27:43 -0700 Subject: [PATCH 17/20] Respect LSP servers watch glob patterns --- Cargo.lock | 5 +- crates/project/Cargo.toml | 1 + crates/project/src/lsp_glob_set.rs | 121 ++++++++++++++++++++++++++++ crates/project/src/project.rs | 86 ++++++++++++++++---- crates/project/src/project_tests.rs | 26 +++++- 5 files changed, 218 insertions(+), 21 deletions(-) create mode 100644 crates/project/src/lsp_glob_set.rs diff --git a/Cargo.lock b/Cargo.lock index ed799521d6fdd93e0a10e45233c72f610d7ba399..108dd2c2e7e6b477668ae914c4a85a4ec85bd882 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2591,9 +2591,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" @@ -4633,6 +4633,7 @@ dependencies = [ "futures 0.3.25", "fuzzy", "git", + "glob", "gpui", "ignore", "language", diff --git a/crates/project/Cargo.toml b/crates/project/Cargo.toml index 2f73daa338656d0606b278472797f1b6d427d69c..b42a6fc674d230adeed763a4de8f10310d0b19e8 100644 --- a/crates/project/Cargo.toml +++ b/crates/project/Cargo.toml @@ -27,6 +27,7 @@ fs = { path = "../fs" } fsevent = { path = "../fsevent" } fuzzy = { path = "../fuzzy" } git = { path = "../git" } +glob = { version = "0.3.1" } gpui = { path = "../gpui" } language = { path = "../language" } lsp = { path = "../lsp" } diff --git a/crates/project/src/lsp_glob_set.rs b/crates/project/src/lsp_glob_set.rs new file mode 100644 index 0000000000000000000000000000000000000000..daac344a0a8fb4396da802ddc6f7325ffd47ea9f --- /dev/null +++ b/crates/project/src/lsp_glob_set.rs @@ -0,0 +1,121 @@ +use anyhow::{anyhow, Result}; +use std::path::Path; + +#[derive(Default)] +pub struct LspGlobSet { + patterns: Vec, +} + +impl LspGlobSet { + pub fn clear(&mut self) { + self.patterns.clear(); + } + + /// Add a pattern to the glob set. + /// + /// LSP's glob syntax supports bash-style brace expansion. For example, + /// the pattern '*.{js,ts}' would match all JavaScript or TypeScript files. + /// This is not a part of the standard libc glob syntax, and isn't supported + /// by the `glob` crate. So we pre-process the glob patterns, producing a + /// separate glob `Pattern` object for each part of a brace expansion. + pub fn add_pattern(&mut self, pattern: &str) -> Result<()> { + // Find all of the ranges of `pattern` that contain matched curly braces. + let mut expansion_ranges = Vec::new(); + let mut expansion_start_ix = None; + for (ix, c) in pattern.match_indices(|c| ['{', '}'].contains(&c)) { + match c { + "{" => { + if expansion_start_ix.is_some() { + return Err(anyhow!("nested braces in glob patterns aren't supported")); + } + expansion_start_ix = Some(ix); + } + "}" => { + if let Some(start_ix) = expansion_start_ix { + expansion_ranges.push(start_ix..ix + 1); + } + expansion_start_ix = None; + } + _ => {} + } + } + + // Starting with a single pattern, process each brace expansion by cloning + // the pattern once per element of the expansion. + let mut unexpanded_patterns = vec![]; + let mut expanded_patterns = vec![pattern.to_string()]; + + for outer_range in expansion_ranges.into_iter().rev() { + let inner_range = (outer_range.start + 1)..(outer_range.end - 1); + std::mem::swap(&mut unexpanded_patterns, &mut expanded_patterns); + for unexpanded_pattern in unexpanded_patterns.drain(..) { + for part in unexpanded_pattern[inner_range.clone()].split(',') { + let mut expanded_pattern = unexpanded_pattern.clone(); + expanded_pattern.replace_range(outer_range.clone(), part); + expanded_patterns.push(expanded_pattern); + } + } + } + + // Parse the final glob patterns and add them to the set. + for pattern in expanded_patterns { + let pattern = glob::Pattern::new(&pattern)?; + self.patterns.push(pattern); + } + + Ok(()) + } + + pub fn matches(&self, path: &Path) -> bool { + self.patterns + .iter() + .any(|pattern| pattern.matches_path(path)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_glob_set() { + let mut watch = LspGlobSet::default(); + watch.add_pattern("/a/**/*.rs").unwrap(); + watch.add_pattern("/a/**/Cargo.toml").unwrap(); + + assert!(watch.matches("/a/b.rs".as_ref())); + assert!(watch.matches("/a/b/c.rs".as_ref())); + + assert!(!watch.matches("/b/c.rs".as_ref())); + assert!(!watch.matches("/a/b.ts".as_ref())); + } + + #[test] + fn test_brace_expansion() { + let mut watch = LspGlobSet::default(); + watch.add_pattern("/a/*.{ts,js,tsx}").unwrap(); + + assert!(watch.matches("/a/one.js".as_ref())); + assert!(watch.matches("/a/two.ts".as_ref())); + assert!(watch.matches("/a/three.tsx".as_ref())); + + assert!(!watch.matches("/a/one.j".as_ref())); + assert!(!watch.matches("/a/two.s".as_ref())); + assert!(!watch.matches("/a/three.t".as_ref())); + assert!(!watch.matches("/a/four.t".as_ref())); + assert!(!watch.matches("/a/five.xt".as_ref())); + } + + #[test] + fn test_multiple_brace_expansion() { + let mut watch = LspGlobSet::default(); + watch.add_pattern("/a/{one,two,three}.{b*c,d*e}").unwrap(); + + assert!(watch.matches("/a/one.bic".as_ref())); + assert!(watch.matches("/a/two.dole".as_ref())); + assert!(watch.matches("/a/three.deeee".as_ref())); + + assert!(!watch.matches("/a/four.bic".as_ref())); + assert!(!watch.matches("/a/one.be".as_ref())); + } +} diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 0c992486fa369e19f9752419e181e77fe8fcb02a..fedfa0c863f299ccc00be3a55ca664c7f8342877 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -1,5 +1,6 @@ mod ignore; mod lsp_command; +mod lsp_glob_set; pub mod search; pub mod terminals; pub mod worktree; @@ -33,10 +34,11 @@ use language::{ Transaction, Unclipped, }; use lsp::{ - DiagnosticSeverity, DiagnosticTag, DocumentHighlightKind, LanguageServer, LanguageString, - MarkedString, + DiagnosticSeverity, DiagnosticTag, DidChangeWatchedFilesRegistrationOptions, + DocumentHighlightKind, LanguageServer, LanguageString, MarkedString, }; use lsp_command::*; +use lsp_glob_set::LspGlobSet; use postage::watch; use rand::prelude::*; use search::SearchQuery; @@ -188,6 +190,7 @@ pub enum LanguageServerState { language: Arc, adapter: Arc, server: Arc, + watched_paths: LspGlobSet, simulate_disk_based_diagnostics_completion: Option>, }, } @@ -2046,8 +2049,26 @@ impl Project { }) .detach(); language_server - .on_request::(|_, _| async { - Ok(()) + .on_request::({ + let this = this.downgrade(); + move |params, mut cx| async move { + let this = this + .upgrade(&cx) + .ok_or_else(|| anyhow!("project dropped"))?; + for reg in params.registrations { + if reg.method == "workspace/didChangeWatchedFiles" { + if let Some(options) = reg.register_options { + let options = serde_json::from_value(options)?; + this.update(&mut cx, |this, cx| { + this.on_lsp_did_change_watched_files( + server_id, options, cx, + ); + }); + } + } + } + Ok(()) + } }) .detach(); @@ -2117,6 +2138,7 @@ impl Project { LanguageServerState::Running { adapter: adapter.clone(), language, + watched_paths: Default::default(), server: language_server.clone(), simulate_disk_based_diagnostics_completion: None, }, @@ -2509,6 +2531,23 @@ impl Project { } } + fn on_lsp_did_change_watched_files( + &mut self, + language_server_id: usize, + params: DidChangeWatchedFilesRegistrationOptions, + cx: &mut ModelContext, + ) { + if let Some(LanguageServerState::Running { watched_paths, .. }) = + self.language_servers.get_mut(&language_server_id) + { + watched_paths.clear(); + for watcher in params.watchers { + watched_paths.add_pattern(&watcher.glob_pattern).log_err(); + } + cx.notify(); + } + } + async fn on_lsp_workspace_edit( this: WeakModelHandle, params: lsp::ApplyWorkspaceEditParams, @@ -4592,15 +4631,20 @@ impl Project { for ((server_worktree_id, _), server_id) in &self.language_server_ids { if *server_worktree_id == worktree_id { if let Some(server) = self.language_servers.get(server_id) { - if let LanguageServerState::Running { server, .. } = server { - server - .notify::( - lsp::DidChangeWatchedFilesParams { - changes: changes - .iter() - .map(|(path, change)| lsp::FileEvent { - uri: lsp::Url::from_file_path(abs_path.join(path)) - .unwrap(), + if let LanguageServerState::Running { + server, + watched_paths, + .. + } = server + { + let params = lsp::DidChangeWatchedFilesParams { + changes: changes + .iter() + .filter_map(|(path, change)| { + let path = abs_path.join(path); + if watched_paths.matches(&path) { + Some(lsp::FileEvent { + uri: lsp::Url::from_file_path(path).unwrap(), typ: match change { PathChange::Added => lsp::FileChangeType::CREATED, PathChange::Removed => lsp::FileChangeType::DELETED, @@ -4610,10 +4654,18 @@ impl Project { } }, }) - .collect(), - }, - ) - .log_err(); + } else { + None + } + }) + .collect(), + }; + + if !params.changes.is_empty() { + server + .notify::(params) + .log_err(); + } } } } diff --git a/crates/project/src/project_tests.rs b/crates/project/src/project_tests.rs index 360e4d0c896d52f7b97c5466b97717ce28f9f087..023ce3c5bc4af7ec83e527311c337f52f3efef67 100644 --- a/crates/project/src/project_tests.rs +++ b/crates/project/src/project_tests.rs @@ -493,6 +493,24 @@ async fn test_reporting_fs_changes_to_language_servers(cx: &mut gpui::TestAppCon // Keep track of the FS events reported to the language server. let fake_server = fake_servers.next().await.unwrap(); let file_changes = Arc::new(Mutex::new(Vec::new())); + fake_server + .request::(lsp::RegistrationParams { + registrations: vec![lsp::Registration { + id: Default::default(), + method: "workspace/didChangeWatchedFiles".to_string(), + register_options: serde_json::to_value( + lsp::DidChangeWatchedFilesRegistrationOptions { + watchers: vec![lsp::FileSystemWatcher { + glob_pattern: "*.{rs,c}".to_string(), + kind: None, + }], + }, + ) + .ok(), + }], + }) + .await + .unwrap(); fake_server.handle_notification::({ let file_changes = file_changes.clone(); move |params, _| { @@ -505,15 +523,19 @@ async fn test_reporting_fs_changes_to_language_servers(cx: &mut gpui::TestAppCon cx.foreground().run_until_parked(); assert_eq!(file_changes.lock().len(), 0); - // Perform some file system mutations. + // Perform some file system mutations, two of which match the watched patterns, + // and one of which does not. fs.create_file("/the-root/c.rs".as_ref(), Default::default()) .await .unwrap(); + fs.create_file("/the-root/d.txt".as_ref(), Default::default()) + .await + .unwrap(); fs.remove_file("/the-root/b.rs".as_ref(), Default::default()) .await .unwrap(); - // The language server receives events for both FS mutations. + // The language server receives events for the FS mutations that match its watch patterns. cx.foreground().run_until_parked(); assert_eq!( &*file_changes.lock(), From 89e99d2902d6ff99b4e4ccee52db1f8b90a844a9 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 23 Mar 2023 16:04:21 -0700 Subject: [PATCH 18/20] :art: Don't store path changes statefully on the background scanner --- crates/project/src/worktree.rs | 115 ++++++++++++++++----------------- 1 file changed, 54 insertions(+), 61 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 76273689349ab5b6b1d987858d4323b30bc034ed..807c2b384ce6cab4ffee86b880cc43912feb9c6f 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -1,12 +1,12 @@ -use super::{ignore::IgnoreStack, DiagnosticSummary}; -use crate::{copy_recursive, ProjectEntryId, RemoveOptions}; +use crate::{ + copy_recursive, ignore::IgnoreStack, DiagnosticSummary, ProjectEntryId, RemoveOptions, +}; use ::ignore::gitignore::{Gitignore, GitignoreBuilder}; use anyhow::{anyhow, Context, Result}; use client::{proto, Client}; use clock::ReplicaId; use collections::{HashMap, VecDeque}; -use fs::LineEnding; -use fs::{repository::GitRepository, Fs}; +use fs::{repository::GitRepository, Fs, LineEnding}; use futures::{ channel::{ mpsc::{self, UnboundedReceiver, UnboundedSender}, @@ -20,17 +20,16 @@ use gpui::{ executor, AppContext, AsyncAppContext, Entity, ModelContext, ModelHandle, MutableAppContext, Task, }; -use language::File as _; use language::{ proto::{ deserialize_fingerprint, deserialize_version, serialize_fingerprint, serialize_line_ending, serialize_version, }, - Buffer, DiagnosticEntry, PointUtf16, Rope, RopeFingerprint, Unclipped, + Buffer, DiagnosticEntry, File as _, PointUtf16, Rope, RopeFingerprint, Unclipped, }; use parking_lot::Mutex; -use postage::barrier; use postage::{ + barrier, prelude::{Sink as _, Stream as _}, watch, }; @@ -50,8 +49,7 @@ use std::{ time::{Duration, SystemTime}, }; use sum_tree::{Bias, Edit, SeekTarget, SumTree, TreeMap, TreeSet}; -use util::paths::HOME; -use util::{ResultExt, TryFutureExt}; +use util::{paths::HOME, ResultExt, TryFutureExt}; #[derive(Copy, Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)] pub struct WorktreeId(usize); @@ -2141,7 +2139,6 @@ impl<'a> sum_tree::Dimension<'a, EntrySummary> for PathKey { struct BackgroundScanner { fs: Arc, snapshot: Mutex, - changes: HashMap, PathChange>, notify: UnboundedSender, executor: Arc, } @@ -2158,7 +2155,6 @@ impl BackgroundScanner { snapshot: Mutex::new(snapshot), notify, executor, - changes: Default::default(), } } @@ -2167,7 +2163,7 @@ impl BackgroundScanner { } async fn run( - mut self, + self, events_rx: impl Stream>, mut changed_paths: UnboundedReceiver<(Vec, barrier::Sender)>, ) { @@ -2312,32 +2308,31 @@ impl BackgroundScanner { while let Poll::Ready(Some(additional_events)) = futures::poll!(events_rx.next()) { events.extend(additional_events); } + let abs_paths = events.into_iter().map(|e| e.path).collect(); if self.notify.unbounded_send(ScanState::Updating).is_err() { return; } - if !self - .process_events(events.into_iter().map(|e| e.path).collect(), true) - .await - { - return; - } - if self - .notify - .unbounded_send(ScanState::Updated { - snapshot: self.snapshot.lock().clone(), - changes: mem::take(&mut self.changes), - barrier: None, - }) - .is_err() - { + if let Some(changes) = self.process_events(abs_paths, true).await { + if self + .notify + .unbounded_send(ScanState::Updated { + snapshot: self.snapshot.lock().clone(), + changes, + barrier: None, + }) + .is_err() + { + return; + } + } else { return; } } // Continue processing events until the worktree is dropped. loop { - let abs_paths; let barrier; + let abs_paths; select_biased! { request = changed_paths.next().fuse() => { let Some((paths, b)) = request else { break }; @@ -2354,18 +2349,19 @@ impl BackgroundScanner { if self.notify.unbounded_send(ScanState::Updating).is_err() { return; } - if !self.process_events(abs_paths, false).await { - return; - } - if self - .notify - .unbounded_send(ScanState::Updated { - snapshot: self.snapshot.lock().clone(), - changes: mem::take(&mut self.changes), - barrier, - }) - .is_err() - { + if let Some(changes) = self.process_events(abs_paths, false).await { + if self + .notify + .unbounded_send(ScanState::Updated { + snapshot: self.snapshot.lock().clone(), + changes, + barrier, + }) + .is_err() + { + return; + } + } else { return; } } @@ -2505,10 +2501,10 @@ impl BackgroundScanner { } async fn process_events( - &mut self, + &self, abs_paths: Vec, received_before_initialized: bool, - ) -> bool { + ) -> Option, PathChange>> { let (scan_queue_tx, scan_queue_rx) = channel::unbounded(); let prev_snapshot = { @@ -2517,14 +2513,9 @@ impl BackgroundScanner { snapshot.clone() }; - let event_paths = if let Some(event_paths) = self + let event_paths = self .update_entries_for_paths(abs_paths, Some(scan_queue_tx)) - .await - { - event_paths - } else { - return false; - }; + .await?; // Scan any directories that were created as part of this event batch. self.executor @@ -2553,13 +2544,13 @@ impl BackgroundScanner { self.update_ignore_statuses().await; self.update_git_repositories(); - self.build_change_set( + let changes = self.build_change_set( prev_snapshot.snapshot, event_paths, received_before_initialized, ); self.snapshot.lock().scan_completed(); - true + Some(changes) } async fn update_entries_for_paths( @@ -2763,17 +2754,18 @@ impl BackgroundScanner { } fn build_change_set( - &mut self, + &self, old_snapshot: Snapshot, event_paths: Vec>, received_before_initialized: bool, - ) { + ) -> HashMap, PathChange> { + use PathChange::{Added, AddedOrUpdated, Removed, Updated}; + let new_snapshot = self.snapshot.lock(); + let mut changes = HashMap::default(); let mut old_paths = old_snapshot.entries_by_path.cursor::(); let mut new_paths = new_snapshot.entries_by_path.cursor::(); - use PathChange::{Added, AddedOrUpdated, Removed, Updated}; - for path in event_paths { let path = PathKey(path); old_paths.seek(&path, Bias::Left, &()); @@ -2792,7 +2784,7 @@ impl BackgroundScanner { match Ord::cmp(&old_entry.path, &new_entry.path) { Ordering::Less => { - self.changes.insert(old_entry.path.clone(), Removed); + changes.insert(old_entry.path.clone(), Removed); old_paths.next(&()); } Ordering::Equal => { @@ -2800,31 +2792,32 @@ impl BackgroundScanner { // If the worktree was not fully initialized when this event was generated, // we can't know whether this entry was added during the scan or whether // it was merely updated. - self.changes.insert(old_entry.path.clone(), AddedOrUpdated); + changes.insert(old_entry.path.clone(), AddedOrUpdated); } else if old_entry.mtime != new_entry.mtime { - self.changes.insert(old_entry.path.clone(), Updated); + changes.insert(old_entry.path.clone(), Updated); } old_paths.next(&()); new_paths.next(&()); } Ordering::Greater => { - self.changes.insert(new_entry.path.clone(), Added); + changes.insert(new_entry.path.clone(), Added); new_paths.next(&()); } } } (Some(old_entry), None) => { - self.changes.insert(old_entry.path.clone(), Removed); + changes.insert(old_entry.path.clone(), Removed); old_paths.next(&()); } (None, Some(new_entry)) => { - self.changes.insert(new_entry.path.clone(), Added); + changes.insert(new_entry.path.clone(), Added); new_paths.next(&()); } (None, None) => break, } } } + changes } } From a0e98ccc35221e8aec4ea1be456b30f3ae868f32 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 23 Mar 2023 16:22:07 -0700 Subject: [PATCH 19/20] :art: BackgroundScanner::run --- crates/project/src/worktree.rs | 41 ++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 807c2b384ce6cab4ffee86b880cc43912feb9c6f..763d60bbca84225c35bcaedea7364108fb22f856 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -2225,39 +2225,42 @@ impl BackgroundScanner { .unwrap(); drop(tx); - // Spawn a worker thread per logical CPU. self.executor .scoped(|scope| { - // One the first worker thread, listen for change requests from the worktree. - // For each change request, after refreshing the given paths, report - // a progress update for the snapshot. + // While the scan is running, listen for path update requests from the worktree, + // and report updates to the worktree based on a timer. scope.spawn(async { - let reporting_timer = self.delay().fuse(); + let reporting_timer = self.pause_between_initializing_updates().fuse(); futures::pin_mut!(reporting_timer); - loop { select_biased! { job = changed_paths.next().fuse() => { let Some((abs_paths, barrier)) = job else { break }; self.update_entries_for_paths(abs_paths, None).await; - if self.notify.unbounded_send(ScanState::Initializing { - snapshot: self.snapshot.lock().clone(), - barrier: Some(barrier), - }).is_err() { + if self + .notify + .unbounded_send(ScanState::Initializing { + snapshot: self.snapshot.lock().clone(), + barrier: Some(barrier), + }) + .is_err() + { break; } } - _ = reporting_timer => { - reporting_timer.set(self.delay().fuse()); - if self.notify.unbounded_send(ScanState::Initializing { - snapshot: self.snapshot.lock().clone(), - barrier: None, - }).is_err() { + if self + .notify + .unbounded_send(ScanState::Initializing { + snapshot: self.snapshot.lock().clone(), + barrier: None, + }) + .is_err() + { break; } + reporting_timer.set(self.pause_between_initializing_updates().fuse()); } - job = rx.recv().fuse() => { let Ok(job) = job else { break }; if let Err(err) = self @@ -2271,7 +2274,7 @@ impl BackgroundScanner { } }); - // On all of the remaining worker threads, just scan directories. + // Spawn worker threads to scan the directory recursively. for _ in 1..self.executor.num_cpus() { scope.spawn(async { while let Ok(job) = rx.recv().await { @@ -2367,7 +2370,7 @@ impl BackgroundScanner { } } - async fn delay(&self) { + async fn pause_between_initializing_updates(&self) { #[cfg(any(test, feature = "test-support"))] if self.fs.is_fake() { return self.executor.simulate_random_delay().await; From 455ffb17f10d66993f301da35d21c379b40ef4e9 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 24 Mar 2023 14:35:18 -0700 Subject: [PATCH 20/20] Handle path changes and progress updates from all worker threads during initial scan --- crates/project/src/worktree.rs | 131 ++++++++++++++++++--------------- 1 file changed, 70 insertions(+), 61 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 763d60bbca84225c35bcaedea7364108fb22f856..1d40dad86480a8180c85fac262f9050c04e07c91 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -9,7 +9,7 @@ use collections::{HashMap, VecDeque}; use fs::{repository::GitRepository, Fs, LineEnding}; use futures::{ channel::{ - mpsc::{self, UnboundedReceiver, UnboundedSender}, + mpsc::{self, UnboundedSender}, oneshot, }, select_biased, Stream, StreamExt, @@ -44,7 +44,10 @@ use std::{ mem, ops::{Deref, DerefMut}, path::{Path, PathBuf}, - sync::{atomic::AtomicUsize, Arc}, + sync::{ + atomic::{AtomicUsize, Ordering::SeqCst}, + Arc, + }, task::Poll, time::{Duration, SystemTime}, }; @@ -61,7 +64,7 @@ pub enum Worktree { pub struct LocalWorktree { snapshot: LocalSnapshot, - path_changes_tx: mpsc::UnboundedSender<(Vec, barrier::Sender)>, + path_changes_tx: channel::Sender<(Vec, barrier::Sender)>, is_scanning: (watch::Sender, watch::Receiver), _background_scanner_task: Task<()>, share: Option, @@ -238,7 +241,7 @@ impl Worktree { ); } - let (path_changes_tx, path_changes_rx) = mpsc::unbounded(); + let (path_changes_tx, path_changes_rx) = channel::unbounded(); let (scan_states_tx, mut scan_states_rx) = mpsc::unbounded(); cx.spawn_weak(|this, mut cx| async move { @@ -837,7 +840,7 @@ impl LocalWorktree { this.as_local_mut() .unwrap() .path_changes_tx - .unbounded_send((vec![abs_path], tx)) + .try_send((vec![abs_path], tx)) .unwrap(); }); rx.recv().await; @@ -930,7 +933,7 @@ impl LocalWorktree { } let (tx, mut rx) = barrier::channel(); - path_changes_tx.unbounded_send((paths, tx)).unwrap(); + path_changes_tx.try_send((paths, tx)).unwrap(); rx.recv().await; this.upgrade(&cx) .ok_or_else(|| anyhow!("worktree was dropped"))? @@ -2165,7 +2168,7 @@ impl BackgroundScanner { async fn run( self, events_rx: impl Stream>, - mut changed_paths: UnboundedReceiver<(Vec, barrier::Sender)>, + mut changed_paths: channel::Receiver<(Vec, barrier::Sender)>, ) { use futures::FutureExt as _; @@ -2225,64 +2228,70 @@ impl BackgroundScanner { .unwrap(); drop(tx); + let progress_update_count = AtomicUsize::new(0); self.executor .scoped(|scope| { - // While the scan is running, listen for path update requests from the worktree, - // and report updates to the worktree based on a timer. - scope.spawn(async { - let reporting_timer = self.pause_between_initializing_updates().fuse(); - futures::pin_mut!(reporting_timer); - loop { - select_biased! { - job = changed_paths.next().fuse() => { - let Some((abs_paths, barrier)) = job else { break }; - self.update_entries_for_paths(abs_paths, None).await; - if self - .notify - .unbounded_send(ScanState::Initializing { - snapshot: self.snapshot.lock().clone(), - barrier: Some(barrier), - }) - .is_err() - { - break; - } - } - _ = reporting_timer => { - if self - .notify - .unbounded_send(ScanState::Initializing { - snapshot: self.snapshot.lock().clone(), - barrier: None, - }) - .is_err() - { - break; + for _ in 0..self.executor.num_cpus() { + scope.spawn(async { + let mut last_progress_update_count = 0; + let progress_update_timer = self.pause_between_progress_updates().fuse(); + futures::pin_mut!(progress_update_timer); + loop { + select_biased! { + // Send periodic progress updates to the worktree. Use an atomic counter + // to ensure that only one of the workers sends a progress update after + // the update interval elapses. + _ = progress_update_timer => { + match progress_update_count.compare_exchange( + last_progress_update_count, + last_progress_update_count + 1, + SeqCst, + SeqCst + ) { + Ok(_) => { + last_progress_update_count += 1; + if self + .notify + .unbounded_send(ScanState::Initializing { + snapshot: self.snapshot.lock().clone(), + barrier: None, + }) + .is_err() + { + break; + } + } + Err(current_count) => last_progress_update_count = current_count, + } + progress_update_timer.set(self.pause_between_progress_updates().fuse()); } - reporting_timer.set(self.pause_between_initializing_updates().fuse()); - } - job = rx.recv().fuse() => { - let Ok(job) = job else { break }; - if let Err(err) = self - .scan_dir(root_char_bag, next_entry_id.clone(), &job) - .await - { - log::error!("error scanning {:?}: {}", job.abs_path, err); + + // Refresh any paths requested by the main thread. + job = changed_paths.recv().fuse() => { + let Ok((abs_paths, barrier)) = job else { break }; + self.update_entries_for_paths(abs_paths, None).await; + if self + .notify + .unbounded_send(ScanState::Initializing { + snapshot: self.snapshot.lock().clone(), + barrier: Some(barrier), + }) + .is_err() + { + break; + } } - } - } - } - }); - // Spawn worker threads to scan the directory recursively. - for _ in 1..self.executor.num_cpus() { - scope.spawn(async { - while let Ok(job) = rx.recv().await { - if let Err(err) = self - .scan_dir(root_char_bag, next_entry_id.clone(), &job) - .await - { - log::error!("error scanning {:?}: {}", job.abs_path, err); + // Recursively load directories from the file system. + job = rx.recv().fuse() => { + let Ok(job) = job else { break }; + if let Err(err) = self + .scan_dir(root_char_bag, next_entry_id.clone(), &job) + .await + { + log::error!("error scanning {:?}: {}", job.abs_path, err); + } + } } } }); @@ -2370,7 +2379,7 @@ impl BackgroundScanner { } } - async fn pause_between_initializing_updates(&self) { + async fn pause_between_progress_updates(&self) { #[cfg(any(test, feature = "test-support"))] if self.fs.is_fake() { return self.executor.simulate_random_delay().await;