Fixed
- Async motion callback exits visual-line mode — when an EasyMotion async motion resolved in visual-line mode, the
.then()callback calledupdateCmSelection(cm)outside of acm.operation()context. With cursor-only CM6 selection,handleExternalSelectiondetectedvisualMode && !somethingSelected()and exited visual mode. Fixed by wrapping the callback'supdateCmSelectioncall incm.operation()withisVimOp = true, matching the protection used by all other vim operation entry points. (#41)- Fork: async motion visual mode branch in
vim.jsnow wrapsupdateCmSelectionincm.operation()withisVimOp = true - Test:
easymotion-visual.e2e.tsupdated to verify visual-line easymotion via register content (yank +getRegisterContent) instead ofgetSelection(), which returns empty with cursor-only CM6 selection
- Fork: async motion visual mode branch in
- Visual line selection overlap in Live Preview — visual-line mode (
V) rendered both the plugin's custom full-line highlight decoration and the native CM6::selectionCSS simultaneously, causing a visible double-highlight. Fixed by adding a.cm-vimVisualLineclass to the editor scrollDOM when in visual-line mode and extending the::selectiontransparency rule to suppress native selection rendering in that mode. Charwise (v) and blockwise (Ctrl-V) visual modes are unaffected. (#41) - Visual-line cursor displacement over collapsed markup in Live Preview — navigating with
V+j/kon lines containing collapsed markup ([[wikilinks]],[text](url)) caused Obsidian to uncollapse the hidden content, reflowing the line and making the cursor appear to need extra steps. Root cause:updateCmSelectionset a spanning CM6EditorSelectionrange across the full line content; Obsidian's Live Preview detects selection overlap withDecoration.replaceranges and reveals them. Fixed by setting a cursor-only CM6 selection (atsel.headposition) in visual-line mode — thelinewiseVisualHighlightViewPlugin already provides the visual highlight independently fromvim.sel, and operators (y/d/c) recompute their own selection at dispatch time. (#41)- Fork:
updateCmSelectioninvim.jsnow setscm.setCursor(sel.head)instead of a spanning range whenvim.visualLineis true - Fork:
joinLinesaction invim.jsnow reads fromvim.selinstead ofcm.getCursor('anchor'/'head')in visual mode, fixingV+Jregression from cursor-only selection - Fork:
replaceaction invim.jsnow reads fromvim.selinstead ofcm.getCursor('start'/'end')in visual mode, with line boundary expansion for visual-line; removed unusedselectionsvariable - Fork:
index.tsadds Ctrl+C special-case that copies linewise text fromvim.selwhensomethingSelected()returns false in visual-line mode - Fork:
index.tsadds.cm-vimVisualLineclass toggle inupdateClass() - Fork:
block-cursor.tsextends::selectionsuppression CSS selector to include.cm-vimVisualLine - Plugin:
styles.cssoverrides.cm-vim-linewise-selectionwithvar(--text-selection)for theme alignment (already present from 0.27.0) - 6 new Neovim golden comparison test cases:
V+j+ycursor position,V+2j+dmulti-line delete,Vkupward selection,Vjkround-trip,v→Vtransition,V→vtransition - 7 new e2e tests: visual-line yank with markup content, multi-line yank register verification,
gvafter visual-line yank,v→VandV→vmode transitions
- Fork:
Full Changelog: 0.27.1...0.28.0