Vim icon indicating copy to clipboard operation
Vim copied to clipboard

Issue with cursor position using visual line movement (`gj` and `gk`)

Open kevinjalbert opened this issue 8 years ago • 18 comments

Please thumbs-up 👍 this issue if it personally affects you! You can do this by clicking on the emoji-face on the top right of this post. Issues with more thumbs-up will be prioritized.


What did you do?

I've set the following as I like to work with word wrap enabled:

    "vim.otherModesKeyBindingsNonRecursive": [
        {
            "before": ["j"],
            "after": ["g", "j"]
        },
        {
            "before": ["k"],
            "after": ["g", "k"]
        }
    ]

I noticed a discrepancy in behaviour for lines without wrapping. As you navigate between lines of varying length the cursor position doesn't keep its horizontal position.

The following GIFs just show motion using j and k.

I would expect both GIFs to show the same thing regardless if the gj and gk mappings are applied.

What did you expect to happen?

Expected behaviour (the keybinding mappings not applied): normal vim movement

What happened instead?

Current behaviour (the keybinding mappings applied): normal vim movement

Technical details:

  • VSCode Version: 1.9.1
  • VsCodeVim Version: 0.5.3
  • OS: MacOS 10.12.3

kevinjalbert avatar Feb 22 '17 15:02 kevinjalbert

copying comment from dupe ticket linked:

This is a tough one

I couldn't figure out a way to get the start and end column positions of the wrapped line.

I tried this:

const posLine = vimState.editor.selection.active.line;

await vscode.commands.executeCommand("cursorMove", {
	to: "wrappedLineStart"
});

const startCol = vimState.editor.selection.active.character;

await vscode.commands.executeCommand("cursorMove", {
	to: "wrappedLineEnd"
});

const endCol = vimState.editor.selection.active.character;
const lineLength = endCol - startCol;

vimState.cursorPosition =
	new Position(posLine, Math.min(lineLength + startCol, vimState.desiredColumn + startCol));

but moving the cursor 3 times for every 1 time we want to move it makes no sense from a performance standpoint.

I think that we need to get wrappedLine info via the vscode API but I could not find it currently...

Then we could skip using cursor move and do the same sort of moves we do as j and k, however we would use the wrappedLine start and end column instead of 0 and end of line

xconverge avatar Mar 22 '17 14:03 xconverge

related https://github.com/Microsoft/vscode/issues/23045

xconverge avatar Mar 22 '17 20:03 xconverge

New user here having this issue. I had trouble following this issue since it was spread across a several of PRs/Issues so I might just be misunderstanding, but as far as I can tell it looks like it was supposed to have been fixed in May with https://github.com/VSCodeVim/Vim/pull/1552

I'm not intending to do anything with folding, but trying to get my j => gj/k => gk shortcuts working I've enabled "vim.foldfix": true which that PR suggested.

I'm still seeing the initial behavior where cursor position isn't retained (as seen in the gifs above).

Am I missing something?

jessejanderson avatar Sep 29 '17 00:09 jessejanderson

@jessejanderson "vim.foldfix": true makes my cursor skip (as in touch a wrapped line) and then continue with the previous erroneous behavior. I was hoping that was what I was missing.

wegry avatar May 02 '18 07:05 wegry

This still seems like an issue, If anyone has figured out a configuration which works I'm all 👂.

VSCode - 1.24.1 VSCodeVim - 0.13.0

kevinjalbert avatar Jun 18 '18 19:06 kevinjalbert

I also have this issue. Would love to see a solution, or any form of workaround!

Chaoclypse avatar Jul 15 '18 12:07 Chaoclypse

I don't know if it's related, but when moving a number of lines using j or k as in 15j or 15k, the initial column position isn't remembered either.

hhu94 avatar Jul 19 '18 00:07 hhu94

For me it's an issue when moving to/from a line that spans more than row.

rightaway avatar Sep 05 '18 08:09 rightaway

This remains an isse even with "vim.foldfix": true, VSCode 1.29.1, and VSCode Vim 0.16.14. Does someone have another workaround?

fabianschilling avatar Dec 12 '18 10:12 fabianschilling

Still an issue for me, as well.

Chaoclypse avatar Dec 16 '18 08:12 Chaoclypse

Still an issue.

xarthurx avatar Jan 10 '19 14:01 xarthurx

@J-Fields what vscode version will we see your fix in?

rightaway avatar Nov 06 '19 06:11 rightaway

@rightaway Please see https://github.com/VSCodeVim/Vim/pull/4127

J-Fields avatar Nov 16 '19 22:11 J-Fields

Still met this problem 😢

Adnios avatar May 23 '22 07:05 Adnios

I think this has worked for a while but I can't get this to work anymore. @J-Fields did your fix somehow get removed?

hpurmann avatar Sep 20 '22 13:09 hpurmann

I was having this issue as well. I solved it by following the instructions given on #3623 for setting up keybindings in VSCode by opening keyboard shortcuts JSON file from the command palette. Just need to add following keybindings in the file:

{
  "key": "up",
  "command": "cursorUp",
  "when": "editorTextFocus && vim.active && !inDebugRepl && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
},
{
  "key": "down",
  "command": "cursorDown",
  "when": "editorTextFocus && vim.active && !inDebugRepl && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
},
{
  "key": "k",
  "command": "cursorUp",
  "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Normal' && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
},
{
  "key": "j",
  "command": "cursorDown",
  "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Normal' && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
}

This will allow moving between visual wrapped lines and also the cursor position for different lines will not reset.

Also, by following above instructions, you can remove following from your settings if you are using it as these don't work:

    "vim.otherModesKeyBindingsNonRecursive": [
        {
            "before": ["j"],
            "after": ["g", "j"]
        },
        {
            "before": ["k"],
            "after": ["g", "k"]
        }
    ]

I think by using this solution, this issue can be closed. Hope this helps!

aurangzaib-danial avatar Nov 21 '23 12:11 aurangzaib-danial

I was having this issue as well. I solved it by following the instructions given on #3623 for setting up keybindings in VSCode by opening keyboard shortcuts JSON file from the command palette. Just need to add following keybindings in the file:

{
  "key": "up",
  "command": "cursorUp",
  "when": "editorTextFocus && vim.active && !inDebugRepl && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
},
{
  "key": "down",
  "command": "cursorDown",
  "when": "editorTextFocus && vim.active && !inDebugRepl && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
},
{
  "key": "k",
  "command": "cursorUp",
  "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Normal' && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
},
{
  "key": "j",
  "command": "cursorDown",
  "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Normal' && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
}

This will allow moving between visual wrapped lines and also the cursor position for different lines will not reset.

Also, by following above instructions, you can remove following from your settings if you are using it as these don't work:

    "vim.otherModesKeyBindingsNonRecursive": [
        {
            "before": ["j"],
            "after": ["g", "j"]
        },
        {
            "before": ["k"],
            "after": ["g", "k"]
        }
    ]

I think by using this solution, this issue can be closed. Hope this helps!

it's buggy in visual mode and UPD:

    {
        "key": "k",
        "command": "cursorUp",
        "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Normal' && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
    },
    {
        "key": "j",
        "command": "cursorDown",
        "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Normal' && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
    },

it breaks 5j or 3k for example

4volodin avatar Dec 27 '23 06:12 4volodin

shame on you... it hasn't been working for 8 years

4volodin avatar Apr 24 '24 11:04 4volodin