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/config.md ADDED
@@ -0,0 +1,155 @@
1
+ # RuVim 設定(Config / Options)
2
+
3
+ この文書は、RuVim の設定方法と `:set` 系オプションの現状仕様をまとめたものです。
4
+
5
+ ## 設定ファイル
6
+
7
+ - XDG 設定ファイル:
8
+ - `$XDG_CONFIG_HOME/ruvim/init.rb`
9
+ - `~/.config/ruvim/init.rb`(`XDG_CONFIG_HOME` 未設定時)
10
+ - filetype ごとの設定(ftplugin):
11
+ - `$XDG_CONFIG_HOME/ruvim/ftplugin/<filetype>.rb`
12
+ - `~/.config/ruvim/ftplugin/<filetype>.rb`
13
+
14
+ 設定ファイルは Ruby DSL(`ConfigDSL`)として評価されます。
15
+
16
+ ### 起動オプションでの切替(CLI)
17
+
18
+ - `--clean`
19
+ - user config と ftplugin を読まない
20
+ - `-u path/to/init.rb`
21
+ - 指定ファイルを user config として読む
22
+ - `-u NONE`
23
+ - user config を読まない(ftplugin は有効)
24
+ - `--cmd {cmd}`
25
+ - user config 読み込み前に Ex コマンドを実行(複数回指定可)
26
+
27
+ ## `:set` 系コマンド(現状)
28
+
29
+ - `:set`
30
+ - 現在値の一覧(簡易)を表示
31
+ - `:set {name}`
32
+ - boolean option を `on`
33
+ - `:set no{name}`
34
+ - boolean option を `off`
35
+ - `:set inv{name}`
36
+ - boolean option を反転
37
+ - `:set {name}?`
38
+ - 値を表示
39
+ - `:set {name}={value}`
40
+ - 値を設定
41
+ - `:setlocal ...`
42
+ - local scope(現状は option 定義に応じて `window` or `buffer`)
43
+ - `:setglobal ...`
44
+ - global scope
45
+
46
+ ## ConfigDSL からの設定
47
+
48
+ `init.rb` / `ftplugin/*.rb` では DSL メソッドも使えます。
49
+
50
+ ```ruby
51
+ set "number"
52
+ set "relativenumber"
53
+ set "ignorecase"
54
+ set "smartcase"
55
+ set "hlsearch"
56
+ setlocal "tabstop=4"
57
+ setglobal "tabstop=8"
58
+ ```
59
+
60
+ ## オプション一覧(現状実装)
61
+
62
+ 実装の定義元は `lib/ruvim/editor.rb` の `RuVim::Editor::OPTION_DEFS` です。
63
+
64
+ ### `number`
65
+
66
+ - 型: `bool`
67
+ - 既定スコープ: `window-local`
68
+ - デフォルト: `false`
69
+ - 用途:
70
+ - 行番号表示の ON/OFF
71
+ - 描画(`Screen`)に反映
72
+ - 例:
73
+ - `:set number`
74
+ - `:set nonumber`
75
+ - `:setlocal number`
76
+
77
+ ### `relativenumber`
78
+
79
+ - 型: `bool`
80
+ - 既定スコープ: `window-local`
81
+ - デフォルト: `false`
82
+ - 用途:
83
+ - 相対行番号表示
84
+ - `number` 併用時は current line を絶対行番号、それ以外を相対行番号で表示
85
+ - 例:
86
+ - `:set relativenumber`
87
+ - `:set norelativenumber`
88
+ - `:setlocal relativenumber`
89
+
90
+ ### `tabstop`
91
+
92
+ - 型: `int`
93
+ - 既定スコープ: `buffer-local`
94
+ - デフォルト: `2`
95
+ - 用途:
96
+ - タブ展開幅(表示幅計算・描画)
97
+ - 例:
98
+ - `:set tabstop=4`
99
+ - `:set tabstop?`
100
+ - `:setlocal tabstop=2`
101
+ - `:setglobal tabstop=8`
102
+
103
+ ### `filetype`
104
+
105
+ - 型: `string`
106
+ - 既定スコープ: `buffer-local`
107
+ - デフォルト: `nil`
108
+ - 用途:
109
+ - filetype-local keymap 解決
110
+ - ftplugin ロード対象の決定
111
+ - 備考:
112
+ - 通常は path から自動検出される
113
+ - 手動で `:set filetype=ruby` も可能
114
+ - 現状、手動変更時に ftplugin を再適用する仕組みはない
115
+
116
+ ### `ignorecase`
117
+
118
+ - 型: `bool`
119
+ - 既定スコープ: `global`
120
+ - デフォルト: `false`
121
+ - 用途:
122
+ - 検索・置換で大文字小文字を無視
123
+ - 例:
124
+ - `:set ignorecase`
125
+ - `:set noignorecase`
126
+
127
+ ### `smartcase`
128
+
129
+ - 型: `bool`
130
+ - 既定スコープ: `global`
131
+ - デフォルト: `false`
132
+ - 用途:
133
+ - `ignorecase` 有効時、検索パターンに大文字を含む場合は case-sensitive にする
134
+ - 例:
135
+ - `:set smartcase`
136
+ - `:set nosmartcase`
137
+
138
+ ### `hlsearch`
139
+
140
+ - 型: `bool`
141
+ - 既定スコープ: `global`
142
+ - デフォルト: `true`
143
+ - 用途:
144
+ - 検索マッチの画面ハイライト ON/OFF
145
+ - 例:
146
+ - `:set hlsearch`
147
+ - `:set nohlsearch`
148
+
149
+ ## 制限(現状)
150
+
151
+ - Vim の option 全部は未実装(ごく一部のみ)
152
+ - `:set all` / `:setlocal` 一覧の整形表示は未実装(簡易表示)
153
+ - `+=`, `-=`, `^=` などの複合代入は未対応
154
+ - `&`(デフォルトへ戻す)や `<`(global 値に戻す)などは未対応
155
+ - option の短縮名(例: `nu`)は未対応
data/docs/done.md ADDED
@@ -0,0 +1,112 @@
1
+ # RuVim DONE
2
+
3
+ 完了した項目をカテゴリ別に整理した一覧です。
4
+
5
+ 注記:
6
+ - 実装の詳細・制約は `docs/spec.md`, `docs/vim_diff.md`, `docs/command.md` を参照
7
+ - このファイルは「完了したことの棚卸し」、`docs/todo.md` は「未完了の作業」に分離して管理する
8
+
9
+ ## コア編集 / Vim ライク基本機能
10
+
11
+ - `Undo/Redo`(`u`, `Ctrl-r`)
12
+ - 検索(`/`, `?`, `n`, `N`)
13
+ - 複数キー解釈の拡張(operator-pending 基礎)
14
+ - 移動コマンド追加(`gg`, `G`, `w`, `b`, `e`, `$`, `^`)
15
+ - 挿入系コマンド追加(`a`, `A`, `I`, `o`, `O`)
16
+ - 編集系コマンド追加(`p`, `P`, `r`, `yy`, `yw`)
17
+ - Visual mode(charwise / linewise)
18
+ - レジスタ基礎(unnamed + delete/yank 保存)
19
+ - text object 実装(`iw`, `aw`, quote/bracket 系など)
20
+ - `c` operator と change 系コマンド(`cw`, `cc`, `c$` など)
21
+ - 検索の強化(regex, highlight, `* # g* g#`, 最小 substitute)
22
+ - named register / clipboard 対応(`"a`, `"A`, `"+`, `"*`)
23
+ - マーク / ジャンプリスト
24
+ - マクロ(`q{reg}`, `@{reg}`)
25
+ - `.`(直前変更の repeat)初版
26
+ - `f/F/t/T`, `;`, `,`(行内文字移動)
27
+ - `%`(対応括弧ジャンプ)
28
+ - register 強化(`"_`, `0`, `1-9`)
29
+ - text object 拡充(`ip/ap`, `i]`, `a}`, ``i` ``, など)
30
+ - quickfix / location list(最小)
31
+ - Visual block(`Ctrl-v`、最小)
32
+ - `.` repeat の精度向上(operator + text object + macro 連携)
33
+
34
+ ## コマンド / 設計 / 拡張基盤
35
+
36
+ - `:command`(ユーザー定義 Ex コマンド)
37
+ - `:ruby` / `:rb`
38
+ - バッファ管理コマンド(`:ls`, `:buffers`, `:bnext`, `:bprev`, `:buffer`, `#`)
39
+ - キーマップのレイヤー化(mode/global/buffer/filetype)
40
+ - option system(global / buffer-local / window-local, `:set` 系)
41
+ - ファイルタイプ検出と ftplugin
42
+ - 設定ファイル(XDG config, 起動時ロード, 拡張ポイント)
43
+ - 設定ファイルの場所を XDG ルールに変更
44
+ - `docs/plugin.md`(拡張 / plugin 的な書き方)
45
+ - block-based keymap DSL(`nmap/imap/map_global ... do |ctx, ...| end`)
46
+ - plugin 向け `ctx.editor / ctx.buffer / ctx.window` API リファレンス(未確定 API 注記つき)
47
+
48
+ ## UI / 画面描画 / 端末挙動
49
+
50
+ - リサイズ対応(`SIGWINCH` + 即時再描画)
51
+ - 差分描画
52
+ - ステータスライン強化
53
+ - コマンドライン改善(履歴 / 補完 / エラー表示)
54
+ - カーソル位置の強調表示
55
+ - 複数 window / split UI(`:split`, `:vsplit`, window 間移動)
56
+ - Tabpage(`:tabnew`, `:tabnext`, `:tabprev`)
57
+ - ヘルプ / コマンド一覧の read-only 仮想バッファ表示
58
+ - intro screen(Vim 風 welcome buffer)
59
+ - エラー表示の改善(最下段・強調表示)
60
+ - PageUp / PageDown 対応
61
+ - `:q` の window/tab/app クローズ挙動を Vim 寄りに調整
62
+
63
+ ## Unicode / 日本語 / 表示幅 / 座標系
64
+
65
+ - 文字幅対応(UTF-8 / 全角 / タブ幅と表示桁分離)
66
+ - Unicode 対応の精度向上(grapheme cluster, EAW, emoji/combining 整合)
67
+ - 内部座標の整理(char index / grapheme / screen column)
68
+ - エンコーディング方針の明文化と実装整理(UTF-8 decode/save)
69
+ - 表示幅ベース描画の共通化(`TextMetrics` 中心)
70
+ - 日本語/全角を含む操作の整合性確認(`w/b/e`, Visual yank, `p/P`)
71
+ - 描画回帰テストの追加(Unicode / wide char)
72
+
73
+ ## 品質 / テスト / CI / パフォーマンス
74
+
75
+ - テスト追加(Buffer / Dispatcher / Ex parser / KeymapManager)
76
+ - パフォーマンス改善(表示幅ベース水平スクロール / syntax cache)
77
+ - rope/piece-table などのバッファ構造検討メモ(`docs/spec.md`)
78
+ - テスト基盤の拡張(結合テスト / snapshot / シナリオ)
79
+ - CI / 開発体験(GitHub Actions, `rake docs:check`, `rake ci`)
80
+ - シンタックスハイライト(最小)
81
+ - 補完基盤(Ex 補完 / Insert mode 補完)
82
+
83
+ ## CLI オプション(Vim 風・実装済み / placeholder 含む)
84
+
85
+ ### 実用寄り(実装済み)
86
+
87
+ - `--help`, `--version`
88
+ - `--clean`
89
+ - `+{cmd}` / `-c {cmd}`
90
+ - `-u {vimrc}` 相当(`-u path`, `-u NONE`)
91
+ - `-R`
92
+ - `-n`(現状 no-op, 互換予約)
93
+ - `-o[N]`, `-O[N]`, `-p[N]`
94
+ - `-M`
95
+ - `-Z`
96
+ - `-V[N]` / `--verbose`
97
+ - `--startuptime {file}`
98
+ - `--cmd {cmd}`
99
+
100
+ ### 互換 placeholder として受理(名前確保)
101
+
102
+ - `-d`(diff mode)
103
+ - `-q {errorfile}`(quickfix 読み込み起動)
104
+ - `-S [session]`(session 読み込み)
105
+
106
+ ## ドキュメント整理 / 仕様整備
107
+
108
+ - `docs/spec.md`, `docs/tutorial.md`, `docs/binding.md`, `docs/command.md`, `docs/config.md`, `docs/vim_diff.md` の継続更新
109
+ - `docs/config.md`(設定一覧)
110
+ - `docs/vim_diff.md`(Vim との差分)
111
+ - `docs/todo.md` の P0-P2 項目の消化
112
+