microsoft / vscode

Visual Studio Code
https://code.visualstudio.com
MIT License
163.2k stars 28.86k forks source link

Keyboard mappings with `setxkbmap` on Linux not working #23991

Open tallpants opened 7 years ago

tallpants commented 7 years ago

I have my Caps Lock key bound to Escape using setxkbmap on Linux. This worked fine till 1.10, but broke with 1.11. At first I thought it was an issue with the VSCodeVim extension, but the issue persists with all the other Vim extensions on the marketplace as well. Pressing the escape button still works as expected.

The binding is still respected everywhere else in the operating system, it's only Visual Studio Code that ignores it for some reason.

Steps to Reproduce:

  1. Run setxkbmap -option caps:escape (binds caps to escape for the duration of the session)
  2. Hitting caps lock when in insert mode (with a Vim extension like VSCodeVim installed) no longer puts you normal mode.
  3. Hitting escape still works as expected and puts you in normal mode.
jspaine commented 7 years ago

Same, with swapescape. Oddly caps lock works as escape to cancel in the keybinding editor, and either caps lock or escape cancel the F1 menu. Tried disabling all extensions, wiping user settings and using an empty workspace to no avail.

I have problems with numpad keys too. With num lock off they do nothing, but work as number keys with it on. If I press a direction with numpad off, nothing happens, but then turn it on and type a number and the cursor will move and then put the number.

In the keyboard shortcuts editor numpad PgDn, for example, shows up as numpad3 whether num lock is on or off.

alexdima commented 7 years ago

This is something that might be broken by us dispatching based on scan codes. I am sorry about it, I need some time to investigate how these options should be handled. i.e. should Chromium handle these mappings or should we do it at the application layer.

Workaround to switch VS Code to dispatch based on key code again. Add the following setting: "keyboard.dispatch": "keyCode" and restart VS Code

tallpants commented 7 years ago

Thanks for the workaround! đź‘Ť

graves501 commented 7 years ago

The workaround works like a charm, thanks!

tobico commented 7 years ago

I have a similar issue, with my Caps Lock bound to Control, where Code is unable to autoclose the quick open window when pressing Ctrl+Tab and then releasing Control. I've tested the workaround and it does not solve this issue.

Note: this appears to be specifically an issue with detecting the modifier key. Caps+Tab still launches the quick open just fine, and I have other remapped key bindings for arrow key movements that also work fine.

navxio commented 7 years ago

this workaround isn't working for me on vscode 1.12.2-1..

alexdima commented 7 years ago

@navdeepio Can you please follow our troubleshooting guide at https://github.com/Microsoft/vscode/wiki/Keybindings#troubleshoot

If nothing in there works, then please proceed to create a new issue using the steps in the "I have tried all of the above" section.

Chillee commented 7 years ago

@alexandrudima Do you guys plan on fixing this issue at some point? Or is the workaround satisfactory as a long term solution?

alexdima commented 7 years ago

@Chillee This method needs to be enhanced to account for setxkbmap customizations and then we might need some tweaks here to cover mappings of those scan codes

Chillee commented 7 years ago

Is it tricky or is it feasible as a first time contribution?

alexdima commented 7 years ago

The work would be split between making first a change in native-keymap and then in vscode.

I would be very appreciative if anyone figures out the X11 specific methods / submits a PR for native-keymap. I can tweak or refactor (if the current model is incorrect) in VS Code.

The way we handle keybindings decisions is documented here

kylebakerio commented 6 years ago

Still experiencing weirdness with 1.21.1 in debian 9.

caps lock and ctrl swapping caused issues. seemed to partially help by swapping settings so that instead of "caps lock and control are swapped", I now have "caps lock is set as another control".

dagolinuxoid commented 6 years ago

Great, now I can use vim mode :)

jhpratt commented 6 years ago

The workaround unfortunately breaks other things, notable the Ctrl + ` shortcut to toggle the integrated terminal. And yes, I'm using a standard-ish layout (those two keys aren't affected).

dagolinuxoid commented 6 years ago

@jhpratt, Ctrl + ` works ( at least in my case it toggles the terminal without issues )

Loridawn99 commented 6 years ago

Awesome

pumpkinlink commented 6 years ago

same problem as @jhpratt, the workaround breaks a lot of shorcuts, (I use an ABNT2 (Brazil) keyboard)

pumpkinlink commented 6 years ago

~the workaround I found was:~

~1. open gnome tweak tool 1.1 disable the caps lock remap (re enabling caps lock default behavior)

  1. open vscode 2.1. map "extension.vim_escape" to capslock
  2. go back to gnome tweak tool 3.1 map caps lock to esc again~

edit: making the above disabled my actual top left physical Esc key. so I made the follwing instead:

  1. Reset the extension.vim_escape keybinding on the GUI Keyboards Shortcuts screen and remove everything related from keybinding.json
  2. add the following to keybinding.json:
    ,
    {
        "key": "capslock",
        "command": "extension.vim_escape",
        "when": "editorTextFocus && vim.active && !inDebugRepl"
    },

now both my physical esc key and the xkbmap/gnome-tweak-took remapped caps lock key work as expected. my dconf settings are as follows:

org.gnome.desktop.input-sources.sources: "[('xkb', 'br')]" org.gnome.desktop.input-sources.xkb-options: "['shift:both_capslock', 'caps:escape']"

rustonaut commented 6 years ago

@alexandrudima, I just ran into this issue, too. Is there a good reason why vscode uses scan codes? I mean scan codes are not really meant to be used by a user application in Linux. And not using the key codes mapped by xkb, will just lead to a repeatedly running into problems for anyone using a rare keyboard or keyboard layout, or alternate input device pretending to be a keyboard.

Also this won't go away with wayland, as (at last the Wayland implementations I used) still use xkb internally.

alexdima commented 6 years ago

We are dispatching by default based on scan codes because those are the only things we receive from Chromium/Electron which we can trust to reflect reality and which have not been processed through magic Chromium mapping tables.

AFAIK, the story goes like this:

Because using setxkbmap is a hint for an advanced user, and using a regular keyboard layout (like de-DE) is not, we have made the decision to dispatch based on scan codes by default to cover most of the folks (including new Linux users). Advanced Linux users (that use setxkbmap) need to go through the hurdle of configuring the dispatch setting...

In the long term, it would be good if we'd improve https://github.com/Microsoft/node-native-keymap to also take into account setxkbmap customizations.

andyl commented 6 years ago

OMG this is so painful. Tried the keyCode workaround and @pumpkinlink workaround. Nothing works. (I'm using Xubuntu 18.04 btw). Is there a way to map the scan code to <Esc> ?

alexdima commented 6 years ago

@andyl Configure "keyboard.dispatch": "keyCode". Restart VS Code.

rustonaut commented 6 years ago

@alexandrudima thanks for the long explanation.

This is quite a quirky problem, I guess to best (but unlikely to be doable) solution would be to fix how browsers handle keyboard events :sob: .

alexdima commented 6 years ago

They are working on it, it just takes time... https://wicg.github.io/keyboard-map/

andyl commented 6 years ago

@alexandrudima - yeah I tried the "keyboard.dispatch": "keyCode" workaround and it doesn't work on my system. Learning more about the escape key than I ever thought possible. In settings.yml I mapped kj to <Esc> - which does work. But for the real escape key no luck. Interestingly enough: I disabled the setxkbmap modification and it still doesn't work! I also tried to set extension.vim_escape to various Keybindings - no luck. Maybe I am experiencing a voodoo curse or anomalous cosmic rays.

rustonaut commented 6 years ago

The "keyCode" workaround just stopped working for me.

efredzb commented 6 years ago

Same here.

JoschD commented 5 years ago

Ubuntu 18.04.1 here: "keyboard.dispatch": "keyCode" still works. (With swapescape)

mlcamilli commented 5 years ago

Kubuntu 18.04 here: "keyboard.dispatch": "keyCode" doesn't work with capslock rebound to ctrl. VSCode still recognizes capslock, no other electron app / program does.

certik commented 5 years ago

In Ubuntu 18.04, to make Caps Lock become an Escape, apply this patch:

--- a/etc/default/keyboard
+++ b/etc/default/keyboard
@@ -5,6 +5,6 @@
 XKBMODEL="pc105"
 XKBLAYOUT="us"
 XKBVARIANT=""
-XKBOPTIONS=""
+XKBOPTIONS="caps:escape"

 BACKSPACE="guess"

restart the computer and add the "keyboard.dispatch": "keyCode" into your vscode settings.

mlcamilli commented 5 years ago

@certik did not work for me

codethief commented 5 years ago

Since a lot of people here seem have esc bound to their caps lock keys, let me throw in the hat for the folks that have ctrl bound to the space key. Yes, the space key.(†) Needless to say, VS Code doesn't handle this well with dispatch set to code – every time I use space as ctrl it interprets it as a key chord of space and ctrl+<the other key I'm pressing>.

I'm mentioning this because I am not sure solutions that add setxkbmap support to VS Code will solve this, as most solutions that bind ctrl to the space key seem to work in a different way from what I've gathered. (Though I should mention that I don't understand too much about the mess that is xmodmap, setxkbmap et cetera, so I could easily be wrong.) Anyway, it would be great if at least one of the "ctrl->space" implementations (see below) were supported eventually. :) …or if at least the "keyCode" dispatch mode doesn't get deprecated afterwards.

Speaking of which, the latter actually seems to work fine for me on a "de-DE" keyboard. @alexandrudima: Is there a particular reason the "code" mode is recommended for German keyboards or is there anything that doesn't work in "keyCode" mode that I haven't noticed?

--

† For those who haven't heard of this: The space key basically acts as ctrl when held down and as space when hit quickly. Not only is this a lot more comfortable to use as your strongest finger – the thumb – is doing all the work; it can also really work wonders when you're dealing with RSI-related issues. In case anyone's interested, here're some solutions I'm aware of that implement this:

andyl commented 5 years ago

Yesterday I found that my problem was a bad setting in keybindings.json. Once I removed this, works fine on Xubuntu 18.04 configured using setxkbmap -option caps:swapescape.

olofwalker commented 5 years ago

On Ubuntu 18.04, if you remap the Capslock to Ctrl, you always have to press enter when using the Ctrl+Tab to switch to a new editor. But this behavior is not unique to VS Code, it also happens in the Vivaldi browser that have a similar "switcher".

Using the record keys in Keyboard shortcuts, I can see that when pressing Ctrl+Tab (using the remapped CapsLock as Ctrl) it reports CapsLock Ctrl+Tab, which is different from the "normal" Ctrl+Tab.

mlcamilli commented 5 years ago

I experience exactly what @olofwalker described. All of my bindings with capslock bound to ctrl do not work because of this

manudurruty commented 5 years ago

"keyboard.dispatch": "keyCode" stopped working.

itgoyo commented 5 years ago

thanks gay,"keyboard.dispatch": "keyCode", it works for me

apahne commented 5 years ago

I have mapped CTRL to Caps Lock. "keyboard.dispatch": "keyCode" is not working.

That is deep in my muscle memory. All other apps honor that. VSCode became pretty much unusable to me.

NanoDano commented 5 years ago

I modified my settings.json to include "keyboard.dispatch": "keyCode", and it started working in Linux (Fedora Gnome). Thanks for that tip. I mapped my key using dconf write /org/gnome/desktop/input-sources/xkb-options "['caps:escape']". In Windows I use AutoHot key and have no issues.

ghost commented 5 years ago

I’m using Ubuntu, and have Caps Lock mapped to Ctrl.

What worked for me was using Gnome Tweaks, and setting “Ctrl position” to “Caps Lock as Ctrl”. I initially had “Caps Lock behavior” set to “Caps Lock is also a Ctrl”, but that did not work. Also "keyboard.dispatch": "keyCode" seems to be needed.

Hope this helps!

mlcamilli commented 5 years ago

@alexanderte super helpful, fixed my problems!

LarnuUK commented 5 years ago

Changing Keyboard: Dispatch to KeyCode seems to have no effect for me, or at least doesn't cause settings for pointer to use the modifier Xmodmap settings.

revgum commented 5 years ago

re: @alexanderte mentions using Gnome Tweaks to set "Ctrl position" and "Caps Lock behavior", I tried multiple options with the checkboxes and it only worked with the configuration in attached screenshot (along with "keyboard.dispatch": "keyCode")

gnome-tweaks

jhpratt commented 5 years ago

Following up on my comment from April 2018 (~17 months ago). I just tried setting it to keyCode, and ran into the same issue as before — Ctrl + ` doesn't toggle the terminal. I've updated the version of Ubuntu, but it's otherwise the same.

@alexandrudima Is there any progress on this front? Is it something I might be able to take on?

JamesLavin commented 4 years ago

I found a partial workaround that might help other vim users. I tweaked the idea in https://dev.to/karlredman/navigate-your-vscode-like-its-1999-the-vim-way-3632 by adding the following to ~/.config/Code/User/keybindings.json:

    {
      "key": "capslock",
      "command": "extension.vim_escape",
      "when": "editorTextFocus && vim.active && vim.mode == 'Insert'"
    },

CapsLock is now triggering Esc to get me out of Vim's insert mode, but it's also toggling CapsLock, so I have to hit CapsLock a second time to undo that. (I tried using multi-command, https://marketplace.visualstudio.com/items?itemName=ryuta46.multi-command, to automatically call CapsLock a second time, but capslock doesn't seem callable as a command.)

This shouldn't be this hard. Sigh.

sholderbach commented 4 years ago

I found similar key rebinding problems with the new great jupyter notebook editor of the python extension. The "keyboard.dispatch": "keyCode"setting is not correctly respected when using Esc mapped on the Caps Lock key to leave the jupyter notebook edit mode.

https://github.com/microsoft/vscode-python/issues/8020

Yet in the general editor and dialogs it works for me without a problem

itachi-19 commented 4 years ago

"keyboard.dispatch": "keyCode"

Where to add this?

LarnuUK commented 4 years ago

"keyboard.dispatch": "keyCode"

Where to add this?

Open the settings (ctrl+,), and search for Dispatch. Or click the Open Settings (JSON) button (top right, shown below), and put the setting in your JSON (it is assumed you understand how to edit a JSON file):

image

itachi-19 commented 4 years ago

"keyboard.dispatch": "keyCode"

Where to add this?

Open the settings (ctrl+,), and search for Dispatch. Or click the Open Settings (JSON) button (top right, shown below), and put the setting in your JSON (it is assumed you understand how to edit a JSON file):

image

Thanks a lot :)

neoscaler commented 4 years ago

This bug is still present, but the workaround also still works for me. I use the Workman-P keyboard layout, which has Backspace on Caps Lock.