Change:
Issue Type: <bBug</bsince the lsat version, when using up arrow to go through a document... if you get to a place where word-wrapforces the cursor to jump to the right (because the cursor is at the left margin & word-wrap is indented)... when the cursor should go to the beginning of the wrapped line, it instead jumps tot he end of the previous line VS Code version: Code 1.64.2 (, 2022-02-09T22:02:28.252Z) OS version: WindowsNT x64 10.0. Restricted Mode: No <details<summarySystem Info</summary </details<details<summaryExtensions (105)</summaryExtensionVersion ------ html-snippets0.2.1 vscode-icalendar1.0.1 vscode-m3u1.0.0 vscode-caniuse0.5.0 case-change1.0.2 Bookmarks13.2.4 rtf2.4.0 vscode-sqlite0.14.0 swagger-viewer3.1.2 spellright3.0.60 armview0.4.6 markdown-checkbox0.3.2 markdown-emoji0.2.1 markdown-footnotes0.0.7 markdown-mermaid1.13.2 markdown-yaml-preamble0.1.0 vscode-tldr1.0.0 mermaid-markdown-syntax-highlighting1.2.2 npm-intellisense1.4.1 gitignore0.7.0 disableligatures0.0.10 vscode-markdownlint0.46.0 jshint0.11.0 vscode-eslint2.2.2 dendron-snippet-maker0.1.6 rushcore1.0.2 rushnav1.0.2 githistory0.6.19 xml2.5.1 escaping-characters1.0.0 vscode-babel-coloring0.0.4 gitlens11.7.0 EditorConfig0.16.4 vscode-npm-script0.3.24 vscode-macros1.3.0 git-project-manager1.8.2 scriptcsRunner0.1.0 vscode-firefox-debug2.9.6 vscode-npm3.3.0 shell-format7.2.2 macros1.2.1 matlab2.3.1 vscode-pull-request-github0.36.2 gc-excelviewer4.0.50 beautify1.5.0 vscode-favorites1.10.2 rest-client0.24.6 path-autocomplete1.18.0 mediawiki2.1.0 markdown-katex0.1.4 nuget-reverse-package-search0.1.68 vscode-nuget-package-manager1.1.6 vscode-peacock4.0.0 gpg0.1.2 docomment0.1.30 vscode-liquid-snippets2.0.3 gnuplot1.0.5 markdown-shortcuts0.12.0 openapi-lint1.2.0 HTMLHint0.10.0 azure-pipelines1.195.0 vscode-azureappservice0.23.1 vscode-azurefunctions1.6.0 vscode-azureresourcegroups0.4.0 vscode-azurestorage0.13.0 vscode-azurevirtualmachines0.5.0 vscode-bicep0.4.1272 vscode-cosmosdb0.18.1 csharp1.24.0 vscode-dotnet-runtime1.5.0 python2022.0. vscode-pylance2022.2.4 jupyter2022.1. jupyter-keymap1.0.0 jupyter-renderers1.0.6 vscode-ai-remote0.7.0 remote-containers0.217.4 remote-ssh0.74.0 remote-ssh-edit0.74.0 vscode-remote-extensionpack0.21.0 azure-account0.10.0 azurecli0.5.0 live-server0.2.12 mono-debug0.16.2 powershell2021.12.0 vscode-node-azure-pack0.2.1 vscode-typescript-tslint-plugin1.3.3 azurerm-vscode-tools0.15.6 debugger-for-edge1.0.15 language-liquid0.1.1 bib0.3.0 vscode-commons0.0.6 vscode-yaml1.4.0 kuskus-kusto-language-server1.0.22 kuskus-kusto-syntax-highlighting1.1.20 vscode-hexdump1.8.1 vscode-zipexplorer0.3.1 addDocComments0.0.8 msbuild-project-tools0.4.3 shell-launcher0.4.1 vscodeintellicode1.2.17 nanoid-generator0.1.2 vscode-icons11.10.0 JavaScriptSnippets1.8.0 t4-support0.5.0 </details<details<summaryA/B Experiments</summary</details<!-- generated by issue reporter --
by "last version" I meant 1.64... same version that made a mess of snippet matching ()
Could you please create a screen recording, or an annotated screenshot with a specific example, I'm not sure I understand where exactly the cursor should be at the beginning in order to reproduce.
hopefully this helps... with the cursor as captured, before the "4", prior to 1.64 the next 2 up arrows to follow the green marks I ... but since 1.64 they follow the red ones (technically, the lower green & lower red are the same place if I start typing... but if I'm renumbering my list or changing between bullets & numbers, it throws things off) ! relevant excerpt from settings:
I tried the same thing, with the same file, in Obsidian... their editor (I don't know what it's based on since they're not open source) also jumps to the end of the line with "3." on the first up arrow (lower red mark), but then to the beginning of that same line on the second one (upper green mark). That behavior would also work for me... either way, going from "4." to "3." should be up arrow twice because it's the second line above
Thanks for the extra information. I could reproduce and after doing bisect found that is the first bad commit.
has this released yet? the behavior hasn't changed. Actually, it seems to have gotten worse... the initial issue is that if my cursor is at the left edge and I go up, up, up when I get to a word-wrap it jumps to the far right. Recently I've noticed the opposite also happening, if I'm at the right end and down-arrow at a word-wrap point, it jumps to the left end (as if I hit right arrow instead of down arrow). the bug was that the cursor jumps between left edge and right edge, and in 1.66.2 it's as bad as ever I probably should point out, in case it's relevant, that I run with the following settings (the exact font shouldn't matter, the point is that it's NOT monospace... this was probably evident from my screenshot, but I should've called it out anyway)
Can you try it in the latest vscode insiders? The bugfix is planned to be released with the next release.

Discussion:
} public static down(config: CursorConfiguration, model: ICursorSimpleModel, lineNumber: number, column: number, leftoverVisibleColumns: number, count: number, allowMoveOnLastLine: boolean): CursorPosition { <del> return this.vertical(config, model, lineNumber, column, leftoverVisibleColumns, lineNumber + count, allowMoveOnLastLine, PositionAffinity.Right); </del> <ins> return this.vertical(config, model, lineNumber, column, leftoverVisibleColumns, lineNumber + count, allowMoveOnLastLine, PositionAffinity.RightOfInjectedText); </ins> } public static moveDown(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean, linesCount: number): SingleCursorState {

} public static up(config: CursorConfiguration, model: ICursorSimpleModel, lineNumber: number, column: number, leftoverVisibleColumns: number, count: number, allowMoveOnFirstLine: boolean): CursorPosition { <del> return this.vertical(config, model, lineNumber, column, leftoverVisibleColumns, lineNumber - count, allowMoveOnFirstLine, PositionAffinity.Left); </del> <ins> return this.vertical(config, model, lineNumber, column, leftoverVisibleColumns, lineNumber - count, allowMoveOnFirstLine, PositionAffinity.LeftOfInjectedText); </ins> } public static moveUp(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean, linesCount: number): SingleCursorState {

* No preference. */ None = 2, <ins> /** * If the given position is on injected text, prefers the position left of it. */ LeftOfInjectedText = 3, /** * If the given position is on injected text, prefers the position right of it. */ RightOfInjectedText = 4, </ins> } /**

return result; } <del> } else if (affinity === PositionAffinity.Right) { </del> <ins> } else if (affinity === PositionAffinity.Right || affinity === PositionAffinity.RightOfInjectedText) { </ins> let result = injectedText.offsetInInputWithInjections + injectedText.length; let index = injectedText.injectedTextIndex; // traverse all injected text that touch each other

index++; } return result; <del> } else if (affinity === PositionAffinity.Left) { </del> <ins> } else if (affinity === PositionAffinity.Left || affinity === PositionAffinity.LeftOfInjectedText) { </ins> // affinity is left let result = injectedText.offsetInInputWithInjections; let index = injectedText.injectedTextIndex;

/** * No preference. */ <del> None = 2 </del> <ins> None = 2, /** * If the given position is on injected text, prefers the position left of it. */ LeftOfInjectedText = 3, /** * If the given position is on injected text, prefers the position right of it. */ RightOfInjectedText = 4 </ins> } export enum RenderLineNumbersType {

}); }); <ins> test('issue #144041: Cursor up/down works', () => { let model = createTextModel( [ 'Word1 Word2 Word3 Word4', 'Word5 Word6 Word7 Word8', ].join('n') ); withTestCodeEditor(model, { wrappingIndent: 'indent', wordWrap: 'wordWrapColumn', wordWrapColumn: 20 }, (editor, viewModel) => { viewModel.setSelections('test', [new Selection(1, 1, 1, 1)]); let cursorPositions: any[] = []; function reportCursorPosition() { cursorPositions.push(viewModel.getCursorStates()[0].viewState.position.toString()); } reportCursorPosition(); CoreNavigationCommands.CursorDown.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorDown.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorDown.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorDown.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorUp.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorUp.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorUp.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorUp.runEditorCommand(null, editor, null); reportCursorPosition(); assert.deepStrictEqual(cursorPositions, [ '(1,1)', '(2,5)', '(3,1)', '(4,5)', '(4,10)', '(3,1)', '(2,5)', '(1,1)', '(1,1)', ]); }); model.dispose(); }); test('issue #140195: Cursor up/down makes progress', () => { let model = createTextModel( [ 'Word1 Word2 Word3 Word4', 'Word5 Word6 Word7 Word8', ].join('n') ); withTestCodeEditor(model, { wrappingIndent: 'indent', wordWrap: 'wordWrapColumn', wordWrapColumn: 20 }, (editor, viewModel) => { editor.deltaDecorations([], [ { range: new Range(1, 22, 1, 22), options: { showIfCollapsed: true, description: 'test', after: { content: 'some very very very very very very very very long text', } } } ]); viewModel.setSelections('test', [new Selection(1, 1, 1, 1)]); let cursorPositions: any[] = []; function reportCursorPosition() { cursorPositions.push(viewModel.getCursorStates()[0].viewState.position.toString()); } reportCursorPosition(); CoreNavigationCommands.CursorDown.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorDown.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorDown.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorDown.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorUp.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorUp.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorUp.runEditorCommand(null, editor, null); reportCursorPosition(); CoreNavigationCommands.CursorUp.runEditorCommand(null, editor, null); reportCursorPosition(); assert.deepStrictEqual(cursorPositions, [ '(1,1)', '(2,5)', '(5,19)', '(6,1)', '(7,5)', '(6,1)', '(2,8)', '(1,1)', '(1,1)', ]); }); model.dispose(); }); </ins> // --------- move to beginning of line test('move to beginning of line', () => {

/** * No preference. */ <del> None = 2 </del> <ins> None = 2, /** * If the given position is on injected text, prefers the position left of it. */ LeftOfInjectedText = 3, /** * If the given position is on injected text, prefers the position right of it. */ RightOfInjectedText = 4 </ins> } /**