ruvim 0.1.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.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/test.yml +15 -0
  3. data/README.md +135 -0
  4. data/Rakefile +36 -0
  5. data/docs/binding.md +125 -0
  6. data/docs/command.md +306 -0
  7. data/docs/config.md +155 -0
  8. data/docs/done.md +112 -0
  9. data/docs/plugin.md +559 -0
  10. data/docs/spec.md +655 -0
  11. data/docs/todo.md +63 -0
  12. data/docs/tutorial.md +490 -0
  13. data/docs/vim_diff.md +179 -0
  14. data/exe/ruvim +6 -0
  15. data/lib/ruvim/app.rb +1600 -0
  16. data/lib/ruvim/buffer.rb +421 -0
  17. data/lib/ruvim/cli.rb +264 -0
  18. data/lib/ruvim/clipboard.rb +73 -0
  19. data/lib/ruvim/command_invocation.rb +14 -0
  20. data/lib/ruvim/command_line.rb +63 -0
  21. data/lib/ruvim/command_registry.rb +38 -0
  22. data/lib/ruvim/config_dsl.rb +134 -0
  23. data/lib/ruvim/config_loader.rb +68 -0
  24. data/lib/ruvim/context.rb +26 -0
  25. data/lib/ruvim/dispatcher.rb +120 -0
  26. data/lib/ruvim/display_width.rb +110 -0
  27. data/lib/ruvim/editor.rb +1025 -0
  28. data/lib/ruvim/ex_command_registry.rb +80 -0
  29. data/lib/ruvim/global_commands.rb +1889 -0
  30. data/lib/ruvim/highlighter.rb +52 -0
  31. data/lib/ruvim/input.rb +66 -0
  32. data/lib/ruvim/keymap_manager.rb +96 -0
  33. data/lib/ruvim/screen.rb +452 -0
  34. data/lib/ruvim/terminal.rb +30 -0
  35. data/lib/ruvim/text_metrics.rb +96 -0
  36. data/lib/ruvim/version.rb +5 -0
  37. data/lib/ruvim/window.rb +71 -0
  38. data/lib/ruvim.rb +30 -0
  39. data/sig/ruvim.rbs +4 -0
  40. data/test/app_completion_test.rb +39 -0
  41. data/test/app_dot_repeat_test.rb +54 -0
  42. data/test/app_motion_test.rb +73 -0
  43. data/test/app_register_test.rb +47 -0
  44. data/test/app_scenario_test.rb +77 -0
  45. data/test/app_startup_test.rb +199 -0
  46. data/test/app_text_object_test.rb +54 -0
  47. data/test/app_unicode_behavior_test.rb +66 -0
  48. data/test/buffer_test.rb +72 -0
  49. data/test/cli_test.rb +165 -0
  50. data/test/config_dsl_test.rb +78 -0
  51. data/test/dispatcher_test.rb +124 -0
  52. data/test/editor_mark_test.rb +69 -0
  53. data/test/editor_register_test.rb +64 -0
  54. data/test/fixtures/render_basic_snapshot.txt +8 -0
  55. data/test/fixtures/render_basic_snapshot_nonumber.txt +8 -0
  56. data/test/fixtures/render_unicode_scrolled_snapshot.txt +7 -0
  57. data/test/highlighter_test.rb +16 -0
  58. data/test/input_screen_integration_test.rb +69 -0
  59. data/test/keymap_manager_test.rb +48 -0
  60. data/test/render_snapshot_test.rb +70 -0
  61. data/test/screen_test.rb +123 -0
  62. data/test/search_option_test.rb +39 -0
  63. data/test/test_helper.rb +15 -0
  64. data/test/text_metrics_test.rb +42 -0
  65. data/test/window_test.rb +21 -0
  66. metadata +106 -0
@@ -0,0 +1,80 @@
1
+ module RuVim
2
+ class ExCommandRegistry
3
+ ExCommandSpec = Struct.new(
4
+ :name,
5
+ :call,
6
+ :aliases,
7
+ :desc,
8
+ :nargs,
9
+ :bang,
10
+ :source,
11
+ keyword_init: true
12
+ )
13
+
14
+ include Singleton
15
+
16
+ def initialize
17
+ @specs = {}
18
+ @lookup = {}
19
+ end
20
+
21
+ def register(name, call:, aliases: [], desc: "", nargs: :any, bang: false, source: :builtin)
22
+ canonical = name.to_s
23
+ if @specs.key?(canonical)
24
+ raise RuVim::CommandError, "Ex command already exists: #{canonical}"
25
+ end
26
+ spec = ExCommandSpec.new(
27
+ name: canonical,
28
+ call: call,
29
+ aliases: aliases.map(&:to_s),
30
+ desc: desc,
31
+ nargs: nargs,
32
+ bang: bang,
33
+ source: source
34
+ )
35
+
36
+ names = [canonical, *spec.aliases]
37
+ names.each do |n|
38
+ existing = @lookup[n]
39
+ if existing && existing != canonical
40
+ raise RuVim::CommandError, "Ex command name collision: #{n}"
41
+ end
42
+ end
43
+
44
+ @specs[canonical] = spec
45
+ names.each { |n| @lookup[n] = canonical }
46
+ spec
47
+ end
48
+
49
+ def resolve(name)
50
+ canonical = @lookup[name.to_s]
51
+ canonical && @specs[canonical]
52
+ end
53
+
54
+ def fetch(name)
55
+ resolve(name) || raise(RuVim::CommandError, "Not an editor command: #{name}")
56
+ end
57
+
58
+ def all
59
+ @specs.values.sort_by(&:name)
60
+ end
61
+
62
+ def registered?(name)
63
+ !!resolve(name)
64
+ end
65
+
66
+ def unregister(name)
67
+ spec = resolve(name.to_s)
68
+ return nil unless spec
69
+
70
+ @specs.delete(spec.name)
71
+ @lookup.delete_if { |_k, v| v == spec.name }
72
+ spec
73
+ end
74
+
75
+ def clear!
76
+ @specs.clear
77
+ @lookup.clear
78
+ end
79
+ end
80
+ end