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
data/docs/vim_diff.md
CHANGED
|
@@ -1,180 +1,112 @@
|
|
|
1
|
-
# RuVim と Vim
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
- `:w`, `:q`, `:wq`, `:e`, `:buffer`, `:bnext`, `:bprev`, `:ls` などはあるが一部のみ
|
|
30
|
-
- quickfix / location list は最小実装のみ
|
|
31
|
-
- `:vimgrep`, `:lvimgrep`, `:copen/:cnext`, `:lopen/:lnext` など
|
|
32
|
-
- `qf/location list` 一覧バッファで `Enter` による選択ジャンプは対応
|
|
33
|
-
- `:grep`, `:make`, `:cfile`, `:lgrep` は未実装
|
|
34
|
-
- `:command` はあるが、現状は「Ex 文字列エイリアス展開」に近い簡易実装
|
|
35
|
-
- `:ruby` はあるが、Vim の `:ruby` 機能互換ではなく RuVim 独自の Ruby eval 入口
|
|
36
|
-
- `:w!` は現状 `:w` とほぼ同じ(権限昇格や readonly 強制保存の完全な意味は未実装)
|
|
37
|
-
|
|
38
|
-
## モード / 編集操作の違い
|
|
39
|
-
|
|
40
|
-
- Normal / Insert / Command-line / Visual(charwise, linewise, blockwise 最小)は実装済み
|
|
41
|
-
- Visual mode は最小実装
|
|
42
|
-
- `y`, `d` 中心
|
|
43
|
-
- `Ctrl-v` blockwise は矩形選択 + `y/d` の最小対応
|
|
44
|
-
- blockwise text object / paste の Vim 互換挙動は未実装
|
|
45
|
-
- Vim の細かい選択挙動や text object は一部未実装
|
|
46
|
-
- operator-pending は `d`, `y`, `c` の一部を実装
|
|
47
|
-
- text object は `iw/aw`, `ip/ap`, `i"/a"`, ``i`/a` ``, `i)/a)`, `i]/a]`, `i}/a}` を実装(簡易)
|
|
48
|
-
- Vim の text object 群全体は未実装
|
|
49
|
-
- word motion(`w`, `b`, `e`)は簡易定義
|
|
50
|
-
- Vim の厳密な単語境界とは一致しない場合がある
|
|
51
|
-
- undo 粒度は簡略化
|
|
52
|
-
- Insert mode は「入ってから出るまで」を 1 undo 単位
|
|
53
|
-
- `.` repeat は拡張済みだが完全互換ではない
|
|
54
|
-
- `x`, `dd`, `d{motion}`, `p/P`, `r<char>`, `i/a/A/I/o/O`, `cc`, `c{motion}` を対象
|
|
55
|
-
- macro 記録中の `.` は内部再生キーを macro に混ぜない
|
|
56
|
-
- Vim の細かい repeat 粒度/カウント互換は未実装
|
|
1
|
+
# RuVim と Vim の違い
|
|
2
|
+
|
|
3
|
+
RuVim は「Vim ライクな Ruby 製ターミナルエディタ」です。Vim 完全互換ではなく、Vim の操作感を優先しつつ一部を独自拡張・簡略化しています。
|
|
4
|
+
|
|
5
|
+
## RuVim の独自機能・強み
|
|
6
|
+
|
|
7
|
+
### Ruby ネイティブな拡張性
|
|
8
|
+
|
|
9
|
+
- 設定ファイルは Ruby DSL(`~/.config/ruvim/init.rb`)
|
|
10
|
+
- `nmap`, `imap`, `map_global`, `set`, `setlocal`, `setglobal`, `command`, `ex_command`, `ex_command_call`
|
|
11
|
+
- Vim script 不要で Ruby の全機能を利用可能
|
|
12
|
+
- `:ruby` / `:rb` で実行中に Ruby eval が可能(Vim の `:ruby` とは別物)
|
|
13
|
+
- plugin 向け `ctx.editor / ctx.buffer / ctx.window` API
|
|
14
|
+
|
|
15
|
+
### ネストしたウィンドウ分割(Layout Tree)
|
|
16
|
+
|
|
17
|
+
- `:vsplit` 後に `:split` すると、対象カラムだけが上下分割される(Vim と同様のツリー構造)
|
|
18
|
+
- 同方向の連続分割は自動的にフラット化(例: hsplit の中で hsplit → 1 レベルに統合)
|
|
19
|
+
- `Shift+Arrow` キーによるスマート分割
|
|
20
|
+
- 同軸方向に既存ウィンドウがあればフォーカス移動
|
|
21
|
+
- なければ新規分割(cross-direction split にも対応)
|
|
22
|
+
- ツリーパスベースの判定で、別領域のウィンドウに影響されない
|
|
23
|
+
|
|
24
|
+
### Rich View モード
|
|
25
|
+
|
|
26
|
+
- TSV / CSV / Markdown をフォーマットして閲覧できる構造化データ表示モード
|
|
27
|
+
- CJK 文字幅を考慮したカラム整列
|
|
57
28
|
|
|
58
|
-
|
|
29
|
+
### Follow mode(`tail -f` 相当)
|
|
59
30
|
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
- paste の挙動は基本的な `charwise` / `linewise` 対応まで
|
|
65
|
-
- Vim の細かいカーソル位置ルールとは差がある可能性がある
|
|
31
|
+
- `:follow` コマンドまたは `-f` CLI フラグでファイル追従モード
|
|
32
|
+
- Linux では inotify(fiddle 経由)を優先、使えない場合は polling(exponential backoff)にフォールバック
|
|
33
|
+
- ファイルの truncation/deletion を検知してメッセージ表示・自動復帰
|
|
34
|
+
- Vim にはない RuVim 独自機能
|
|
66
35
|
|
|
67
|
-
|
|
36
|
+
### 検索は Ruby 正規表現
|
|
68
37
|
|
|
69
|
-
-
|
|
70
|
-
-
|
|
38
|
+
- `/`, `?`, `:s` はすべて Ruby の `Regexp` を使用
|
|
39
|
+
- Vim regex と異なる点はあるが、Ruby 利用者には馴染みやすい
|
|
40
|
+
- `:help regex` でヘルプ表示
|
|
41
|
+
|
|
42
|
+
## Vim と同等に実装済みの機能
|
|
43
|
+
|
|
44
|
+
### モード・編集操作
|
|
45
|
+
|
|
46
|
+
- Normal / Insert / Command-line / Visual(charwise, linewise, blockwise)
|
|
47
|
+
- operator-pending: `d`, `y`, `c` + motion / text object
|
|
48
|
+
- text object: `iw/aw`, `ip/ap`, `i"/a"`, `` i`/a` ``, `i)/a)`, `i]/a]`, `i}/a}`
|
|
49
|
+
- `.` repeat: `x`, `dd`, `d{motion}`, `p/P`, `r<char>`, `i/a/A/I/o/O`, `cc`, `c{motion}`
|
|
50
|
+
- macro 記録中の `.` は内部再生キーを macro に混ぜない
|
|
51
|
+
- word motion: `w`, `b`, `e`(`iskeyword` 対応)
|
|
52
|
+
- macros: `q{reg}`, `@{reg}`, `@@`
|
|
53
|
+
- marks / jumps: `m`, `'`, `` ` ``, `''`, ` `` `, `<C-o>`, `<C-i>`
|
|
54
|
+
|
|
55
|
+
### レジスタ
|
|
56
|
+
|
|
57
|
+
- unnamed(`"`), named(`"a`〜`"z`, `"A` append), black hole(`"_`)
|
|
58
|
+
- yank `"0`, numbered delete `"1`〜`"9`
|
|
59
|
+
- system clipboard `"+`, `"*`(`pbcopy/pbpaste`, `wl-copy/wl-paste`, `xclip`, `xsel`)
|
|
60
|
+
|
|
61
|
+
### Ex コマンド
|
|
62
|
+
|
|
63
|
+
- `:w`, `:q`, `:wq`, `:e`, `:buffer`, `:bnext`, `:bprev`, `:bdelete`, `:ls`, `:split`, `:vsplit`
|
|
64
|
+
- `:qa`, `:qa!`, `:wqa`
|
|
65
|
+
- quickfix / location list: `:vimgrep`, `:lvimgrep`, `:grep`, `:lgrep`, `:copen`, `:cnext`, `:lopen`, `:lnext`
|
|
66
|
+
- tabpage: `:tabnew`, `:tabnext`, `:tabprev`, `:tabs`
|
|
67
|
+
- arglist: `:args`, `:next`, `:prev`, `:first`, `:last`
|
|
68
|
+
- 行操作: `:d` / `:delete`, `:y` / `:yank`
|
|
69
|
+
|
|
70
|
+
### option system
|
|
71
|
+
|
|
72
|
+
- `:set`, `:setlocal`, `:setglobal`(global / buffer-local / window-local)
|
|
73
|
+
- 表示系: `number`, `relativenumber`, `cursorline`, `wrap`, `linebreak`, `breakindent`, `showbreak`, `list`, `listchars`, `colorcolumn`, `signcolumn`, `numberwidth`, `scrolloff`, `sidescrolloff`, `termguicolors`
|
|
74
|
+
- インデント: `shiftwidth`, `softtabstop`, `expandtab`, `autoindent`, `smartindent`, `tabstop`
|
|
75
|
+
- 検索: `ignorecase`, `smartcase`, `hlsearch`, `incsearch`
|
|
76
|
+
- 分割: `splitbelow`, `splitright`
|
|
77
|
+
- grep: `grepprg`, `grepformat`
|
|
78
|
+
- その他: `hidden`, `autowrite`, `clipboard`, `timeoutlen`, `ttimeoutlen`, `backspace`, `whichwrap`, `iskeyword`, `filetype`, `path`, `suffixesadd`, 補完系(`completeopt`, `pumheight`, `wildmode`, `wildmenu`, `wildignore`, `wildignorecase`)
|
|
79
|
+
|
|
80
|
+
### その他
|
|
81
|
+
|
|
82
|
+
- filetype 検出(拡張子 + shebang)/ ftplugin
|
|
83
|
+
- syntax highlight: Ruby(Prism lexer), JSON, Markdown, Scheme, TSV/CSV
|
|
84
|
+
- 補完: Ex コマンド名 + 引数補完, Insert mode buffer words(`Ctrl-n` / `Ctrl-p`)
|
|
85
|
+
- CLI: `--help`, `--version`, `--clean`, `-u`, `-R`, `-M`, `-Z`, `-f`, `-o/-O/-p`, `-c`, `+{cmd}`, `-V`, `--startuptime`, `--cmd`
|
|
86
|
+
|
|
87
|
+
## 動作の微細な差分
|
|
88
|
+
|
|
89
|
+
- undo 粒度は簡略化(Insert mode は「入ってから出るまで」が 1 undo 単位)
|
|
90
|
+
- `.` repeat のカウント互換は完全ではない
|
|
91
|
+
- word motion の単語境界定義が Vim と一致しない場合がある
|
|
92
|
+
- paste のカーソル位置ルールに Vim との差がある可能性がある
|
|
93
|
+
- 文字幅対応は近似(CJK / emoji 幅2 / grapheme cluster は対応するが、East Asian Width 完全互換ではない)
|
|
94
|
+
- ANSI + raw mode の自前描画(行キャッシュによる簡易差分描画で Vim の描画最適化とは別実装)
|
|
71
95
|
- `SIGWINCH + self-pipe + IO.select` でリサイズ追従
|
|
72
|
-
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
## スクリプト / 設定の違い
|
|
79
|
-
|
|
80
|
-
- XDG 設定ファイル(`$XDG_CONFIG_HOME/ruvim/init.rb` または `~/.config/ruvim/init.rb`)を Ruby DSL(`ConfigDSL`)で読む
|
|
81
|
-
- Vim script 互換設定ファイルではない
|
|
82
|
-
- CLI の `-u {path|NONE}` / `--clean` は一部実装済み(Vim 互換の全オプションは未実装)
|
|
83
|
-
- 現状の DSL 例:
|
|
84
|
-
- `nmap`, `imap`, `map_global`
|
|
85
|
-
- `command`
|
|
86
|
-
- `ex_command`
|
|
87
|
-
- `ex_command_call`
|
|
88
|
-
|
|
89
|
-
## CLI オプションの違い
|
|
90
|
-
|
|
91
|
-
- 実装済み(現状)
|
|
92
|
-
- `--help`, `--version`
|
|
93
|
-
- `--clean`
|
|
94
|
-
- `-u {path|NONE}`
|
|
95
|
-
- `-R`, `-M`, `-Z`, `-n`(`-n` は現状 no-op)
|
|
96
|
-
- `-d`(placeholder: 未実装メッセージ)
|
|
97
|
-
- `-q {errorfile}`(placeholder: 未実装メッセージ)
|
|
98
|
-
- `-S [session]`(placeholder: 未実装メッセージ)
|
|
99
|
-
- `-o[N]`, `-O[N]`, `-p[N]`(基礎)
|
|
100
|
-
- `-V[N]`, `--verbose[=N]`(簡易)
|
|
101
|
-
- `--startuptime FILE`(簡易)
|
|
102
|
-
- `--cmd {cmd}`(pre-config Ex 実行)
|
|
103
|
-
- `-c {cmd}`
|
|
104
|
-
- `+{cmd}`, `+{line}`, `+`
|
|
105
|
-
- 未実装(Vim で定番だが RuVim は未対応)
|
|
106
|
-
- 実処理としては `-S`, `-q`, `-d` など(現状は placeholder のみ)
|
|
107
|
-
- 複数ファイル引数は `-o/-O/-p` 時のみ対応(通常起動の arglist 相当は未実装)
|
|
108
|
-
|
|
109
|
-
## option(設定)の違い
|
|
110
|
-
|
|
111
|
-
- 現状の実装済み option は少数(`number`, `relativenumber`, `ignorecase`, `smartcase`, `hlsearch`, `tabstop`, `filetype`)
|
|
112
|
-
- Vim の option 名短縮(例: `nu`, `ts`)は未対応
|
|
113
|
-
- `:set` の高度な構文(`+=`, `-=`, `^=`, `&`, `<` など)は未対応
|
|
114
|
-
- `:set all` や詳細な一覧表示は未対応(簡易表示のみ)
|
|
115
|
-
|
|
116
|
-
### Vim にあるが未実装の代表例(RuVim 現状)
|
|
117
|
-
|
|
118
|
-
- 表示系
|
|
119
|
-
- `relativenumber`
|
|
120
|
-
- `cursorline`
|
|
121
|
-
- `wrap`
|
|
122
|
-
- `list`, `listchars`
|
|
123
|
-
- `colorcolumn`
|
|
124
|
-
- `signcolumn`
|
|
125
|
-
- `numberwidth`
|
|
126
|
-
- `scrolloff`, `sidescrolloff`
|
|
127
|
-
- インデント/編集系
|
|
128
|
-
- `shiftwidth`
|
|
129
|
-
- `softtabstop`
|
|
130
|
-
- `expandtab`
|
|
131
|
-
- `autoindent`
|
|
132
|
-
- `smartindent`
|
|
133
|
-
- 検索系
|
|
134
|
-
- `ignorecase`
|
|
135
|
-
- `smartcase`
|
|
136
|
-
- `hlsearch`
|
|
137
|
-
- `incsearch`
|
|
138
|
-
- split / window 系
|
|
139
|
-
- `splitbelow`
|
|
140
|
-
- `splitright`
|
|
141
|
-
- `winfixheight`
|
|
142
|
-
- `winfixwidth`
|
|
143
|
-
- ファイル / 永続化系
|
|
144
|
-
- `swapfile`
|
|
145
|
-
- `backup`
|
|
146
|
-
- `writebackup`
|
|
147
|
-
- `undofile`
|
|
148
|
-
- `undodir`
|
|
149
|
-
- UI / 端末 / パフォーマンス系
|
|
150
|
-
- `termguicolors`
|
|
151
|
-
- `timeoutlen`
|
|
152
|
-
- `ttimeoutlen`
|
|
153
|
-
- `updatetime`
|
|
154
|
-
|
|
155
|
-
注記:
|
|
156
|
-
- これは網羅一覧ではなく、よく使われるものの代表例です。
|
|
157
|
-
- 実装済み option の一覧は `docs/config.md` を参照。
|
|
158
|
-
|
|
159
|
-
## 未実装(Vim との差分として大きいもの)
|
|
160
|
-
|
|
161
|
-
- text objects は一部のみ(`iw/aw`, `ip/ap`, `i"/a"`, ``i`/a` ``, `i)/a)`, `i]/a]`, `i}/a}`)
|
|
162
|
-
- change operator(`c` 系)は基礎のみ
|
|
163
|
-
- macros / replay は基礎のみ(`q{reg}`, `@{reg}`, `@@`)
|
|
164
|
-
- marks / jumps は基礎のみ(`m`, `'`, `` ` ``, `''`, `````, `<C-o>`, `<C-i>`)
|
|
165
|
-
- search regex 互換(現状は Ruby 正規表現)
|
|
166
|
-
- search は Ruby 正規表現ベース(Vim regex と非互換な点あり)
|
|
167
|
-
- substitute は最小実装(`:%s/.../.../g` のみ、Vim の置換フラグ群は未対応)
|
|
168
|
-
- folds
|
|
169
|
-
- syntax highlight は最小実装(regex ベース / `ruby`, `json` のみ)
|
|
170
|
-
- 補完は基礎のみ
|
|
171
|
-
- Ex 補完(コマンド名 + 一部引数)
|
|
172
|
-
- Insert mode buffer words 補完(`Ctrl-n` / `Ctrl-p`)
|
|
173
|
-
- LSP / diagnostics
|
|
174
|
-
- job/channel/terminal 連携
|
|
96
|
+
- `:w!` は現状 `:w` とほぼ同じ(権限昇格や readonly 強制保存は未実装)
|
|
97
|
+
- `:command` は Ex 文字列エイリアス展開の簡易実装
|
|
98
|
+
- Visual blockwise は矩形選択 + `y/d` の最小対応(blockwise text object / paste の Vim 互換挙動は未実装)
|
|
99
|
+
- option 名短縮(`nu`, `ts` 等)は未対応
|
|
100
|
+
- `:set` の高度な構文(`+=`, `-=`, `^=` 等)は未対応
|
|
101
|
+
- small delete register `"-` は未実装
|
|
175
102
|
|
|
176
|
-
##
|
|
103
|
+
## 未実装の主要機能
|
|
177
104
|
|
|
178
|
-
- Vim
|
|
179
|
-
-
|
|
180
|
-
-
|
|
105
|
+
- Vim script 互換 / プラグイン互換
|
|
106
|
+
- folds
|
|
107
|
+
- LSP / diagnostics
|
|
108
|
+
- job / channel / terminal 連携
|
|
109
|
+
- `:make`, `:cfile`, `:lfile`(`:grep`, `:lgrep` は実装済み)
|
|
110
|
+
- substitute の `c`(confirm)フラグ(`g`, `i`, `I`, `n`, `e` は実装済み)
|
|
111
|
+
- swap / backup / undofile(永続 undo)
|
|
112
|
+
- `-d`(diff mode), `-q`(quickfix mode), `-S`(session)は placeholder のみ
|