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 ddcfed9dac..c0b72cf5b6 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 81568b9e3e..ad94423e11 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 5b2fd412e8..9e87b0b1bd 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 c0b72cf5b6..61f207c45a 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 59a98bdcfa..f0bf81e49e 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 9e87b0b1bd..0c992486fa 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 f0bf81e49e..0d3e3b416b 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); + // 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() { + return; + } + 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() { - break; + return; } - - if !self.process_events(events).await { - break; + 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 | 302 ++++++++++++++-------------- 5 files changed, 191 insertions(+), 159 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8990500c56..ed799521d6 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 f640f35036..fd713ef3b5 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 89ed5563ab..be100b2e87 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 61f207c45a..383c1b5c47 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 0d3e3b416b..7250de9a68 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(); + randomly_mutate_tree(&fs, root_dir, 1.0, &mut rng).await; } - log::info!("Generated initial tree"); + 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, + 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); - } + 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 { - log::info!("Deleting file {:?}", old_path.strip_prefix(&root_path)?); - std::fs::remove_file(old_path).unwrap(); - record_event(old_path.clone()); + 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(); } } - - 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); - } else { - files.push(child_path); - } - } - (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 7250de9a68..06bd49fbaf 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 383c1b5c47..360e4d0c89 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 c04deca9e5..82b542cb6b 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 | 319 +++++++++++++++------------------ 1 file changed, 146 insertions(+), 173 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 06bd49fbaf..42284f1a13 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; + 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, + }; - 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 (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.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); + 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 fd713d4242..9f795992d5 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 54546adb55..4e738c0651 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 6ff66b8ecc..cb6f29a42e 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 9b5ca9c1ea..516a1b4fe4 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 ebb57e0636..e28a378a67 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 6c52ec70e9..44d0936808 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 51f070dd1d..1c0d0e93ea 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 1d1a4dfb1b..a1a3dbf71a 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 def6361dc2..54567b2440 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 65d36753e7..bd994b5407 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 26e2d8c53b..ac4badbe2a 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 55645732b8..71a6235b95 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 f37b1c9a45..aa1f49977c 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 661c84c8cd..552cf54892 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 be100b2e87..2f73daa338 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 cc27f40954..d245700d58 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 e9283b14c9..9e79b09d72 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 037c6fd4fb..e8d851fa08 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 85215c15b2..e8c03a1a5e 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 1711bb335b..566fcfe355 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 5fda4b613c..362a060c1f 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 80ff311069..2c922200b2 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 06b20684c6..9a6813f627 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 6a2422f87c..4ae59fe429 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 | 409 +++++++++++++++++++-------------- 1 file changed, 236 insertions(+), 173 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 42284f1a13..afce1b5abe 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)); - } - } - - _ => { - if force { - self.snapshot = self.background_snapshot.lock().clone(); - } + ScanState::Err(error) => { + *self.is_scanning.0.borrow_mut() = false; + log::error!("error scanning worktree {:?}", error); } } + } + 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 afce1b5abe..656268a02c 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 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)] + }; - { - 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(); - - 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 | 585 ++++++++++++++-------------- 2 files changed, 302 insertions(+), 284 deletions(-) diff --git a/crates/language/src/buffer_tests.rs b/crates/language/src/buffer_tests.rs index 3e65ec3120..765c0f9673 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 656268a02c..33714e762f 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 _}; + use futures::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; - } - - 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 - .unbounded_send(ScanState::Err(Arc::new(err))) - .is_err() - { - return; - } + // 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(); } - drop(initializing_task); + // 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()); + } + } + }; + + 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; + } + + 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)); - } + async fn delay(&self) { + #[cfg(any(test, feature = "test-support"))] + if self.fs.is_fake() { + return self.executor.simulate_random_delay().await; } - - 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(); - } - - Ok(()) + smol::Timer::after(Duration::from_millis(100)).await; } async fn scan_dir( @@ -2492,108 +2497,25 @@ 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; }; - let metadata = futures::future::join_all( - events - .iter() - .map(|event| self.fs.metadata(&event.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) { - 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 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 mut ancestor_inodes = snapshot.ancestor_inodes_for_path(&path); - if metadata.is_dir && !ancestor_inodes.contains(&metadata.inode) { - ancestor_inodes.insert(metadata.inode); - self.executor - .block(scan_queue_tx.send(ScanJob { - abs_path, - path, - ignore_stack, - ancestor_inodes, - scan_queue: scan_queue_tx.clone(), - })) - .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); - } - } - } - drop(scan_queue_tx); - } // Scan any directories that were created as part of this event batch. self.executor @@ -2602,7 +2524,11 @@ impl BackgroundScanner { 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) + .scan_dir( + prev_snapshot.root_char_bag, + prev_snapshot.next_entry_id.clone(), + &job, + ) .await { log::error!("error scanning {:?}: {}", job.abs_path, err); @@ -2618,11 +2544,104 @@ impl BackgroundScanner { self.update_ignore_statuses().await; self.update_git_repositories(); - self.build_change_set(prev_snapshot, event_paths, received_before_initialized); + 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( + abs_paths + .iter() + .map(|abs_path| self.fs.metadata(&abs_path)) + .collect::>(), + ) + .await; + + 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); + } + } + } + + 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.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); + self.executor + .block(scan_queue_tx.send(ScanJob { + abs_path, + path, + ignore_stack, + ancestor_inodes, + scan_queue: scan_queue_tx.clone(), + })) + .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); + } + } + } + + Some(event_paths) + } + async fn update_ignore_statuses(&self) { let mut snapshot = self.snapshot.lock().clone(); let mut ignores_to_update = Vec::new(); 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 33714e762f..90da3253d5 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 90da3253d5..7627368934 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 | 254 ++-- .../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, 7441 insertions(+), 161 deletions(-) diff --git a/crates/vim/src/test/neovim_backed_test_context.rs b/crates/vim/src/test/neovim_backed_test_context.rs index a6bf5bc6fa..b8e09d0b91 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 1850a03171..538e83a803 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), + }; - Point::new(start.0, start.1)..Point::new(end.0, end.1) + if self.data.back() != Some(&state) { + self.data.push_back(state.clone()); + } + + (mode, text, start..end) } #[cfg(not(feature = "neovim"))] + 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!("operation does not match recorded script. re-record with --features=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) - } else { - panic!("Invalid test data. Is test deterministic? Try running with '--features neovim' to regenerate"); - } + self.state().await.2 } - #[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 + self.state().await.0 } - #[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"); - } + 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 807c9010e8..3ed9f40f88 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 32ea8ac6a6..8094974f98 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 635edf536b..4324f9610d 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 d002dfa718..b11a2562db 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 4c7f760021..8ef45ec623 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 67492d827e..d4b4a499bb 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 fdc7632f01..90668f4a17 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 b1dadfdd64..d43cc04c45 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 f2e2f66b35..508500163b 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 bd91ec3d63..fc9f91fe02 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 8a0cc840be..a3f09e4453 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 6d6f45a3a2..44766df85e 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 b8e250788c..f4271f7120 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 75da235bd2..6acfb5d080 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 a8ce6bbc85..827fe18c0d 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 e37a013ec3..4f89a82b80 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 a280506d56..378c5dc7ca 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 7827bc8a28..11f99c8244 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 452b0fde10..a88f84cf4b 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 1d93c94450..586fbdf799 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 e96efcaa7c..18baf78c6e 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 fa86b9d3b5..c6dc30882e 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 0ecb12f47b..10095cefbb 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 59e5a3373a..932a4c1967 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 e1bc415620..ebbad8fc4d 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 a43eb2d6fd..863d15aca1 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 591dac4200..93f0cc2459 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 ac6e54f355..de6aca9665 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 490e7377e9..cf842a386e 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 fc561ca0e5..76c2f098d3 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 3985b9501c..75c032430c 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 ca85e2842b..60b3a6c9b1 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 06e24f34f7..a8a242f1f6 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 1dfae9eca4..5e657f35d5 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 374c38015e..81b1f563e1 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 591dac4200..e15d5d0c4a 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 cb05a3b53a..c385ccb546 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 7cd6ffbafc..9c11d89a12 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 c4650284dd..06f80dc245 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 2570db66da..2ad056170c 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 1bbc077812..c010a1ffd2 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 b13aa23589..bd4e91977f 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 35f4fd5e1d..d370c5585c 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 39f86325bc..7cc8291b13 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 6eeff7997f..4cdf210326 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 86d6d0832d..95b18396d0 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 6b377b0d20..a37ad24d39 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 b64ea3c808..4d13cdb81c 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 45854367ae..ce5d0d7ac1 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 da373bbcad..64aaf65ef8 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 c556c7cb16..fe9a948d43 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 123b752860..c992662195 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 386a2db23f..6d4a76ffd6 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 cd5242c0f3..f064fa9fd9 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 3d6c4b3493..b0db891bce 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 244e909ba4..5aef81073a 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 fa1a400bc0..015890ac36 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 2cf45ea2f7..57fc863392 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 9dc0fc655b..2382cc9e49 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 ccb2312091..437b55ef29 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 3251127aed..3032185d64 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 0b8ac80442..e20270f97c 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 89f6a104af..397a364e5a 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 54caf22a3e..caa7ed7367 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 c7f6df4445..8c252e49c5 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 50750714d0..42d7a69849 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 8c00d1bb1f..336108c6cb 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 e291fe1034..4b8248235e 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 0637a088a0..e69de29bb2 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 751636a5a3..5514f7385a 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 b6fadf7ec1..b7b3bd0e63 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 ca85e2842b..cb7eb53472 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 09a9634227..de1fc009ad 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 ed799521d6..108dd2c2e7 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 2f73daa338..b42a6fc674 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 0000000000..daac344a0a --- /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 0c992486fa..fedfa0c863 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 360e4d0c89..023ce3c5bc 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 7627368934..807c2b384c 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 807c2b384c..763d60bbca 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 | 135 ++++++++++++++++++--------------- 1 file changed, 72 insertions(+), 63 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 763d60bbca..1d40dad864 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; - } - 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); - } - } - } - } - }); - - // Spawn worker threads to scan the directory recursively. - for _ in 1..self.executor.num_cpus() { + 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); + 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()); + } + + // 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; + } + } + + // 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;