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
data/docs/vim_diff.md ADDED
@@ -0,0 +1,179 @@
1
+ # RuVim と Vim の違い(現状)
2
+
3
+ この文書は、現時点の RuVim 実装と本家 Vim の違いをまとめたものです。
4
+
5
+ ## 位置づけ
6
+
7
+ - RuVim は「Vim ライクな Ruby 製ターミナルエディタ」
8
+ - 現状は Vim 完全互換ではない
9
+ - Vim の操作感を優先して、一部を簡略化している
10
+
11
+ ## 大きな違い(全体)
12
+
13
+ - Vim script 互換はない
14
+ - 代わりに `:ruby` / `:rb`
15
+ - プラグイン互換はない
16
+ - split UI は簡易実装(等分割タイル)
17
+ - `:split`, `:vsplit` はある
18
+ - Vim の nested window tree / 高度な window 操作は未実装
19
+ - tabpage は最小実装
20
+ - `:tabnew`, `:tabnext`, `:tabprev` はある
21
+ - Vim の高度な tab 操作/コマンド群は未実装
22
+ - register は `unnamed` / `named` / `"_` / `0` / `1-9` / `"+` / `"*` の基礎を実装
23
+ - option system は基礎のみ(`:set`, `:setlocal`, `:setglobal`, `number`, `relativenumber`, `ignorecase`, `smartcase`, `hlsearch`, `tabstop`, `filetype`)
24
+ - filetype 検出 / ftplugin は基礎のみ(拡張子中心の簡易判定)
25
+ - Ex コマンドは一部のみ
26
+
27
+ ## コマンドライン / Ex の違い
28
+
29
+ - `:w`, `:q`, `:wq`, `:e`, `:buffer`, `:bnext`, `:bprev`, `:ls` などはあるが一部のみ
30
+ - quickfix / location list は最小実装のみ
31
+ - `:vimgrep`, `:lvimgrep`, `:copen/:cnext`, `:lopen/:lnext` など
32
+ - `:grep`, `:make`, `:cfile`, `:lgrep`, 一覧バッファからの選択ジャンプは未実装
33
+ - `:command` はあるが、現状は「Ex 文字列エイリアス展開」に近い簡易実装
34
+ - `:ruby` はあるが、Vim の `:ruby` 機能互換ではなく RuVim 独自の Ruby eval 入口
35
+ - `:w!` は現状 `:w` とほぼ同じ(権限昇格や readonly 強制保存の完全な意味は未実装)
36
+
37
+ ## モード / 編集操作の違い
38
+
39
+ - Normal / Insert / Command-line / Visual(charwise, linewise, blockwise 最小)は実装済み
40
+ - Visual mode は最小実装
41
+ - `y`, `d` 中心
42
+ - `Ctrl-v` blockwise は矩形選択 + `y/d` の最小対応
43
+ - blockwise text object / paste の Vim 互換挙動は未実装
44
+ - Vim の細かい選択挙動や text object は一部未実装
45
+ - operator-pending は `d`, `y`, `c` の一部を実装
46
+ - text object は `iw/aw`, `ip/ap`, `i"/a"`, ``i`/a` ``, `i)/a)`, `i]/a]`, `i}/a}` を実装(簡易)
47
+ - Vim の text object 群全体は未実装
48
+ - word motion(`w`, `b`, `e`)は簡易定義
49
+ - Vim の厳密な単語境界とは一致しない場合がある
50
+ - undo 粒度は簡略化
51
+ - Insert mode は「入ってから出るまで」を 1 undo 単位
52
+ - `.` repeat は拡張済みだが完全互換ではない
53
+ - `x`, `dd`, `d{motion}`, `p/P`, `r<char>`, `i/a/A/I/o/O`, `cc`, `c{motion}` を対象
54
+ - macro 記録中の `.` は内部再生キーを macro に混ぜない
55
+ - Vim の細かい repeat 粒度/カウント互換は未実装
56
+
57
+ ## レジスタ / yank / paste の違い
58
+
59
+ - unnamed register(`"`)と named register(`"a`, `"A` append)を実装
60
+ - black hole(`"_`)、yank `0`、numbered delete `1-9`(簡易)を実装
61
+ - `"+`, `"*` は環境依存の system clipboard と連携(`pbcopy/pbpaste`, `wl-copy/wl-paste`, `xclip`, `xsel` のいずれか)
62
+ - small delete register `-` など Vim の全 register 種別は未実装
63
+ - paste の挙動は基本的な `charwise` / `linewise` 対応まで
64
+ - Vim の細かいカーソル位置ルールとは差がある可能性がある
65
+
66
+ ## 画面描画 / 端末挙動の違い
67
+
68
+ - ANSI + raw mode の自前描画
69
+ - 行キャッシュによる簡易差分描画(Vim の描画最適化とは別実装)
70
+ - `SIGWINCH + self-pipe + IO.select` でリサイズ追従
71
+ - 文字幅対応は近似実装
72
+ - タブ展開あり
73
+ - 一部全角/emoji 幅2対応
74
+ - 左右移動は grapheme cluster を考慮
75
+ - East Asian Width / grapheme cluster 完全互換ではない
76
+
77
+ ## スクリプト / 設定の違い
78
+
79
+ - XDG 設定ファイル(`$XDG_CONFIG_HOME/ruvim/init.rb` または `~/.config/ruvim/init.rb`)を Ruby DSL(`ConfigDSL`)で読む
80
+ - Vim script 互換設定ファイルではない
81
+ - CLI の `-u {path|NONE}` / `--clean` は一部実装済み(Vim 互換の全オプションは未実装)
82
+ - 現状の DSL 例:
83
+ - `nmap`, `imap`, `map_global`
84
+ - `command`
85
+ - `ex_command`
86
+ - `ex_command_call`
87
+
88
+ ## CLI オプションの違い
89
+
90
+ - 実装済み(現状)
91
+ - `--help`, `--version`
92
+ - `--clean`
93
+ - `-u {path|NONE}`
94
+ - `-R`, `-M`, `-Z`, `-n`(`-n` は現状 no-op)
95
+ - `-d`(placeholder: 未実装メッセージ)
96
+ - `-q {errorfile}`(placeholder: 未実装メッセージ)
97
+ - `-S [session]`(placeholder: 未実装メッセージ)
98
+ - `-o[N]`, `-O[N]`, `-p[N]`(基礎)
99
+ - `-V[N]`, `--verbose[=N]`(簡易)
100
+ - `--startuptime FILE`(簡易)
101
+ - `--cmd {cmd}`(pre-config Ex 実行)
102
+ - `-c {cmd}`
103
+ - `+{cmd}`, `+{line}`, `+`
104
+ - 未実装(Vim で定番だが RuVim は未対応)
105
+ - 実処理としては `-S`, `-q`, `-d` など(現状は placeholder のみ)
106
+ - 複数ファイル引数は `-o/-O/-p` 時のみ対応(通常起動の arglist 相当は未実装)
107
+
108
+ ## option(設定)の違い
109
+
110
+ - 現状の実装済み option は少数(`number`, `relativenumber`, `ignorecase`, `smartcase`, `hlsearch`, `tabstop`, `filetype`)
111
+ - Vim の option 名短縮(例: `nu`, `ts`)は未対応
112
+ - `:set` の高度な構文(`+=`, `-=`, `^=`, `&`, `<` など)は未対応
113
+ - `:set all` や詳細な一覧表示は未対応(簡易表示のみ)
114
+
115
+ ### Vim にあるが未実装の代表例(RuVim 現状)
116
+
117
+ - 表示系
118
+ - `relativenumber`
119
+ - `cursorline`
120
+ - `wrap`
121
+ - `list`, `listchars`
122
+ - `colorcolumn`
123
+ - `signcolumn`
124
+ - `numberwidth`
125
+ - `scrolloff`, `sidescrolloff`
126
+ - インデント/編集系
127
+ - `shiftwidth`
128
+ - `softtabstop`
129
+ - `expandtab`
130
+ - `autoindent`
131
+ - `smartindent`
132
+ - 検索系
133
+ - `ignorecase`
134
+ - `smartcase`
135
+ - `hlsearch`
136
+ - `incsearch`
137
+ - split / window 系
138
+ - `splitbelow`
139
+ - `splitright`
140
+ - `winfixheight`
141
+ - `winfixwidth`
142
+ - ファイル / 永続化系
143
+ - `swapfile`
144
+ - `backup`
145
+ - `writebackup`
146
+ - `undofile`
147
+ - `undodir`
148
+ - UI / 端末 / パフォーマンス系
149
+ - `termguicolors`
150
+ - `timeoutlen`
151
+ - `ttimeoutlen`
152
+ - `updatetime`
153
+
154
+ 注記:
155
+ - これは網羅一覧ではなく、よく使われるものの代表例です。
156
+ - 実装済み option の一覧は `docs/config.md` を参照。
157
+
158
+ ## 未実装(Vim との差分として大きいもの)
159
+
160
+ - text objects は一部のみ(`iw/aw`, `ip/ap`, `i"/a"`, ``i`/a` ``, `i)/a)`, `i]/a]`, `i}/a}`)
161
+ - change operator(`c` 系)は基礎のみ
162
+ - macros / replay は基礎のみ(`q{reg}`, `@{reg}`, `@@`)
163
+ - marks / jumps は基礎のみ(`m`, `'`, `` ` ``, `''`, `````, `<C-o>`, `<C-i>`)
164
+ - search regex 互換(現状は Ruby 正規表現)
165
+ - search は Ruby 正規表現ベース(Vim regex と非互換な点あり)
166
+ - substitute は最小実装(`:%s/.../.../g` のみ、Vim の置換フラグ群は未対応)
167
+ - folds
168
+ - syntax highlight は最小実装(regex ベース / `ruby`, `json` のみ)
169
+ - 補完は基礎のみ
170
+ - Ex 補完(コマンド名 + 一部引数)
171
+ - Insert mode buffer words 補完(`Ctrl-n` / `Ctrl-p`)
172
+ - LSP / diagnostics
173
+ - job/channel/terminal 連携
174
+
175
+ ## 互換性の考え方(現状)
176
+
177
+ - Vim の「概念(buffer / window / mode / operator / Ex)」は寄せる
178
+ - 挙動の細部は MVP 実装として簡略化
179
+ - 後方互換性より、Ruby で拡張しやすい構造を優先
data/exe/ruvim ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift(File.expand_path("../lib", __dir__))
3
+
4
+ require "ruvim"
5
+
6
+ exit RuVim::CLI.run(ARGV)