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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5d2d270426e0c654c22de404d8745368dbc7a5eb98fc91eecad94624a3b91b6c
4
- data.tar.gz: 75ad40c44e89934ab1746d43aee2ac09c695513d6edb6f7e71d0b888126931a8
3
+ metadata.gz: 8f942ba8fad5d2732b0369e0f79f0760c326f602bed0d754a578f4ddb28794ba
4
+ data.tar.gz: 2c82a6317f9e5e34b7319db75ea7bd12b333f6841ce77cd52b5e50edfcbdec22
5
5
  SHA512:
6
- metadata.gz: 938e1eb393efd57f97260526fc40f375d27ca0aecf9b370d0b0b41b7c3f535026b1c8be82588a2713025c615e4e5222abe871f46918fbc08f3fef9b35347e023
7
- data.tar.gz: f0a3fb80d5f3e2395daf0c689fd4129bfd6ff026e3184eb8f0e58ffc68f19ede36be7ac6c914fa3a2a70bd9b7c9bb95ae60bf292f760ce7691b498a0b12d66a7
6
+ metadata.gz: 97b81ea7eff50fc175d862265224996b358e61b6d3bd4d5710446bdaa7cae4048352fcf8d41b9c81a31f9d1a2bc7c3602490d9e488f75a536aab29b46571db62
7
+ data.tar.gz: 38e25791b5f3ff239e9b175b02007e0964b3e3ca423abe3e2665eeec615b0b6aefa5458323c2a7ab79bf55f94220985fc3cf4ffa49c93cdd4f1912ac57d585c6
data/docs/binding.md CHANGED
@@ -61,15 +61,20 @@
61
61
  - `.` : 直前変更の repeat(現状: `x`, `dd`, `d{motion}`, `p/P`, `r<char>`)
62
62
  - `Ctrl-o` : jumplist の古い位置へ
63
63
  - `Ctrl-i` : jumplist の新しい位置へ(端末では Tab と同じコード)
64
+ - `Ctrl-d` / `Ctrl-u` : 半ページ下/上へ移動(概ね表示高さの半分)
65
+ - `Ctrl-f` / `Ctrl-b` : 1ページ下/上へ移動(`PageDown` / `PageUp` 相当)
66
+ - `Ctrl-e` / `Ctrl-y` : カーソル位置をなるべく保ったまま画面を1行下/上へスクロール(最小実装)
64
67
  - `q{reg}` : macro 記録開始/終了(再度 `q` で停止)
65
68
  - `@{reg}` / `@@` : macro 再生 / 直前 macro 再生
66
69
  - `n` : 直前検索を次へ
67
70
  - `N` : 直前検索を前へ(逆方向)
68
71
  - `*` / `#` : カーソル下の単語検索(前/後)
69
72
  - `g*` / `g#` : カーソル下の単語を部分一致検索(前/後)
73
+ - `gf` : カーソル下のファイル名を開く(最小。`path` / `suffixesadd` を参照)
70
74
  - `Esc` : メッセージ/保留入力のクリア
71
75
  - `矢印キー` : 移動
72
76
  - `PageUp` / `PageDown` : 画面単位で移動(概ね表示高さ - 1 行)
77
+ - `Enter` : quickfix / location list バッファ上では選択項目へジャンプ(一覧ウィンドウから元の編集ウィンドウへ戻る)
73
78
 
74
79
  ### count 対応(現状)
75
80
 
@@ -122,4 +127,5 @@
122
127
  - `d` は keymap の固定列ではなく operator-pending 状態機械で解釈
123
128
  - keymap 解決順(現状実装): `filetype-local -> buffer-local -> mode-local -> global`
124
129
  - `~/.config/ruvim/init.rb`(または `$XDG_CONFIG_HOME/ruvim/init.rb`)の `nmap` / `imap` / `map_global` で上書き・追加可能
130
+ - `Ctrl-d/u/f/b/e/y` に加えて、`矢印キー` / `PageUp` / `PageDown` も「既定挙動の前に keymap override を試す」ため `nmap "<PageDown>", ...` のように上書き可能
125
131
  - `~/.config/ruvim/ftplugin/<filetype>.rb`(または `$XDG_CONFIG_HOME/ruvim/ftplugin/<filetype>.rb`)では `nmap` / `imap` が filetype-local として登録される
data/docs/command.md CHANGED
@@ -94,8 +94,17 @@
94
94
  - 形式: `:ruby <code>`
95
95
  - 形式: `:rb <code>`
96
96
  - Ruby コードを評価し、返り値をステータスに表示
97
+ - `stdout` / `stderr` に出力があった場合は `[Ruby Output]` 仮想バッファに表示(返り値も末尾に表示)
97
98
  - 利用可能: `ctx`, `editor`, `buffer`, `window`
98
99
 
100
+ ### `:!`(shell 実行, 最小)
101
+
102
+ - 形式: `:!<command>`
103
+ - shell コマンドを同期実行します
104
+ - `stdout` / `stderr` に出力があった場合は `[Shell Output]` 仮想バッファに表示(終了ステータスも表示)
105
+ - 出力がない場合は `shell exit N` をステータス表示
106
+ - `-Z`(restricted mode)では無効
107
+
99
108
  ### `:ls` / `:buffers`
100
109
 
101
110
  - 形式: `:ls`
@@ -121,6 +130,13 @@
121
130
  - バッファ ID / 名前 / `#`(alternate)で切替
122
131
  - `!` 対応(未保存変更を無視して切替)
123
132
 
133
+ ### `:bdelete` / `:bd`
134
+
135
+ - 形式: `:bdelete [id|name|#]`
136
+ - 現在バッファ(または指定バッファ)を一覧から削除
137
+ - 表示中 window は別バッファへ切り替えられる
138
+ - `!` 対応(未保存変更バッファを破棄)
139
+
124
140
  ### `:split`
125
141
 
126
142
  - 形式: `:split`
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
- ### `number`
65
-
66
- - 型: `bool`
67
- - 既定スコープ: `window-local`
68
- - デフォルト: `false`
69
- - 用途:
70
- - 行番号表示の ON/OFF
71
- - 描画(`Screen`)に反映
72
- - 例:
73
- - `:set number`
74
- - `:set nonumber`
75
- - `:setlocal number`
76
-
77
- ### `relativenumber`
78
-
79
- - 型: `bool`
80
- - 既定スコープ: `window-local`
81
- - デフォルト: `false`
82
- - 用途:
83
- - 相対行番号表示
84
- - `number` 併用時は current line を絶対行番号、それ以外を相対行番号で表示
85
- - 例:
86
- - `:set relativenumber`
87
- - `:set norelativenumber`
88
- - `:setlocal relativenumber`
89
-
90
- ### `tabstop`
91
-
92
- - 型: `int`
93
- - 既定スコープ: `buffer-local`
94
- - デフォルト: `2`
95
- - 用途:
96
- - タブ展開幅(表示幅計算・描画)
97
- - 例:
98
- - `:set tabstop=4`
99
- - `:set tabstop?`
100
- - `:setlocal tabstop=2`
101
- - `:setglobal tabstop=8`
102
-
103
- ### `filetype`
104
-
105
- - 型: `string`
106
- - 既定スコープ: `buffer-local`
107
- - デフォルト: `nil`
108
- - 用途:
109
- - filetype-local keymap 解決
110
- - ftplugin ロード対象の決定
111
- - 備考:
112
- - 通常は path から自動検出される
113
- - 手動で `:set filetype=ruby` も可能
114
- - 現状、手動変更時に ftplugin を再適用する仕組みはない
115
-
116
- ### `ignorecase`
117
-
118
- - 型: `bool`
119
- - 既定スコープ: `global`
120
- - デフォルト: `false`
121
- - 用途:
122
- - 検索・置換で大文字小文字を無視
123
- - 例:
124
- - `:set ignorecase`
125
- - `:set noignorecase`
126
-
127
- ### `smartcase`
128
-
129
- - 型: `bool`
130
- - 既定スコープ: `global`
131
- - デフォルト: `false`
132
- - 用途:
133
- - `ignorecase` 有効時、検索パターンに大文字を含む場合は case-sensitive にする
134
- - 例:
135
- - `:set smartcase`
136
- - `:set nosmartcase`
137
-
138
- ### `hlsearch`
139
-
140
- - 型: `bool`
141
- - 既定スコープ: `global`
142
- - デフォルト: `true`
143
- - 用途:
144
- - 検索マッチの画面ハイライト ON/OFF
145
- - 例:
146
- - `:set hlsearch`
147
- - `:set nohlsearch`
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` の最小探索に利用します。
221
+ - `lib/**` のような再帰探索(簡易)に対応します。
222
+
223
+ - `suffixesadd` (`string`, default `nil`) [`PARTIAL`]
224
+ - `gf` などで補完する拡張子候補を指定します(`,` 区切り)。
225
+ - 現状は `gf` の最小探索に利用します。
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
 
@@ -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
- - 直接使わなくても、通常は `ctx.count` / `ctx.bang?` で足ります
508
-
509
- ### `ctx.count`
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
- - `ctx.bang?` と同じ意味
534
+ - Ex コマンドが `!` 付きで呼ばれたかどうか
537
535
  - `count`
538
- - `ctx.count` と同じ意味
536
+ - Normal mode の count(なければ `1`)
539
537
 
540
538
  ## どこまで plugin と呼べる?
541
539
 
data/docs/spec.md CHANGED
@@ -189,7 +189,8 @@ RuVim::ExCommandRegistry.instance.register(
189
189
  - `-Z`
190
190
  - restricted mode(現状)
191
191
  - user config / ftplugin を読み込まない
192
- - `:ruby` を禁止する
192
+ - `:ruby` / `:rb` を禁止する
193
+ - `:!` を禁止する
193
194
  - `-n`
194
195
  - 現状は no-op(将来の swap / 永続 undo / session 互換の先行予約)
195
196
  - `-o[N]`, `-O[N]`, `-p[N]`
@@ -308,15 +309,20 @@ RuVim::ExCommandRegistry.instance.register(
308
309
  - `:commands`
309
310
  - `:command[!] <Name> <ex-body>`
310
311
  - `:ruby <code>` / `:rb <code>`
312
+ - `:!<command>`
311
313
  - `:ls` / `:buffers`
312
314
  - `:bnext` / `:bn`
313
315
  - `:bprev` / `:bp`
314
316
  - `:buffer <id|name|#>` / `:b <id|name|#>`
317
+ - `:bdelete[!] [id|name|#]` / `:bd[!] [id|name|#]`
315
318
  - `:split`
316
319
  - `:vsplit`
317
320
  - `:tabnew [path]`
318
321
  - `:tabnext` / `:tabn`
319
322
  - `:tabprev` / `:tabp`
323
+ - `:vimgrep`, `:lvimgrep`
324
+ - `:copen`, `:cclose`, `:cnext` / `:cn`, `:cprev` / `:cp`
325
+ - `:lopen`, `:lclose`, `:lnext` / `:ln`, `:lprev` / `:lp`
320
326
 
321
327
  ## 検索仕様(現状)
322
328
 
@@ -362,7 +368,15 @@ RuVim::ExCommandRegistry.instance.register(
362
368
  - `editor`
363
369
  - `buffer`
364
370
  - `window`
365
- - 返り値はステータスラインに表示(`inspect`)
371
+ - `stdout` / `stderr` に出力があれば `[Ruby Output]` 仮想バッファに表示(返り値も表示)
372
+ - 出力がない場合、返り値をステータスラインに表示(`inspect`)
373
+
374
+ ### `:!`(shell 実行, 最小)
375
+
376
+ - `:!<command>` で shell コマンドを同期実行
377
+ - `stdout` / `stderr` があれば `[Shell Output]` 仮想バッファに表示(終了ステータスを含む)
378
+ - 出力がない場合は `shell exit N` をステータス表示
379
+ - restricted mode(`-Z`)では禁止
366
380
 
367
381
  ### バッファ管理 Ex コマンド(現状仕様)
368
382
 
@@ -373,6 +387,7 @@ RuVim::ExCommandRegistry.instance.register(
373
387
  - 数値ID
374
388
  - パス名 / basename
375
389
  - `#`(alternate buffer)
390
+ - `:bdelete` / `:bd` : バッファ削除(未保存は `!` 必須)
376
391
 
377
392
  ### alternate buffer(`#`)
378
393
 
@@ -387,8 +402,10 @@ ANSI エスケープシーケンスによる再描画です。
387
402
  - 代替スクリーン (`?1049h / ?1049l`)
388
403
  - カーソル非表示/表示 (`?25l / ?25h`)
389
404
  - 行キャッシュによる簡易差分描画(同サイズ時)
390
- - 最下段: status line
391
- - Command-line mode 時は最下段を command-line、1つ上を status line
405
+ - フッターは 2 行固定:
406
+ - 最下段: command line / error message
407
+ - 1つ上: status line
408
+ - Command-line mode 時も status line は維持し、最下段だけを入力行として使う
392
409
  - ファイル未指定起動時は Vim 風 intro screen を表示(RuVim では intro 用の read-only 特殊バッファ)
393
410
  - カーソル位置の文字を反転表示(見やすさ向上)
394
411
 
@@ -573,12 +590,12 @@ Vim 完全互換ではなく、まずは扱いやすい粒度を優先した仕
573
590
  - `:set`
574
591
  - `:setlocal`
575
592
  - `:setglobal`
576
- - 実装済み option:
577
- - `number`(window-local, bool)
578
- - `relativenumber`(window-local, bool)
579
- - `ignorecase` / `smartcase` / `hlsearch`(global, bool)
580
- - `tabstop`(buffer-local, int)
581
- - `Screen` `number` / `relativenumber` / `tabstop` を描画に反映する
593
+ - 実装済み option は `RuVim::Editor::OPTION_DEFS` に定義(現状 `49` 個)
594
+ - 代表例:
595
+ - window-local: `number`, `relativenumber`, `wrap`, `linebreak`, `breakindent`, `cursorline`, `scrolloff`, `sidescrolloff`
596
+ - global: `ignorecase`, `smartcase`, `hlsearch`, `incsearch`, `splitbelow`, `splitright`, `hidden`, `clipboard`, `timeoutlen`
597
+ - buffer-local: `tabstop`, `expandtab`, `shiftwidth`, `softtabstop`, `autoindent`, `smartindent`, `filetype`
598
+ - 詳細な一覧・実装状況は `docs/config.md` を参照
582
599
 
583
600
  ## Filetype / ftplugin(現状の基礎)
584
601
 
@@ -641,15 +658,15 @@ Vim 完全互換ではなく、まずは扱いやすい粒度を優先した仕
641
658
  - `test/dispatcher_test.rb`
642
659
  - `test/keymap_manager_test.rb`
643
660
 
644
- ## 既知の未実装 / 今後の仕様候補
645
-
646
- - Undo / Redo
647
- - 複数 window split
648
- - Tabpage
649
- - レジスタ(yank/delete)
650
- - 検索 (`/`, `?`)
651
- - operator-pending(`d` + motion)
652
- - 差分描画
653
- - filetype / buffer-local keymap
654
- - user-defined Ex command DSL(`:command`)
655
- - `:ruby`(Ruby 式評価)
661
+ ## 既知の未実装 / 今後の仕様候補(現状)
662
+
663
+ - 永続 undo(`undofile` / `undodir` 相当)
664
+ - session 保存/復元(`-S` / `:mksession` 相当の実体)
665
+ - `:grep` / `:make` / `:cfile` / `:lgrep` / `:lfile` など quickfix 入口
666
+ - Ex range/address(`:1,10d`, `:.,$s/.../.../` など)
667
+ - `:substitute` フラグ拡張(`c`, `i`, `I`, `n`, `e` など)
668
+ - arglist(複数ファイル起動 + `:args`, `:next`, `:prev` 等)
669
+ - `Ctrl-w` resize / close-others / equalize など window 操作拡張
670
+ - `:set` 高度構文(`+=`, `-=`, `:set all`, 短縮名)
671
+ - tag jump / folds / `:global` / `:normal`
672
+ - LSP / diagnostics / fuzzy finder など中長期機能