#author("2026-09-14T17:31:46+09:00","","")
#author("2026-09-14T17:32:12+09:00","","")
* Spec Hold [#cef65b46]

- タタン、タタン、タタンで加速
- タン、タン、タンで減速
- タタタタタンで最初から爆速
- 20タンでも最初から爆速、タタン、タン、も有効
- rush-count は廃止

** rush.nvim内部処理仕様 [#w4f4a4b0]

- keymap.set で置き換えたkeymapを監視する。置き換えるキーは具体的には "j", <C-f>, "gj" など。
-- <C-f>, "gj" などはまだ実験していない
- key K を長押しする操作を<hold-K>と表記する
- 同時にon_keyで置き換えていないkey eventを監視する。(<C-f>などの場合どうするかは未定)
- keymap.set で登録した関数が呼び出されるたびにrush eventを発生させる
- rush eventの内容
-- 発生時間(vim.loop.hrtime)
-- 押されたkey
-- 連打開始直前に押されたキー(なければ"")
-- vim_count:連打開始時のvim.v.count 
-- 前回key eventからの時間間隔(最初のkey evetの場合はvimが起動してからevent発生までの時間間隔)
- rush eventの種類
-- tap: 前と同じキーが短時間(おおよそinterval.rep以内)に続けて押された 
--- 同一キー連打回数ntを提供する。連打開始はclickになるので、tapの場合2からはじまる
-- start: キーを押し込んだ最初のeventはtap|clickだが2番目のkey eventはhold-startと判定する
--- start2がよいか?
-- repeat: キーを押し込んだ後3番目以降のkey eventはrepeat rush eventと判定する
--- hold時間を提供する。hold時間とはhold開始からの経過時間。最初は≒interval.hold2+interval.rep
--- repeat回数nrを提供する。repeat回数とはhold中に発生したkey event回数。3から始まる。
-- click: その他のkey event。連打でない場合、時間をおいてタイプの場合に相当する
-- repeat-end: hold終了event。repeatからinterval.rep経過後repat eventがなければ発生する。またはrepeat以外のeventが発生する直前に発生する
- 具体例
-- しばらく時間をおいてから"jjk<hold-k>"と連続タイプした場合のrush event概要
-- click-j(1,0), tap-j(2,0), tap-k(1,0), tap-k(2,0), start-k(2,2), repeat-k(2,3), repeat-k(2,4), ..., repeat-end(2,n)
-- 括弧は(nt,nr)

利用例(アイデア)

- rush eventの内容をみてreturnする文字列や振る舞いを自由に設定することができる
- 例、j<hold-j>の場合
-- click-j(1,0), tap-j(2,0), start-j(2,2), repeat-j(2,3), ... となるので
-- nr!=0なら return "2j" とする
- 例、<hold-j>の場合
-- nr!=0なら return vim_count .. "j" とする
- 例、n,<hold-n>の場合
-- nr!=0なら 検索履歴表示
- 例、j,kの場合
-- return <esc>
- 例、j,<hold-k>の場合
-- return "", 女子高生とのチャットゲーム開始
- &color(,orange){<hold-j><hold-j><hold-j> と<hold-j>を繰り返すたびに移動量が倍になる。};
- &color(,orange){勝手に加速しない。加速度合いを制御できる};
- &color(,orange){Ctrlキーを押すたびに遅くなるとか};

Front page   Edit Diff History Attach Copy Rename Reload   New Page list Search Recent changes   Help   RSS of recent changes