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.
jpaniagualaconich commented 4 years ago

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.

jhpratt commented 4 years ago

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.

kylebakerio commented 4 years ago

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.

NanoDano commented 4 years ago

@kylebakerio Maybe you can ask for a refund.

mahkoh commented 4 years ago

@kylebakerio Maybe don't use Microsoft software on linux.

ahmaddynugroho commented 4 years ago

This is how I make Caps Lock an additional Esc for vim extension in vscode in POP!_OS 19.10:

  1. "sudo apt install gnome-tweaks"
  2. "gnome-tweaks"
  3. go to "Keyboard & Mouse" and click on "Additional Layout Options"
  4. inside "Caps Lock Behavior" choose "Make Caps Lock an Additional Esc"
  5. go to vscode "File" then "Preferences" then "Settings"
  6. Type "dispatch"
  7. choose "keyCode"
  8. done
kylebakerio commented 4 years ago

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.

romin1122 commented 4 years ago

Thanks, It solved my problem as well. Awesome!

tkkcc commented 4 years ago

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"

trululu96 commented 4 years ago

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

i-oliva commented 3 years ago

setxkbmap -option lv3:rwin_switch

lbrande commented 3 years ago

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?

ihlec commented 3 years ago

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?

same issue here. xmodmap bindings are broken

other remappings like KDE->Keyboard->Advanced works fine with the "keyboard.dispatch": "keyCode"

Stigjb commented 3 years ago

The "keyboard.dispatch": "keyCode" workaround has stopped working for me recently. The keys are still swapped in other applications, but now hitting caps lock in VS Code has absolutely no effect whether the dispatch is set to code or keyCode.

spencerpogo commented 3 years ago

The "keyboard.dispatch": "keyCode" workaround was working but recently it isn't working anymore.

kylebakerio commented 3 years ago

Amazing. I've been following this issue for years. I don't know any other app on linux that has had so much trouble respecting this issue that I've ever interacted with--and it's a tool built specifically for developers to write code?

I guess it matters that it is built by microsoft?

spencerpogo commented 3 years ago

False alarm, it started working again for me :shrug:

Stigjb commented 3 years ago

It started working again for me as well :shrug:

joooooooooooooooooooooooooooooooooooosh commented 3 years ago

Stopped working for me again.

aflag commented 3 years ago

Are there any hopes of this issue ever getting fixed? Are all chromium based apps affected? Has it been notified upstream?

kylebakerio commented 3 years ago

@aflag I've never experienced this issue with any other app (including other chromium based apps) in linux. this is a vscode-only issue for me, and has been repeatedly the handful of times I've given vscode a go over the years.

aflag commented 3 years ago

Indeed a bit weird. It seems there’s a workaround which I haven’t tested yet. Can’t say I’ve tried too many electron based apps before, though.

It took me a while to realise what the bug was, I thought vscode was dropping input from time to time. It was very confusing, until I figured out what was going on. If it’s too difficult to fix, maybe trying to identify that something may be wrong during startup and showing a popup with a suggestion to try that work around would go a long way. It’d have definitely made my life easier/less frustrating a couple days ago.

rishadbaniya commented 3 years ago

This is how I make Caps Lock an additional Esc for vim extension in vscode in POP!_OS 19.10:

1. "sudo apt install gnome-tweaks"

2. "gnome-tweaks"

3. go to "Keyboard & Mouse" and click on "Additional Layout Options"

4. inside "Caps Lock Behavior" choose "Make Caps Lock an Additional Esc"

5. go to vscode "File" then "Preferences" then "Settings"

6. Type "dispatch"

7. choose "keyCode"

8. done

now this thing works

gorilskij commented 3 years ago

I'm swapping Caps Lock and Backspace and the keyCode option has recently stopped working (Ubuntu 20.04, code 1.55.2)

fahadbr commented 3 years ago

this is also a problem for me using setxkbmap settings. i started looking into using interception-tools combined with caps2esc (https://gitlab.com/interception/linux/tools) as an alternative set up and it seems to work with vscode. (capslock works as escape again)

I would suggest people looking into interception-tools as a workaround

AntonOfTheWoods commented 3 years ago

@alexdima you are still assigned to this ticket, and we haven't seen any action in a while. I see the W3C keyboard-map has a draft version from March of this year.

Might one option be to try and detect that some xkb fooery is going on and alert the user to look at a FAQ about this issue, if we still need to wait for a proper fix? It's little niggles like this that keep us zealots from becoming full converts :-).

olejorgenb commented 3 years ago

What's the rationale for dispatching based on "code"? Does this means that dvorak and international users have the same physical hotkeys as qwerty and americans also? (which is arguable a good thing, but possibly quite confusing)

I assume "code" means keycode and "keycode" means keysym in X11 lingo.

truly-irham commented 3 years ago

This is how I make Caps Lock an additional Esc for vim extension in vscode in POP!_OS 19.10:

1. "sudo apt install gnome-tweaks"

2. "gnome-tweaks"

3. go to "Keyboard & Mouse" and click on "Additional Layout Options"

4. inside "Caps Lock Behavior" choose "Make Caps Lock an Additional Esc"

5. go to vscode "File" then "Preferences" then "Settings"

6. Type "dispatch"

7. choose "keyCode"

8. done

now this thing works

Thanks for quoting this. I really don't know why the workaround "keyboard.dispatch": "keyCode" in settings.json doesnt sync with the gui settings. It's great if someone could clarify this perhaps :/ I use arch btw

diogogmt commented 3 years ago

Switching the dispatch mode to keyCode is working again; "keyboard.dispatch": "keyCode"

MossabDiae commented 3 years ago

I'm using colemak , vscode didn't respect capslock as backspace which I set using setxkbmap , setting "keyboard.dispatch": "keyCode" did work but all the shortcuts were remapped based on the new layout which was uncomfortable . the solution I did was :

kylebakerio commented 3 years ago

I just drop in to watch the fire burn every time I get a new notification. This issue is literally the reason I don't give VScode a real chance and stick with sublime, not willing to deal with it every time I re-install. caps lock as ctrl being seamless matters more to me.

aflag commented 2 years ago

@kylebakerio it's free software, you can always fix it yourself and make lots of people happy.

kylebakerio commented 2 years ago

I am not invested in this project. There are other editors. People rave about VS code, it was the hottness for a while, I wanted to give it a shot. It's not my field of expertise, so I'd be very inefficient getting up to speed on this. I also frankly have my own projects, work, and open source projects I contribute to. Just not in the cards for me.

It's surprising that a project sponsored by Microsoft doesn't have their shit together and prioritize what to me is fixing a bug in something ground level--getting keyboard mappings handled right in a code text editor on linux. I've never encountered this bug in another project on linux, it just isn't hard to respect key mappings in a vanilla gnome environment... And if it is, it doesn't speak well of their code architecture and design choices.

I feel like a bit of a troll here on this thread now, but it's become some kind of sad trash fire to watch, kind of can't help it. The last time I had this experience was watching the Chromium "bug report" for the garbage built-in hotkey that was present for years that made backspace = "go back" history navigation if you weren't in an active text field... which meant if you accidentally lost focus on text field (say, but tapping your mouspad with your palm on a laptop while typing) and hit backspace, you could lose all you had typed.

For years I watched the conversation rage on about this. I just sat in disbelief that such a moronic default couldn't be fixed. They finally did! couple years back. my god. anyways, same as here, would just pop in when I'd get email notifications as the conversation accumulated back and forth, year after year.... This bug has was reported in ubuntu 16.04! We're in the 21.10 era now! Jesus!

alexdima commented 2 years ago

I am sorry that it takes us a long time to fix this issue. The problem is that we are not X11 experts, and that our time is very limited and split between other issues. Unfortunately, we don't really get any community contributions in this area. I can only guess that is because the underlying node module is written in C++ and a contributor would need to be an expert in or at least understand the inner workings of X11.

Last month I spent about 3 days (!!) just reading the X11 specification such that I could fix:

You can find the changesets I did at https://github.com/microsoft/node-native-keymap and assess how easy or complex doing them is:

We also need to improvise, for example we now have a new thread running that is just listening to X11 keyboard state change events (in parallel to whatever Chromium is doing with X11). Is that a good design? Is that a bad design? We don't know, because we're not experts in X11. We also got some ugly freezes because of trying to join that thread (e.g. https://github.com/microsoft/vscode/pull/135108), so that's why we try to ask for community help.

Contributing with comments that do not contain technical content is not helpful in this particular case. Please take a moment and consider the following positive ways in which you can contribute:

To clarify, there is always the workaround to use "keyboard.dispatch": "keyCode", it is not the case that this issue does not have a workaround. If "keyboard.dispatch": "keyCode" does not work, then it means that the setxkbmap you have defined also does not work in any Chromium based browsers.

kylebakerio commented 2 years ago

Hey, I'm sympathetic to that, interesting to hear that it isn't somewhere clearly defined as a best practice. Atom is another chromium based code editor--does it not exhibit this bug? If so, could one not look at how they've implemented it?

However

If "keyboard.dispatch": "keyCode" does not work, then it means that the setxkbmap you have defined also does not work in any Chromium based browsers.

This doesn't seem to be true, as I use chrome as a power user, and never have the issues I've seen in VScode, including with this setting. ¯\_(ツ)_/¯

akosfekete commented 2 years ago

Another workaround for this could be using kbct to remap keys instead of setxkbmap (it works on a lower level and even supports Wayland). It's not a one-to-one replacement, but it solved a bunch of issues for me (it requires the uinput kernel module to be loaded though)

kylebakerio commented 2 years ago

For whatever it's worth, an interesting VSCode extension made me give vscode yet another try.

I'm on pop 21.10 (an ubuntu variant, with gnome), using the same gnome-set caps-lock-as-control I've always had, and it's working as far as I can tell--so, progress!

I used to also have multiple languages installed, and that had also caused a subtle weird bug--don't have multilang set for now, so can't verify that issue is gone, but just thought I'd pop in and throw that out there.

haoadoreorange commented 2 years ago

@alexdima, I have ctrl J set to workbench.action.quickOpenNavigateNext (vim nav) and also have GNOME Make Caps Lock an Ctrl, so I can press caps J to navigate as such.

In my case the navigation does work so I suppose it's not a key dispatch problem. However, workbench.action.quickOpenNavigateNext is supposed to select the option on key release and indeed using ctrl J does so but caps J does not, it only moves the selection.

What can be the issue here that blocks the "choose" action ?

Gingercookie commented 2 years ago

Using Ubuntu 22.04 LTS I have achieved some level of success by remapping the system keycode for caps lock to another key (one that I never use, right_control). This way, my system reads the incoming caps lock press as a different key entirely, and thus eliminates the need to bother with keyboard.dispatch in the settings.

Caveat : I didn't figure out a way to map two key codes to the same key symbol. This means whatever key you take over will need to be remapped to something else, or be completely disabled. (Works great if you want to swap two keys). The way I did it, the right control key is now a "dead" key on my system. If someone else knows how to make that happen, that would be a much better solution.

How to change your system keymap :

  1. Edit keymap sudo vim /usr/share/X11/xkb/keycodes/evdev
  2. Find the key you want to map to (in my case RCTL), and edit as needed.
        // <RCTL> = 105;        // Unmap right control key from right control
        <RCTL> = 66;            // Map caps lock key (66) to right control
  3. Close all GUI applications and save all work before the next step!
  4. Restart your x11 server sudo systemctl restart display-manager
alanhoyle commented 1 year ago

I'm seeing this same issue on macOS 13, using the OS's built-in Colemak keymap, on various VSCode-based web IDEs including:

While accessing those IDEs through the following browsers:

The work-around with Settings: "keyboard.dispatch": "keyCode" makes this work for me in any of those.

Native macOS VSCode works perfectly without any need for Settings modifications!

fweth commented 1 year ago

Can confirm what @alanhoyle is saying for ChromeOS 116 (and older versions) as well.

ixaxaar commented 1 year ago

Have been observing the same issue with arch + vscodium. I needed to modify delete -> home and also reconcile with the fact that there is no tilde key on one of my keebs.

The only solution I finally could work with is with vscode keybindings: Fortunately, got chatGPT to generate this.

[
  // Insert -> Home
  {
    "key": "insert",
    "command": "cursorHome",
    "when": "editorTextFocus"
  },
  // Shift+Insert -> Shift+Home
  {
    "key": "shift+insert",
    "command": "cursorHomeSelect",
    "when": "editorTextFocus"
  },
  // Ctrl+Insert -> Ctrl+Home
  {
    "key": "ctrl+insert",
    "command": "cursorTop",
    "when": "editorTextFocus"
  },
  // Ctrl+Shift+Insert -> Ctrl+Shift+Home
  {
    "key": "ctrl+shift+insert",
    "command": "cursorTopSelect",
    "when": "editorTextFocus"
  }
]
Khayet commented 11 months ago

Here's a rather simple workaround that helped me as a user of KDE Plasma, Fedora 38 (Wayland):

Instead of checking the option "Make Caps Lock an additional Ctrl" under "Caps Lock behavior" in the System Settings (Keyboard > Advanced), I check "Caps Lock as Ctrl" under "Ctrl position". This works for me, maybe it's helpful to other Plasma users as well.

rkjnsn commented 10 months ago

Currently, there's a setting to toggle between the legacy keyCode property, which takes the layout into account but requires “creative solutions”, and the new code property, which ignores layout entirely and reports only the physical location of the key, requiring VSCode to do its own layout mapping. Why not instead use (or offer the option to use) the more-modern key property, which takes the layout into account like keyCode, but is designed with cross-platform use in mind and thus avoids some of the problems of the legacy keyCode property.

Looking at the key value is analogous to looking at the decoded ksym value on Linux, which is what almost all native applications do, aside from things like games, VMs, and remote desktop tools.

l8l commented 9 months ago

As of December 2023, I still experienced this issue that switching Esc and Capslock was not respected by Vscode despite never having had an issue in any other app. The "keyCode" workaround worked for me but I'd appreciate this to be fixed. As a first step, one could let "keyboard.dispatch": "keyCode" just be the default on Linux for example?

beenotung commented 7 months ago

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

A reminding, you need to actually restart VSCode for this change to take effect. Restart extension host is not enough.

barafael commented 3 months ago

Previously this workaround worked fine for me, however recently using plasma6/wayland and it no longer works.

rabyj commented 3 months ago

Previously this workaround worked fine for me, however recently using plasma6/wayland and it no longer works.

@barafael Does the original keyboard dispatch setting work for you? Or the workaround mentioned by @Khayet ?

I wouldn't expect the X11 solution to work for Wayland, considering wayland handles keycodes differently from x11 (setxkbmap doesn't interact with Wayland protocols, and this issue is about setxkbmap originally).

barafael commented 3 months ago

@rabyj the original solution. The other workaround isn't applicable to my use. Btw I have the identical issue under plasma6/x11.

barafael commented 3 months ago

@rabyj never mind! I made a mistake, it does work. Thanks :)