ruvim 0.1.0 → 0.2.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/docs/binding.md +6 -0
- data/docs/command.md +16 -0
- data/docs/config.md +203 -84
- data/docs/lib_cleanup_report.md +79 -0
- data/docs/plugin.md +13 -15
- data/docs/spec.md +39 -22
- data/docs/todo.md +187 -10
- data/docs/tutorial.md +1 -1
- data/docs/vim_diff.md +2 -1
- data/lib/ruvim/app.rb +681 -123
- data/lib/ruvim/config_loader.rb +19 -5
- data/lib/ruvim/context.rb +0 -7
- data/lib/ruvim/dispatcher.rb +10 -0
- data/lib/ruvim/display_width.rb +25 -2
- data/lib/ruvim/editor.rb +173 -4
- data/lib/ruvim/global_commands.rb +500 -55
- data/lib/ruvim/input.rb +22 -10
- data/lib/ruvim/keyword_chars.rb +46 -0
- data/lib/ruvim/screen.rb +388 -53
- data/lib/ruvim/text_metrics.rb +26 -0
- data/lib/ruvim/version.rb +2 -2
- data/lib/ruvim/window.rb +35 -10
- data/lib/ruvim.rb +1 -0
- data/test/app_completion_test.rb +101 -0
- data/test/app_motion_test.rb +97 -2
- data/test/app_scenario_test.rb +270 -0
- data/test/app_startup_test.rb +10 -0
- data/test/config_loader_test.rb +37 -0
- data/test/dispatcher_test.rb +116 -0
- data/test/display_width_test.rb +18 -0
- data/test/fixtures/render_basic_snapshot.txt +7 -8
- data/test/fixtures/render_basic_snapshot_nonumber.txt +1 -2
- data/test/fixtures/render_unicode_scrolled_snapshot.txt +6 -7
- data/test/input_screen_integration_test.rb +26 -13
- data/test/screen_test.rb +166 -0
- data/test/window_test.rb +26 -0
- metadata +5 -1
data/docs/todo.md
CHANGED
|
@@ -18,28 +18,148 @@
|
|
|
18
18
|
- `docs/config.md`
|
|
19
19
|
- `docs/vim_diff.md`
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## 直近の優先順(推奨)
|
|
22
|
+
|
|
23
|
+
1. Vim 互換性の精度向上(word/paste/visual/scroll 細部)
|
|
24
|
+
2. 永続化(`undofile` / session)
|
|
25
|
+
3. option system の残件(P0/P1 の `PARTIAL` を詰める)
|
|
26
|
+
4. P2 option(永続化/外部連携系)
|
|
27
|
+
5. P3 長期機能(LSP / fuzzy finder)
|
|
28
|
+
|
|
29
|
+
## 次の1週間の実装順(提案・改訂版)
|
|
30
|
+
|
|
31
|
+
### Day 1: quickfix を「使える入口」までつなぐ
|
|
32
|
+
|
|
33
|
+
- `[DONE]` `quickfix` / `location list` バッファで `Enter` ジャンプ
|
|
34
|
+
- qf 行フォーマット -> location 解決
|
|
35
|
+
- cursor 行の項目へ移動(window 復帰含む)
|
|
36
|
+
- docs 更新
|
|
37
|
+
- `docs/command.md`, `docs/vim_diff.md`
|
|
38
|
+
|
|
39
|
+
### Day 2: quickfix 入口コマンド(P0)
|
|
40
|
+
|
|
41
|
+
- `:grep`, `:lgrep`(外部 grep -> qf/loclist)
|
|
42
|
+
- `:cfile`, `:lfile`(ファイルから qf/loclist 読み込み)
|
|
43
|
+
- `:make` は `makeprg/errorformat` 最小の雛形まで(全部入りは後回し)
|
|
44
|
+
- まずは「動く最小」優先(精度は P2 option 実装と一緒に詰める)
|
|
45
|
+
|
|
46
|
+
### Day 3: Ex 基盤(range + substitute flags の前段)
|
|
47
|
+
|
|
48
|
+
- Ex 範囲指定(address / range)の基礎
|
|
49
|
+
- `.` / `%` / 行番号
|
|
50
|
+
- `:1,10d`, `:%y`, `:.,$...`
|
|
51
|
+
- `:substitute` の range 連携準備(既存 `:%s` パーサの拡張)
|
|
52
|
+
|
|
53
|
+
### Day 4: `:substitute` フラグ拡張 + scroll 細部
|
|
54
|
+
|
|
55
|
+
- `:substitute` フラグ(`i`, `I`, `n`, `e`, `c` の主要)
|
|
56
|
+
- `Ctrl-e` / `Ctrl-y` / `Ctrl-d` / `Ctrl-u` の細部調整
|
|
57
|
+
- count, 端での挙動, row_offset/cursor_y の整合
|
|
58
|
+
- docs 更新
|
|
59
|
+
- `docs/command.md`, `docs/binding.md`
|
|
60
|
+
|
|
61
|
+
### Day 5: paste / visual の互換性詰め
|
|
62
|
+
|
|
63
|
+
- `p`, `P` のカーソル位置ルール調整(charwise / linewise)
|
|
64
|
+
- Visual mode の端点/inclusive ルール整理
|
|
65
|
+
- Visual block の最小 blockwise paste(`p`)
|
|
66
|
+
- テスト追加(操作シナリオ + snapshot)
|
|
67
|
+
|
|
68
|
+
### Day 6: word motion 精度 + `iskeyword` 連携の詰め
|
|
69
|
+
|
|
70
|
+
- `w`, `b`, `e` の境界判定を Vim に寄せる
|
|
71
|
+
- `iskeyword` との整合(word motion / text object / `*`)
|
|
72
|
+
- 日本語/記号混在ケースの回帰テスト追加
|
|
73
|
+
|
|
74
|
+
### Day 7: 永続化の第一段(undofile 先行)
|
|
75
|
+
|
|
76
|
+
- `undofile`, `undodir` option 実体化
|
|
77
|
+
- 保存時/終了時の undo dump(最小)
|
|
78
|
+
- ファイル再オープン時の undo restore(path ベース)
|
|
79
|
+
- エラー時の degrade(読めない/壊れた undo file は無視してメッセージ)
|
|
80
|
+
- docs 更新
|
|
81
|
+
- `docs/config.md`, `docs/spec.md`, `docs/vim_diff.md`
|
|
82
|
+
|
|
83
|
+
### 次の週に回す候補(この週の続き)
|
|
84
|
+
|
|
85
|
+
- session file(`-S [session]` placeholder 実体化)
|
|
86
|
+
- `wrap` / `linebreak` / `breakindent` / `showbreak` の整合性
|
|
87
|
+
- `wildmenu` / `completeopt` / `pumheight` の UI コンポーネント寄せ
|
|
88
|
+
- arglist(複数ファイル通常起動 + `:args/:next/:prev`)
|
|
89
|
+
|
|
90
|
+
### この順番の理由(依存)
|
|
91
|
+
|
|
92
|
+
- `quickfix` は既に内部モデルがあるので、入口(`Enter`, `:grep` 系)を先に作ると体験改善が大きい
|
|
93
|
+
- Ex range と `:substitute` flags は同じパーサ/Dispatcher 周辺を触るので連続でやる方が安全
|
|
94
|
+
- `paste/visual/word motion` は互換性テストをまとめて増やしやすい
|
|
95
|
+
- `undofile` は session より独立度が高く、先に基盤化するとその後の作業でも安全
|
|
96
|
+
|
|
97
|
+
## TODO Vim 互換性の精度向上(精度・挙動の詰め)
|
|
22
98
|
|
|
23
99
|
- Vim 互換性の精度向上(word motion / paste / visual 挙動)
|
|
24
100
|
- `w`, `b`, `e` の境界判定を Vim に寄せる
|
|
25
101
|
- `p`, `P` のカーソル位置ルールを調整
|
|
26
102
|
- Visual mode の端点/inclusive ルールを整理
|
|
103
|
+
- Visual block の blockwise paste / text object
|
|
104
|
+
- `Ctrl-e` / `Ctrl-y` / `Ctrl-d` / `Ctrl-u` の細部挙動(Vim との差分詰め)
|
|
105
|
+
|
|
106
|
+
## TODO Vim 差分で実用上効く追加機能(未着手)
|
|
107
|
+
|
|
108
|
+
### P0: すぐ効く(既存機能の入口/使い勝手を補う)
|
|
109
|
+
|
|
110
|
+
- quickfix / location list の入口コマンド拡張
|
|
111
|
+
- `:grep`, `:lgrep`(外部 grep -> qf/loclist)
|
|
112
|
+
- `:make`(`makeprg` + `errorformat` の最小連携)
|
|
113
|
+
- `:cfile`, `:lfile`(ファイルから qf/loclist 読み込み)
|
|
114
|
+
- Ex 範囲指定(address / range)の基礎
|
|
115
|
+
- `:1,10d`, `:%y`, `:.,$s/.../.../` など
|
|
116
|
+
- まずは行範囲 + 現在行 (`.`) + 全体 (`%`) を優先
|
|
117
|
+
- `:substitute` フラグ拡張(Ruby regex 方針のまま)
|
|
118
|
+
- `c`, `i`, `I`, `n`, `e` などの主要フラグ
|
|
119
|
+
- range 指定との組み合わせ
|
|
120
|
+
|
|
121
|
+
### P1: Vim 運用でよく触る基盤(あると詰まりにくい)
|
|
122
|
+
|
|
123
|
+
- arglist(複数ファイル通常起動 + 操作)
|
|
124
|
+
- 複数ファイル引数(通常起動)
|
|
125
|
+
- `:args`, `:next`, `:prev`, `:first`, `:last`
|
|
126
|
+
- `alternate buffer (#)` との整合
|
|
127
|
+
- `Ctrl-w` window 操作の拡張
|
|
128
|
+
- `Ctrl-w c`(window close)
|
|
129
|
+
- `Ctrl-w o`(only / 他 window を閉じる)
|
|
130
|
+
- `Ctrl-w =`(equalize)
|
|
131
|
+
- resize 系(`+`, `-`, `<`, `>`, `_`, `|` の最小)
|
|
132
|
+
- `:set` 構文の拡張
|
|
133
|
+
- `+=`, `-=`, `^=`, `&`, `<`
|
|
134
|
+
- option 名短縮(例: `nu`, `ts`)
|
|
135
|
+
- `:set all` / もう少し見やすい一覧表示
|
|
136
|
+
- register 拡張(実用寄り)
|
|
137
|
+
- `"-`(small delete register)
|
|
138
|
+
- delete/yank の register 更新ルールを Vim に寄せる
|
|
139
|
+
|
|
140
|
+
### P2: 中長期で効くが依存が広い
|
|
141
|
+
|
|
142
|
+
- tags / tag jump(最小)
|
|
143
|
+
- `Ctrl-]`, `Ctrl-t`, `:tag`, `:tselect`
|
|
144
|
+
- tags file 読み込み + jump stack
|
|
145
|
+
- Ex の追加制御コマンド
|
|
146
|
+
- `:global` / `:vglobal`
|
|
147
|
+
- `:normal` / `:normal!`
|
|
148
|
+
- folds(最小)
|
|
149
|
+
- `za`, `zc`, `zo`
|
|
150
|
+
- 表示・カーソル移動・検索の整合
|
|
27
151
|
|
|
28
152
|
## TODO 永続化
|
|
29
153
|
|
|
30
154
|
- 永続 undo / セッション
|
|
31
|
-
-
|
|
32
|
-
- session file(開いている buffer / cursor
|
|
155
|
+
- `undofile` / `undodir` 実体(保存・復元)
|
|
156
|
+
- session file(開いている buffer / cursor 位置 / tab/window レイアウト)
|
|
157
|
+
- `-S [session]` の実体化(現在 placeholder)
|
|
33
158
|
|
|
34
159
|
## TODO 長期(規模大)
|
|
35
160
|
|
|
36
161
|
### P3: 長期(人気はあるが規模大)
|
|
37
162
|
|
|
38
|
-
- LSP / diagnostics(中長期)
|
|
39
|
-
- language server 起動管理
|
|
40
|
-
- diagnostics 表示
|
|
41
|
-
- definition / references ジャンプ
|
|
42
|
-
|
|
43
163
|
- LSP diagnostics + jump(最小)
|
|
44
164
|
- 効果: 高
|
|
45
165
|
- コスト: 高
|
|
@@ -56,8 +176,65 @@
|
|
|
56
176
|
- grep/検索基盤
|
|
57
177
|
- preview(任意)
|
|
58
178
|
|
|
59
|
-
##
|
|
179
|
+
## TODO option system 拡張(残件のみ)
|
|
180
|
+
|
|
181
|
+
注記:
|
|
182
|
+
- 実装済みの `number`, `relativenumber`, `ignorecase`, `smartcase`, `hlsearch`, `tabstop`, `filetype` は除外
|
|
183
|
+
- 完了済みの option 実装は `docs/done.md` と `docs/config.md` を参照
|
|
184
|
+
- ここには `PARTIAL` / 未着手のみを残す
|
|
185
|
+
|
|
186
|
+
### P0: 日常編集の体験差が大きい(残件)
|
|
187
|
+
|
|
188
|
+
- `[PARTIAL]` `wrap`(長い行を折り返す)
|
|
189
|
+
- `[PARTIAL]` `linebreak`(単語境界寄りで折り返す)
|
|
190
|
+
- `[PARTIAL]` `breakindent`(折り返し行のインデント)
|
|
191
|
+
- 折り返し時の検索ハイライト/Visual/カーソル表示の整合性
|
|
192
|
+
- `showbreak` / `breakindent` との組み合わせ挙動
|
|
193
|
+
|
|
194
|
+
### P1: 使う人が多い / UI と編集体験を整える(残件)
|
|
195
|
+
|
|
196
|
+
- `[PARTIAL]` `showbreak`(折り返し行の先頭表示)
|
|
197
|
+
- `[PARTIAL]` `signcolumn`(サイン列の表示: `yes` の幅予約のみ)
|
|
198
|
+
- `[PARTIAL]` `matchtime`(`showmatch` のメッセージ表示時間に反映)
|
|
199
|
+
- `[PARTIAL]` `backspace`(Insert mode での BS 挙動: `start/eol` 最小)
|
|
200
|
+
- `[PARTIAL]` `whichwrap`(左右移動が行をまたぐ条件: `h/l` 最小)
|
|
201
|
+
- `[PARTIAL]` `virtualedit`(`onemore`, `all` の最小: 左右移動と描画)
|
|
202
|
+
- `[PARTIAL]` `iskeyword`(単語境界の定義: word motion / 補完 / 一部 textobj)
|
|
203
|
+
- `[PARTIAL]` `completeopt`(補完 UI の挙動: `menu/menuone/noselect` の最小)
|
|
204
|
+
- `[PARTIAL]` `pumheight`(補完候補 UI の高さ: メッセージ表示件数に反映)
|
|
205
|
+
- `[PARTIAL]` `wildmode`(コマンドライン補完の挙動: `list/full/longest` の最小)
|
|
206
|
+
- `[PARTIAL]` `wildmenu`(コマンドライン補完 UI: メッセージ行ベースの簡易表示)
|
|
207
|
+
- `[PARTIAL]` `path`(`gf` の最小パス探索)
|
|
208
|
+
- `[PARTIAL]` `suffixesadd`(`gf` の拡張子補完)
|
|
209
|
+
|
|
210
|
+
補足(P1 実装の観点):
|
|
211
|
+
- `PARTIAL` の定義は `docs/config.md` 側で詳細化する
|
|
212
|
+
- `signcolumn` は diagnostics/LSP と一緒に拡張する方が効率がよい
|
|
213
|
+
- `wildmenu` / `completeopt` / `pumheight` は UI コンポーネント化でまとめて詰める
|
|
214
|
+
|
|
215
|
+
### P2: 実用性は高いが依存が増えやすい / 実装範囲が広い
|
|
216
|
+
|
|
217
|
+
- `undofile`(永続 undo の ON/OFF)
|
|
218
|
+
- `undodir`(永続 undo の保存先)
|
|
219
|
+
- `updatetime`(アイドル更新間隔。診断/自動処理にも関係)
|
|
220
|
+
- `swapfile`(swap file の ON/OFF)
|
|
221
|
+
- `backup`(バックアップ保存)
|
|
222
|
+
- `writebackup`(書き込み時バックアップ)
|
|
223
|
+
- `autoread`(外部更新の再読込)
|
|
224
|
+
- `[PARTIAL]` `autowrite`(特定コマンド時の自動保存: buffer切替/`:e`/`gf`/`:tabnew` の最小)
|
|
225
|
+
- `confirm`(確認ダイアログ相当の確認フロー)
|
|
226
|
+
- `grepprg`(外部 grep コマンド)
|
|
227
|
+
- `grepformat`(grep 結果のパース形式)
|
|
228
|
+
- `makeprg`(外部 build コマンド)
|
|
229
|
+
- `errorformat`(quickfix のパース形式)
|
|
230
|
+
- `formatoptions`(自動整形/コメント継続の挙動)
|
|
231
|
+
- `textwidth`(自動改行幅)
|
|
232
|
+
- `spell`(スペルチェック ON/OFF)
|
|
233
|
+
- `spelllang`(スペルチェック言語)
|
|
234
|
+
- `[PARTIAL]` `termguicolors`(検索/`cursorline`/`colorcolumn` 背景色の最小 truecolor 対応)
|
|
235
|
+
|
|
236
|
+
## メモ(実装方針)
|
|
60
237
|
|
|
61
238
|
- Vim 完全互換の CLI を目指すより、よく使うフラグから互換寄りに実装する
|
|
62
239
|
- Ruby DSL 前提なので、Vim の `-u NONE` / `-U NONE` は RuVim 向けに意味を再定義してよい
|
|
63
|
-
|
|
240
|
+
- UI/Unicode/折り返し系は `TextMetrics` と `Screen` の責務を増やしすぎないように分割する
|
data/docs/tutorial.md
CHANGED
|
@@ -27,7 +27,7 @@ ruvim path/to/file.txt
|
|
|
27
27
|
- `-S Session.vim`(session startup placeholder。現状は未実装メッセージのみ)
|
|
28
28
|
- `-R`(readonly で開く。現在バッファの `:w` を拒否)
|
|
29
29
|
- `-M`(modifiable off 相当。編集操作を拒否し、あわせて readonly)
|
|
30
|
-
- `-Z`(restricted mode。config/ftplugin を読まず、`:ruby` を無効化)
|
|
30
|
+
- `-Z`(restricted mode。config/ftplugin を読まず、`:ruby` と `:!` を無効化)
|
|
31
31
|
- `-n`(現状 no-op。将来の swap/永続機能向け互換フラグ)
|
|
32
32
|
- `-o[N]` / `-O[N]` / `-p[N]`(複数ファイルを split / vsplit / tab で開く)
|
|
33
33
|
- `-V[N]` / `--verbose[=N]`(起動/設定/Ex のログを stderr に出す)
|
data/docs/vim_diff.md
CHANGED
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
- `:w`, `:q`, `:wq`, `:e`, `:buffer`, `:bnext`, `:bprev`, `:ls` などはあるが一部のみ
|
|
30
30
|
- quickfix / location list は最小実装のみ
|
|
31
31
|
- `:vimgrep`, `:lvimgrep`, `:copen/:cnext`, `:lopen/:lnext` など
|
|
32
|
-
-
|
|
32
|
+
- `qf/location list` 一覧バッファで `Enter` による選択ジャンプは対応
|
|
33
|
+
- `:grep`, `:make`, `:cfile`, `:lgrep` は未実装
|
|
33
34
|
- `:command` はあるが、現状は「Ex 文字列エイリアス展開」に近い簡易実装
|
|
34
35
|
- `:ruby` はあるが、Vim の `:ruby` 機能互換ではなく RuVim 独自の Ruby eval 入口
|
|
35
36
|
- `:w!` は現状 `:w` とほぼ同じ(権限昇格や readonly 強制保存の完全な意味は未実装)
|