ruvim 0.2.0 → 0.4.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 +96 -0
- data/CLAUDE.md +1 -0
- data/README.md +15 -1
- data/docs/binding.md +39 -0
- data/docs/command.md +163 -4
- data/docs/config.md +12 -4
- data/docs/done.md +21 -0
- data/docs/spec.md +214 -18
- data/docs/todo.md +1 -5
- data/docs/tutorial.md +24 -0
- data/docs/vim_diff.md +105 -173
- data/lib/ruvim/app.rb +1165 -70
- data/lib/ruvim/buffer.rb +47 -1
- data/lib/ruvim/cli.rb +18 -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 +466 -71
- data/lib/ruvim/ex_command_registry.rb +2 -0
- data/lib/ruvim/file_watcher.rb +243 -0
- data/lib/ruvim/git/blame.rb +245 -0
- data/lib/ruvim/git/branch.rb +97 -0
- data/lib/ruvim/git/commit.rb +102 -0
- data/lib/ruvim/git/diff.rb +129 -0
- data/lib/ruvim/git/handler.rb +84 -0
- data/lib/ruvim/git/log.rb +41 -0
- data/lib/ruvim/git/status.rb +103 -0
- data/lib/ruvim/global_commands.rb +1066 -105
- data/lib/ruvim/highlighter.rb +19 -22
- data/lib/ruvim/input.rb +40 -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/diff.rb +41 -0
- data/lib/ruvim/lang/json.rb +52 -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/json_renderer.rb +131 -0
- data/lib/ruvim/rich_view/jsonl_renderer.rb +57 -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 +109 -0
- data/lib/ruvim/screen.rb +503 -109
- 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 +24 -0
- data/test/app_completion_test.rb +98 -0
- data/test/app_dot_repeat_test.rb +13 -0
- data/test/app_motion_test.rb +13 -0
- data/test/app_scenario_test.rb +898 -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/cli_test.rb +14 -0
- data/test/clipboard_test.rb +67 -0
- data/test/command_line_test.rb +118 -0
- data/test/config_dsl_test.rb +87 -0
- data/test/dispatcher_test.rb +322 -0
- data/test/display_width_test.rb +41 -0
- data/test/editor_register_test.rb +23 -0
- data/test/file_watcher_test.rb +197 -0
- data/test/follow_test.rb +199 -0
- data/test/git_blame_test.rb +713 -0
- data/test/highlighter_test.rb +165 -0
- data/test/indent_test.rb +287 -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 +734 -0
- data/test/screen_test.rb +304 -0
- data/test/search_option_test.rb +19 -0
- data/test/test_helper.rb +9 -0
- metadata +49 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: affafdf81175fc15f4d0f0053982743caa863aa371053095bfdd24160aee857d
|
|
4
|
+
data.tar.gz: 9abd61f0ba641b3f7dc429c4104f2e5d09243ebeb821baa8ad7521c6b4a3eca7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7a5dc6394f0905831d384fb66d88992d20691b58347a2c1673179f0036585f82aa54c6681f8bb79dd9c0e3ffa77389cb5e7a62d7eec27571be0b7f79529a58fb
|
|
7
|
+
data.tar.gz: 203a49cce3d46575fa743c5635874af2e320ddd225fe973d74a82851b1bfb6112e379e084e1e8afa262c5eac3d596c5c7b23ad572e77f8bf6ed5d2296e9fe992
|
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,96 @@
|
|
|
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
|
+
* note that CLAUDE.md is a symbolic link to AGENTS.md. Commit AGENTS.md if modify CLAUDE.md
|
|
13
|
+
* commit it
|
|
14
|
+
* After committing, show the commit message
|
|
15
|
+
|
|
16
|
+
## Source Tree
|
|
17
|
+
|
|
18
|
+
### Architecture
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
CLI (exe/ruvim) → CLI.parse() → App.new() → App.run_ui_loop()
|
|
22
|
+
Input.read_key() → KeymapManager.resolve() → Dispatcher.dispatch()
|
|
23
|
+
→ GlobalCommands.<method>() → Editor state update → Screen.render() → Terminal.write()
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Core (lib/ruvim/)
|
|
27
|
+
|
|
28
|
+
| File | Description |
|
|
29
|
+
|------|-------------|
|
|
30
|
+
| `app.rb` | Main application loop, input handling, startup |
|
|
31
|
+
| `editor.rb` | Editor state: buffers, windows, options, registers, marks, modes |
|
|
32
|
+
| `buffer.rb` | Text buffer (lines, file I/O, encoding) |
|
|
33
|
+
| `window.rb` | View of a buffer (cursor, scroll, grapheme-aware movement) |
|
|
34
|
+
| `global_commands.rb` | All built-in command implementations (cursor, edit, search, visual, etc.) |
|
|
35
|
+
| `screen.rb` | Rendering: window layout, syntax highlight, line numbers, status line, wrap |
|
|
36
|
+
| `dispatcher.rb` | Routes commands; parses Ex ranges/substitute; shell execution |
|
|
37
|
+
| `keymap_manager.rb` | Key-to-command mapping with layers (filetype > buffer > mode > global) |
|
|
38
|
+
| `input.rb` | Raw keyboard input, ANSI escape sequence parsing |
|
|
39
|
+
| `terminal.rb` | Terminal I/O: raw mode, alternate screen, winsize |
|
|
40
|
+
| `command_line.rb` | Command-line text/cursor state |
|
|
41
|
+
| `command_registry.rb` | Normal/insert mode command registry (singleton) |
|
|
42
|
+
| `ex_command_registry.rb` | Ex command registry (singleton) |
|
|
43
|
+
| `cli.rb` | CLI argument parsing, `--help`, `--version` |
|
|
44
|
+
| `config_loader.rb` | Load `~/.config/ruvim/init.rb` and ftplugin |
|
|
45
|
+
| `config_dsl.rb` | User config DSL: `nmap`, `imap`, `set`, `command`, `colorscheme` |
|
|
46
|
+
| `display_width.rb` | Character display width (CJK, emoji, combining marks) |
|
|
47
|
+
| `text_metrics.rb` | Grapheme-aware text measurement and navigation |
|
|
48
|
+
| `keyword_chars.rb` | Word character definition (iskeyword) |
|
|
49
|
+
| `highlighter.rb` | Syntax highlighting dispatcher (delegates to lang modules) |
|
|
50
|
+
| `lang/base.rb` | Default lang module (no-op fallback for indent/dedent) |
|
|
51
|
+
| `lang/markdown.rb` | Markdown parsing, detection helpers, and syntax highlight colors |
|
|
52
|
+
| `lang/ruby.rb` | Ruby syntax highlighting via Prism lexer; auto-indent calculation |
|
|
53
|
+
| `lang/json.rb` | JSON syntax highlighting via regex; auto-indent |
|
|
54
|
+
| `lang/scheme.rb` | Scheme syntax highlighting via regex |
|
|
55
|
+
| `lang/diff.rb` | Diff syntax highlighting (add/delete/hunk/header colors) |
|
|
56
|
+
| `lang/tsv.rb` | TSV detection and RichView renderer registration |
|
|
57
|
+
| `lang/csv.rb` | CSV detection and RichView renderer registration |
|
|
58
|
+
| `git/blame.rb` | Git blame: parser, runner, command handlers |
|
|
59
|
+
| `git/status.rb` | Git status: runner, filename parser, command handlers |
|
|
60
|
+
| `git/diff.rb` | Git diff: runner, command handlers |
|
|
61
|
+
| `git/log.rb` | Git log: runner, command handlers |
|
|
62
|
+
| `git/branch.rb` | Git branch: listing, checkout, command handlers |
|
|
63
|
+
| `git/commit.rb` | Git commit: message buffer, execute, command handlers |
|
|
64
|
+
| `git/handler.rb` | Git module (repo_root), dispatcher, close, shared helpers |
|
|
65
|
+
| `file_watcher.rb` | File change monitoring (inotify with fiddle fallback to polling) |
|
|
66
|
+
| `clipboard.rb` | System clipboard access (xclip, pbpaste, etc.) |
|
|
67
|
+
| `context.rb` | Command handler context (editor, window, buffer, invocation) |
|
|
68
|
+
| `command_invocation.rb` | Single command invocation (id, argv, count, bang) |
|
|
69
|
+
| `rich_view.rb` | Rich view mode (TSV/CSV/Markdown rendering) |
|
|
70
|
+
| `rich_view/table_renderer.rb` | Table formatting with display-width-aware column alignment |
|
|
71
|
+
| `rich_view/markdown_renderer.rb` | Markdown rendering (headings, inline, tables, code blocks, HR) |
|
|
72
|
+
| `rich_view/json_renderer.rb` | JSON pretty-print into virtual buffer |
|
|
73
|
+
| `rich_view/jsonl_renderer.rb` | JSONL per-line pretty-print into virtual buffer |
|
|
74
|
+
|
|
75
|
+
### Tests (test/)
|
|
76
|
+
|
|
77
|
+
- 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`, `file_watcher_test`, `clipboard_test`, `command_line_test`
|
|
78
|
+
- 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`, `follow_test`, `git_blame_test`
|
|
79
|
+
- Helper: `test_helper.rb` (fresh_editor, Minitest)
|
|
80
|
+
|
|
81
|
+
### Docs (docs/)
|
|
82
|
+
|
|
83
|
+
`spec.md` (feature spec), `command.md`, `binding.md`, `config.md`, `tutorial.md`, `vim_diff.md`, `plugin.md`, `todo.md`, `done.md`
|
|
84
|
+
|
|
85
|
+
## Debugging (Lumitrace)
|
|
86
|
+
|
|
87
|
+
lumitrace is a tool that records runtime values of each Ruby expression.
|
|
88
|
+
When a test fails, read `lumitrace help` first, then use it.
|
|
89
|
+
Basic: `lumitrace -j exec rake test`
|
|
90
|
+
This also provides coverage information for the test run.
|
|
91
|
+
|
|
92
|
+
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.
|
|
93
|
+
|
|
94
|
+
## misc
|
|
95
|
+
|
|
96
|
+
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.
|
data/CLAUDE.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
AGENTS.md
|
data/README.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
Ruby で実装した Vim ライクなターミナルエディタです。
|
|
4
4
|
|
|
5
|
+
Vim の操作感をベースに、Ruby ならではの、もしくは ko1 が欲しい拡張性と独自機能を加えています。
|
|
6
|
+
|
|
7
|
+
## Vim にない独自機能
|
|
8
|
+
|
|
9
|
+
- **Rich View (`gr`)** — TSV / CSV / Markdown をテーブル整形して閲覧。CJK 幅を考慮したカラム揃え
|
|
10
|
+
- **`g/` 検索フィルタ** — 検索にマッチする行だけを集めたバッファを作成。再帰的に絞り込み可能。ログ解析に便利
|
|
11
|
+
- **Follow mode (`-f` / `:follow`)** — `tail -f` 相当のファイル追従。inotify 対応
|
|
12
|
+
- Ruby related:
|
|
13
|
+
- **Ruby DSL 設定** — `~/.config/ruvim/init.rb` に Ruby で `nmap`, `set`, `command` を記述。Vim script 不要
|
|
14
|
+
- **Ruby 正規表現** — 検索・置換は Ruby `Regexp`。Ruby ユーザーにそのまま馴染む
|
|
15
|
+
- **`:ruby` eval** — 実行中に任意の Ruby コードを評価。`ctx.editor` / `ctx.buffer` API でエディタを操作
|
|
16
|
+
|
|
17
|
+
## 概要
|
|
18
|
+
|
|
5
19
|
- raw mode + ANSI 描画
|
|
6
20
|
- Normal / Insert / Command-line / Visual
|
|
7
21
|
- Ex コマンド(`:w`, `:q`, `:e`, `:help`, `:set` など)
|
|
@@ -132,4 +146,4 @@ lint / format 方針(現状):
|
|
|
132
146
|
- Vim 完全互換ではありません
|
|
133
147
|
- 正規表現は Vim regex ではなく Ruby `Regexp` を使います
|
|
134
148
|
- 文字幅 / Unicode は改善済みですが、完全互換ではありません
|
|
135
|
-
- 複数ファイル引数や一部 Vim CLI オプションは未実装です
|
|
149
|
+
- 複数ファイル引数や一部 Vim CLI オプションは未実装です
|
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` : 左へ移動
|
|
@@ -28,6 +30,14 @@
|
|
|
28
30
|
- `/` : 前方検索入力に入る
|
|
29
31
|
- `?` : 後方検索入力に入る
|
|
30
32
|
- `x` : カーソル位置の文字削除
|
|
33
|
+
- `X` : カーソル前の文字削除
|
|
34
|
+
- `s` : カーソル位置の文字を削除して Insert mode(substitute)
|
|
35
|
+
- `~` : カーソル位置の文字の大文字小文字を切替
|
|
36
|
+
- `J` : 現在行と次の行を結合
|
|
37
|
+
- `D` : カーソルから行末まで削除
|
|
38
|
+
- `C` : カーソルから行末まで変更(削除して Insert mode)
|
|
39
|
+
- `S` : 行全体を変更(削除して Insert mode)
|
|
40
|
+
- `Y` : 行全体をヤンク
|
|
31
41
|
- `dd` : 現在行を削除
|
|
32
42
|
- `d` + motion : operator-pending delete(`dw`, `dj`, `dk`, `d$`, `dh`, `dl`)
|
|
33
43
|
- `diw` / `daw` : 単語 text object delete(簡易)
|
|
@@ -47,6 +57,7 @@
|
|
|
47
57
|
- `'{mark}` / `` `{mark} `` : mark へ jump(行頭寄せ / 正確位置)
|
|
48
58
|
- `''` / `` `` `` : jumplist で前の位置へ jump(行頭寄せ / 正確位置)
|
|
49
59
|
- `r<char>` : 1文字置換
|
|
60
|
+
- `=` + motion / `==` : auto-indent(Ruby filetype 対応)
|
|
50
61
|
- `c` + motion / `cc` : change(削除して Insert mode)
|
|
51
62
|
- `ciw` / `caw` : 単語 text object change(簡易)
|
|
52
63
|
- `ci"` / `ca"` : quote text object change(簡易)
|
|
@@ -56,6 +67,7 @@
|
|
|
56
67
|
- `V` : Visual (linewise)
|
|
57
68
|
- `Ctrl-w w` : 次の window へ移動
|
|
58
69
|
- `Ctrl-w h/j/k/l` : window 間移動(split UI)
|
|
70
|
+
- `Shift+矢印キー` : window 間移動 or 分割(1ウィンドウ時は分割、2個以上なら移動)
|
|
59
71
|
- `u` : Undo
|
|
60
72
|
- `Ctrl-r` : Redo
|
|
61
73
|
- `.` : 直前変更の repeat(現状: `x`, `dd`, `d{motion}`, `p/P`, `r<char>`)
|
|
@@ -64,6 +76,9 @@
|
|
|
64
76
|
- `Ctrl-d` / `Ctrl-u` : 半ページ下/上へ移動(概ね表示高さの半分)
|
|
65
77
|
- `Ctrl-f` / `Ctrl-b` : 1ページ下/上へ移動(`PageDown` / `PageUp` 相当)
|
|
66
78
|
- `Ctrl-e` / `Ctrl-y` : カーソル位置をなるべく保ったまま画面を1行下/上へスクロール(最小実装)
|
|
79
|
+
- `zt` : カーソル行を画面上端に移動
|
|
80
|
+
- `zz` : カーソル行を画面中央に移動
|
|
81
|
+
- `zb` : カーソル行を画面下端に移動
|
|
67
82
|
- `q{reg}` : macro 記録開始/終了(再度 `q` で停止)
|
|
68
83
|
- `@{reg}` / `@@` : macro 再生 / 直前 macro 再生
|
|
69
84
|
- `n` : 直前検索を次へ
|
|
@@ -71,9 +86,20 @@
|
|
|
71
86
|
- `*` / `#` : カーソル下の単語検索(前/後)
|
|
72
87
|
- `g*` / `g#` : カーソル下の単語を部分一致検索(前/後)
|
|
73
88
|
- `gf` : カーソル下のファイル名を開く(最小。`path` / `suffixesadd` を参照)
|
|
89
|
+
- `file:line` 形式なら開いた後に `line` 行目へ移動
|
|
90
|
+
- `gr` : Rich mode をトグル(TSV/CSV をテーブル整形表示、同一バッファ上で動作)
|
|
91
|
+
- `g/` : 検索パターンにマッチする行だけを集めたフィルタバッファを作成(再帰フィルタ可、Enter で元行へジャンプ、`:q` で戻る)
|
|
92
|
+
- `Ctrl-g` : Git コマンドモード(`:git ` がプリセットされたコマンドラインに入る)
|
|
93
|
+
- `blame` → Git blame を開く / `status` → Git status / `diff` → Git diff / `log` → Git log
|
|
94
|
+
- Blame バッファ内: `p` 親コミットの blame へ遷移 / `P` 前の blame へ戻る / `c` コミット詳細を表示
|
|
95
|
+
- `Ctrl-c` : stdin stream 停止(stdin バッファ表示時)
|
|
74
96
|
- `Esc` : メッセージ/保留入力のクリア
|
|
97
|
+
- `Ctrl-z` : shell へ suspend(`fg` で復帰)
|
|
75
98
|
- `矢印キー` : 移動
|
|
76
99
|
- `PageUp` / `PageDown` : 画面単位で移動(概ね表示高さ - 1 行)
|
|
100
|
+
- `Q` : quickfix list を開く(`:copen` 相当)
|
|
101
|
+
- `]q` : 次の quickfix item へジャンプ(`:cnext` 相当)
|
|
102
|
+
- `[q` : 前の quickfix item へジャンプ(`:cprev` 相当)
|
|
77
103
|
- `Enter` : quickfix / location list バッファ上では選択項目へジャンプ(一覧ウィンドウから元の編集ウィンドウへ戻る)
|
|
78
104
|
|
|
79
105
|
### count 対応(現状)
|
|
@@ -90,6 +116,7 @@
|
|
|
90
116
|
- `Ctrl-p` : buffer words 補完(前候補)
|
|
91
117
|
- `Esc` : Normal mode に戻る
|
|
92
118
|
- `Ctrl-c` : Normal mode に戻る
|
|
119
|
+
- `Ctrl-z` : shell へ suspend(`fg` で復帰)
|
|
93
120
|
- `矢印キー` : 移動
|
|
94
121
|
- `PageUp` / `PageDown` : 画面単位で移動
|
|
95
122
|
|
|
@@ -101,8 +128,18 @@
|
|
|
101
128
|
- `V` : linewise Visual の開始/切替
|
|
102
129
|
- `y` : 選択範囲を yank
|
|
103
130
|
- `d` : 選択範囲を delete
|
|
131
|
+
- `=` : 選択範囲を auto-indent
|
|
104
132
|
- `i` / `a` + object : text object を選択(`iw`, `aw`, `ip`, `ap`, `i"`, `a"`, ``i` ``, ``a` ``, `i)`, `a)`, `i]`, `a]`, `i}`, `a}`)
|
|
105
133
|
- `Esc` / `Ctrl-c` : Normal mode に戻る
|
|
134
|
+
- `Ctrl-z` : shell へ suspend(`fg` で復帰)
|
|
135
|
+
|
|
136
|
+
## Rich mode
|
|
137
|
+
|
|
138
|
+
- Normal mode のキーバインドをほぼそのまま使える(移動・検索・yank 等)
|
|
139
|
+
- バッファを変更する操作(insert/delete/change/paste/replace)はブロック
|
|
140
|
+
- `Esc` : Normal mode に戻る
|
|
141
|
+
- `Ctrl-c` : Normal mode に戻る
|
|
142
|
+
- `Ctrl-z` : shell へ suspend(`fg` で復帰)
|
|
106
143
|
|
|
107
144
|
## Command-line mode
|
|
108
145
|
|
|
@@ -114,6 +151,7 @@
|
|
|
114
151
|
- `Tab` (`Ctrl-i`) : Ex 補完(`:` prefix 時、コマンド名/一部引数の文脈対応)
|
|
115
152
|
- `Esc` : キャンセル
|
|
116
153
|
- `Ctrl-c` : キャンセル
|
|
154
|
+
- `Ctrl-z` : shell へ suspend(`fg` で復帰)
|
|
117
155
|
|
|
118
156
|
### prefix 別の Enter 動作
|
|
119
157
|
|
|
@@ -128,4 +166,5 @@
|
|
|
128
166
|
- keymap 解決順(現状実装): `filetype-local -> buffer-local -> mode-local -> global`
|
|
129
167
|
- `~/.config/ruvim/init.rb`(または `$XDG_CONFIG_HOME/ruvim/init.rb`)の `nmap` / `imap` / `map_global` で上書き・追加可能
|
|
130
168
|
- `Ctrl-d/u/f/b/e/y` に加えて、`矢印キー` / `PageUp` / `PageDown` も「既定挙動の前に keymap override を試す」ため `nmap "<PageDown>", ...` のように上書き可能
|
|
169
|
+
- `Ctrl-z` は keymap ではなく app レベルの suspend 処理として扱う(全モード共通)
|
|
131
170
|
- `~/.config/ruvim/ftplugin/<filetype>.rb`(または `$XDG_CONFIG_HOME/ruvim/ftplugin/<filetype>.rb`)では `nmap` / `imap` が filetype-local として登録される
|
data/docs/command.md
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
## 起動オプション(CLI, 現状)
|
|
4
4
|
|
|
5
5
|
- `--help`, `--version`
|
|
6
|
+
- `-f`(follow mode: ファイルを開いて末尾から `tail -f` 相当の追従モードで起動)
|
|
6
7
|
- `--clean`
|
|
7
8
|
- `-d`(diff mode placeholder, 未実装メッセージ表示)
|
|
8
9
|
- `-q {errorfile}`(quickfix startup placeholder。現状は未実装メッセージ表示)
|
|
@@ -19,6 +20,16 @@
|
|
|
19
20
|
- `-c {cmd}`
|
|
20
21
|
- `+{cmd}`, `+{line}`, `+`
|
|
21
22
|
|
|
23
|
+
補足(現状挙動):
|
|
24
|
+
|
|
25
|
+
- `cmd | ruvim`
|
|
26
|
+
- `stdin` を follow stream として開く(`[stdin]` バッファ)
|
|
27
|
+
- Normal mode の `Ctrl-c` で stream 停止(上流プロセスには直接 `SIGINT` は送らない)
|
|
28
|
+
- `Ctrl-z`
|
|
29
|
+
- 全モード共通で shell へ suspend(`SIGTSTP`)
|
|
30
|
+
- suspend 前に terminal を cooked + main screen へ戻す
|
|
31
|
+
- `fg` 復帰後は alt screen を再有効化し、画面を全面再描画する
|
|
32
|
+
|
|
22
33
|
## Ex コマンド(builtin)
|
|
23
34
|
|
|
24
35
|
### `:w` / `:write`
|
|
@@ -36,11 +47,22 @@
|
|
|
36
47
|
- 最後の window / tab のとき: エディタ終了
|
|
37
48
|
- 最後の window / tab で未保存変更がある場合、`!` なしでは拒否
|
|
38
49
|
|
|
50
|
+
### `:qa` / `:qall`
|
|
51
|
+
|
|
52
|
+
- 形式: `:qa`, `:qa!`
|
|
53
|
+
- 全ウィンドウ/タブを無視して一括終了
|
|
54
|
+
- 未保存変更があるファイルバッファが存在する場合、`!` なしでは拒否
|
|
55
|
+
|
|
39
56
|
### `:wq`
|
|
40
57
|
|
|
41
58
|
- 形式: `:wq`, `:wq!`, `:wq [path]`
|
|
42
59
|
- 保存して `:q` 相当(window / tab / app を閉じる)
|
|
43
60
|
|
|
61
|
+
### `:wqa` / `:wqall` / `:xa` / `:xall`
|
|
62
|
+
|
|
63
|
+
- 形式: `:wqa`, `:wqa!`
|
|
64
|
+
- 変更のある全ファイルバッファを保存して一括終了
|
|
65
|
+
|
|
44
66
|
### `:e` / `:edit`
|
|
45
67
|
|
|
46
68
|
- 形式: `:e[!] [path]`
|
|
@@ -48,6 +70,11 @@
|
|
|
48
70
|
- 引数なし: 現在ファイルを再読込
|
|
49
71
|
- 未保存変更がある場合は `!` なしで拒否
|
|
50
72
|
- `:e!` は未保存変更を破棄して開き直す(undo/redo もクリア)
|
|
73
|
+
- 大きいファイル(閾値以上)は段階読み込みになる場合がある
|
|
74
|
+
- 読み込み中は status line に `[load/live]`
|
|
75
|
+
- デフォルトでは先頭 `8MB` を先に表示して、残りを後から追加
|
|
76
|
+
- 閾値: `RUVIM_ASYNC_FILE_THRESHOLD_BYTES`
|
|
77
|
+
- 先読みサイズ: `RUVIM_ASYNC_FILE_PREFIX_BYTES`
|
|
51
78
|
|
|
52
79
|
### `:help`
|
|
53
80
|
|
|
@@ -64,6 +91,16 @@
|
|
|
64
91
|
- 形式: `:commands`
|
|
65
92
|
- Ex コマンド一覧(alias 含む)を read-only バッファに表示
|
|
66
93
|
|
|
94
|
+
### `:bindings`
|
|
95
|
+
|
|
96
|
+
- 形式: `:bindings [mode]`
|
|
97
|
+
- 現在バッファに対して有効な key binding 一覧を read-only バッファに表示
|
|
98
|
+
- layer ごとに表示:
|
|
99
|
+
- `buffer`
|
|
100
|
+
- `filetype`
|
|
101
|
+
- `app`
|
|
102
|
+
- `mode` は任意(例: `normal`, `insert`, `visual_line`, `command_line`。短縮形 `n`, `i`, `v`, `c` なども可)
|
|
103
|
+
|
|
67
104
|
### quickfix / location list(最小)
|
|
68
105
|
|
|
69
106
|
- `:vimgrep /pattern/`
|
|
@@ -78,10 +115,55 @@
|
|
|
78
115
|
- current window の location list を開く / 閉じる
|
|
79
116
|
- `:lnext` / `:ln`, `:lprev` / `:lp`
|
|
80
117
|
- location list 項目を前後移動して該当位置へジャンプ
|
|
118
|
+
- `:grep /pattern/ [path...]`
|
|
119
|
+
- 外部 grep(`grepprg`)を実行して quickfix list を作成
|
|
120
|
+
- `:lgrep /pattern/ [path...]`
|
|
121
|
+
- 外部 grep(`grepprg`)を実行して location list を作成
|
|
81
122
|
- 現状の制限:
|
|
82
|
-
- `:
|
|
123
|
+
- `:make`, `:cfile`, `:lfile` は未実装
|
|
83
124
|
- 一覧バッファ上で `Enter` からのジャンプは未実装
|
|
84
125
|
|
|
126
|
+
### `:rich`
|
|
127
|
+
|
|
128
|
+
- 形式: `:rich [format]`
|
|
129
|
+
- Rich mode を開始 / 終了する(トグル)
|
|
130
|
+
- `format` に `tsv` または `csv` を指定可能(省略時は filetype / 内容から自動判定)
|
|
131
|
+
- 同一バッファ上で動作し、描画時にテーブル整形を適用する
|
|
132
|
+
- Rich mode では移動・検索・yank 等は使えるが、バッファ変更操作はブロックされる
|
|
133
|
+
- 区切り文字は ` | `(スペース+パイプ+スペース)
|
|
134
|
+
- 列幅は画面に見えている行だけから計算(大規模ファイルでも高速)
|
|
135
|
+
- `Esc` / `Ctrl-C` で Normal mode に戻る
|
|
136
|
+
|
|
137
|
+
### `:filter`
|
|
138
|
+
|
|
139
|
+
- 形式: `:filter [/pattern/]`
|
|
140
|
+
- 現在の検索パターン(引数なし)または指定パターンにマッチする行だけを集めたフィルタバッファを作成
|
|
141
|
+
- フィルタバッファ上で再度 `:filter` や `g/` を使うと再帰的に絞り込める
|
|
142
|
+
- Enter で元バッファの該当行へジャンプ(フィルタバッファは閉じる)
|
|
143
|
+
- `:q` でフィルタバッファを閉じて前のバッファに戻る
|
|
144
|
+
- 元バッファの filetype を引き継ぐ(TSV なら `gr` でテーブル表示可能)
|
|
145
|
+
- Normal mode では `g/` キーバインドで実行可能
|
|
146
|
+
|
|
147
|
+
### `:follow`
|
|
148
|
+
|
|
149
|
+
- 形式: `:follow`
|
|
150
|
+
- ファイルの follow mode をトグルする(`tail -f` 相当)
|
|
151
|
+
- follow 中はファイルへの追記がリアルタイムにバッファへ反映される
|
|
152
|
+
- カーソルが最終行にいる場合は末尾を自動追従(auto-scroll)
|
|
153
|
+
- カーソルが途中にある場合はスクロール位置を維持
|
|
154
|
+
- `G` で末尾に移動すれば追従が再開される
|
|
155
|
+
- `:follow` を再度実行すると停止
|
|
156
|
+
- `Ctrl-C`(ノーマルモード)で follow を停止
|
|
157
|
+
- ステータスラインに `[follow]` と表示される(inotify 使用時は `[follow/i]`)
|
|
158
|
+
- ファイルが紐づいていないバッファではエラー
|
|
159
|
+
- 未保存の変更があるバッファでは follow 開始不可
|
|
160
|
+
- follow 中のバッファは変更不可(modifiable が false)
|
|
161
|
+
- ファイルが truncate された場合はメッセージを表示し監視を継続
|
|
162
|
+
- ファイルが削除された場合はメッセージを表示し、再作成を待って監視を再開
|
|
163
|
+
- follow 停止時、バッファ内容はそのまま保持(`:e!` で再読み込み可能)
|
|
164
|
+
- 監視方式: Linux では inotify(fiddle 経由)を優先し、使えない場合は polling にフォールバック
|
|
165
|
+
- polling は exponential backoff(0.1s → 3s)で CPU 負荷を抑える
|
|
166
|
+
|
|
85
167
|
### `:command`
|
|
86
168
|
|
|
87
169
|
- 形式: `:command Name ex_body`
|
|
@@ -137,6 +219,34 @@
|
|
|
137
219
|
- 表示中 window は別バッファへ切り替えられる
|
|
138
220
|
- `!` 対応(未保存変更バッファを破棄)
|
|
139
221
|
|
|
222
|
+
### `:args`
|
|
223
|
+
|
|
224
|
+
- 形式: `:args`
|
|
225
|
+
- 引数リスト(arglist)を表示
|
|
226
|
+
- 現在の引数は `[filename]` 形式で表示される
|
|
227
|
+
|
|
228
|
+
### `:next`
|
|
229
|
+
|
|
230
|
+
- 形式: `:next`
|
|
231
|
+
- arglist の次の引数ファイルを開く
|
|
232
|
+
- エラー: 最後の引数で実行時
|
|
233
|
+
|
|
234
|
+
### `:prev`
|
|
235
|
+
|
|
236
|
+
- 形式: `:prev`
|
|
237
|
+
- arglist の前の引数ファイルを開く
|
|
238
|
+
- エラー: 最初の引数で実行時
|
|
239
|
+
|
|
240
|
+
### `:first`
|
|
241
|
+
|
|
242
|
+
- 形式: `:first`
|
|
243
|
+
- arglist の最初の引数ファイルを開く
|
|
244
|
+
|
|
245
|
+
### `:last`
|
|
246
|
+
|
|
247
|
+
- 形式: `:last`
|
|
248
|
+
- arglist の最後の引数ファイルを開く
|
|
249
|
+
|
|
140
250
|
### `:split`
|
|
141
251
|
|
|
142
252
|
- 形式: `:split`
|
|
@@ -165,6 +275,23 @@
|
|
|
165
275
|
- 形式: `:tabprev`
|
|
166
276
|
- 前のタブへ移動
|
|
167
277
|
|
|
278
|
+
### `:tabs`
|
|
279
|
+
|
|
280
|
+
- 形式: `:tabs`
|
|
281
|
+
- 全タブページの一覧を表示
|
|
282
|
+
- 各タブに含まれるウィンドウとバッファ名を表示
|
|
283
|
+
- 現在のタブ / ウィンドウは `>` マーカーで示す
|
|
284
|
+
|
|
285
|
+
### `:d` / `:delete`
|
|
286
|
+
|
|
287
|
+
- 形式: `:d [count]`, `:{range}d`
|
|
288
|
+
- 行を削除
|
|
289
|
+
|
|
290
|
+
### `:y` / `:yank`
|
|
291
|
+
|
|
292
|
+
- 形式: `:y [count]`, `:{range}y`
|
|
293
|
+
- 行をヤンク
|
|
294
|
+
|
|
168
295
|
## 内部コマンド(主なもの)
|
|
169
296
|
|
|
170
297
|
内部コマンドは主に key binding から使われ、`RuVim::CommandRegistry` に登録されます。
|
|
@@ -220,7 +347,35 @@
|
|
|
220
347
|
- `editor.buffer_next`
|
|
221
348
|
- `editor.buffer_prev`
|
|
222
349
|
- `buffer.replace_char`
|
|
350
|
+
- `buffer.substitute_char`
|
|
351
|
+
- `buffer.swapcase_char`
|
|
352
|
+
- `buffer.join_lines`
|
|
353
|
+
- `buffer.indent_lines`
|
|
354
|
+
- `buffer.indent_motion`
|
|
355
|
+
- `buffer.visual_indent`
|
|
356
|
+
- `buffer.visual_select_text_object`
|
|
357
|
+
- `mode.visual_block`
|
|
358
|
+
- `cursor.page_up` / `cursor.page_down`
|
|
359
|
+
- `cursor.page_up.default` / `cursor.page_down.default`
|
|
360
|
+
- `cursor.page_up.half` / `cursor.page_down.half`
|
|
361
|
+
- `cursor.match_bracket`
|
|
362
|
+
- `window.scroll_up` / `window.scroll_down`
|
|
363
|
+
- `window.scroll_up.line` / `window.scroll_down.line`
|
|
364
|
+
- `window.cursor_line_top` / `window.cursor_line_center` / `window.cursor_line_bottom`
|
|
365
|
+
- `window.focus_or_split_left` / `window.focus_or_split_right` / `window.focus_or_split_up` / `window.focus_or_split_down`
|
|
366
|
+
- `normal.register_pending_start`
|
|
367
|
+
- `normal.operator_delete_start` / `normal.operator_yank_start` / `normal.operator_change_start` / `normal.operator_indent_start`
|
|
368
|
+
- `normal.replace_pending_start`
|
|
369
|
+
- `normal.find_char_forward_start` / `normal.find_char_backward_start` / `normal.find_till_forward_start` / `normal.find_till_backward_start`
|
|
370
|
+
- `normal.find_repeat` / `normal.find_repeat_reverse`
|
|
371
|
+
- `normal.change_repeat`
|
|
372
|
+
- `normal.macro_record_toggle` / `normal.macro_play_pending_start`
|
|
373
|
+
- `normal.mark_pending_start`
|
|
374
|
+
- `normal.jump_mark_linewise_pending_start` / `normal.jump_mark_exact_pending_start`
|
|
375
|
+
- `quickfix.next` / `quickfix.prev` / `quickfix.open`
|
|
376
|
+
- `stdin.stream_stop`
|
|
223
377
|
- `ui.clear_message`
|
|
378
|
+
- `rich.toggle`
|
|
224
379
|
|
|
225
380
|
## 検索コマンド(Normal mode)
|
|
226
381
|
|
|
@@ -233,12 +388,14 @@
|
|
|
233
388
|
- `*` / `#` : カーソル下の単語検索(単語境界)
|
|
234
389
|
- `g*` / `g#` : カーソル下の単語検索(部分一致)
|
|
235
390
|
- `:vimgrep` / `:lvimgrep` : 検索結果を quickfix/location list に積む
|
|
391
|
+
- `:nohlsearch` (`:noh`) : 検索ハイライトを一時的にクリア(次の検索で自動復帰)
|
|
236
392
|
|
|
237
|
-
### `:%s/.../.../
|
|
393
|
+
### `:%s/.../.../[flags]`
|
|
238
394
|
|
|
239
|
-
-
|
|
395
|
+
- バッファ全体置換(レンジ指定対応: `:{range}s/.../.../`)
|
|
240
396
|
- Ruby 正規表現 + Ruby 置換文字列を利用
|
|
241
|
-
- `g`
|
|
397
|
+
- 対応フラグ: `g`(全置換), `i`(大文字小文字無視), `I`(大文字小文字区別), `n`(置換せずマッチ数表示), `e`(エラー抑制)
|
|
398
|
+
- `c`(確認)フラグは未実装
|
|
242
399
|
|
|
243
400
|
## Operator-pending(Normal mode)
|
|
244
401
|
|
|
@@ -265,6 +422,7 @@
|
|
|
265
422
|
- `buffer.visual_delete`
|
|
266
423
|
- blockwise は最小実装(矩形選択 + `y/d`)
|
|
267
424
|
- blockwise の text object 選択 / paste の Vim 互換挙動は未対応
|
|
425
|
+
- `Ctrl-z` で shell へ suspend(`fg` で復帰)
|
|
268
426
|
|
|
269
427
|
## repeat(Normal mode)
|
|
270
428
|
|
|
@@ -310,6 +468,7 @@
|
|
|
310
468
|
|
|
311
469
|
- `Screen` は行キャッシュを使った簡易差分描画を行う
|
|
312
470
|
- `SIGWINCH` + self-pipe + `IO.select` で入力待機中でもリサイズに即追従
|
|
471
|
+
- `Ctrl-z` suspend/`fg` 復帰後は `Screen` キャッシュを破棄し、全面再描画する
|
|
313
472
|
- command-line は履歴と Ex 補完(コマンド名 + 一部引数の文脈補完)を持つ
|
|
314
473
|
- Insert mode は `Ctrl-n` / `Ctrl-p` の buffer words 補完を持つ
|
|
315
474
|
- 文字幅は `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
|
- 自動改行幅の指定です。
|
|
@@ -244,11 +244,11 @@ setglobal "tabstop=8"
|
|
|
244
244
|
- Tab 入力/削除時の編集幅を指定します。
|
|
245
245
|
- 現状は Insert mode の Tab 入力と、`expandtab` 時の空白 Backspace(最小)で使用します。
|
|
246
246
|
|
|
247
|
-
- `autoindent` (`bool`, default `
|
|
247
|
+
- `autoindent` (`bool`, default `true`) [`DONE`]
|
|
248
248
|
- 改行時に前行の先頭インデントを引き継ぎます。
|
|
249
249
|
- Insert mode `Enter`、`o`/`O` に反映されます。
|
|
250
250
|
|
|
251
|
-
- `smartindent` (`bool`, default `
|
|
251
|
+
- `smartindent` (`bool`, default `true`) [`PARTIAL`]
|
|
252
252
|
- 簡易な自動インデントを行います。
|
|
253
253
|
- 現状は前行が `{` `[` `(` で終わる場合に `shiftwidth` 分の空白を追加します。
|
|
254
254
|
|
|
@@ -265,6 +265,14 @@ setglobal "tabstop=8"
|
|
|
265
265
|
- ftplugin 読み込み対象、filetype-local keymap、簡易 syntax highlight の判定に使います。
|
|
266
266
|
- 手動で変更した場合の ftplugin 再適用は現状未対応です。
|
|
267
267
|
|
|
268
|
+
### Global options(検索・grep)
|
|
269
|
+
|
|
270
|
+
- `grepprg` (`string`, default `"grep -nH"`) [`DONE`]
|
|
271
|
+
- `:grep` / `:lgrep` が使用する外部コマンドを指定します。
|
|
272
|
+
|
|
273
|
+
- `grepformat` (`string`, default `"%f:%l:%m"`) [`DONE`]
|
|
274
|
+
- `:grep` / `:lgrep` の出力パース書式を指定します。
|
|
275
|
+
|
|
268
276
|
## 制限(現状)
|
|
269
277
|
|
|
270
278
|
- Vim の option 全部は未実装(ごく一部のみ)
|
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 含む)
|