ruvim 0.4.0 → 0.6.1

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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/AGENTS.md +53 -4
  3. data/README.md +15 -6
  4. data/Rakefile +7 -0
  5. data/benchmark/cext_compare.rb +165 -0
  6. data/benchmark/chunked_load.rb +256 -0
  7. data/benchmark/file_load.rb +140 -0
  8. data/benchmark/hotspots.rb +178 -0
  9. data/docs/binding.md +3 -2
  10. data/docs/command.md +81 -9
  11. data/docs/done.md +23 -0
  12. data/docs/spec.md +105 -19
  13. data/docs/todo.md +9 -0
  14. data/docs/tutorial.md +9 -1
  15. data/docs/vim_diff.md +13 -0
  16. data/ext/ruvim/extconf.rb +5 -0
  17. data/ext/ruvim/ruvim_ext.c +519 -0
  18. data/lib/ruvim/app.rb +217 -2778
  19. data/lib/ruvim/browser.rb +104 -0
  20. data/lib/ruvim/buffer.rb +39 -28
  21. data/lib/ruvim/command_invocation.rb +2 -2
  22. data/lib/ruvim/completion_manager.rb +708 -0
  23. data/lib/ruvim/dispatcher.rb +14 -8
  24. data/lib/ruvim/display_width.rb +91 -45
  25. data/lib/ruvim/editor.rb +64 -81
  26. data/lib/ruvim/ex_command_registry.rb +3 -1
  27. data/lib/ruvim/gh/link.rb +207 -0
  28. data/lib/ruvim/git/blame.rb +16 -6
  29. data/lib/ruvim/git/branch.rb +20 -5
  30. data/lib/ruvim/git/grep.rb +107 -0
  31. data/lib/ruvim/git/handler.rb +42 -1
  32. data/lib/ruvim/global_commands.rb +175 -35
  33. data/lib/ruvim/highlighter.rb +4 -13
  34. data/lib/ruvim/key_handler.rb +1510 -0
  35. data/lib/ruvim/keymap_manager.rb +7 -7
  36. data/lib/ruvim/lang/base.rb +5 -0
  37. data/lib/ruvim/lang/c.rb +116 -0
  38. data/lib/ruvim/lang/cpp.rb +107 -0
  39. data/lib/ruvim/lang/csv.rb +4 -1
  40. data/lib/ruvim/lang/diff.rb +2 -0
  41. data/lib/ruvim/lang/dockerfile.rb +36 -0
  42. data/lib/ruvim/lang/elixir.rb +85 -0
  43. data/lib/ruvim/lang/erb.rb +30 -0
  44. data/lib/ruvim/lang/go.rb +83 -0
  45. data/lib/ruvim/lang/html.rb +34 -0
  46. data/lib/ruvim/lang/javascript.rb +83 -0
  47. data/lib/ruvim/lang/json.rb +6 -0
  48. data/lib/ruvim/lang/lua.rb +76 -0
  49. data/lib/ruvim/lang/makefile.rb +36 -0
  50. data/lib/ruvim/lang/markdown.rb +3 -4
  51. data/lib/ruvim/lang/ocaml.rb +77 -0
  52. data/lib/ruvim/lang/perl.rb +91 -0
  53. data/lib/ruvim/lang/python.rb +85 -0
  54. data/lib/ruvim/lang/registry.rb +102 -0
  55. data/lib/ruvim/lang/ruby.rb +7 -0
  56. data/lib/ruvim/lang/rust.rb +95 -0
  57. data/lib/ruvim/lang/scheme.rb +5 -0
  58. data/lib/ruvim/lang/sh.rb +76 -0
  59. data/lib/ruvim/lang/sql.rb +52 -0
  60. data/lib/ruvim/lang/toml.rb +36 -0
  61. data/lib/ruvim/lang/tsv.rb +4 -1
  62. data/lib/ruvim/lang/typescript.rb +53 -0
  63. data/lib/ruvim/lang/yaml.rb +62 -0
  64. data/lib/ruvim/rich_view/table_renderer.rb +3 -3
  65. data/lib/ruvim/rich_view.rb +14 -7
  66. data/lib/ruvim/screen.rb +126 -72
  67. data/lib/ruvim/stream/file_load.rb +85 -0
  68. data/lib/ruvim/stream/follow.rb +40 -0
  69. data/lib/ruvim/stream/git.rb +43 -0
  70. data/lib/ruvim/stream/run.rb +74 -0
  71. data/lib/ruvim/stream/stdin.rb +55 -0
  72. data/lib/ruvim/stream.rb +35 -0
  73. data/lib/ruvim/stream_mixer.rb +394 -0
  74. data/lib/ruvim/terminal.rb +18 -4
  75. data/lib/ruvim/text_metrics.rb +84 -65
  76. data/lib/ruvim/version.rb +1 -1
  77. data/lib/ruvim/window.rb +5 -5
  78. data/lib/ruvim.rb +23 -6
  79. data/test/app_command_test.rb +382 -0
  80. data/test/app_completion_test.rb +43 -19
  81. data/test/app_dot_repeat_test.rb +27 -3
  82. data/test/app_ex_command_test.rb +154 -0
  83. data/test/app_motion_test.rb +13 -12
  84. data/test/app_register_test.rb +2 -1
  85. data/test/app_scenario_test.rb +15 -10
  86. data/test/app_startup_test.rb +70 -27
  87. data/test/app_text_object_test.rb +2 -1
  88. data/test/app_unicode_behavior_test.rb +3 -2
  89. data/test/browser_test.rb +88 -0
  90. data/test/buffer_test.rb +24 -0
  91. data/test/cli_test.rb +63 -0
  92. data/test/command_invocation_test.rb +33 -0
  93. data/test/config_dsl_test.rb +47 -0
  94. data/test/dispatcher_test.rb +74 -4
  95. data/test/ex_command_registry_test.rb +106 -0
  96. data/test/follow_test.rb +20 -21
  97. data/test/gh_link_test.rb +141 -0
  98. data/test/git_blame_test.rb +96 -17
  99. data/test/git_grep_test.rb +64 -0
  100. data/test/highlighter_test.rb +125 -0
  101. data/test/indent_test.rb +137 -0
  102. data/test/input_screen_integration_test.rb +1 -1
  103. data/test/keyword_chars_test.rb +85 -0
  104. data/test/lang_test.rb +634 -0
  105. data/test/markdown_renderer_test.rb +5 -5
  106. data/test/on_save_hook_test.rb +12 -8
  107. data/test/render_snapshot_test.rb +78 -0
  108. data/test/rich_view_test.rb +42 -42
  109. data/test/run_command_test.rb +307 -0
  110. data/test/screen_test.rb +68 -5
  111. data/test/stream_test.rb +165 -0
  112. data/test/window_test.rb +59 -0
  113. metadata +66 -2
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuVim
4
+ module Lang
5
+ module Sh
6
+ KEYWORDS = %w[
7
+ if then else elif fi case esac for while until do done
8
+ in function select return exit break continue
9
+ local export readonly declare typeset unset
10
+ source eval exec trap set shopt
11
+ ].freeze
12
+
13
+ KEYWORD_RE = /\b(?:#{KEYWORDS.join("|")})\b/
14
+ STRING_SINGLE_RE = /'[^']*'/
15
+ STRING_DOUBLE_RE = /"(?:\\.|[^"\\])*"/
16
+ VARIABLE_RE = /\$\{?[A-Za-z_]\w*\}?|\$[0-9@#?!\-*$]/
17
+ NUMBER_RE = /\b\d+\b/
18
+ COMMENT_RE = /#.*/
19
+ SHEBANG_RE = /\A#!.*/
20
+ OPERATOR_RE = /(?:\|\||&&|;;|<<|>>)/
21
+
22
+ INDENT_OPEN_RE = /\b(?:then|else|do)\s*$/
23
+ INDENT_CLOSE_RE = /\A\s*(?:fi|done|esac|else|elif)\b/
24
+
25
+ DEDENT_TRIGGERS = {
26
+ "i" => /\A(\s*)fi\z/,
27
+ "e" => /\A(\s*)(?:done|else)\z/,
28
+ "c" => /\A(\s*)esac\z/,
29
+ "f" => /\A(\s*)elif\z/
30
+ }.freeze
31
+
32
+ module_function
33
+
34
+ def calculate_indent(lines, target_row, shiftwidth)
35
+ depth = 0
36
+ (0...target_row).each do |row|
37
+ line = lines[row].to_s.strip
38
+ next if line.empty? || line.start_with?("#")
39
+
40
+ depth += 1 if line.match?(/\b(?:then|else|elif|do)\s*$/) || line.match?(/\{\s*$/)
41
+ depth -= 1 if line.match?(/\A(?:fi|done|esac)\b/) || line.match?(/\A\}/)
42
+ end
43
+
44
+ target_line = lines[target_row].to_s.strip
45
+ depth -= 1 if target_line.match?(/\A(?:fi|done|esac|else|elif)\b/) || target_line.match?(/\A\}/)
46
+ depth = 0 if depth < 0
47
+ depth * shiftwidth
48
+ end
49
+
50
+ def indent_trigger?(line)
51
+ stripped = line.to_s.rstrip
52
+ stripped.match?(/\b(?:then|else|elif|do)\s*$/) || stripped.match?(/\{\s*$/)
53
+ end
54
+
55
+ def dedent_trigger(char)
56
+ DEDENT_TRIGGERS[char]
57
+ end
58
+
59
+ def color_columns(text)
60
+ cols = {}
61
+ Highlighter.apply_regex(cols, text, STRING_SINGLE_RE, Highlighter::STRING_COLOR)
62
+ Highlighter.apply_regex(cols, text, STRING_DOUBLE_RE, Highlighter::STRING_COLOR)
63
+ Highlighter.apply_regex(cols, text, KEYWORD_RE, Highlighter::KEYWORD_COLOR)
64
+ Highlighter.apply_regex(cols, text, VARIABLE_RE, Highlighter::VARIABLE_COLOR)
65
+ Highlighter.apply_regex(cols, text, NUMBER_RE, Highlighter::NUMBER_COLOR)
66
+ Highlighter.apply_regex(cols, text, COMMENT_RE, Highlighter::COMMENT_COLOR, override: true)
67
+ cols
68
+ end
69
+ end
70
+
71
+ Registry.register("sh", mod: Sh,
72
+ extensions: %w[.sh .bash .zsh],
73
+ shebangs: %w[bash sh zsh ksh dash],
74
+ runprg: "bash %")
75
+ end
76
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuVim
4
+ module Lang
5
+ module Sql
6
+ KEYWORDS = %w[
7
+ SELECT FROM WHERE AND OR NOT IN IS NULL LIKE BETWEEN EXISTS
8
+ INSERT INTO VALUES UPDATE SET DELETE CREATE TABLE ALTER DROP
9
+ INDEX VIEW TRIGGER FUNCTION PROCEDURE
10
+ JOIN INNER LEFT RIGHT OUTER FULL CROSS ON USING
11
+ GROUP BY ORDER ASC DESC HAVING LIMIT OFFSET DISTINCT
12
+ UNION ALL INTERSECT EXCEPT AS CASE WHEN THEN ELSE END
13
+ BEGIN COMMIT ROLLBACK TRANSACTION SAVEPOINT
14
+ PRIMARY KEY FOREIGN REFERENCES UNIQUE CHECK DEFAULT CONSTRAINT
15
+ IF ELSE ELSEIF WHILE LOOP FOR RETURN DECLARE
16
+ INT INTEGER BIGINT SMALLINT TINYINT
17
+ FLOAT DOUBLE DECIMAL NUMERIC REAL
18
+ CHAR VARCHAR TEXT BLOB CLOB BOOLEAN DATE TIME TIMESTAMP
19
+ SERIAL AUTO_INCREMENT IDENTITY
20
+ CASCADE RESTRICT SET GRANT REVOKE WITH RECURSIVE
21
+ COUNT SUM AVG MIN MAX COALESCE NULLIF CAST CONVERT
22
+ EXPLAIN ANALYZE VACUUM REINDEX CLUSTER TRUNCATE
23
+ TRUE FALSE
24
+ ].freeze
25
+
26
+ KEYWORD_RE = /\b(?:#{KEYWORDS.join("|")})\b/i
27
+ STRING_SINGLE_RE = /'(?:''|[^'])*'/
28
+ STRING_DOUBLE_RE = /"(?:""|[^"])*"/
29
+ NUMBER_RE = /\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b/
30
+ LINE_COMMENT_RE = /--.*/
31
+ BLOCK_COMMENT_RE = %r{/\*.*?\*/}
32
+ PARAMETER_RE = /[:@$]\w+/
33
+
34
+ module_function
35
+
36
+ def color_columns(text)
37
+ cols = {}
38
+ Highlighter.apply_regex(cols, text, STRING_SINGLE_RE, Highlighter::STRING_COLOR)
39
+ Highlighter.apply_regex(cols, text, STRING_DOUBLE_RE, Highlighter::STRING_COLOR)
40
+ Highlighter.apply_regex(cols, text, KEYWORD_RE, Highlighter::KEYWORD_COLOR)
41
+ Highlighter.apply_regex(cols, text, NUMBER_RE, Highlighter::NUMBER_COLOR)
42
+ Highlighter.apply_regex(cols, text, PARAMETER_RE, Highlighter::VARIABLE_COLOR)
43
+ Highlighter.apply_regex(cols, text, BLOCK_COMMENT_RE, Highlighter::COMMENT_COLOR, override: true)
44
+ Highlighter.apply_regex(cols, text, LINE_COMMENT_RE, Highlighter::COMMENT_COLOR, override: true)
45
+ cols
46
+ end
47
+ end
48
+
49
+ Registry.register("sql", mod: Sql,
50
+ extensions: %w[.sql])
51
+ end
52
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuVim
4
+ module Lang
5
+ module Toml
6
+ KEYWORD_RE = /\b(?:true|false)\b/
7
+ TABLE_RE = /\A\s*\[[\w.\-"]+\]/
8
+ ARRAY_TABLE_RE = /\A\s*\[\[[\w.\-"]+\]\]/
9
+ KEY_RE = /\A\s*[\w.\-]+\s*(?==)/
10
+ STRING_DOUBLE_RE = /"(?:\\.|[^"\\])*"/
11
+ STRING_SINGLE_RE = /'[^']*'/
12
+ NUMBER_RE = /(?<=[= ])[+-]?(?:0[xXoObB][\da-fA-F_]+|\d[\d_]*(?:\.[\d_]+)?(?:[eE][+-]?\d+)?)\b/
13
+ DATETIME_RE = /\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?/
14
+ COMMENT_RE = /#.*/
15
+
16
+ module_function
17
+
18
+ def color_columns(text)
19
+ cols = {}
20
+ Highlighter.apply_regex(cols, text, ARRAY_TABLE_RE, "\e[1;36m")
21
+ Highlighter.apply_regex(cols, text, TABLE_RE, "\e[1;36m")
22
+ Highlighter.apply_regex(cols, text, KEY_RE, Highlighter::KEYWORD_COLOR)
23
+ Highlighter.apply_regex(cols, text, STRING_DOUBLE_RE, Highlighter::STRING_COLOR)
24
+ Highlighter.apply_regex(cols, text, STRING_SINGLE_RE, Highlighter::STRING_COLOR)
25
+ Highlighter.apply_regex(cols, text, KEYWORD_RE, "\e[35m")
26
+ Highlighter.apply_regex(cols, text, DATETIME_RE, Highlighter::CONSTANT_COLOR)
27
+ Highlighter.apply_regex(cols, text, NUMBER_RE, Highlighter::NUMBER_COLOR)
28
+ Highlighter.apply_regex(cols, text, COMMENT_RE, Highlighter::COMMENT_COLOR, override: true)
29
+ cols
30
+ end
31
+ end
32
+
33
+ Registry.register("toml", mod: Toml,
34
+ extensions: %w[.toml])
35
+ end
36
+ end
@@ -2,6 +2,9 @@
2
2
 
3
3
  module RuVim
4
4
  module Lang
5
+ Registry.register("tsv", mod: Base,
6
+ extensions: %w[.tsv])
7
+
5
8
  module Tsv
6
9
  module_function
7
10
 
@@ -15,5 +18,5 @@ module RuVim
15
18
  end
16
19
  end
17
20
 
18
- RichView.register("tsv", RichView::TableRenderer, detector: Lang::Tsv.method(:detect?))
21
+ RichView.register(:tsv, RichView::TableRenderer, detector: Lang::Tsv.method(:detect?))
19
22
  end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuVim
4
+ module Lang
5
+ module Typescript
6
+ TS_KEYWORDS = %w[
7
+ abstract as declare enum implements interface
8
+ module namespace private protected public readonly
9
+ type keyof infer extends
10
+ never unknown any
11
+ override satisfies
12
+ ].freeze
13
+
14
+ ALL_KEYWORDS = (Javascript::KEYWORDS + TS_KEYWORDS).uniq.freeze
15
+
16
+ KEYWORD_RE = /\b(?:#{ALL_KEYWORDS.join("|")})\b/
17
+
18
+ module_function
19
+
20
+ def calculate_indent(lines, target_row, shiftwidth)
21
+ Javascript.calculate_indent(lines, target_row, shiftwidth)
22
+ end
23
+
24
+ def indent_trigger?(line)
25
+ Javascript.indent_trigger?(line)
26
+ end
27
+
28
+ def dedent_trigger(char)
29
+ Javascript.dedent_trigger(char)
30
+ end
31
+
32
+ def color_columns(text)
33
+ cols = {}
34
+ Highlighter.apply_regex(cols, text, Javascript::STRING_SINGLE_RE, Highlighter::STRING_COLOR)
35
+ Highlighter.apply_regex(cols, text, Javascript::STRING_DOUBLE_RE, Highlighter::STRING_COLOR)
36
+ Highlighter.apply_regex(cols, text, Javascript::TEMPLATE_RE, Highlighter::STRING_COLOR)
37
+ Highlighter.apply_regex(cols, text, KEYWORD_RE, Highlighter::KEYWORD_COLOR)
38
+ Highlighter.apply_regex(cols, text, Javascript::NUMBER_RE, Highlighter::NUMBER_COLOR)
39
+ Highlighter.apply_regex(cols, text, Javascript::CONSTANT_RE, Highlighter::CONSTANT_COLOR)
40
+ Highlighter.apply_regex(cols, text, Javascript::BLOCK_COMMENT_RE, Highlighter::COMMENT_COLOR, override: true)
41
+ Highlighter.apply_regex(cols, text, Javascript::LINE_COMMENT_RE, Highlighter::COMMENT_COLOR, override: true)
42
+ cols
43
+ end
44
+ end
45
+
46
+ Registry.register("typescript", mod: Typescript,
47
+ extensions: %w[.ts],
48
+ aliases: %w[typescriptreact],
49
+ runprg: "npx tsx %")
50
+ Registry.register("typescriptreact", mod: Typescript,
51
+ extensions: %w[.tsx])
52
+ end
53
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuVim
4
+ module Lang
5
+ module Yaml
6
+ KEYWORDS = %w[true false null yes no on off].freeze
7
+
8
+ KEYWORD_RE = /\b(?:#{KEYWORDS.join("|")})\b/
9
+ KEY_RE = /\A\s*[\w.\-\/]+\s*(?=:)/
10
+ TAG_RE = /![\w!.\/\-]*/
11
+ ANCHOR_RE = /[&*]\w+/
12
+ COMMENT_RE = /#.*/
13
+ STRING_SINGLE_RE = /'(?:[^'\\]|\\.)*'/
14
+ STRING_DOUBLE_RE = /"(?:[^"\\]|\\.)*"/
15
+ NUMBER_RE = /(?<=[\s:\-\[,]|^)-?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?\s*$/
16
+ BLOCK_SCALAR_RE = /\A\s*[|>][+-]?\s*$/
17
+
18
+ module_function
19
+
20
+ def calculate_indent(lines, target_row, shiftwidth)
21
+ return 0 if target_row == 0
22
+
23
+ prev_row = target_row - 1
24
+ prev_row -= 1 while prev_row > 0 && lines[prev_row].to_s.strip.empty?
25
+ prev = lines[prev_row].to_s
26
+ prev_indent = prev[/\A */].size
27
+
28
+ # Increase indent after mapping key or list with sub-items
29
+ if prev.match?(/:\s*$/) || prev.match?(/[|>][+-]?\s*$/)
30
+ return prev_indent + shiftwidth
31
+ end
32
+
33
+ prev_indent
34
+ end
35
+
36
+ def indent_trigger?(line)
37
+ line.to_s.rstrip.match?(/:\s*$/) || line.to_s.rstrip.match?(/[|>][+-]?\s*$/)
38
+ end
39
+
40
+ def dedent_trigger(_char)
41
+ nil
42
+ end
43
+
44
+ def color_columns(text)
45
+ cols = {}
46
+ Highlighter.apply_regex(cols, text, STRING_SINGLE_RE, Highlighter::STRING_COLOR)
47
+ Highlighter.apply_regex(cols, text, STRING_DOUBLE_RE, Highlighter::STRING_COLOR)
48
+ Highlighter.apply_regex(cols, text, KEY_RE, Highlighter::KEYWORD_COLOR)
49
+ Highlighter.apply_regex(cols, text, KEYWORD_RE, "\e[35m")
50
+ Highlighter.apply_regex(cols, text, TAG_RE, Highlighter::CONSTANT_COLOR)
51
+ Highlighter.apply_regex(cols, text, ANCHOR_RE, Highlighter::VARIABLE_COLOR)
52
+ Highlighter.apply_regex(cols, text, NUMBER_RE, Highlighter::NUMBER_COLOR)
53
+ Highlighter.apply_regex(cols, text, BLOCK_SCALAR_RE, Highlighter::STRING_COLOR)
54
+ Highlighter.apply_regex(cols, text, COMMENT_RE, Highlighter::COMMENT_COLOR, override: true)
55
+ cols
56
+ end
57
+ end
58
+
59
+ Registry.register("yaml", mod: Yaml,
60
+ extensions: %w[.yml .yaml])
61
+ end
62
+ end
@@ -9,9 +9,9 @@ module RuVim
9
9
  module_function
10
10
 
11
11
  def delimiter_for(format)
12
- case format.to_s
13
- when "csv" then ","
14
- when "tsv" then "\t"
12
+ case format
13
+ when :csv then ","
14
+ when :tsv then "\t"
15
15
  else "\t"
16
16
  end
17
17
  end
@@ -13,12 +13,12 @@ module RuVim
13
13
  module_function
14
14
 
15
15
  def register(filetype, renderer, detector: nil)
16
- @renderers[filetype.to_s] = renderer
17
- @detectors << { filetype: filetype.to_s, detector: detector } if detector
16
+ @renderers[filetype.to_sym] = renderer
17
+ @detectors << { filetype: filetype.to_sym, detector: detector } if detector
18
18
  end
19
19
 
20
20
  def renderer_for(filetype)
21
- @renderers[filetype.to_s]
21
+ @renderers[filetype.to_sym]
22
22
  end
23
23
 
24
24
  def registered_filetypes
@@ -26,10 +26,13 @@ module RuVim
26
26
  end
27
27
 
28
28
  # Detect format from filetype or buffer content.
29
- # Returns a filetype string ("tsv", "csv", "markdown") or nil.
29
+ # Returns a filetype symbol (:tsv, :csv, :markdown) or nil.
30
30
  def detect_format(buffer)
31
- ft = buffer.options["filetype"].to_s
32
- return ft if @renderers.key?(ft)
31
+ raw = buffer.options["filetype"]
32
+ if raw && !raw.to_s.empty?
33
+ ft = raw.to_sym
34
+ return ft if @renderers.key?(ft)
35
+ end
33
36
 
34
37
  # Ask registered detectors
35
38
  @detectors.each do |entry|
@@ -42,7 +45,7 @@ module RuVim
42
45
  # Enter rich mode on the current buffer (same buffer, no virtual buffer).
43
46
  def open!(editor, format: nil)
44
47
  buffer = editor.current_buffer
45
- format ||= detect_format(buffer)
48
+ format = format ? format.to_sym : detect_format(buffer)
46
49
  raise RuVim::CommandError, "Cannot detect format for rich view" unless format
47
50
 
48
51
  renderer = @renderers[format]
@@ -105,5 +108,9 @@ module RuVim
105
108
  km.bind_buffer(buffer_id, "\e", "rich.close_buffer")
106
109
  km.bind_buffer(buffer_id, "<C-c>", "rich.close_buffer")
107
110
  end
111
+
112
+ register(:markdown, MarkdownRenderer)
113
+ register(:json, JsonRenderer)
114
+ register(:jsonl, JsonlRenderer)
108
115
  end
109
116
  end