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

Key mapping does not support ctrl key #1452

Closed
hk0i opened this issue Mar 30, 2017 · 23 comments
Closed

Key mapping does not support ctrl key #1452

hk0i opened this issue Mar 30, 2017 · 23 comments

Comments

@hk0i
Copy link

hk0i commented Mar 30, 2017

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?

Attempted to map Ctrl +h to Ctrl-w h.

In settings.json:

    "vim.otherModesKeyBindings": [
        {
            "before": ["<C-h>"],
            "after": ["<C-w>", "h"]
        }
    ],

Saved config, then tried Ctrl + h

What did you expect to happen?

Expected to map Ctrl +h to Ctrl-w h

What happened instead?

Character under cursor was deleted. (Escape sequence Ctrl+h ??)

Technical details:

  • VSCode Version: Version 1.10.1 (1.10.1)
  • VsCodeVim Version: 0.6.11
  • OS: OS X
@dbernheisel
Copy link

dbernheisel commented Apr 5, 2017

Not sure if I should expect the plugin to manage custom key bindings for VScode, other than maybe providing a vim-like configuration. In the meantime, I used VSCode's user-defined keymappings to accomplish mapping ctrl+ keys to editor actions.

Code -> Preferences -> Keyboard Shortcuts (or ⌘K ⌘S)

[
  {
    "key": "ctrl+alt+h",
    "command": "workbench.action.focusPreviousGroup",
    "when": "editorTextFocus"
  },
  {
     "key": "ctrl+alt+l",
    "command": "workbench.action.focusNextGroup",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+h",
    "command": "workbench.action.previousEditor",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+l",
    "command": "workbench.action.nextEditor",
    "when": "editorTextFocus"
  }
]

@xconverge
Copy link
Member

The problem is we dont bind to ctrl+l so our extension does not know it exists, ctrl+h we only use in insert mode...so we can't remap these from inside the plugin currently...

@hk0i
Copy link
Author

hk0i commented Apr 5, 2017

Just as a side note, c-h works for me in normal mode (as a backspace key)

@hk0i
Copy link
Author

hk0i commented Apr 5, 2017

@dbernheisel thanks, I was able to get what I wanted using those commands,

[
    {
        "key": "ctrl+h",
        "command": "workbench.action.focusPreviousGroup",
        "when": "editorTextFocus"
    },
    {
        "key": "ctrl+l",
        "command": "workbench.action.focusNextGroup",
        "when": "editorTextFocus"
    },
    {
        "key": "cmd+shift+[",
        "command": "workbench.action.previousEditor",
        "when": "editorTextFocus"
    },
    {
        "key": "cmd+shift+]",
        "command": "workbench.action.nextEditor",
        "when": "editorTextFocus"
    }
]

Is what I've changed to.

Unfortunately, I'm not familiar enough with VSCode to know the nomenclature of, for example, window vs buffer and so on like we have in vim. I actually wasn't able to figure out how to make those key mappings the VSCode way so I tried to do it by making a vim mapping.

I'm probably just misunderstanding the purpose of the otherModesKeybindings, could someone explain it?

@rebornix
Copy link
Member

It's possible to cover this issue by #1543

@barberousse
Copy link

I have a similar issue attempting to bind <C-p> to workbench.actions.quickOpen

@Chillee
Copy link
Member

Chillee commented May 7, 2017

@barberousse What's the issue with simply using normally? We don't bind it in normal mode at all.

@barberousse
Copy link

@Chillee Are you sure? Ctrl + p appears to be bound to the canonical vi command of "Move one line up". To be clear, I'm on OS X as well, so quick open should fire on Cmd + P instead of Ctrl + p. At any rate, the following fails to rebind as expected, the behavior persists in "Move one line up":

{
    "before": [ "<C-p>"],
    "after": [],
    "command": "workbench.action.quickOpen"
}

@Chillee
Copy link
Member

Chillee commented May 7, 2017

That's interesting. I don't think we've really implemented that. We only bind <C-p> for moving to the previous suggestion for autocomplete.

You could try this too.

"vim.handleKeys": {
    "<C-p>": false
}

Although, I don't use a mac, so I'm not sure how most of that stuff works with regards to keybindings.

@barberousse
Copy link

Setting the boolean there did not change behavior, but it does confirm to my understanding that the extension truly isn't responsible for the unexpected behavior as well.

@hk0i
Copy link
Author

hk0i commented May 9, 2017

@barberousse are you on OS X? This emacs-like movement is baked into most text fields on OS X (try it even on the github comments input field).

@kuzyo
Copy link

kuzyo commented May 10, 2017

There was added some new remapings options:

Added new remapping options to remap any key. #1543 As an example, this functionality can cover #1505 and #1452.

Can somebody help - how with this options I can remap:

Expected to map Ctrl +h to Ctrl-w h

@barberousse
Copy link

@hk0i I am, must be it

@iantanwx
Copy link

Reporting in, I cannot rebind <C-p> to workbench.action.quickOpen either. I miss fzf :(

Anyway, sorry for the complaint. Great work!

@Chillee
Copy link
Member

Chillee commented Jun 24, 2017

@iantanwx Does this not work for you?

"vim.handleKeys": {
    "<C-p>": false
}

@xconverge
Copy link
Member

C-p should be opening quick open already... we don't rebind it

@JonahMoses
Copy link

[
  {
    "key": "ctrl+h",
    "command": "workbench.action.focusPreviousGroup",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+l",
    "command": "workbench.action.focusNextGroup",
    "when": "editorTextFocus"
  },
]

FYI, I was able to solve my problem by placing that into my keybindings.json

@iamdanthedev
Copy link

Hi
Is it possible to bind Ctrl+; to this action somehow? I've got used to this combo so much already..

{
            "before": ["<C-;>"],
            "after": ["A", ";", "<Esc>"]
}

@jpotterm
Copy link
Contributor

For the original question of mapping ctrl+h to ctrl+w h you can add the following to keybindings.json:

{
    "key": "ctrl+h",
    "command": "extension.vim_navigateLeft",
    "when": "vim.active && vim.use<C-w>",
}

I think this works better than mapping to the command workbench.action.focusPreviousGroup because this lets you navigate into the file explorer sidebar.

@eysi09
Copy link

eysi09 commented Feb 5, 2018

I'm having the issue with binding <C-p> to workbench.action.quickOpen on macOS. Also with

"vim.handleKeys": {
    "<C-p>": false
}

@eysi09
Copy link

eysi09 commented Feb 5, 2018

Actually it does work if I just set the keybindings directly in keybindings.json, regardless of whether or not I use the "vim.handleKeys" option. Originally I was trying to set the behaviour using the "vim.otherModesKeyBindingsNonRecursive" option. So, the following just works:

// In keybindings.json
  {
    "key": "ctrl+p",
    "command": "workbench.action.quickOpen",
  }

@ianmacartney
Copy link

I had a similar issue remapping emacs-like text motion in insert mode (trying to get ctrl-{a,e,p,n,d,h,f,b} to work in insert mode like other mac text boxes). Either the vscodevim keymappings would have preference over my vim.*KeyBindings or they'd be disabled if I used handleKeys to exclude them.
I ended up getting a good result by just using keybindings.json like others here, gating on vim.mode (note ctrl-{h,b,p} already worked without an explicit mapping so I left them be):

    {
        "key": "ctrl+d",
        "command": "deleteRight",
        "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Insert'"
    },
    {
        "key": "ctrl+n",
        "command": "cursorDown",
        "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Insert'"
    },
    {
        "key": "ctrl+f",
        "command": "cursorRight",
        "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Insert'"
    },
    {
        "key": "ctrl+a",
        "command": "cursorLineStart",
        "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Insert'"
    },
    {
        "key": "ctrl+e",
        "command": "cursorLineEnd",
        "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Insert'"
    },

I also added the ctrl-p similar to @eysi09, but gated to only be in non-insert mode:

    {
        "key": "ctrl+p",
        "command": "workbench.action.quickOpen",
        "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode != 'Insert'"
    },

I also added C-{h,l,j,k} to do vim navigation (the original question here) similar to @jpotterm but filtering to only non-insert mode (so I can still have delete backward & join line & kill line in insert mode):

    {
        "key": "ctrl+h",
        "command": "extension.vim_navigateLeft",
        "when": "editorTextFocus && vim.active && vim.use<C-w> && !inDebugRepl && vim.mode != 'Insert'"
    },
    {
        "key": "ctrl+l",
        "command": "extension.vim_navigateRight",
        "when": "editorTextFocus && vim.active && vim.use<C-w> && !inDebugRepl && vim.mode != 'Insert'"
    },
    {
        "key": "ctrl+j",
        "command": "extension.vim_navigateDown",
        "when": "editorTextFocus && vim.active && vim.use<C-w> && !inDebugRepl && vim.mode != 'Insert'"
    },
    {
        "key": "ctrl+k",
        "command": "extension.vim_navigateUp",
        "when": "editorTextFocus && vim.active && vim.use<C-w> && !inDebugRepl && vim.mode != 'Insert'"
    },

I bet it'd be good to call some of this out in the readme (namely that most C-* bindings that are already handled by vscodevim aren't user-configurable via the vim.KeyBindings user setting, but only by keybindings.json). It took me a bit to find this issue

@jpoon
Copy link
Member

jpoon commented Jun 19, 2018

We bind to a couple of <ctrl>+<key> commands (https://github.com/VSCodeVim/Vim/blob/master/package.json#L140). Pertaining to the original issue, <C-h>works on v0.13.1:

    "vim.normalModeKeyBindings": [
        {
            "before": [
                "<C-h>"
            ],
            "after": [
                "<C-w>",
                "h"
            ]
        }
    ],

For keycombos that involve CTRL, the full list is in our package.json, for others we have a bug tracking this here #757.

@jpoon jpoon closed this as completed Jun 19, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests