Fixed
- EasyMotion line motions (
j/k) operate characterwise instead of linewise in operator-pending mode —d<leader><leader>j{label}deleted from cursor column to the target position (characterwise) instead of deleting full lines (linewise). Native Vimj/khavemotionArgs: { linewise: true }. Addedlinewise: trueto botheasyMotionLineandeasyMotionLineBackdefinitions.- Plugin:
src/easymotion/register.ts(addedmotionArgs: { linewise: true, forward: true/false }to line motion entries)
- Plugin:
- EasyMotion forward motions do not set
motionArgs.forward— the fork'sclipToLinefunction (which clips trailing newline+whitespace for multi-line forward operations) never fired for EasyMotion motions. Addedforward: trueorforward: falseto all 17 directional EasyMotion motion definitions.- Plugin:
src/easymotion/register.ts(addedforwardflag to allEASYMOTION_DEFSentries)
- Plugin:
- Insert-mode surround macro recording —
<C-g>s{char}keys typed during insert mode were not logged to the macro key buffer. The fork'shandleKeyInsertModenow callslogKeywhen a full insert-mode command is matched, recording the complete key sequence to the macro register.- Fork:
~/Repos/codemirror-vim/src/vim.js(handleKeyInsertMode—logKeyonmatch.type == 'full')
- Fork:
easyMotionRepeatoperator-pending mode —easyMotionRepeatwas registered as an action (defineAction) which cannot participate in operator-pending mode. Changed to a motion (defineMotion) withmapCommandbinding at<leader><leader>.. The motion inheritsmotionArgsfrom the last executed EasyMotion motion, so operators apply with correctlinewise/inclusive/forwardflags.- Plugin:
src/easymotion/register.ts(changed fromdefineActiontodefineMotion+mapCommand, addedlastMotionArgsstorage)
- Plugin:
:m/:tnewline handling at document boundaries — moving or copying lines to position 0 (top of file) or after the last line produced concatenated text without newline separation. FixedgetLineRangeTextto include the preceding newline separator when extracting the last line, andcreateMoveCopyCommandto insert with correct newline placement at boundaries.- Plugin:
src/workspace/commands.ts(getLineRangeTextboundary handling,createMoveCopyCommandinsert text normalization)
- Plugin:
- Table cell count prefixes —
3jin both table-nav overlay mode and cell editor mode performed a single cell crossing instead of three. Three changes: (1) table-nav keymap now accumulates digit keys as a count prefix and passes the count tonavigate(). (2)navigate()loopscounttimes for directional movement. (3) Cross-cell motion overrides (moveByLines,moveByDisplayLines) now looprepeattimes throughgetCellBelow/getCellAbove, stopping at table boundaries.- Plugin:
src/vim/table-nav-keymap.ts(digit accumulation,consumeCount(), count parameter on navigation keys) - Plugin:
src/vim/table-nav-controller.ts(navigate()count parameter, loop) - Plugin:
src/vim/table-cell-motions.ts(createMoveByLines,createMoveByDisplayLinesrepeat loop)
- Plugin:
- Cross-cell word motions —
w/b/e/W/B/E/ge/gEat cell boundaries did not jump to the adjacent cell. Added amoveByWordsoverride intable-cell-motions.tsthat detects when the word motion result isnullor stuck at a boundary, and crosses to the next/previous cell viagetNextCell.- Plugin:
src/vim/table-cell-motions.ts(newcreateMoveByWordsoverride, registered inapplyTableCellMotions)
- Plugin:
- Table-nav dot-repeat for structural commands —
.in table-nav mode now repeats the last structural command (o,O,dd,dc,J,K,H,L,I,A). Count prefix works (3.repeats 3 times). Cleared on cell edit entry so vim's native.handles text edits.- Plugin:
src/vim/table-nav-keymap.ts(lastStructuralActiontracking,.handler with count) - Plugin:
src/vim/table-nav-controller.ts(clearLastStructuralActionon cell edit entry)
- Plugin:
- Multi-line
tcolumn 0 exclusion — forwardt{char}targets at column 0 were excluded entirely instead of wrapping to the previous line's last character. Fixed in both flash (applyTillOffsetinchar-mode.ts) and EasyMotion (findTillTargetsintargets.ts). Targets at column 0 of line 0 (no previous line) are still excluded.- Plugin:
src/flash/char-mode.ts(applyTillOffset— wrap to previous line) - Plugin:
src/easymotion/targets.ts(findTillTargets— same fix)
- Plugin:
- EXTRA_DEFS bidirectional motions lack motionArgs —
easyMotionBdEndWord,easyMotionBdEndWORD,easyMotionBdTillnow haveinclusive: true, andeasyMotionBdLinehaslinewise: true. Applied viaObject.assign(motionArgs, defArgs)inside the motion function body, bypassing thedefineMotion-only limitation.- Plugin:
src/easymotion/register.ts(EXTRA_DEFSmotionArgs + motion function mutation)
- Plugin:
- Tab/Shift+Tab in table-nav — Tab in cell edit mode now exits the cell and returns to table-nav on the next cell. Tab/Shift+Tab also work directly in table-nav mode as cell navigation (equivalent to
l/h). Count prefix works (3Tabmoves 3 cells forward).- Plugin:
src/vim/table-nav-keymap.ts(Tab/Shift+Tab case in nav handler) - Plugin:
src/vim/table-nav-controller.ts(Tab/Shift+Tab Scope handlers in cell edit)
- Plugin:
Tests
- 3 new e2e tests in
test/specs/easymotion-comprehensive.e2e.ts:d+easymotion jlinewise delete,y+easymotion jlinewise yank with register flag,d+easymotion klinewise delete upward - 2 new e2e tests in
test/specs/easymotion-comprehensive.e2e.ts:d+easyMotionRepeatoperator-pending delete,d+easyMotionRepeatafter line motion preserves linewise - 1 new e2e test in
test/specs/surround.e2e.ts: macro register contains<C-g>skeys after recording - 6 crash-guard tests in
test/specs/vim-builtin/ex-move-copy-normal.e2e.tsstrengthened to behavioral assertions (:m0,:m$,:m-2,:1,2m$,:t$,:1,2t$) + 2 new tests (:m3,:t0) - 2 new e2e tests in
test/specs/table-nav-mode.e2e.ts:3jmoves 3 rows in table-nav,2lmoves 2 columns - 2 new e2e tests in
test/specs/table-cell-vim-mode.e2e.ts: cross-cellwat end of cell, cross-cellbat start of cell - 3 new e2e tests in
test/specs/table-nav-mode.e2e.ts:.repeatso,2.repeats twice,.cleared after cell edit - 3 new unit tests in
test/unit/flash-targets.test.ts:findTillTargetscolumn 0 wrap, column 0 line 0 exclusion, non-zero column - 2 new e2e tests in
test/specs/table-nav-mode.e2e.ts: Tab in cell edit returns to nav, Shift+Tab navigates backward - 1 new e2e test in
test/specs/flash-char-mode.e2e.ts: multi-linetwraps to previous line end at column 0 - 1 new e2e test in
test/specs/easymotion-comprehensive.e2e.ts:y + easyMotionBdLineviamapCommandyanks linewise (EXTRA_DEFS motionArgs)
Documentation
CHANGELOG.mdKNOWN_LIMITATIONS.md: marked EasyMotion linewise, forward motionArgs, insert-mode surround macro recording,easyMotionRepeatoperator-pending,:m/:taddress parsing, table count prefixes, cross-cell word motions, table-nav dot-repeat, multi-linetcolumn 0, EXTRA_DEFS motionArgs, and Tab/Shift+Tab in table-nav as fixedCONTRIBUTING.md: updatedeasymotion/register.tsandtable-cell-motions.tsdescriptions,table-nav-keymap.tsdescription- Fork:
~/Repos/codemirror-vim/DIFFERENCES.md(updated insert-mode surround macro recording section) docs/features/tables.md: added count prefix, cross-cell word motions (w/b/e), dot-repeat (.), Tab/Shift+Tab to keybindings table and native mode navigation tabledocs/features/easymotion.md: added "Repeat last motion" section with<leader><leader>.bindingdocs/reference/keybindings.md: added "EasyMotion repeat" section with<leader><leader>.binding
Full Changelog: 0.127.0...0.128.0