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:
setxkbmap -option caps:escape
(binds caps to escape for the duration of the session)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.
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
Thanks for the workaround! đź‘Ť
The workaround works like a charm, thanks!
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.
this workaround isn't working for me on vscode 1.12.2-1..
@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.
@alexandrudima Do you guys plan on fixing this issue at some point? Or is the workaround satisfactory as a long term solution?
@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
Is it tricky or is it feasible as a first time contribution?
The work would be split between making first a change in native-keymap
and then in vscode
.
native-keymap
would involve finding and using X11 specific methods that would capture/return the mappings done via setxkbmap
and expose them in some form in the results of _GetKeyMap
vscode
would involve making changes in macLinuxKeyboardMapper.ts
, where the values returned from native-keymap
are consumed, and where all keybindings decisions are done for OSX and Linux.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
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".
Great, now I can use vim mode :)
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).
@jhpratt, Ctrl + ` works ( at least in my case it toggles the terminal without issues )
Awesome
same problem as @jhpratt, the workaround breaks a lot of shorcuts, (I use an ABNT2 (Brazil) keyboard)
~the workaround I found was:~
~1. open gnome tweak tool
1.1 disable the caps lock remap (re enabling caps lock default behavior)
edit: making the above disabled my actual top left physical Esc key. so I made the follwing instead:
extension.vim_escape
keybinding on the GUI Keyboards Shortcuts screen and remove everything related from keybinding.json
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']"
@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.
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:
keyCode
field on WindowskeyCode
concept from Windows.keyCode
values which appear to make sense on Linux and OSX, but they are inherently broken because the concept of keyCode
does not exist natively on those operating systems.keyCode
to produced character in order to display a good label in the UI.code
(scan code) which is a value that does not go through the creative solution and is passed to JS unprocessed. We implement https://github.com/Microsoft/node-native-keymap which uses OS APIs to map scan codes to produced characters. Unfortunately, the code we have on Linux, does not cover the setxkbmap
customizations, it appears we need to improve that code...setxkbmap
it is probably better to dispatch using the previous keyCode
solution, especially when using an English keyboard layout where the creative solution from browsers is reversible and we can print decent labels in the UI. But, when not using setxkbmap
and when using a different keyboard layout (like de-DE, etc.) it is preferable to run VS Code with dispatching on code
.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.
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>
?
@andyl Configure "keyboard.dispatch": "keyCode"
. Restart VS Code.
@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: .
They are working on it, it just takes time... https://wicg.github.io/keyboard-map/
@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.
The "keyCode" workaround just stopped working for me.
Same here.
Ubuntu 18.04.1 here: "keyboard.dispatch": "keyCode"
still works. (With swapescape
)
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.
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.
@certik did not work for me
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:
Yesterday I found that my problem was a bad setting in keybindings.json
. Once I removed this, setxkbmap -option caps:swapescape
.
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.
I experience exactly what @olofwalker described. All of my bindings with capslock bound to ctrl do not work because of this
_"keyboard.dispatch": "keyCode"
_ stopped working.
thanks gay,"keyboard.dispatch": "keyCode",
it works for me
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.
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.
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!
@alexanderte super helpful, fixed my problems!
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.
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"
)
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?
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.
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
"keyboard.dispatch": "keyCode"
Where to add this?
"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):
"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):
Thanks a lot :)
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.
The Dell XPS 13 7390 has a different home/end/pgup/pgdn layout than previous models.
To try and get a similar experience on the 7390, I remapped Home, End, Page Up and Page Down to AltGr+Left, AltGr+Right, AltGR+Up and AltGr+Down. It works with both "keyboard.dispatch": "code"
and "keyboard.dispatch": "keyCode"
.
Problem is that the "original" PgUp and PgDn keys that I thought I disabled are still working on Electron apps, even though they're disabled for all the non electron apps. This is what xev shows for the disabled PgDn:
KeyRelease event, serial 37, synthetic NO, window 0x6600001,
root 0x136, subw 0x0, time 1695289, (141,560), root:(249,662),
state 0x0, keycode 117 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
NoSymbol
is not taken into account somehow and vscode still turns keycode 117 into a page down.
I can work around it by directly using setkeycodes
but it would be awesome if I didn't need to.
For reference, my previous comment is still correct. Using keyCode
_does not_ work for me. Doing Ctrl + ` does not open the terminal as would be expected; neither of those keys are affected in any way by my keymapping. The extent of what I'm doing is having a British layout with minor modifications via Gnome.
This is unbelievable. Only project I know of that has this problem. Never had an issue before. And a project this size, for programmers, still hasn't fixed this after years?
Embarrassing.
@kylebakerio Maybe you can ask for a refund.
@kylebakerio Maybe don't use Microsoft software on linux.
This is how I make Caps Lock an additional Esc for vim extension in vscode in POP!_OS 19.10:
For whatever it's worth, giving vscode another try after all these years, now on a clean debian 10 install, with a less complex keyboard setup (haven't gotten around to it), it seems to work... Only thing I've done is set caps lock to be ctrl using gnome-tweaks.
... until I tried setting a custom hotkey that is a default in sublime text, which is auto-indent on paste. When I tried to set to ctrl+shift+v, it somehow got confused by the capslock being a control again, and started making it so that I'd have to hit my hotkeys twice for them to work. I noticed some funniness with the input reading, it noticed it was capslock and didn't respect that it should ignore it is capslock and that it is just a ctrl.
I quickly just turned it off and manually indent things for now. I'm in the middle of a project, so I'm just giving vscode a chance for now.
Given this, I imagine if I had all my language settings and key modifiers, it still would have trouble dealing with keyboard inputs.
Maybe when my current sprint is done I'll spend some time getting to know vscode and trying to give it a chance, but this is just not a good sign.
Thanks, It solved my problem as well. Awesome!
Hi, @sholderbach. Have you made it work in jupyter?
I am trying to map capslock
to escape
in jupyter notebook ui. In default keybings.json there is
{ "key": "escape", "command": "notebook.cell.quitEdit","when": "inputFocus && notebookEditorFocused" },
In self keybings.json, Changing escape
to ctrl+capslock
works, while changing to capslock
fails. Also tried toggling "keyboard.dispatch": "keyCode"
The workaround stopped working randomly, It did not improve after a reinstall. It particularly stopped working while on jupyter notebooks, on the rest of the app it works fine.
Version: 1.49.0
Commit: e790b931385d72cf5669fcefc51cdf65990efa5d
Date: 2020-09-10T13:20:50.359Z
Electron: 9.2.1
Chrome: 83.0.4103.122
Node.js: 12.14.1
V8: 8.3.110.13-electron.0
OS: Linux x64 5.4.0-7642-generic
setxkbmap -option lv3:rwin_switch
I also have problems but I have instead used xmodmap
to swap escape with the key just below escape (section on my keyboard). I've tried using "keyboard.dispatch": "keyCode"
but it doesn't help at all. Binding ctrl+escape
appears to work though. Any known solution?
Most helpful comment
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