Merge pull request #2258 from zed-industries/lsp-file-change-notifications

Implement `DidChangedWatchedFiles` LSP feature
This commit is contained in:
Max Brunsfeld 2023-03-24 14:42:23 -07:00 committed by GitHub
commit c74f8eb9e3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
108 changed files with 8740 additions and 947 deletions

7
Cargo.lock generated
View file

@ -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"
@ -4625,12 +4625,15 @@ dependencies = [
"client",
"clock",
"collections",
"ctor",
"db",
"env_logger",
"fs",
"fsevent",
"futures 0.3.25",
"fuzzy",
"git",
"glob",
"gpui",
"ignore",
"language",

View file

@ -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" }

View file

@ -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"] }

View file

@ -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"

View file

@ -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",

View file

@ -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"] }

View file

@ -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"

View file

@ -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"] }

View file

@ -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"] }

View file

@ -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"] }

View file

@ -380,6 +380,8 @@ struct FakeFsState {
next_inode: u64,
next_mtime: SystemTime,
event_txs: Vec<smol::channel::Sender<Vec<fsevent::Event>>>,
events_paused: bool,
buffered_events: Vec<fsevent::Event>,
}
#[cfg(any(test, feature = "test-support"))]
@ -483,15 +485,21 @@ impl FakeFsState {
I: IntoIterator<Item = T>,
T: Into<PathBuf>,
{
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::<Vec<_>>();
}));
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::<Vec<_>>();
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(())
}

View file

@ -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 }

View file

@ -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"

View file

@ -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"] }

View file

@ -1366,6 +1366,7 @@ impl Buffer {
where
T: Into<Arc<str>>,
{
self.autoindent_requests.clear();
self.edit([(0..self.len(), text)], None, cx)
}

View file

@ -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.

View file

@ -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 }

View file

@ -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"] }

View file

@ -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),
}),

View file

@ -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"

View file

@ -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" }
@ -44,7 +45,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"
@ -58,6 +59,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"] }

View file

@ -0,0 +1,121 @@
use anyhow::{anyhow, Result};
use std::path::Path;
#[derive(Default)]
pub struct LspGlobSet {
patterns: Vec<glob::Pattern>,
}
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()));
}
}

View file

@ -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<Language>,
adapter: Arc<CachedLspAdapter>,
server: Arc<LanguageServer>,
watched_paths: LspGlobSet,
simulate_disk_based_diagnostics_completion: Option<Task<()>>,
},
}
@ -2046,8 +2049,26 @@ impl Project {
})
.detach();
language_server
.on_request::<lsp::request::RegisterCapability, _, _>(|_, _| async {
Ok(())
.on_request::<lsp::request::RegisterCapability, _, _>({
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<Self>,
) {
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<Self>,
params: lsp::ApplyWorkspaceEditParams,
@ -4465,7 +4504,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 +4538,7 @@ impl Project {
fn update_local_worktree_buffers(
&mut self,
worktree_handle: ModelHandle<Worktree>,
worktree_handle: &ModelHandle<Worktree>,
cx: &mut ModelContext<Self>,
) {
let snapshot = worktree_handle.read(cx).snapshot();
@ -4506,7 +4548,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 +4620,58 @@ impl Project {
}
}
fn update_local_worktree_language_servers(
&mut self,
worktree_handle: &ModelHandle<Worktree>,
changes: &HashMap<Arc<Path>, PathChange>,
cx: &mut ModelContext<Self>,
) {
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,
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,
PathChange::Updated
| PathChange::AddedOrUpdated => {
lsp::FileChangeType::CHANGED
}
},
})
} else {
None
}
})
.collect(),
};
if !params.changes.is_empty() {
server
.notify::<lsp::notification::DidChangeWatchedFiles>(params)
.log_err();
}
}
}
}
}
}
fn update_local_worktree_buffers_git_repos(
&mut self,
worktree: ModelHandle<Worktree>,

View file

@ -8,12 +8,21 @@ 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};
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!({
@ -438,6 +447,111 @@ 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
.request::<lsp::request::RegisterCapability>(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::<lsp::notification::DidChangeWatchedFiles, _>({
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, 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 the FS mutations that match its watch patterns.
cx.foreground().run_until_parked();
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,
},
]
);
}
#[gpui::test]
async fn test_single_file_worktrees_diagnostics(cx: &mut gpui::TestAppContext) {
cx.foreground().forbid_parking();
@ -1585,7 +1699,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 +1717,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 +1802,7 @@ async fn test_invalid_edits_from_lsp(cx: &mut gpui::TestAppContext) {
buffer.text(),
"
use a::{b, c};
fn f() {
b();
c();

File diff suppressed because it is too large Load diff

View file

@ -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"

View file

@ -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]

View file

@ -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"

View file

@ -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"] }

View file

@ -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"] }

View file

@ -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" }

View file

@ -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"

View file

@ -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::<Point>(cx));
let text = self.buffer_text();
self.neovim.set_state(selection, &text).await;
self.neovim.set_state(marked_text).await;
context_handle
}

View file

@ -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<Mode>),
Put { state: String },
Key(String),
Get { state: String, mode: Option<Mode> },
}
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<Point>, 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<Point>, _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<Mode>, String, Range<Point>) {
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<Point> {
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("<escape>")
.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<Mode>, String, Range<Point>) {
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<Point> {
// 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<Mode> {
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<Mode> {
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<NeovimData>) {
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<Point>) {
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<Point>) -> 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)
}

View file

@ -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"}]
{"Get":{"state":"ˇ","mode":"Normal"}}
{"Put":{"state":"This is a tesˇt"}}
{"Get":{"state":"This is a tesˇt","mode":"Normal"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

File diff suppressed because one or more lines are too long

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -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"}]
{"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"}}

File diff suppressed because one or more lines are too long

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

File diff suppressed because one or more lines are too long

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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}}}]
{"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}}}}

File diff suppressed because one or more lines are too long

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -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"}]
{"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"}}

View file

@ -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"}]
{"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"}}

Some files were not shown because too many files have changed in this diff Show more