Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Can't bind key sequences (multiple leaders?) to actions in Normal Mode? #2955

Closed
spiralsam opened this issue Aug 12, 2018 · 3 comments · Fixed by #4735
Closed

Can't bind key sequences (multiple leaders?) to actions in Normal Mode? #2955

spiralsam opened this issue Aug 12, 2018 · 3 comments · Fixed by #4735

Comments

@spiralsam
Copy link

Am I missing something? From the documentation, It's possible to bind jj to in insert mode:

  "vim.insertModeKeyBindings": [
    {
      "before": ["j", "j"],
      "after": ["<Esc>"]
    }
  ],

But trying to bind jj to something in normal mode doesn't work:

  "vim.normalModeKeyBindings": [
    {
      "before": ["j", "j"],
      "after": ["w"]
    }
  ]

In VIM I usually bind numerous arbitrary characters as "leaders" like so (a and b in this random example)

noremap a <Nop>
noremap aa w
noremap ab b
...
noremap b <Nop>
noremap ba w
noremap bb b
...

But as far as I can tell, VSCodeVim only allows one global leader set as "vim.leader". For the life of me, I couldn't get this binding capability to work for Normal mode.

@mystic01
Copy link

mystic01 commented Nov 3, 2018

It's the same with 'h', 'h':

# OK
"vim.insertModeKeyBindings": [
    {
        "before": [
            "h",
            "h"
        ],
        "after": [
            "^"
        ]
    },
],

The following don't work.

# FAILED
"vim.normalModeKeyBindings": [
    {
        "before": [
            "h",
            "h"
        ],
        "after": [
            "^"
        ]
    },
]
# FAILED
"vim.normalModeKeyBindings": [
    {
        "before": [
            "h",
            "c"
        ],
        "after": [
            "^"
        ]
    },
]

However, 'g' 'g' works.

# OK
"vim.normalModeKeyBindings": [
    {
        "before": [
            "g",
            "g"
        ],
        "after": [
            "^"
        ]
    },
]

@mystic01
Copy link

mystic01 commented Nov 4, 2018

For this issue, I traced the code. The basic reason is 'j' & 'h' are moving focus command. They don't need to 'wait' the next key input. otherwise, the moving motion would be slow. I also found a workaround. If you don't need some moving focus command, just modify the code in "....vscode\extensions\vscodevim.vim-0.16.12\out\src\actions\motion.js"

let MoveDown = class MoveDown extends BaseMovement {
    constructor() {
        super(...arguments);
        // this.keys = ['j'];
        this.keys = ['j', 'j'];
        this.doesntChangeDesiredColumn = true;
    }
...

After this modification, when you type 'j', vim would wait next input key. so your new key mapping will work.

@sql-koala
Copy link
Contributor

sql-koala commented Oct 26, 2019

For this issue, I traced the code
"....vscode\extensions\vscodevim.vim-0.16.12\out\src\actions\motion.js"
After this modification, when you type 'j', vim would wait next input key. so your new key mapping will work.

Hi @mystic01 ,
I have a similar situation (a mapping problem that I want to solve by editing the code). I did my changes to motion.js? That alone does not work, do need to build/compile the extension? What did you do? Thanks.
edit: question is solved. Editing the source worked.

berknam pushed a commit to berknam/Vim that referenced this issue Apr 13, 2020
Refactor the Remapper and ModeHandler to allow better remapping experience.
It will allow to remap operator keys, motion keys and multiple keys when the first key could be handled.

Should fix the following issues (maybe more):
VSCodeVim#4674
VSCodeVim#4464
VSCodeVim#3988
VSCodeVim#3768
VSCodeVim#3742
VSCodeVim#2975
VSCodeVim#2955
VSCodeVim#2234
VSCodeVim#2041
VSCodeVim#1870
VSCodeVim#1821
VSCodeVim#1579
VSCodeVim#1398

Needs more testing.
@berknam berknam mentioned this issue Apr 13, 2020
10 tasks
J-Fields pushed a commit that referenced this issue Aug 16, 2020
This is a pretty massive change; see pull request #4735 for full details

Most notably:
- Support for operator-pending mode, including remaps and a half-cursor decoration
- Correct handling of ambiguous remaps with timeout
- Correct handling of recursive special case when the RHS starts with the LHS
- Correct handling of multi-key remaps in insert mode
- Failed movements that occur partway through a remap stop & discard the rest of the remap
- Implement `unmap` and `mapclear` in .vimrc

Refs #463, refs #4908
Fixes #1261, fixes #1398, fixes #1579, fixes #1821, fixes #1835
Fixes #1870, fixes #1883, fixes #2041, fixes #2234, fixes #2466
Fixes #2897, fixes #2955, fixes #2975, fixes #3082, fixes #3086
Fixes #3171, fixes #3373, fixes #3413, fixes #3742, fixes #3768
Fixes #3988, fixes #4057, fixes #4118, fixes #4236, fixes #4353
Fixes #4464, fixes #4530, fixes #4532, fixes #4563, fixes #4674
Fixes #4756, fixes #4883, fixes #4928, fixes #4991, fixes #5016
Fixes #5057, fixes #5067, fixes #5084, fixes #5125
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants