ruvim 0.3.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/AGENTS.md +68 -7
- data/README.md +30 -7
- data/Rakefile +7 -0
- data/benchmark/cext_compare.rb +165 -0
- data/benchmark/chunked_load.rb +256 -0
- data/benchmark/file_load.rb +140 -0
- data/benchmark/hotspots.rb +178 -0
- data/docs/binding.md +18 -1
- data/docs/command.md +156 -10
- data/docs/config.md +10 -2
- data/docs/done.md +23 -0
- data/docs/spec.md +162 -25
- data/docs/todo.md +9 -0
- data/docs/tutorial.md +33 -1
- data/docs/vim_diff.md +31 -8
- data/ext/ruvim/extconf.rb +5 -0
- data/ext/ruvim/ruvim_ext.c +519 -0
- data/lib/ruvim/app.rb +246 -2525
- data/lib/ruvim/browser.rb +104 -0
- data/lib/ruvim/buffer.rb +43 -20
- data/lib/ruvim/cli.rb +6 -0
- data/lib/ruvim/command_invocation.rb +2 -2
- data/lib/ruvim/completion_manager.rb +708 -0
- data/lib/ruvim/dispatcher.rb +14 -8
- data/lib/ruvim/display_width.rb +91 -45
- data/lib/ruvim/editor.rb +74 -80
- data/lib/ruvim/ex_command_registry.rb +3 -1
- data/lib/ruvim/file_watcher.rb +243 -0
- data/lib/ruvim/gh/link.rb +207 -0
- data/lib/ruvim/git/blame.rb +255 -0
- data/lib/ruvim/git/branch.rb +112 -0
- data/lib/ruvim/git/commit.rb +102 -0
- data/lib/ruvim/git/diff.rb +129 -0
- data/lib/ruvim/git/grep.rb +107 -0
- data/lib/ruvim/git/handler.rb +125 -0
- data/lib/ruvim/git/log.rb +41 -0
- data/lib/ruvim/git/status.rb +103 -0
- data/lib/ruvim/global_commands.rb +351 -77
- data/lib/ruvim/highlighter.rb +4 -11
- data/lib/ruvim/input.rb +1 -0
- data/lib/ruvim/key_handler.rb +1510 -0
- data/lib/ruvim/keymap_manager.rb +7 -7
- data/lib/ruvim/lang/base.rb +5 -0
- data/lib/ruvim/lang/c.rb +116 -0
- data/lib/ruvim/lang/cpp.rb +107 -0
- data/lib/ruvim/lang/csv.rb +4 -1
- data/lib/ruvim/lang/diff.rb +43 -0
- data/lib/ruvim/lang/dockerfile.rb +36 -0
- data/lib/ruvim/lang/elixir.rb +85 -0
- data/lib/ruvim/lang/erb.rb +30 -0
- data/lib/ruvim/lang/go.rb +83 -0
- data/lib/ruvim/lang/html.rb +34 -0
- data/lib/ruvim/lang/javascript.rb +83 -0
- data/lib/ruvim/lang/json.rb +40 -0
- data/lib/ruvim/lang/lua.rb +76 -0
- data/lib/ruvim/lang/makefile.rb +36 -0
- data/lib/ruvim/lang/markdown.rb +3 -4
- data/lib/ruvim/lang/ocaml.rb +77 -0
- data/lib/ruvim/lang/perl.rb +91 -0
- data/lib/ruvim/lang/python.rb +85 -0
- data/lib/ruvim/lang/registry.rb +102 -0
- data/lib/ruvim/lang/ruby.rb +7 -0
- data/lib/ruvim/lang/rust.rb +95 -0
- data/lib/ruvim/lang/scheme.rb +5 -0
- data/lib/ruvim/lang/sh.rb +76 -0
- data/lib/ruvim/lang/sql.rb +52 -0
- data/lib/ruvim/lang/toml.rb +36 -0
- data/lib/ruvim/lang/tsv.rb +4 -1
- data/lib/ruvim/lang/typescript.rb +53 -0
- data/lib/ruvim/lang/yaml.rb +62 -0
- data/lib/ruvim/rich_view/json_renderer.rb +131 -0
- data/lib/ruvim/rich_view/jsonl_renderer.rb +57 -0
- data/lib/ruvim/rich_view/table_renderer.rb +3 -3
- data/lib/ruvim/rich_view.rb +30 -7
- data/lib/ruvim/screen.rb +135 -84
- data/lib/ruvim/stream/file_load.rb +85 -0
- data/lib/ruvim/stream/follow.rb +40 -0
- data/lib/ruvim/stream/git.rb +43 -0
- data/lib/ruvim/stream/run.rb +74 -0
- data/lib/ruvim/stream/stdin.rb +55 -0
- data/lib/ruvim/stream.rb +35 -0
- data/lib/ruvim/stream_mixer.rb +394 -0
- data/lib/ruvim/terminal.rb +18 -4
- data/lib/ruvim/text_metrics.rb +84 -65
- data/lib/ruvim/version.rb +1 -1
- data/lib/ruvim/window.rb +5 -5
- data/lib/ruvim.rb +31 -4
- data/test/app_command_test.rb +382 -0
- data/test/app_completion_test.rb +65 -16
- data/test/app_dot_repeat_test.rb +27 -3
- data/test/app_ex_command_test.rb +154 -0
- data/test/app_motion_test.rb +13 -12
- data/test/app_register_test.rb +2 -1
- data/test/app_scenario_test.rb +182 -8
- data/test/app_startup_test.rb +70 -27
- data/test/app_text_object_test.rb +2 -1
- data/test/app_unicode_behavior_test.rb +3 -2
- data/test/browser_test.rb +88 -0
- data/test/buffer_test.rb +24 -0
- data/test/cli_test.rb +77 -0
- data/test/clipboard_test.rb +67 -0
- data/test/command_invocation_test.rb +33 -0
- data/test/command_line_test.rb +118 -0
- data/test/config_dsl_test.rb +134 -0
- data/test/dispatcher_test.rb +74 -4
- data/test/display_width_test.rb +41 -0
- data/test/ex_command_registry_test.rb +106 -0
- data/test/file_watcher_test.rb +197 -0
- data/test/follow_test.rb +198 -0
- data/test/gh_link_test.rb +141 -0
- data/test/git_blame_test.rb +792 -0
- data/test/git_grep_test.rb +64 -0
- data/test/highlighter_test.rb +169 -0
- data/test/indent_test.rb +223 -0
- data/test/input_screen_integration_test.rb +1 -1
- data/test/keyword_chars_test.rb +85 -0
- data/test/lang_test.rb +634 -0
- data/test/markdown_renderer_test.rb +5 -5
- data/test/on_save_hook_test.rb +12 -8
- data/test/render_snapshot_test.rb +78 -0
- data/test/rich_view_test.rb +279 -23
- data/test/run_command_test.rb +307 -0
- data/test/screen_test.rb +68 -5
- data/test/search_option_test.rb +19 -0
- data/test/stream_test.rb +165 -0
- data/test/test_helper.rb +9 -0
- data/test/window_test.rb +59 -0
- metadata +68 -2
data/test/app_completion_test.rb
CHANGED
|
@@ -6,6 +6,8 @@ class AppCompletionTest < Minitest::Test
|
|
|
6
6
|
def setup
|
|
7
7
|
@app = RuVim::App.new
|
|
8
8
|
@editor = @app.instance_variable_get(:@editor)
|
|
9
|
+
@key_handler = @app.instance_variable_get(:@key_handler)
|
|
10
|
+
@completion = @app.instance_variable_get(:@completion)
|
|
9
11
|
end
|
|
10
12
|
|
|
11
13
|
def test_app_starts_with_intro_buffer_without_path
|
|
@@ -20,7 +22,7 @@ class AppCompletionTest < Minitest::Test
|
|
|
20
22
|
cmd = @editor.command_line
|
|
21
23
|
cmd.replace_text("set nu")
|
|
22
24
|
|
|
23
|
-
@
|
|
25
|
+
@completion.command_line_complete
|
|
24
26
|
|
|
25
27
|
assert_equal "set number", cmd.text
|
|
26
28
|
end
|
|
@@ -33,7 +35,7 @@ class AppCompletionTest < Minitest::Test
|
|
|
33
35
|
@editor.current_window.cursor_x = 2
|
|
34
36
|
@editor.enter_insert_mode
|
|
35
37
|
|
|
36
|
-
@
|
|
38
|
+
@key_handler.send(:handle_insert_key, :ctrl_n)
|
|
37
39
|
|
|
38
40
|
assert_equal "foobar", b.line_at(0)
|
|
39
41
|
assert_equal 6, @editor.current_window.cursor_x
|
|
@@ -45,7 +47,7 @@ class AppCompletionTest < Minitest::Test
|
|
|
45
47
|
File.write(File.join(dir, "a.o"), "")
|
|
46
48
|
@editor.set_option("wildignore", "*.o", scope: :global)
|
|
47
49
|
|
|
48
|
-
matches = @
|
|
50
|
+
matches = @completion.send(:path_completion_candidates, File.join(dir, "a"))
|
|
49
51
|
|
|
50
52
|
assert_includes matches, File.join(dir, "a.rb")
|
|
51
53
|
refute_includes matches, File.join(dir, "a.o")
|
|
@@ -57,7 +59,7 @@ class AppCompletionTest < Minitest::Test
|
|
|
57
59
|
Dir.chdir(dir) do
|
|
58
60
|
FileUtils.mkdir_p("lib")
|
|
59
61
|
|
|
60
|
-
matches = @
|
|
62
|
+
matches = @completion.send(:path_completion_candidates, "li")
|
|
61
63
|
|
|
62
64
|
assert_includes matches, "lib/"
|
|
63
65
|
end
|
|
@@ -70,7 +72,7 @@ class AppCompletionTest < Minitest::Test
|
|
|
70
72
|
File.write(File.join(dir, "aaa.txt"), "")
|
|
71
73
|
File.write(File.join(dir, "bbb.txt"), "")
|
|
72
74
|
|
|
73
|
-
matches = @
|
|
75
|
+
matches = @completion.send(:path_completion_candidates, File.join(dir, ""))
|
|
74
76
|
|
|
75
77
|
assert_includes matches, File.join(dir, ".git/")
|
|
76
78
|
visible_idx = matches.index(File.join(dir, "aaa.txt"))
|
|
@@ -96,10 +98,10 @@ class AppCompletionTest < Minitest::Test
|
|
|
96
98
|
cmd = @editor.command_line
|
|
97
99
|
cmd.replace_text("e #{File.join(dir, "a")}")
|
|
98
100
|
|
|
99
|
-
@
|
|
101
|
+
@completion.command_line_complete
|
|
100
102
|
first = cmd.text.dup
|
|
101
103
|
first_msg = @editor.message.dup
|
|
102
|
-
@
|
|
104
|
+
@completion.command_line_complete
|
|
103
105
|
second = cmd.text.dup
|
|
104
106
|
second_msg = @editor.message.dup
|
|
105
107
|
|
|
@@ -125,10 +127,10 @@ class AppCompletionTest < Minitest::Test
|
|
|
125
127
|
cmd = @editor.command_line
|
|
126
128
|
cmd.replace_text("e #{File.join(dir, "a")}")
|
|
127
129
|
|
|
128
|
-
@
|
|
130
|
+
@completion.command_line_complete
|
|
129
131
|
assert_equal "e #{File.join(dir, "a")}", cmd.text
|
|
130
132
|
|
|
131
|
-
@
|
|
133
|
+
@completion.command_line_complete
|
|
132
134
|
assert([a, b].any? { |p| cmd.text.end_with?(p) })
|
|
133
135
|
end
|
|
134
136
|
end
|
|
@@ -148,9 +150,9 @@ class AppCompletionTest < Minitest::Test
|
|
|
148
150
|
cmd = @editor.command_line
|
|
149
151
|
cmd.replace_text("e #{File.join(dir, "a")}")
|
|
150
152
|
|
|
151
|
-
@
|
|
153
|
+
@completion.command_line_complete
|
|
152
154
|
first = cmd.text.dup
|
|
153
|
-
@
|
|
155
|
+
@completion.command_line_complete
|
|
154
156
|
second = cmd.text.dup
|
|
155
157
|
|
|
156
158
|
refute_equal first, second
|
|
@@ -168,7 +170,7 @@ class AppCompletionTest < Minitest::Test
|
|
|
168
170
|
cmd = @editor.command_line
|
|
169
171
|
cmd.replace_text("se")
|
|
170
172
|
|
|
171
|
-
@
|
|
173
|
+
@completion.command_line_complete
|
|
172
174
|
|
|
173
175
|
assert_equal "se", cmd.text
|
|
174
176
|
assert_includes @editor.message, "set"
|
|
@@ -186,11 +188,11 @@ class AppCompletionTest < Minitest::Test
|
|
|
186
188
|
@editor.current_window.cursor_x = 2
|
|
187
189
|
@editor.enter_insert_mode
|
|
188
190
|
|
|
189
|
-
@
|
|
191
|
+
@key_handler.send(:handle_insert_key, :ctrl_n)
|
|
190
192
|
assert_equal "fo", b.line_at(0)
|
|
191
193
|
assert_includes @editor.message, "..."
|
|
192
194
|
|
|
193
|
-
@
|
|
195
|
+
@key_handler.send(:handle_insert_key, :ctrl_n)
|
|
194
196
|
assert_equal "foobar", b.line_at(0)
|
|
195
197
|
end
|
|
196
198
|
|
|
@@ -203,11 +205,58 @@ class AppCompletionTest < Minitest::Test
|
|
|
203
205
|
@editor.current_window.cursor_x = 2
|
|
204
206
|
@editor.enter_insert_mode
|
|
205
207
|
|
|
206
|
-
@
|
|
208
|
+
@key_handler.send(:handle_insert_key, :ctrl_n)
|
|
207
209
|
assert_equal "fo", b.line_at(0)
|
|
208
210
|
assert_includes @editor.message, "["
|
|
209
211
|
|
|
210
|
-
@
|
|
212
|
+
@key_handler.send(:handle_insert_key, :ctrl_n)
|
|
211
213
|
assert_equal "foobar", b.line_at(0)
|
|
212
214
|
end
|
|
215
|
+
|
|
216
|
+
def test_git_subcommand_completion
|
|
217
|
+
@editor.materialize_intro_buffer!
|
|
218
|
+
@editor.enter_command_line_mode(":")
|
|
219
|
+
cmd = @editor.command_line
|
|
220
|
+
cmd.replace_text("git bl")
|
|
221
|
+
|
|
222
|
+
@completion.command_line_complete
|
|
223
|
+
|
|
224
|
+
# "bl" matches "blame", "blameback", "blamecommit", "blameprev", "branch"
|
|
225
|
+
# With multiple matches, wildmode applies (longest common prefix or cycle)
|
|
226
|
+
text = cmd.text
|
|
227
|
+
assert text.start_with?("git bl"), "Expected completion to keep 'git bl' prefix, got: #{text}"
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def test_git_subcommand_completion_unique
|
|
231
|
+
@editor.materialize_intro_buffer!
|
|
232
|
+
@editor.enter_command_line_mode(":")
|
|
233
|
+
cmd = @editor.command_line
|
|
234
|
+
cmd.replace_text("git commi")
|
|
235
|
+
|
|
236
|
+
@completion.command_line_complete
|
|
237
|
+
|
|
238
|
+
assert_equal "git commit", cmd.text
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def test_git_subcommand_completion_includes_external
|
|
242
|
+
@editor.materialize_intro_buffer!
|
|
243
|
+
@editor.enter_command_line_mode(":")
|
|
244
|
+
cmd = @editor.command_line
|
|
245
|
+
cmd.replace_text("git stas")
|
|
246
|
+
|
|
247
|
+
@completion.command_line_complete
|
|
248
|
+
|
|
249
|
+
assert_equal "git stash", cmd.text
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def test_gh_subcommand_completion_includes_external
|
|
253
|
+
@editor.materialize_intro_buffer!
|
|
254
|
+
@editor.enter_command_line_mode(":")
|
|
255
|
+
cmd = @editor.command_line
|
|
256
|
+
cmd.replace_text("gh issu")
|
|
257
|
+
|
|
258
|
+
@completion.command_line_complete
|
|
259
|
+
|
|
260
|
+
assert_equal "gh issue", cmd.text
|
|
261
|
+
end
|
|
213
262
|
end
|
data/test/app_dot_repeat_test.rb
CHANGED
|
@@ -4,13 +4,14 @@ class AppDotRepeatTest < Minitest::Test
|
|
|
4
4
|
def setup
|
|
5
5
|
@app = RuVim::App.new(clean: true)
|
|
6
6
|
@editor = @app.instance_variable_get(:@editor)
|
|
7
|
+
@key_handler = @app.instance_variable_get(:@key_handler)
|
|
7
8
|
@editor.materialize_intro_buffer!
|
|
8
9
|
@buffer = @editor.current_buffer
|
|
9
10
|
@win = @editor.current_window
|
|
10
11
|
end
|
|
11
12
|
|
|
12
13
|
def press(*keys)
|
|
13
|
-
keys.each { |k| @
|
|
14
|
+
keys.each { |k| @key_handler.send(:handle_normal_key, k) }
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def test_dot_repeats_x
|
|
@@ -57,11 +58,34 @@ class AppDotRepeatTest < Minitest::Test
|
|
|
57
58
|
@win.cursor_x = 0
|
|
58
59
|
|
|
59
60
|
press("s")
|
|
60
|
-
@
|
|
61
|
-
@
|
|
61
|
+
@key_handler.handle("X")
|
|
62
|
+
@key_handler.handle(:escape)
|
|
62
63
|
press("l")
|
|
63
64
|
press(".")
|
|
64
65
|
|
|
65
66
|
assert_equal "XbXd", @buffer.line_at(0)
|
|
66
67
|
end
|
|
68
|
+
|
|
69
|
+
def test_dot_repeats_counted_x
|
|
70
|
+
@buffer.replace_all_lines!(["abcdefgh"])
|
|
71
|
+
@win.cursor_x = 0
|
|
72
|
+
|
|
73
|
+
@key_handler.handle("3")
|
|
74
|
+
press("x")
|
|
75
|
+
assert_equal "defgh", @buffer.line_at(0)
|
|
76
|
+
|
|
77
|
+
press(".")
|
|
78
|
+
assert_equal "gh", @buffer.line_at(0)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def test_dot_repeats_counted_dd
|
|
82
|
+
@buffer.replace_all_lines!(["a", "b", "c", "d", "e", "f"])
|
|
83
|
+
|
|
84
|
+
@key_handler.handle("2")
|
|
85
|
+
press("d", "d")
|
|
86
|
+
assert_equal ["c", "d", "e", "f"], @buffer.lines
|
|
87
|
+
|
|
88
|
+
press(".")
|
|
89
|
+
assert_equal ["e", "f"], @buffer.lines
|
|
90
|
+
end
|
|
67
91
|
end
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "test_helper"
|
|
4
|
+
|
|
5
|
+
class AppExCommandTest < Minitest::Test
|
|
6
|
+
def setup
|
|
7
|
+
@app = RuVim::App.new(clean: true)
|
|
8
|
+
@editor = @app.instance_variable_get(:@editor)
|
|
9
|
+
@key_handler = @app.instance_variable_get(:@key_handler)
|
|
10
|
+
@editor.materialize_intro_buffer!
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def feed(*keys)
|
|
14
|
+
keys.each { |k| @key_handler.handle(k) }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def buf
|
|
18
|
+
@editor.current_buffer
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def win
|
|
22
|
+
@editor.current_window
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# --- :set ---
|
|
26
|
+
|
|
27
|
+
def test_set_number_on_off
|
|
28
|
+
feed(":", "s", "e", "t", " ", "n", "u", "m", "b", "e", "r", :enter)
|
|
29
|
+
assert @editor.get_option("number")
|
|
30
|
+
|
|
31
|
+
feed(":", "s", "e", "t", " ", "n", "o", "n", "u", "m", "b", "e", "r", :enter)
|
|
32
|
+
refute @editor.get_option("number")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_set_tabstop_value
|
|
36
|
+
feed(":", "s", "e", "t", " ", "t", "a", "b", "s", "t", "o", "p", "=", "8", :enter)
|
|
37
|
+
assert_equal 8, @editor.get_option("tabstop")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_set_option_query
|
|
41
|
+
feed(":", "s", "e", "t", " ", "n", "u", "m", "b", "e", "r", "?", :enter)
|
|
42
|
+
assert_equal :normal, @editor.mode
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# --- :bindings ---
|
|
46
|
+
|
|
47
|
+
def test_bindings_command
|
|
48
|
+
feed(":", "b", "i", "n", "d", "i", "n", "g", "s", :enter)
|
|
49
|
+
assert_equal :normal, @editor.mode
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def test_bindings_with_mode_filter
|
|
53
|
+
feed(":", "b", "i", "n", "d", "i", "n", "g", "s", " ", "n", :enter)
|
|
54
|
+
assert_equal :normal, @editor.mode
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# --- :tabnew / :tabnext / :tabprev ---
|
|
58
|
+
|
|
59
|
+
def test_tabnext_tabprev_via_ex
|
|
60
|
+
feed(":", "t", "a", "b", "n", "e", "w", :enter)
|
|
61
|
+
feed(":", "t", "a", "b", "p", "r", "e", "v", :enter)
|
|
62
|
+
feed(":", "t", "a", "b", "n", "e", "x", "t", :enter)
|
|
63
|
+
assert_equal :normal, @editor.mode
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# --- :bnext / :bprev ---
|
|
67
|
+
|
|
68
|
+
def test_bnext_bprev_via_ex
|
|
69
|
+
feed(":", "b", "n", "e", "x", "t", :enter)
|
|
70
|
+
feed(":", "b", "p", "r", "e", "v", :enter)
|
|
71
|
+
assert_equal :normal, @editor.mode
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# --- :copen / :cclose / :cprev / :lclose / :lprev ---
|
|
75
|
+
|
|
76
|
+
def test_copen_and_cclose
|
|
77
|
+
feed(":", "c", "o", "p", "e", "n", :enter)
|
|
78
|
+
feed(":", "c", "c", "l", "o", "s", "e", :enter)
|
|
79
|
+
assert_equal :normal, @editor.mode
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_cprev_with_empty_list
|
|
83
|
+
feed(":", "c", "p", "r", "e", "v", :enter)
|
|
84
|
+
assert_equal :normal, @editor.mode
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def test_lclose_without_open
|
|
88
|
+
feed(":", "l", "c", "l", "o", "s", "e", :enter)
|
|
89
|
+
assert_equal :normal, @editor.mode
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def test_lprev_with_empty_list
|
|
93
|
+
feed(":", "l", "p", "r", "e", "v", :enter)
|
|
94
|
+
assert_equal :normal, @editor.mode
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# --- :args ---
|
|
98
|
+
|
|
99
|
+
def test_arglist_operations
|
|
100
|
+
feed(":", "a", "r", "g", "s", :enter)
|
|
101
|
+
assert_equal :normal, @editor.mode
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# --- :wq ---
|
|
105
|
+
|
|
106
|
+
def test_wq_with_no_filename_shows_error
|
|
107
|
+
feed(":", "w", "q", :enter)
|
|
108
|
+
assert_equal :normal, @editor.mode
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# --- :edit ---
|
|
112
|
+
|
|
113
|
+
def test_edit_no_file_reloads_or_errors
|
|
114
|
+
feed(":", "e", "d", "i", "t", :enter)
|
|
115
|
+
assert_equal :normal, @editor.mode
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# --- :split / :vsplit + window focus ---
|
|
119
|
+
|
|
120
|
+
def test_window_focus_after_split
|
|
121
|
+
feed(":", "s", "p", "l", "i", "t", :enter)
|
|
122
|
+
original_win_id = @editor.current_window.id
|
|
123
|
+
|
|
124
|
+
feed(:ctrl_w, "w")
|
|
125
|
+
refute_equal original_win_id, @editor.current_window.id
|
|
126
|
+
|
|
127
|
+
feed(:ctrl_w, "j")
|
|
128
|
+
feed(:ctrl_w, "k")
|
|
129
|
+
assert_equal :normal, @editor.mode
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def test_window_focus_left_right
|
|
133
|
+
feed(":", "v", "s", "p", "l", "i", "t", :enter)
|
|
134
|
+
feed(:ctrl_w, "h")
|
|
135
|
+
feed(:ctrl_w, "l")
|
|
136
|
+
assert_equal :normal, @editor.mode
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# --- :b# (alternate buffer) ---
|
|
140
|
+
|
|
141
|
+
def test_buffer_alternate_hash
|
|
142
|
+
feed(":", "s", "p", "l", "i", "t", :enter)
|
|
143
|
+
feed(":", "b", "#", :enter)
|
|
144
|
+
assert_equal :normal, @editor.mode
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# --- rich view toggle ---
|
|
148
|
+
|
|
149
|
+
def test_rich_toggle
|
|
150
|
+
buf.replace_all_lines!(["hello world"])
|
|
151
|
+
feed("g", "r")
|
|
152
|
+
assert_equal :normal, @editor.mode
|
|
153
|
+
end
|
|
154
|
+
end
|
data/test/app_motion_test.rb
CHANGED
|
@@ -4,11 +4,12 @@ class AppMotionTest < Minitest::Test
|
|
|
4
4
|
def setup
|
|
5
5
|
@app = RuVim::App.new(clean: true)
|
|
6
6
|
@editor = @app.instance_variable_get(:@editor)
|
|
7
|
+
@key_handler = @app.instance_variable_get(:@key_handler)
|
|
7
8
|
@editor.materialize_intro_buffer!
|
|
8
9
|
end
|
|
9
10
|
|
|
10
11
|
def press(*keys)
|
|
11
|
-
keys.each { |k| @
|
|
12
|
+
keys.each { |k| @key_handler.send(:handle_normal_key, k) }
|
|
12
13
|
end
|
|
13
14
|
|
|
14
15
|
def test_find_char_and_repeat
|
|
@@ -59,14 +60,14 @@ class AppMotionTest < Minitest::Test
|
|
|
59
60
|
|
|
60
61
|
@editor.current_window_view_height_hint = 5
|
|
61
62
|
|
|
62
|
-
@
|
|
63
|
+
@key_handler.send(:handle_normal_key, :pagedown)
|
|
63
64
|
assert_equal 4, @editor.current_window.cursor_y
|
|
64
65
|
|
|
65
66
|
@editor.pending_count = 2
|
|
66
|
-
@
|
|
67
|
+
@key_handler.send(:handle_normal_key, :pagedown)
|
|
67
68
|
assert_equal 12, @editor.current_window.cursor_y
|
|
68
69
|
|
|
69
|
-
@
|
|
70
|
+
@key_handler.send(:handle_normal_key, :pageup)
|
|
70
71
|
assert_equal 8, @editor.current_window.cursor_y
|
|
71
72
|
end
|
|
72
73
|
|
|
@@ -78,16 +79,16 @@ class AppMotionTest < Minitest::Test
|
|
|
78
79
|
|
|
79
80
|
@editor.current_window_view_height_hint = 10
|
|
80
81
|
|
|
81
|
-
@
|
|
82
|
+
@key_handler.send(:handle_normal_key, :ctrl_d)
|
|
82
83
|
assert_equal 5, @editor.current_window.cursor_y
|
|
83
84
|
|
|
84
|
-
@
|
|
85
|
+
@key_handler.send(:handle_normal_key, :ctrl_u)
|
|
85
86
|
assert_equal 0, @editor.current_window.cursor_y
|
|
86
87
|
|
|
87
|
-
@
|
|
88
|
+
@key_handler.send(:handle_normal_key, :ctrl_f)
|
|
88
89
|
assert_equal 9, @editor.current_window.cursor_y
|
|
89
90
|
|
|
90
|
-
@
|
|
91
|
+
@key_handler.send(:handle_normal_key, :ctrl_b)
|
|
91
92
|
assert_equal 0, @editor.current_window.cursor_y
|
|
92
93
|
end
|
|
93
94
|
|
|
@@ -100,11 +101,11 @@ class AppMotionTest < Minitest::Test
|
|
|
100
101
|
|
|
101
102
|
@editor.current_window_view_height_hint = 10
|
|
102
103
|
|
|
103
|
-
@
|
|
104
|
+
@key_handler.send(:handle_normal_key, :ctrl_e)
|
|
104
105
|
assert_equal 6, @editor.current_window.row_offset
|
|
105
106
|
assert_equal 6, @editor.current_window.cursor_y
|
|
106
107
|
|
|
107
|
-
@
|
|
108
|
+
@key_handler.send(:handle_normal_key, :ctrl_y)
|
|
108
109
|
assert_equal 5, @editor.current_window.row_offset
|
|
109
110
|
assert_equal 6, @editor.current_window.cursor_y
|
|
110
111
|
end
|
|
@@ -118,7 +119,7 @@ class AppMotionTest < Minitest::Test
|
|
|
118
119
|
keymaps = @app.instance_variable_get(:@keymaps)
|
|
119
120
|
keymaps.bind(:normal, ["<C-d>"], "cursor.down")
|
|
120
121
|
|
|
121
|
-
@
|
|
122
|
+
@key_handler.send(:handle_normal_key, :ctrl_d)
|
|
122
123
|
assert_equal 1, @editor.current_window.cursor_y
|
|
123
124
|
end
|
|
124
125
|
|
|
@@ -131,7 +132,7 @@ class AppMotionTest < Minitest::Test
|
|
|
131
132
|
keymaps = @app.instance_variable_get(:@keymaps)
|
|
132
133
|
keymaps.bind(:normal, ["<PageDown>"], "cursor.down")
|
|
133
134
|
|
|
134
|
-
@
|
|
135
|
+
@key_handler.send(:handle_normal_key, :pagedown)
|
|
135
136
|
assert_equal 1, @editor.current_window.cursor_y
|
|
136
137
|
end
|
|
137
138
|
|
data/test/app_register_test.rb
CHANGED
|
@@ -4,12 +4,13 @@ class AppRegisterTest < Minitest::Test
|
|
|
4
4
|
def setup
|
|
5
5
|
@app = RuVim::App.new(clean: true)
|
|
6
6
|
@editor = @app.instance_variable_get(:@editor)
|
|
7
|
+
@key_handler = @app.instance_variable_get(:@key_handler)
|
|
7
8
|
@editor.materialize_intro_buffer!
|
|
8
9
|
@buffer = @editor.current_buffer
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def press(*keys)
|
|
12
|
-
keys.each { |k| @
|
|
13
|
+
keys.each { |k| @key_handler.send(:handle_normal_key, k) }
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
def test_yy_updates_register_zero
|