ruvim 0.1.0 → 0.3.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/.github/workflows/test.yml +4 -0
- data/AGENTS.md +84 -0
- data/CLAUDE.md +1 -0
- data/docs/binding.md +29 -0
- data/docs/command.md +101 -0
- data/docs/config.md +203 -84
- data/docs/done.md +21 -0
- data/docs/lib_cleanup_report.md +79 -0
- data/docs/plugin.md +13 -15
- data/docs/spec.md +195 -33
- data/docs/todo.md +183 -10
- data/docs/tutorial.md +1 -1
- data/docs/vim_diff.md +94 -171
- data/lib/ruvim/app.rb +1543 -172
- data/lib/ruvim/buffer.rb +35 -1
- data/lib/ruvim/cli.rb +12 -3
- data/lib/ruvim/clipboard.rb +2 -0
- data/lib/ruvim/command_invocation.rb +3 -1
- data/lib/ruvim/command_line.rb +2 -0
- data/lib/ruvim/command_registry.rb +2 -0
- data/lib/ruvim/config_dsl.rb +2 -0
- data/lib/ruvim/config_loader.rb +21 -5
- data/lib/ruvim/context.rb +2 -7
- data/lib/ruvim/dispatcher.rb +153 -13
- data/lib/ruvim/display_width.rb +28 -2
- data/lib/ruvim/editor.rb +622 -69
- data/lib/ruvim/ex_command_registry.rb +2 -0
- data/lib/ruvim/global_commands.rb +1386 -114
- data/lib/ruvim/highlighter.rb +16 -21
- data/lib/ruvim/input.rb +52 -29
- data/lib/ruvim/keymap_manager.rb +83 -0
- data/lib/ruvim/keyword_chars.rb +48 -0
- data/lib/ruvim/lang/base.rb +25 -0
- data/lib/ruvim/lang/csv.rb +18 -0
- data/lib/ruvim/lang/json.rb +18 -0
- data/lib/ruvim/lang/markdown.rb +170 -0
- data/lib/ruvim/lang/ruby.rb +236 -0
- data/lib/ruvim/lang/scheme.rb +44 -0
- data/lib/ruvim/lang/tsv.rb +19 -0
- data/lib/ruvim/rich_view/markdown_renderer.rb +248 -0
- data/lib/ruvim/rich_view/table_renderer.rb +176 -0
- data/lib/ruvim/rich_view.rb +93 -0
- data/lib/ruvim/screen.rb +851 -119
- data/lib/ruvim/terminal.rb +18 -1
- data/lib/ruvim/text_metrics.rb +28 -0
- data/lib/ruvim/version.rb +2 -2
- data/lib/ruvim/window.rb +37 -10
- data/lib/ruvim.rb +15 -0
- data/test/app_completion_test.rb +174 -0
- data/test/app_dot_repeat_test.rb +13 -0
- data/test/app_motion_test.rb +110 -2
- data/test/app_scenario_test.rb +998 -0
- data/test/app_startup_test.rb +197 -0
- data/test/arglist_test.rb +113 -0
- data/test/buffer_test.rb +49 -30
- data/test/config_loader_test.rb +37 -0
- data/test/dispatcher_test.rb +438 -0
- data/test/display_width_test.rb +18 -0
- data/test/editor_register_test.rb +23 -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/highlighter_test.rb +121 -0
- data/test/indent_test.rb +201 -0
- data/test/input_screen_integration_test.rb +65 -14
- data/test/markdown_renderer_test.rb +279 -0
- data/test/on_save_hook_test.rb +150 -0
- data/test/rich_view_test.rb +478 -0
- data/test/screen_test.rb +470 -0
- data/test/window_test.rb +26 -0
- metadata +37 -2
data/docs/config.md
CHANGED
|
@@ -61,90 +61,209 @@ setglobal "tabstop=8"
|
|
|
61
61
|
|
|
62
62
|
実装の定義元は `lib/ruvim/editor.rb` の `RuVim::Editor::OPTION_DEFS` です。
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
-
|
|
68
|
-
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
-
|
|
72
|
-
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
-
|
|
80
|
-
-
|
|
81
|
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
-
|
|
93
|
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
-
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
-
|
|
112
|
-
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
-
|
|
119
|
-
-
|
|
120
|
-
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
-
|
|
124
|
-
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
-
|
|
130
|
-
-
|
|
131
|
-
|
|
132
|
-
-
|
|
133
|
-
- `
|
|
134
|
-
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
-
|
|
141
|
-
-
|
|
142
|
-
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
-
|
|
146
|
-
-
|
|
147
|
-
|
|
64
|
+
補足:
|
|
65
|
+
- `DONE` / `PARTIAL` / `定義のみ` は、RuVim 内での実装の反映度を示します(Vim 完全互換度ではありません)
|
|
66
|
+
- `PARTIAL` は「主要な場面では効くが、Vim の細部互換までは未実装」の意味です
|
|
67
|
+
|
|
68
|
+
### Window-local options
|
|
69
|
+
|
|
70
|
+
- `number` (`bool`, default `false`) [`DONE`]
|
|
71
|
+
- 行番号表示を有効化します。
|
|
72
|
+
- `Screen` の行番号ガター描画に反映されます。
|
|
73
|
+
|
|
74
|
+
- `relativenumber` (`bool`, default `false`) [`DONE`]
|
|
75
|
+
- 相対行番号を表示します。
|
|
76
|
+
- `number` 併用時は current line を絶対行番号で表示します。
|
|
77
|
+
|
|
78
|
+
- `wrap` (`bool`, default `true`) [`PARTIAL`]
|
|
79
|
+
- 長い行を画面幅で折り返して表示します。
|
|
80
|
+
- 最小実装として描画ベースで折り返します。Vim のスクロール/カーソル互換は未完成です。
|
|
81
|
+
|
|
82
|
+
- `linebreak` (`bool`, default `false`) [`PARTIAL`]
|
|
83
|
+
- `wrap` 時に空白位置を優先して折り返します。
|
|
84
|
+
- 現状は簡易な空白ベース判定です。
|
|
85
|
+
|
|
86
|
+
- `breakindent` (`bool`, default `false`) [`PARTIAL`]
|
|
87
|
+
- `wrap` の継続行に元行のインデントを反映します。
|
|
88
|
+
- 現状は先頭空白の簡易再利用です。
|
|
89
|
+
|
|
90
|
+
- `cursorline` (`bool`, default `false`) [`DONE`]
|
|
91
|
+
- 現在行の背景ハイライトを有効化します。
|
|
92
|
+
- 検索/選択/カーソル反転より優先度は低く描画されます。
|
|
93
|
+
|
|
94
|
+
- `scrolloff` (`int`, default `0`) [`DONE`]
|
|
95
|
+
- 縦スクロール時にカーソル上下の余白行数を維持します。
|
|
96
|
+
- `Window#ensure_visible` に反映されます。
|
|
97
|
+
|
|
98
|
+
- `sidescrolloff` (`int`, default `0`) [`DONE`]
|
|
99
|
+
- 横スクロール時にカーソル左右の余白桁数を維持します。
|
|
100
|
+
- 表示幅ベースで計算されます(全角/タブを考慮)。
|
|
101
|
+
|
|
102
|
+
- `numberwidth` (`int`, default `4`) [`DONE`]
|
|
103
|
+
- 行番号列の最小幅を指定します。
|
|
104
|
+
- `number` / `relativenumber` のガター幅計算に反映されます。
|
|
105
|
+
|
|
106
|
+
- `colorcolumn` (`string`, default `nil`) [`DONE`]
|
|
107
|
+
- 桁ガイド列を背景色で表示します。
|
|
108
|
+
- 現状は `80` や `80,100` のような数値列指定のみ対応です。
|
|
109
|
+
|
|
110
|
+
- `signcolumn` (`string`, default `"auto"`) [`PARTIAL`]
|
|
111
|
+
- サイン列の表示方針を指定します。
|
|
112
|
+
- 現状は `yes` / `yes:N` の幅予約に対応する最小実装です(サイン自体の描画は未実装)。
|
|
113
|
+
|
|
114
|
+
- `list` (`bool`, default `false`) [`PARTIAL`]
|
|
115
|
+
- 不可視文字を可視化します。
|
|
116
|
+
- 現状は `listchars` と組み合わせた描画の最小対応です。
|
|
117
|
+
|
|
118
|
+
- `listchars` (`string`, default `"tab:>-,trail:-,nbsp:+"`) [`PARTIAL`]
|
|
119
|
+
- 不可視文字の表示記号を指定します。
|
|
120
|
+
- 現状は `tab`, `trail`, `nbsp` のみ使用します。
|
|
121
|
+
|
|
122
|
+
- `showbreak` (`string`, default `">"`) [`PARTIAL`]
|
|
123
|
+
- `wrap` 継続行の先頭に表示する文字列です。
|
|
124
|
+
- 現状は描画にのみ反映されます。
|
|
125
|
+
|
|
126
|
+
### Global options
|
|
127
|
+
|
|
128
|
+
- `showmatch` (`bool`, default `false`) [`PARTIAL`]
|
|
129
|
+
- 閉じ括弧入力時に対応括弧のフィードバックを出します。
|
|
130
|
+
- 現状は Vim の一時ジャンプ/点滅ではなく、`match` メッセージ表示です。
|
|
131
|
+
|
|
132
|
+
- `matchtime` (`int`, default `5`) [`PARTIAL`]
|
|
133
|
+
- `showmatch` の一時メッセージ表示時間(0.1秒単位)です。
|
|
134
|
+
- 現状は `match` メッセージの自動消去時間に反映されます。
|
|
135
|
+
|
|
136
|
+
- `whichwrap` (`string`, default `""`) [`PARTIAL`]
|
|
137
|
+
- 左右移動が行をまたぐ条件を指定します。
|
|
138
|
+
- 現状は `h` / `l`、左右矢印(`left` / `right`、`<` / `>`)の最小対応です。
|
|
139
|
+
|
|
140
|
+
- `virtualedit` (`string`, default `""`) [`PARTIAL`]
|
|
141
|
+
- 実文字のない位置へのカーソル移動可否を指定します。
|
|
142
|
+
- 現状は `onemore` と `all` の最小対応(主に左右移動と描画)です。
|
|
143
|
+
|
|
144
|
+
- `ignorecase` (`bool`, default `false`) [`DONE`]
|
|
145
|
+
- 検索/置換の大文字小文字を無視します。
|
|
146
|
+
- `smartcase` と組み合わせて挙動が変わります。
|
|
147
|
+
|
|
148
|
+
- `smartcase` (`bool`, default `false`) [`DONE`]
|
|
149
|
+
- `ignorecase` 有効時に、パターンに大文字を含む場合だけ case-sensitive にします。
|
|
150
|
+
|
|
151
|
+
- `hlsearch` (`bool`, default `true`) [`DONE`]
|
|
152
|
+
- 直前検索パターンのマッチを画面上でハイライトします。
|
|
153
|
+
|
|
154
|
+
- `incsearch` (`bool`, default `false`) [`PARTIAL`]
|
|
155
|
+
- `/` `?` の入力中に逐次検索プレビューを行います。
|
|
156
|
+
- 現状はカーソル移動中心の最小実装で、Esc で元位置に戻ります。
|
|
157
|
+
|
|
158
|
+
- `splitbelow` (`bool`, default `false`) [`DONE`]
|
|
159
|
+
- `:split` 時に現在 window の下側へ分割を挿入します。
|
|
160
|
+
|
|
161
|
+
- `splitright` (`bool`, default `false`) [`DONE`]
|
|
162
|
+
- `:vsplit` 時に現在 window の右側へ分割を挿入します。
|
|
163
|
+
|
|
164
|
+
- `hidden` (`bool`, default `false`) [`PARTIAL`]
|
|
165
|
+
- 未保存バッファを残したまま別バッファへ移動できるようにします。
|
|
166
|
+
- 現状は `:e`, `:buffer`, `:bnext`, `:bprev`, `:tabnew`, `gf` の主要経路で参照します。
|
|
167
|
+
|
|
168
|
+
- `autowrite` (`bool`, default `false`) [`PARTIAL`]
|
|
169
|
+
- 一部のバッファ切替/ファイル移動コマンドの前に、変更済みファイルバッファを自動保存します。
|
|
170
|
+
- 現状は `:buffer`, `:bnext`, `:bprev`, `:e {file}`, `:tabnew`, `gf` の主要経路で最小対応です。
|
|
171
|
+
- 無名バッファや特殊バッファは自動保存しません。
|
|
172
|
+
|
|
173
|
+
- `clipboard` (`string`, default `""`) [`PARTIAL`]
|
|
174
|
+
- unnamed register を `*` / `+` に連携する方針を指定します。
|
|
175
|
+
- 現状は `unnamed`, `unnamedplus` の基本連携のみ対応です。
|
|
176
|
+
|
|
177
|
+
- `timeoutlen` (`int`, default `1000`) [`DONE`]
|
|
178
|
+
- キーマップの保留入力待ち時間(ms)です。
|
|
179
|
+
- 曖昧なキーマップ解決のタイムアウトに使います。
|
|
180
|
+
|
|
181
|
+
- `ttimeoutlen` (`int`, default `50`) [`DONE`]
|
|
182
|
+
- 端末の ESC シーケンス待ち時間(ms)です。
|
|
183
|
+
- 矢印キー等の読み取りタイムアウトに使います。
|
|
184
|
+
|
|
185
|
+
- `backspace` (`string`, default `"indent,eol,start"`) [`PARTIAL`]
|
|
186
|
+
- Insert mode の Backspace が越えてよい境界を指定します。
|
|
187
|
+
- 現状は `start`, `eol`, `indent`, `2` の最小判定です(Vim 完全互換ではありません)。
|
|
188
|
+
|
|
189
|
+
- `completeopt` (`string`, default `"menu,menuone,noselect"`) [`PARTIAL`]
|
|
190
|
+
- Insert mode 補完 UI/選択挙動を指定します。
|
|
191
|
+
- 現状は `menu`, `menuone`, `noselect`, `noinsert` をメッセージ行ベースの簡易 UI に反映します。
|
|
192
|
+
|
|
193
|
+
- `pumheight` (`int`, default `10`) [`PARTIAL`]
|
|
194
|
+
- 補完候補 UI の最大表示件数です。
|
|
195
|
+
- 現状はメッセージ行ベースの補完候補表示件数に使います。
|
|
196
|
+
|
|
197
|
+
- `wildmode` (`string`, default `"full"`) [`PARTIAL`]
|
|
198
|
+
- コマンドライン補完の Tab 挙動を指定します。
|
|
199
|
+
- 現状は `longest`, `list`, `full` の最小対応です(`list:full` 形式も可)。
|
|
200
|
+
|
|
201
|
+
- `wildignore` (`string`, default `""`) [`DONE`]
|
|
202
|
+
- コマンドライン path 補完から除外するパターンを指定します。
|
|
203
|
+
- `File.fnmatch?` ベースで判定します。
|
|
204
|
+
|
|
205
|
+
- `wildignorecase` (`bool`, default `false`) [`DONE`]
|
|
206
|
+
- `wildignore` のパターンマッチを大文字小文字無視にします。
|
|
207
|
+
|
|
208
|
+
- `wildmenu` (`bool`, default `false`) [`PARTIAL`]
|
|
209
|
+
- コマンドライン補完候補の一覧表示 UI を有効化します。
|
|
210
|
+
- 現状はメッセージ行への簡易表示です(Vim の下部メニュー UI ではない)。
|
|
211
|
+
|
|
212
|
+
- `termguicolors` (`bool`, default `false`) [`PARTIAL`]
|
|
213
|
+
- truecolor ANSI シーケンスを使う描画を有効化します。
|
|
214
|
+
- 現状は検索ハイライト、`cursorline`、`colorcolumn` の背景色に最小反映されます。
|
|
215
|
+
|
|
216
|
+
### Buffer-local options
|
|
217
|
+
|
|
218
|
+
- `path` (`string`, default `nil`) [`PARTIAL`]
|
|
219
|
+
- `gf` などのファイル探索ディレクトリを指定します(`,` 区切り)。
|
|
220
|
+
- 現状は `gf` の最小探索に利用します(`file:line` の `line` ジャンプにも対応)。
|
|
221
|
+
- `lib/**` のような再帰探索(簡易)に対応します。
|
|
222
|
+
|
|
223
|
+
- `suffixesadd` (`string`, default `nil`) [`PARTIAL`]
|
|
224
|
+
- `gf` などで補完する拡張子候補を指定します(`,` 区切り)。
|
|
225
|
+
- 現状は `gf` の最小探索に利用します(`file:line` の `path` 部分に適用)。
|
|
226
|
+
|
|
227
|
+
- `textwidth` (`int`, default `0`) [`定義のみ`]
|
|
228
|
+
- 自動改行幅の指定です。
|
|
229
|
+
- 現状は値を保持できるだけで、自動整形には未接続です。
|
|
230
|
+
|
|
231
|
+
- `formatoptions` (`string`, default `nil`) [`定義のみ`]
|
|
232
|
+
- 自動整形/コメント継続の挙動を指定します。
|
|
233
|
+
- 現状は値を保持できるだけで、編集処理には未接続です。
|
|
234
|
+
|
|
235
|
+
- `expandtab` (`bool`, default `false`) [`DONE`]
|
|
236
|
+
- Insert mode の Tab 入力を空白に変換します。
|
|
237
|
+
- `softtabstop` / `tabstop` と組み合わせて空白数を決めます。
|
|
238
|
+
|
|
239
|
+
- `shiftwidth` (`int`, default `2`) [`PARTIAL`]
|
|
240
|
+
- インデント幅の基準です。
|
|
241
|
+
- 現状は `smartindent` の追加インデント幅で使用します。
|
|
242
|
+
|
|
243
|
+
- `softtabstop` (`int`, default `0`) [`PARTIAL`]
|
|
244
|
+
- Tab 入力/削除時の編集幅を指定します。
|
|
245
|
+
- 現状は Insert mode の Tab 入力と、`expandtab` 時の空白 Backspace(最小)で使用します。
|
|
246
|
+
|
|
247
|
+
- `autoindent` (`bool`, default `false`) [`DONE`]
|
|
248
|
+
- 改行時に前行の先頭インデントを引き継ぎます。
|
|
249
|
+
- Insert mode `Enter`、`o`/`O` に反映されます。
|
|
250
|
+
|
|
251
|
+
- `smartindent` (`bool`, default `false`) [`PARTIAL`]
|
|
252
|
+
- 簡易な自動インデントを行います。
|
|
253
|
+
- 現状は前行が `{` `[` `(` で終わる場合に `shiftwidth` 分の空白を追加します。
|
|
254
|
+
|
|
255
|
+
- `iskeyword` (`string`, default `nil`) [`PARTIAL`]
|
|
256
|
+
- 単語境界の定義を指定します。
|
|
257
|
+
- 現状は `w/b/e`、`*` / `#`、一部 text object、Insert 補完の単語抽出に反映します。
|
|
258
|
+
|
|
259
|
+
- `tabstop` (`int`, default `2`) [`DONE`]
|
|
260
|
+
- タブの表示幅です。
|
|
261
|
+
- 表示幅計算、描画、一部編集処理に使います。
|
|
262
|
+
|
|
263
|
+
- `filetype` (`string`, default `nil`) [`DONE`]
|
|
264
|
+
- filetype を示します。
|
|
265
|
+
- ftplugin 読み込み対象、filetype-local keymap、簡易 syntax highlight の判定に使います。
|
|
266
|
+
- 手動で変更した場合の ftplugin 再適用は現状未対応です。
|
|
148
267
|
|
|
149
268
|
## 制限(現状)
|
|
150
269
|
|
data/docs/done.md
CHANGED
|
@@ -30,12 +30,15 @@
|
|
|
30
30
|
- quickfix / location list(最小)
|
|
31
31
|
- Visual block(`Ctrl-v`、最小)
|
|
32
32
|
- `.` repeat の精度向上(operator + text object + macro 連携)
|
|
33
|
+
- `=` operator(自動インデント: `==`, `=j`, `=k`, `=G`, `=gg`, Visual `=`。Ruby filetype 対応)
|
|
33
34
|
|
|
34
35
|
## コマンド / 設計 / 拡張基盤
|
|
35
36
|
|
|
36
37
|
- `:command`(ユーザー定義 Ex コマンド)
|
|
37
38
|
- `:ruby` / `:rb`
|
|
38
39
|
- バッファ管理コマンド(`:ls`, `:buffers`, `:bnext`, `:bprev`, `:buffer`, `#`)
|
|
40
|
+
- arglist(引数リスト)管理コマンド(`:args`, `:next`, `:prev`, `:first`, `:last`)
|
|
41
|
+
- 複数ファイル起動時に全ファイルをバッファとして読み込む(`:ls` に表示)
|
|
39
42
|
- キーマップのレイヤー化(mode/global/buffer/filetype)
|
|
40
43
|
- option system(global / buffer-local / window-local, `:set` 系)
|
|
41
44
|
- ファイルタイプ検出と ftplugin
|
|
@@ -45,6 +48,19 @@
|
|
|
45
48
|
- block-based keymap DSL(`nmap/imap/map_global ... do |ctx, ...| end`)
|
|
46
49
|
- plugin 向け `ctx.editor / ctx.buffer / ctx.window` API リファレンス(未確定 API 注記つき)
|
|
47
50
|
|
|
51
|
+
## Rich mode / 構造化データ表示
|
|
52
|
+
|
|
53
|
+
- Rich View フレームワーク(filetype ごとのレンダラー登録)
|
|
54
|
+
- TSV/CSV テーブルレンダラー(列幅自動計算、CJK 対応、CSV quoted field パース)
|
|
55
|
+
- `:rich [format]` Ex コマンド(トグル)
|
|
56
|
+
- `gr` Normal mode キーバインド(トグル)
|
|
57
|
+
- filetype 検出に `.tsv` / `.csv` 追加
|
|
58
|
+
- Rich View → Rich mode へ変換(仮想バッファ方式から同一バッファ上のモード方式へ)
|
|
59
|
+
- Rich mode の横スクロール修正(`$` で行末に移動した際の縦揃えズレを解消)
|
|
60
|
+
- Markdown Rich mode(見出し・インライン装飾・テーブル罫線・コードブロック・HR・ブロック引用の ANSI レンダリング)
|
|
61
|
+
- `render_rich_view_line_sc` の ANSI エスケープシーケンス対応
|
|
62
|
+
- `ensure_visible_rich` の汎用化(`renderer.cursor_display_col` インターフェース)
|
|
63
|
+
|
|
48
64
|
## UI / 画面描画 / 端末挙動
|
|
49
65
|
|
|
50
66
|
- リサイズ対応(`SIGWINCH` + 即時再描画)
|
|
@@ -53,12 +69,14 @@
|
|
|
53
69
|
- コマンドライン改善(履歴 / 補完 / エラー表示)
|
|
54
70
|
- カーソル位置の強調表示
|
|
55
71
|
- 複数 window / split UI(`:split`, `:vsplit`, window 間移動)
|
|
72
|
+
- ネストしたウィンドウ分割(layout tree: vsplit→split でカラム内だけ上下分割)
|
|
56
73
|
- Tabpage(`:tabnew`, `:tabnext`, `:tabprev`)
|
|
57
74
|
- ヘルプ / コマンド一覧の read-only 仮想バッファ表示
|
|
58
75
|
- intro screen(Vim 風 welcome buffer)
|
|
59
76
|
- エラー表示の改善(最下段・強調表示)
|
|
60
77
|
- PageUp / PageDown 対応
|
|
61
78
|
- `:q` の window/tab/app クローズ挙動を Vim 寄りに調整
|
|
79
|
+
- hit-enter prompt(複数行メッセージ表示: `:ls`, `:args`, `:set`, `:command`)
|
|
62
80
|
|
|
63
81
|
## Unicode / 日本語 / 表示幅 / 座標系
|
|
64
82
|
|
|
@@ -69,15 +87,18 @@
|
|
|
69
87
|
- 表示幅ベース描画の共通化(`TextMetrics` 中心)
|
|
70
88
|
- 日本語/全角を含む操作の整合性確認(`w/b/e`, Visual yank, `p/P`)
|
|
71
89
|
- 描画回帰テストの追加(Unicode / wide char)
|
|
90
|
+
- `truncate` の表示幅計算を文字数ベースから `DisplayWidth` ベースに修正(全角文字を含むエラーメッセージでターミナルがスクロールするバグを修正)
|
|
72
91
|
|
|
73
92
|
## 品質 / テスト / CI / パフォーマンス
|
|
74
93
|
|
|
75
94
|
- テスト追加(Buffer / Dispatcher / Ex parser / KeymapManager)
|
|
76
95
|
- パフォーマンス改善(表示幅ベース水平スクロール / syntax cache)
|
|
96
|
+
- Insert mode ペースト高速化(stdin に pending input がある間はレンダリングをスキップしバッチ処理)
|
|
77
97
|
- rope/piece-table などのバッファ構造検討メモ(`docs/spec.md`)
|
|
78
98
|
- テスト基盤の拡張(結合テスト / snapshot / シナリオ)
|
|
79
99
|
- CI / 開発体験(GitHub Actions, `rake docs:check`, `rake ci`)
|
|
80
100
|
- シンタックスハイライト(最小)
|
|
101
|
+
- Markdown シンタックスハイライト(`Lang::Markdown` に抽出、通常モード + Rich mode で共有)
|
|
81
102
|
- 補完基盤(Ex 補完 / Insert mode 補完)
|
|
82
103
|
|
|
83
104
|
## CLI オプション(Vim 風・実装済み / placeholder 含む)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# lib/ Cleanup Report
|
|
2
|
+
|
|
3
|
+
このレポートは、`lib/` 配下のコードを対象に、性能面のホットスポットと冗長な実装を見直した内容をまとめたものです。
|
|
4
|
+
|
|
5
|
+
## 対象と方針
|
|
6
|
+
|
|
7
|
+
- 対象: `lib/` 配下の全ファイル(重点は描画・文字幅計算・入力/編集のホットパス)
|
|
8
|
+
- 方針:
|
|
9
|
+
- 挙動を変えない(または最小限)
|
|
10
|
+
- 依存追加なし
|
|
11
|
+
- 効果の大きいキャッシュ / 重複除去を優先
|
|
12
|
+
|
|
13
|
+
## 実施した改善
|
|
14
|
+
|
|
15
|
+
### 1. `iskeyword` 解析の共通化 + キャッシュ化
|
|
16
|
+
|
|
17
|
+
変更ファイル:
|
|
18
|
+
- `lib/ruvim/keyword_chars.rb`
|
|
19
|
+
- `lib/ruvim/app.rb`
|
|
20
|
+
- `lib/ruvim/global_commands.rb`
|
|
21
|
+
- `lib/ruvim.rb`
|
|
22
|
+
|
|
23
|
+
内容:
|
|
24
|
+
- `app.rb` と `global_commands.rb` に重複していた `iskeyword` 解析ロジックを `RuVim::KeywordChars` に切り出し
|
|
25
|
+
- 解析結果(文字クラス文字列 / Regex)を spec 文字列単位でキャッシュ
|
|
26
|
+
|
|
27
|
+
効果:
|
|
28
|
+
- 冗長コード削減
|
|
29
|
+
- `word motion`, `text object`, `*`, 補完などで繰り返し発生する `iskeyword` 解析コストを低減
|
|
30
|
+
|
|
31
|
+
### 2. `DisplayWidth` の codepoint 幅計算をキャッシュ化
|
|
32
|
+
|
|
33
|
+
変更ファイル:
|
|
34
|
+
- `lib/ruvim/display_width.rb`
|
|
35
|
+
- `test/display_width_test.rb`
|
|
36
|
+
|
|
37
|
+
内容:
|
|
38
|
+
- `tab` 以外の codepoint 幅計算をキャッシュ
|
|
39
|
+
- `RUVIM_AMBIGUOUS_WIDTH` 環境変数の値が変わった場合はキャッシュを自動破棄
|
|
40
|
+
- 初回/ENV変更時のキャッシュ初期化を明示化
|
|
41
|
+
|
|
42
|
+
効果:
|
|
43
|
+
- 描画 (`Screen`)
|
|
44
|
+
- 文字幅計算 (`TextMetrics`)
|
|
45
|
+
- カーソル位置計算
|
|
46
|
+
|
|
47
|
+
上記のホットパスで、同一文字の幅判定の再計算を削減
|
|
48
|
+
|
|
49
|
+
### 3. `Screen` の option 解析キャッシュ (`listchars`, `colorcolumn`)
|
|
50
|
+
|
|
51
|
+
変更ファイル:
|
|
52
|
+
- `lib/ruvim/screen.rb`
|
|
53
|
+
|
|
54
|
+
内容:
|
|
55
|
+
- `parse_listchars` を raw 文字列単位でキャッシュ
|
|
56
|
+
- `colorcolumn_display_cols` を raw 文字列単位でキャッシュ
|
|
57
|
+
- `render_cells` の未使用変数 (`idx`) を削除
|
|
58
|
+
|
|
59
|
+
効果:
|
|
60
|
+
- 行ごと描画時に毎回 `split(',')` / parse していた処理を削減
|
|
61
|
+
- 描画ホットパスの定数処理を軽量化
|
|
62
|
+
|
|
63
|
+
## 動作確認
|
|
64
|
+
|
|
65
|
+
- `rake test`
|
|
66
|
+
- `154 runs, 494 assertions, 0 failures`
|
|
67
|
+
|
|
68
|
+
## 変更の性質(互換性)
|
|
69
|
+
|
|
70
|
+
- 基本的に挙動は維持
|
|
71
|
+
- `DisplayWidth` のキャッシュ導入に伴い、`RUVIM_AMBIGUOUS_WIDTH` 変更時の追従をテストで保証
|
|
72
|
+
|
|
73
|
+
## 今後の改善候補(今回未着手)
|
|
74
|
+
|
|
75
|
+
- `Screen` の `effective_option(...)` 呼び出しのフレーム内キャッシュ(window/buffer単位)
|
|
76
|
+
- `app.rb` の `completeopt` / `wildmode` / `backspace` など CSV option 解析の共通化 + キャッシュ
|
|
77
|
+
- `GlobalCommands` の `whichwrap` / `virtualedit` / `path` / `suffixesadd` 解析のキャッシュ
|
|
78
|
+
- `TextMetrics.screen_col_for_char_index` の部分再利用(長い行での O(n) 再計算削減)
|
|
79
|
+
|
data/docs/plugin.md
CHANGED
|
@@ -83,9 +83,13 @@ imap "jk", "ui.clear_message"
|
|
|
83
83
|
|
|
84
84
|
- 用途:
|
|
85
85
|
- 汎用のキーバインド定義
|
|
86
|
+
- `mode: nil` で最下位フォールバック map を定義
|
|
86
87
|
- 登録先:
|
|
87
88
|
- `mode:` を指定した場合: その mode の map
|
|
88
89
|
- `mode: nil` の場合: `global map`(最下位フォールバック)
|
|
90
|
+
- 実用上の目安:
|
|
91
|
+
- 通常は `nmap` / `imap` を使う方が分かりやすい
|
|
92
|
+
- `map_global` は「複数 mode で共有したい」「フォールバックを置きたい」場合向け
|
|
89
93
|
- 例:
|
|
90
94
|
|
|
91
95
|
```ruby
|
|
@@ -206,6 +210,10 @@ ex_command_call "Hello", "user.hello", desc: "Run hello"
|
|
|
206
210
|
|
|
207
211
|
同じキーが複数定義されている場合、上にあるものが優先されます。
|
|
208
212
|
|
|
213
|
+
補足:
|
|
214
|
+
- `map_global(..., mode: nil)` は最後に評価されるため、普段の設定では出番は少なめです。
|
|
215
|
+
- まず `nmap` / `imap` で定義し、必要なときだけ `map_global` を使うのがおすすめです。
|
|
216
|
+
|
|
209
217
|
## `command` と `ex_command` の違い
|
|
210
218
|
|
|
211
219
|
### `command`
|
|
@@ -504,19 +512,9 @@ ctx.window.clamp_to_buffer(ctx.buffer)
|
|
|
504
512
|
- 型: `RuVim::CommandInvocation` または `nil`
|
|
505
513
|
- 意味:
|
|
506
514
|
- 現在実行中のコマンド呼び出し情報
|
|
507
|
-
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
- 型: `Integer`
|
|
512
|
-
- 意味:
|
|
513
|
-
- Normal mode の count(なければ `1`)
|
|
514
|
-
|
|
515
|
-
### `ctx.bang?`
|
|
516
|
-
|
|
517
|
-
- 型: `true` / `false`
|
|
518
|
-
- 意味:
|
|
519
|
-
- Ex コマンドが `!` 付きで呼ばれたかどうか
|
|
515
|
+
- 主な参照:
|
|
516
|
+
- `ctx.invocation&.count`
|
|
517
|
+
- `ctx.invocation&.bang`
|
|
520
518
|
|
|
521
519
|
## block で使う引数(`argv`, `kwargs`, `bang`, `count`)
|
|
522
520
|
|
|
@@ -533,9 +531,9 @@ end
|
|
|
533
531
|
- `kwargs`
|
|
534
532
|
- keymap / 内部呼び出しの named args(Hash)
|
|
535
533
|
- `bang`
|
|
536
|
-
-
|
|
534
|
+
- Ex コマンドが `!` 付きで呼ばれたかどうか
|
|
537
535
|
- `count`
|
|
538
|
-
-
|
|
536
|
+
- Normal mode の count(なければ `1`)
|
|
539
537
|
|
|
540
538
|
## どこまで plugin と呼べる?
|
|
541
539
|
|