ruvim 0.2.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 +23 -0
- data/docs/command.md +85 -0
- data/docs/config.md +2 -2
- data/docs/done.md +21 -0
- data/docs/spec.md +157 -12
- data/docs/todo.md +1 -5
- data/docs/vim_diff.md +94 -172
- data/lib/ruvim/app.rb +882 -69
- 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 +2 -0
- data/lib/ruvim/context.rb +2 -0
- data/lib/ruvim/dispatcher.rb +143 -13
- data/lib/ruvim/display_width.rb +3 -0
- data/lib/ruvim/editor.rb +455 -71
- data/lib/ruvim/ex_command_registry.rb +2 -0
- data/lib/ruvim/global_commands.rb +890 -63
- data/lib/ruvim/highlighter.rb +16 -21
- data/lib/ruvim/input.rb +39 -28
- data/lib/ruvim/keymap_manager.rb +83 -0
- data/lib/ruvim/keyword_chars.rb +2 -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 +503 -106
- data/lib/ruvim/terminal.rb +18 -1
- data/lib/ruvim/text_metrics.rb +2 -0
- data/lib/ruvim/version.rb +1 -1
- data/lib/ruvim/window.rb +2 -0
- data/lib/ruvim.rb +14 -0
- data/test/app_completion_test.rb +73 -0
- data/test/app_dot_repeat_test.rb +13 -0
- data/test/app_motion_test.rb +13 -0
- data/test/app_scenario_test.rb +729 -1
- data/test/app_startup_test.rb +187 -0
- data/test/arglist_test.rb +113 -0
- data/test/buffer_test.rb +49 -30
- data/test/dispatcher_test.rb +322 -0
- data/test/editor_register_test.rb +23 -0
- data/test/highlighter_test.rb +121 -0
- data/test/indent_test.rb +201 -0
- data/test/input_screen_integration_test.rb +40 -2
- 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 +304 -0
- metadata +33 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c463658b0badbad140842446b82818bb797930372d4ccb8ff5e4275fbe627904
|
|
4
|
+
data.tar.gz: 92b3c9f004f8b075f603d4b8f2e4c48255ac0ef3eea768dd3e290495ab661033
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 46ec215ad18a1e72a62d54e0a95b24d87b7ee5b9093300a4597c8d96754ef4a1ce30f964101e1f2cd3dda8ecefcc74d7565602bb80f0eba6ce28cd2fb835a9ad
|
|
7
|
+
data.tar.gz: 49827d053ac4b9c827b0cbe86ebb00ff8a6609af4998ef5060a2407d0022f33b47327c11eaef4efc75aca03e0ddc07660a8bf12214db28e8c98f58c83c705b60
|
data/.github/workflows/test.yml
CHANGED
|
@@ -7,9 +7,13 @@ on:
|
|
|
7
7
|
jobs:
|
|
8
8
|
test:
|
|
9
9
|
runs-on: ubuntu-latest
|
|
10
|
+
strategy:
|
|
11
|
+
matrix:
|
|
12
|
+
ruby: ["3.2", "3.3", "3.4", "4.0"]
|
|
10
13
|
steps:
|
|
11
14
|
- uses: actions/checkout@v4
|
|
12
15
|
- uses: ruby/setup-ruby@v1
|
|
13
16
|
with:
|
|
17
|
+
ruby-version: ${{ matrix.ruby }}
|
|
14
18
|
bundler-cache: true
|
|
15
19
|
- run: bundle exec rake ci
|
data/AGENTS.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
This project is RuVim, a Vim-like editor written in Ruby. Always run the full test suite (`rake test` or equivalent) after making code changes and confirm all tests pass before committing.
|
|
2
|
+
|
|
3
|
+
* check docs/ to understand the specification
|
|
4
|
+
* docs/spec.md
|
|
5
|
+
* docs/todo.md
|
|
6
|
+
* When modifying the source code
|
|
7
|
+
* write tests first, then implement (test-first)
|
|
8
|
+
* update docs/
|
|
9
|
+
* catch up changes
|
|
10
|
+
* move completed tasks to done.md
|
|
11
|
+
* update CLAUDE.md Source Tree section if files were added, removed, or renamed
|
|
12
|
+
* commit it
|
|
13
|
+
* After committing, show the commit message
|
|
14
|
+
|
|
15
|
+
## Source Tree
|
|
16
|
+
|
|
17
|
+
### Architecture
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
CLI (exe/ruvim) → CLI.parse() → App.new() → App.run_ui_loop()
|
|
21
|
+
Input.read_key() → KeymapManager.resolve() → Dispatcher.dispatch()
|
|
22
|
+
→ GlobalCommands.<method>() → Editor state update → Screen.render() → Terminal.write()
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Core (lib/ruvim/)
|
|
26
|
+
|
|
27
|
+
| File | Description |
|
|
28
|
+
|------|-------------|
|
|
29
|
+
| `app.rb` | Main application loop, input handling, startup |
|
|
30
|
+
| `editor.rb` | Editor state: buffers, windows, options, registers, marks, modes |
|
|
31
|
+
| `buffer.rb` | Text buffer (lines, file I/O, encoding) |
|
|
32
|
+
| `window.rb` | View of a buffer (cursor, scroll, grapheme-aware movement) |
|
|
33
|
+
| `global_commands.rb` | All built-in command implementations (cursor, edit, search, visual, etc.) |
|
|
34
|
+
| `screen.rb` | Rendering: window layout, syntax highlight, line numbers, status line, wrap |
|
|
35
|
+
| `dispatcher.rb` | Routes commands; parses Ex ranges/substitute; shell execution |
|
|
36
|
+
| `keymap_manager.rb` | Key-to-command mapping with layers (filetype > buffer > mode > global) |
|
|
37
|
+
| `input.rb` | Raw keyboard input, ANSI escape sequence parsing |
|
|
38
|
+
| `terminal.rb` | Terminal I/O: raw mode, alternate screen, winsize |
|
|
39
|
+
| `command_line.rb` | Command-line text/cursor state |
|
|
40
|
+
| `command_registry.rb` | Normal/insert mode command registry (singleton) |
|
|
41
|
+
| `ex_command_registry.rb` | Ex command registry (singleton) |
|
|
42
|
+
| `cli.rb` | CLI argument parsing, `--help`, `--version` |
|
|
43
|
+
| `config_loader.rb` | Load `~/.config/ruvim/init.rb` and ftplugin |
|
|
44
|
+
| `config_dsl.rb` | User config DSL: `nmap`, `imap`, `set`, `command`, `colorscheme` |
|
|
45
|
+
| `display_width.rb` | Character display width (CJK, emoji, combining marks) |
|
|
46
|
+
| `text_metrics.rb` | Grapheme-aware text measurement and navigation |
|
|
47
|
+
| `keyword_chars.rb` | Word character definition (iskeyword) |
|
|
48
|
+
| `highlighter.rb` | Syntax highlighting dispatcher (delegates to lang modules) |
|
|
49
|
+
| `lang/base.rb` | Default lang module (no-op fallback for indent/dedent) |
|
|
50
|
+
| `lang/markdown.rb` | Markdown parsing, detection helpers, and syntax highlight colors |
|
|
51
|
+
| `lang/ruby.rb` | Ruby syntax highlighting via Prism lexer; auto-indent calculation |
|
|
52
|
+
| `lang/json.rb` | JSON syntax highlighting via regex |
|
|
53
|
+
| `lang/scheme.rb` | Scheme syntax highlighting via regex |
|
|
54
|
+
| `lang/tsv.rb` | TSV detection and RichView renderer registration |
|
|
55
|
+
| `lang/csv.rb` | CSV detection and RichView renderer registration |
|
|
56
|
+
| `clipboard.rb` | System clipboard access (xclip, pbpaste, etc.) |
|
|
57
|
+
| `context.rb` | Command handler context (editor, window, buffer, invocation) |
|
|
58
|
+
| `command_invocation.rb` | Single command invocation (id, argv, count, bang) |
|
|
59
|
+
| `rich_view.rb` | Rich view mode (TSV/CSV/Markdown rendering) |
|
|
60
|
+
| `rich_view/table_renderer.rb` | Table formatting with display-width-aware column alignment |
|
|
61
|
+
| `rich_view/markdown_renderer.rb` | Markdown rendering (headings, inline, tables, code blocks, HR) |
|
|
62
|
+
|
|
63
|
+
### Tests (test/)
|
|
64
|
+
|
|
65
|
+
- Unit: `buffer_test`, `window_test`, `editor_test`, `screen_test`, `display_width_test`, `text_metrics_test`, `keymap_manager_test`, `highlighter_test`, `dispatcher_test`, `config_*_test`, `indent_test`
|
|
66
|
+
- Integration: `app_scenario_test`, `app_motion_test`, `app_text_object_test`, `app_register_test`, `app_dot_repeat_test`, `app_completion_test`, `app_unicode_behavior_test`, `render_snapshot_test`, `on_save_hook_test`
|
|
67
|
+
- Helper: `test_helper.rb` (fresh_editor, Minitest)
|
|
68
|
+
|
|
69
|
+
### Docs (docs/)
|
|
70
|
+
|
|
71
|
+
`spec.md` (feature spec), `command.md`, `binding.md`, `config.md`, `tutorial.md`, `vim_diff.md`, `plugin.md`, `todo.md`, `done.md`
|
|
72
|
+
|
|
73
|
+
## Debugging (Lumitrace)
|
|
74
|
+
|
|
75
|
+
lumitrace is a tool that records runtime values of each Ruby expression.
|
|
76
|
+
When a test fails, read `lumitrace help` first, then use it.
|
|
77
|
+
Basic: `lumitrace -t exec rake test`
|
|
78
|
+
|
|
79
|
+
When fixing bugs, do NOT assume the first fix attempt is correct. After applying a fix, re-read the relevant code paths to verify the fix addresses the actual root cause, not a symptom. If the user says 'it hasn't changed' or equivalent, start fresh analysis from the failing behavior.
|
|
80
|
+
|
|
81
|
+
## misc
|
|
82
|
+
|
|
83
|
+
The user communicates in both English and Japanese. Respond in the same language the user uses. When the user gives feedback like 変わってないですよ ('it hasn't changed'), treat it as a bug report requiring re-analysis.
|
|
84
|
+
|
data/CLAUDE.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
AGENTS.md
|
data/docs/binding.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# RuVim キーバインディング一覧
|
|
2
2
|
|
|
3
|
+
実行時の現在有効な binding 一覧は `:bindings` で表示できます(layer: `buffer` / `filetype` / `app`)。
|
|
4
|
+
|
|
3
5
|
## Normal mode
|
|
4
6
|
|
|
5
7
|
- `h` : 左へ移動
|
|
@@ -47,6 +49,7 @@
|
|
|
47
49
|
- `'{mark}` / `` `{mark} `` : mark へ jump(行頭寄せ / 正確位置)
|
|
48
50
|
- `''` / `` `` `` : jumplist で前の位置へ jump(行頭寄せ / 正確位置)
|
|
49
51
|
- `r<char>` : 1文字置換
|
|
52
|
+
- `=` + motion / `==` : auto-indent(Ruby filetype 対応)
|
|
50
53
|
- `c` + motion / `cc` : change(削除して Insert mode)
|
|
51
54
|
- `ciw` / `caw` : 単語 text object change(簡易)
|
|
52
55
|
- `ci"` / `ca"` : quote text object change(簡易)
|
|
@@ -56,6 +59,7 @@
|
|
|
56
59
|
- `V` : Visual (linewise)
|
|
57
60
|
- `Ctrl-w w` : 次の window へ移動
|
|
58
61
|
- `Ctrl-w h/j/k/l` : window 間移動(split UI)
|
|
62
|
+
- `Shift+矢印キー` : window 間移動 or 分割(1ウィンドウ時は分割、2個以上なら移動)
|
|
59
63
|
- `u` : Undo
|
|
60
64
|
- `Ctrl-r` : Redo
|
|
61
65
|
- `.` : 直前変更の repeat(現状: `x`, `dd`, `d{motion}`, `p/P`, `r<char>`)
|
|
@@ -71,9 +75,15 @@
|
|
|
71
75
|
- `*` / `#` : カーソル下の単語検索(前/後)
|
|
72
76
|
- `g*` / `g#` : カーソル下の単語を部分一致検索(前/後)
|
|
73
77
|
- `gf` : カーソル下のファイル名を開く(最小。`path` / `suffixesadd` を参照)
|
|
78
|
+
- `file:line` 形式なら開いた後に `line` 行目へ移動
|
|
79
|
+
- `gr` : Rich mode をトグル(TSV/CSV をテーブル整形表示、同一バッファ上で動作)
|
|
74
80
|
- `Esc` : メッセージ/保留入力のクリア
|
|
81
|
+
- `Ctrl-z` : shell へ suspend(`fg` で復帰)
|
|
75
82
|
- `矢印キー` : 移動
|
|
76
83
|
- `PageUp` / `PageDown` : 画面単位で移動(概ね表示高さ - 1 行)
|
|
84
|
+
- `Q` : quickfix list を開く(`:copen` 相当)
|
|
85
|
+
- `]q` : 次の quickfix item へジャンプ(`:cnext` 相当)
|
|
86
|
+
- `[q` : 前の quickfix item へジャンプ(`:cprev` 相当)
|
|
77
87
|
- `Enter` : quickfix / location list バッファ上では選択項目へジャンプ(一覧ウィンドウから元の編集ウィンドウへ戻る)
|
|
78
88
|
|
|
79
89
|
### count 対応(現状)
|
|
@@ -90,6 +100,7 @@
|
|
|
90
100
|
- `Ctrl-p` : buffer words 補完(前候補)
|
|
91
101
|
- `Esc` : Normal mode に戻る
|
|
92
102
|
- `Ctrl-c` : Normal mode に戻る
|
|
103
|
+
- `Ctrl-z` : shell へ suspend(`fg` で復帰)
|
|
93
104
|
- `矢印キー` : 移動
|
|
94
105
|
- `PageUp` / `PageDown` : 画面単位で移動
|
|
95
106
|
|
|
@@ -101,8 +112,18 @@
|
|
|
101
112
|
- `V` : linewise Visual の開始/切替
|
|
102
113
|
- `y` : 選択範囲を yank
|
|
103
114
|
- `d` : 選択範囲を delete
|
|
115
|
+
- `=` : 選択範囲を auto-indent
|
|
104
116
|
- `i` / `a` + object : text object を選択(`iw`, `aw`, `ip`, `ap`, `i"`, `a"`, ``i` ``, ``a` ``, `i)`, `a)`, `i]`, `a]`, `i}`, `a}`)
|
|
105
117
|
- `Esc` / `Ctrl-c` : Normal mode に戻る
|
|
118
|
+
- `Ctrl-z` : shell へ suspend(`fg` で復帰)
|
|
119
|
+
|
|
120
|
+
## Rich mode
|
|
121
|
+
|
|
122
|
+
- Normal mode のキーバインドをほぼそのまま使える(移動・検索・yank 等)
|
|
123
|
+
- バッファを変更する操作(insert/delete/change/paste/replace)はブロック
|
|
124
|
+
- `Esc` : Normal mode に戻る
|
|
125
|
+
- `Ctrl-c` : Normal mode に戻る
|
|
126
|
+
- `Ctrl-z` : shell へ suspend(`fg` で復帰)
|
|
106
127
|
|
|
107
128
|
## Command-line mode
|
|
108
129
|
|
|
@@ -114,6 +135,7 @@
|
|
|
114
135
|
- `Tab` (`Ctrl-i`) : Ex 補完(`:` prefix 時、コマンド名/一部引数の文脈対応)
|
|
115
136
|
- `Esc` : キャンセル
|
|
116
137
|
- `Ctrl-c` : キャンセル
|
|
138
|
+
- `Ctrl-z` : shell へ suspend(`fg` で復帰)
|
|
117
139
|
|
|
118
140
|
### prefix 別の Enter 動作
|
|
119
141
|
|
|
@@ -128,4 +150,5 @@
|
|
|
128
150
|
- keymap 解決順(現状実装): `filetype-local -> buffer-local -> mode-local -> global`
|
|
129
151
|
- `~/.config/ruvim/init.rb`(または `$XDG_CONFIG_HOME/ruvim/init.rb`)の `nmap` / `imap` / `map_global` で上書き・追加可能
|
|
130
152
|
- `Ctrl-d/u/f/b/e/y` に加えて、`矢印キー` / `PageUp` / `PageDown` も「既定挙動の前に keymap override を試す」ため `nmap "<PageDown>", ...` のように上書き可能
|
|
153
|
+
- `Ctrl-z` は keymap ではなく app レベルの suspend 処理として扱う(全モード共通)
|
|
131
154
|
- `~/.config/ruvim/ftplugin/<filetype>.rb`(または `$XDG_CONFIG_HOME/ruvim/ftplugin/<filetype>.rb`)では `nmap` / `imap` が filetype-local として登録される
|
data/docs/command.md
CHANGED
|
@@ -19,6 +19,16 @@
|
|
|
19
19
|
- `-c {cmd}`
|
|
20
20
|
- `+{cmd}`, `+{line}`, `+`
|
|
21
21
|
|
|
22
|
+
補足(現状挙動):
|
|
23
|
+
|
|
24
|
+
- `cmd | ruvim`
|
|
25
|
+
- `stdin` を follow stream として開く(`[stdin]` バッファ)
|
|
26
|
+
- Normal mode の `Ctrl-c` で stream 停止(上流プロセスには直接 `SIGINT` は送らない)
|
|
27
|
+
- `Ctrl-z`
|
|
28
|
+
- 全モード共通で shell へ suspend(`SIGTSTP`)
|
|
29
|
+
- suspend 前に terminal を cooked + main screen へ戻す
|
|
30
|
+
- `fg` 復帰後は alt screen を再有効化し、画面を全面再描画する
|
|
31
|
+
|
|
22
32
|
## Ex コマンド(builtin)
|
|
23
33
|
|
|
24
34
|
### `:w` / `:write`
|
|
@@ -36,11 +46,22 @@
|
|
|
36
46
|
- 最後の window / tab のとき: エディタ終了
|
|
37
47
|
- 最後の window / tab で未保存変更がある場合、`!` なしでは拒否
|
|
38
48
|
|
|
49
|
+
### `:qa` / `:qall`
|
|
50
|
+
|
|
51
|
+
- 形式: `:qa`, `:qa!`
|
|
52
|
+
- 全ウィンドウ/タブを無視して一括終了
|
|
53
|
+
- 未保存変更があるファイルバッファが存在する場合、`!` なしでは拒否
|
|
54
|
+
|
|
39
55
|
### `:wq`
|
|
40
56
|
|
|
41
57
|
- 形式: `:wq`, `:wq!`, `:wq [path]`
|
|
42
58
|
- 保存して `:q` 相当(window / tab / app を閉じる)
|
|
43
59
|
|
|
60
|
+
### `:wqa` / `:wqall` / `:xa` / `:xall`
|
|
61
|
+
|
|
62
|
+
- 形式: `:wqa`, `:wqa!`
|
|
63
|
+
- 変更のある全ファイルバッファを保存して一括終了
|
|
64
|
+
|
|
44
65
|
### `:e` / `:edit`
|
|
45
66
|
|
|
46
67
|
- 形式: `:e[!] [path]`
|
|
@@ -48,6 +69,11 @@
|
|
|
48
69
|
- 引数なし: 現在ファイルを再読込
|
|
49
70
|
- 未保存変更がある場合は `!` なしで拒否
|
|
50
71
|
- `:e!` は未保存変更を破棄して開き直す(undo/redo もクリア)
|
|
72
|
+
- 大きいファイル(閾値以上)は段階読み込みになる場合がある
|
|
73
|
+
- 読み込み中は status line に `[load/live]`
|
|
74
|
+
- デフォルトでは先頭 `8MB` を先に表示して、残りを後から追加
|
|
75
|
+
- 閾値: `RUVIM_ASYNC_FILE_THRESHOLD_BYTES`
|
|
76
|
+
- 先読みサイズ: `RUVIM_ASYNC_FILE_PREFIX_BYTES`
|
|
51
77
|
|
|
52
78
|
### `:help`
|
|
53
79
|
|
|
@@ -64,6 +90,16 @@
|
|
|
64
90
|
- 形式: `:commands`
|
|
65
91
|
- Ex コマンド一覧(alias 含む)を read-only バッファに表示
|
|
66
92
|
|
|
93
|
+
### `:bindings`
|
|
94
|
+
|
|
95
|
+
- 形式: `:bindings [mode]`
|
|
96
|
+
- 現在バッファに対して有効な key binding 一覧を read-only バッファに表示
|
|
97
|
+
- layer ごとに表示:
|
|
98
|
+
- `buffer`
|
|
99
|
+
- `filetype`
|
|
100
|
+
- `app`
|
|
101
|
+
- `mode` は任意(例: `normal`, `insert`, `visual_line`, `command_line`。短縮形 `n`, `i`, `v`, `c` なども可)
|
|
102
|
+
|
|
67
103
|
### quickfix / location list(最小)
|
|
68
104
|
|
|
69
105
|
- `:vimgrep /pattern/`
|
|
@@ -82,6 +118,17 @@
|
|
|
82
118
|
- `:grep`, `:make`, `:cfile`, `:lgrep` は未実装
|
|
83
119
|
- 一覧バッファ上で `Enter` からのジャンプは未実装
|
|
84
120
|
|
|
121
|
+
### `:rich`
|
|
122
|
+
|
|
123
|
+
- 形式: `:rich [format]`
|
|
124
|
+
- Rich mode を開始 / 終了する(トグル)
|
|
125
|
+
- `format` に `tsv` または `csv` を指定可能(省略時は filetype / 内容から自動判定)
|
|
126
|
+
- 同一バッファ上で動作し、描画時にテーブル整形を適用する
|
|
127
|
+
- Rich mode では移動・検索・yank 等は使えるが、バッファ変更操作はブロックされる
|
|
128
|
+
- 区切り文字は ` | `(スペース+パイプ+スペース)
|
|
129
|
+
- 列幅は画面に見えている行だけから計算(大規模ファイルでも高速)
|
|
130
|
+
- `Esc` / `Ctrl-C` で Normal mode に戻る
|
|
131
|
+
|
|
85
132
|
### `:command`
|
|
86
133
|
|
|
87
134
|
- 形式: `:command Name ex_body`
|
|
@@ -137,6 +184,34 @@
|
|
|
137
184
|
- 表示中 window は別バッファへ切り替えられる
|
|
138
185
|
- `!` 対応(未保存変更バッファを破棄)
|
|
139
186
|
|
|
187
|
+
### `:args`
|
|
188
|
+
|
|
189
|
+
- 形式: `:args`
|
|
190
|
+
- 引数リスト(arglist)を表示
|
|
191
|
+
- 現在の引数は `[filename]` 形式で表示される
|
|
192
|
+
|
|
193
|
+
### `:next`
|
|
194
|
+
|
|
195
|
+
- 形式: `:next`
|
|
196
|
+
- arglist の次の引数ファイルを開く
|
|
197
|
+
- エラー: 最後の引数で実行時
|
|
198
|
+
|
|
199
|
+
### `:prev`
|
|
200
|
+
|
|
201
|
+
- 形式: `:prev`
|
|
202
|
+
- arglist の前の引数ファイルを開く
|
|
203
|
+
- エラー: 最初の引数で実行時
|
|
204
|
+
|
|
205
|
+
### `:first`
|
|
206
|
+
|
|
207
|
+
- 形式: `:first`
|
|
208
|
+
- arglist の最初の引数ファイルを開く
|
|
209
|
+
|
|
210
|
+
### `:last`
|
|
211
|
+
|
|
212
|
+
- 形式: `:last`
|
|
213
|
+
- arglist の最後の引数ファイルを開く
|
|
214
|
+
|
|
140
215
|
### `:split`
|
|
141
216
|
|
|
142
217
|
- 形式: `:split`
|
|
@@ -165,6 +240,13 @@
|
|
|
165
240
|
- 形式: `:tabprev`
|
|
166
241
|
- 前のタブへ移動
|
|
167
242
|
|
|
243
|
+
### `:tabs`
|
|
244
|
+
|
|
245
|
+
- 形式: `:tabs`
|
|
246
|
+
- 全タブページの一覧を表示
|
|
247
|
+
- 各タブに含まれるウィンドウとバッファ名を表示
|
|
248
|
+
- 現在のタブ / ウィンドウは `>` マーカーで示す
|
|
249
|
+
|
|
168
250
|
## 内部コマンド(主なもの)
|
|
169
251
|
|
|
170
252
|
内部コマンドは主に key binding から使われ、`RuVim::CommandRegistry` に登録されます。
|
|
@@ -221,6 +303,7 @@
|
|
|
221
303
|
- `editor.buffer_prev`
|
|
222
304
|
- `buffer.replace_char`
|
|
223
305
|
- `ui.clear_message`
|
|
306
|
+
- `rich.toggle`
|
|
224
307
|
|
|
225
308
|
## 検索コマンド(Normal mode)
|
|
226
309
|
|
|
@@ -265,6 +348,7 @@
|
|
|
265
348
|
- `buffer.visual_delete`
|
|
266
349
|
- blockwise は最小実装(矩形選択 + `y/d`)
|
|
267
350
|
- blockwise の text object 選択 / paste の Vim 互換挙動は未対応
|
|
351
|
+
- `Ctrl-z` で shell へ suspend(`fg` で復帰)
|
|
268
352
|
|
|
269
353
|
## repeat(Normal mode)
|
|
270
354
|
|
|
@@ -310,6 +394,7 @@
|
|
|
310
394
|
|
|
311
395
|
- `Screen` は行キャッシュを使った簡易差分描画を行う
|
|
312
396
|
- `SIGWINCH` + self-pipe + `IO.select` で入力待機中でもリサイズに即追従
|
|
397
|
+
- `Ctrl-z` suspend/`fg` 復帰後は `Screen` キャッシュを破棄し、全面再描画する
|
|
313
398
|
- command-line は履歴と Ex 補完(コマンド名 + 一部引数の文脈補完)を持つ
|
|
314
399
|
- Insert mode は `Ctrl-n` / `Ctrl-p` の buffer words 補完を持つ
|
|
315
400
|
- 文字幅は `DisplayWidth` の近似実装(tab 展開 + 一部全角幅2)
|
data/docs/config.md
CHANGED
|
@@ -217,12 +217,12 @@ setglobal "tabstop=8"
|
|
|
217
217
|
|
|
218
218
|
- `path` (`string`, default `nil`) [`PARTIAL`]
|
|
219
219
|
- `gf` などのファイル探索ディレクトリを指定します(`,` 区切り)。
|
|
220
|
-
- 現状は `gf`
|
|
220
|
+
- 現状は `gf` の最小探索に利用します(`file:line` の `line` ジャンプにも対応)。
|
|
221
221
|
- `lib/**` のような再帰探索(簡易)に対応します。
|
|
222
222
|
|
|
223
223
|
- `suffixesadd` (`string`, default `nil`) [`PARTIAL`]
|
|
224
224
|
- `gf` などで補完する拡張子候補を指定します(`,` 区切り)。
|
|
225
|
-
- 現状は `gf`
|
|
225
|
+
- 現状は `gf` の最小探索に利用します(`file:line` の `path` 部分に適用)。
|
|
226
226
|
|
|
227
227
|
- `textwidth` (`int`, default `0`) [`定義のみ`]
|
|
228
228
|
- 自動改行幅の指定です。
|
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 含む)
|