Repository: vscode
Issue: "Keybinding" shown is misleading for Ctrl-modified keyboard layouts (like Dvorak+QWERTY)
Labels: bug,windows,keyboard-layout

Issue Type: <b>Bug</b>

The keyboard layout I'm using is [United States-Dvorak (Ctrl + Qwerty)](https://github.com/chid/dvorak-qwerty/tree/master/dverty), which is Dvorak except when Ctrl is held down, in which case it acts like QWERTY.

This works generally fine in Windows.

VS Code exhibits some extremely confusing behaviour, however.

When entering a keybinding (via "add keybinding") that uses Ctrl, 

### Keybindings for either Ctrl+J or Ctrl+H are reported when searching for "ctrl+j"

![image](https://user-images.githubusercontent.com/678344/142298304-e34f647a-dc3d-4fd0-a1ac-5d24487538d3.png)

This bit is so confusing I can only explain it with an example. If you search for "ctrl+j", you effectively get two result sets combined, neither of which really matches what you expect:

- keybindings that are defined as "ctrl+c" (such as "Terminal: Copy selection") are returned and reported as "Ctrl + J" (The QWERTY key C is the Dvorak key J).
- keybindings that are defined as "ctrl+j" (such as "Join lines") are returned and reported as "Ctrl + H" (The QWERTY key J is the Dvorak key H)

What I would expect: only the "ctrl+j" results are returned, and reported as "Ctrl + J". (Join lines happily works as expected - pressing Ctrl with the key labelled as J)

Very surprisingly, this does not happen if you search for "ctrl j" or "ctrl h" (with a space instead of a plus):

![image](https://user-images.githubusercontent.com/678344/142299127-65aebc05-5aec-4404-ba13-b25dc4d53683.png)

## Adding a key combination with Ctrl simultaneously reports that combination inconsistently

I couldn't work out how to screenshot this, but when adding a new key combination:

1. Hold down Ctrl and press the QWERTY J key
2. The input box shows "ctrl+j"
3. Below the input box is shown "Ctrl + H"
4. The stored key is "ctrl+j"

Expected: in step three it shows "Ctrl + J"

## Chords that start with Ctrl are displayed as if Ctrl was held all the way through

1. Add a key combination that is Ctrl+J, then releasing Ctrl and pressing J again. (This is actually Ctrl+J followed by H)
2. The input box shows "ctrl+j j"
3. Below the input box shows "Ctrl + H chord to H"
4. The stored keybinding is "ctrl+j j"
5. The actual behaviour is as expected.

## Summary

I think there are maybe three distinct issues here:

1. Whenever VS Code is reporting keybinding in its fancy "`Ctrl` + `H`" style, it is making an incorrect assumption that since "J" on QWERTY is "H" on my current keyboard layout, then "Ctrl+J" must map to "Ctrl+H" (incorrect).
2. The identifiers for keybindings are always expressed in QWERTY terms, which explains why "ctrl+j j" is the representation of what is actually Ctrl+J, H. (Consistent, just a bit surprising to me.)
3. I really don't know why two different result sets are combined when searching for "ctrl+j", but it's not good. It's as if the search is trying to pre-empt the fact you might mean either the physical key J, or the logical (Dvorak) key J, but it ends up being super confusing because of issue 1.

VS Code version: Code 1.62.2 (3a6960b964327f0e3882ce18fcebd07ed191b316, 2021-11-11T20:56:38.428Z)
OS version: Windows_NT x64 10.0.19043
Restricted Mode: No
Remote OS version: Linux x64 5.10.60.1-microsoft-standard-WSL2
Remote OS version: Linux x64 5.10.60.1-microsoft-standard-WSL2
Remote OS version: Linux x64 5.10.60.1-microsoft-standard-WSL2
Remote OS version: Linux x64 5.10.60.1-microsoft-standard-WSL2
Remote OS version: Linux x64 5.10.60.1-microsoft-standard-WSL2
Remote OS version: Linux x64 5.10.60.1-microsoft-standard-WSL2
Remote OS version: Linux x64 5.10.60.1-microsoft-standard-WSL2

<details>
<summary>System Info</summary>

|Item|Value|
|---|---|
|CPUs|AMD Ryzen 7 5700G with Radeon Graphics          (16 x 3793)|
|GPU Status|2d_canvas: enabled<br>gpu_compositing: enabled<br>multiple_raster_threads: enabled_on<br>oop_rasterization: enabled<br>opengl: enabled_on<br>rasterization: enabled<br>skia_renderer: enabled_on<br>video_decode: enabled<br>vulkan: disabled_off<br>webgl: enabled<br>webgl2: enabled|
|Load (avg)|undefined|
|Memory (System)|31.41GB (2.48GB free)|
|Process Argv|--crash-reporter-id 316e90d8-477f-431d-a653-578e1f9ecd1b|
|Screen Reader|no|
|VM|0%|

|Item|Value|
|---|---|
|Remote|WSL: Ubuntu|
|OS|Linux x64 5.10.60.1-microsoft-standard-WSL2|
|CPUs|AMD Ryzen 7 5700G with Radeon Graphics (16 x 3792)|
|Memory (System)|24.59GB (3.84GB free)|
|VM|0%|

|Item|Value|
|---|---|
|Remote|WSL: Ubuntu|
|OS|Linux x64 5.10.60.1-microsoft-standard-WSL2|
|CPUs|AMD Ryzen 7 5700G with Radeon Graphics (16 x 3792)|
|Memory (System)|24.59GB (3.84GB free)|
|VM|0%|

|Item|Value|
|---|---|
|Remote|WSL: Ubuntu|
|OS|Linux x64 5.10.60.1-microsoft-standard-WSL2|
|CPUs|AMD Ryzen 7 5700G with Radeon Graphics (16 x 3792)|
|Memory (System)|24.59GB (3.84GB free)|
|VM|0%|

|Item|Value|
|---|---|
|Remote|WSL: Ubuntu|
|OS|Linux x64 5.10.60.1-microsoft-standard-WSL2|
|CPUs|AMD Ryzen 7 5700G with Radeon Graphics (16 x 3792)|
|Memory (System)|24.59GB (3.84GB free)|
|VM|0%|

|Item|Value|
|---|---|
|Remote|WSL: Ubuntu|
|OS|Linux x64 5.10.60.1-microsoft-standard-WSL2|
|CPUs|AMD Ryzen 7 5700G with Radeon Graphics (16 x 3792)|
|Memory (System)|24.59GB (3.84GB free)|
|VM|0%|

|Item|Value|
|---|---|
|Remote|WSL: Ubuntu|
|OS|Linux x64 5.10.60.1-microsoft-standard-WSL2|
|CPUs|AMD Ryzen 7 5700G with Radeon Graphics (16 x 3792)|
|Memory (System)|24.59GB (3.84GB free)|
|VM|0%|

|Item|Value|
|---|---|
|Remote|WSL: Ubuntu|
|OS|Linux x64 5.10.60.1-microsoft-standard-WSL2|
|CPUs|AMD Ryzen 7 5700G with Radeon Graphics (16 x 3792)|
|Memory (System)|24.59GB (3.84GB free)|
|VM|0%|
</details><details><summary>Extensions (19)</summary>

Extension|Author (truncated)|Version
---|---|---
jest-snippets|and|1.8.0
comment-tagged-templates|bie|0.3.1
ndjson-colorizer|bus|1.0.0
riot-tag|cri|0.1.7
vscode-sql-tagged-template-literals-syntax-only|fri|0.0.19
vue|jcb|0.1.5
vscode-position|jtr|1.0.3
jupyter-keymap|ms-|1.0.0
remote-containers|ms-|0.205.2
remote-ssh|ms-|0.66.1
remote-ssh-edit|ms-|0.66.1
remote-wsl|ms-|0.58.5
vscode-remote-extensionpack|ms-|0.21.0
sublime-keybindings|ms-|4.0.10
ejs-language-support|Qas|0.0.1
mdx|sil|0.1.0
vscode-ruby|win|0.28.0
vscode-notes|dio|1.1.0
prettier-vscode|esb|9.0.0

(4 theme extensions excluded)

</details><details>
<summary>A/B Experiments</summary>

```
vsliv368:30146709
vsreu685:30147344
python383cf:30185419
vspor879:30202332
vspor708:30202333
vspor363:30204092
vstes516:30244333
pythontb:30283811
pythonptprofiler:30281270
vshan820:30294714
vstes263:30335439
pythondataviewer:30285071
vscod805:30301674
pythonvspyt200:30340761
binariesv615:30325510
bridge0708:30335490
dockerwalkthru:30377721
bridge0723:30353136
pythonrunftest32:30373476
pythonf5test824:30373475
javagetstartedt:30391933
pythonvspyt187:30373474
vsqsis200cf:30386380
vsaa593:30376534
vssld246:30386377
vscexrecpromptt1:30400061

```

</details>

<!-- generated by issue reporter -->