How to swap Command and Control keys with xkb step by step?
Solution 1
This answer is mostly based on the answer given here. The reason I ask and answer this question again is the final step, which was not fully described. For further reading about xkb
look here, here, and here.
-
Create a file in
/usr/share/X11/xkb/symbols
(could also be in/etc/X11/xkb/symbols
) calledaltwin2
and containing the following mapping:// Control is SWAPPED with Win-keys partial modifier_keys xkb_symbols "cmd_n_ctrl" { key <LWIN> { [ Control_L ] }; key <RWIN> { [ Control_R ] }; key <LCTL> { [ Super_L ] }; modifier_map Control { <LWIN>, <RWIN> }; modifier_map Mod4 { <LCTL> }; };
-
Insert the following line under the
option = symbols
section in/usr/share/X11/xkb/rules/evdev
(disregard the warning on the first line):altwin2:cmd_n_ctrl = +altwin2(cmd_n_ctrl)
-
Add the new option to
/usr/share/X11/xkb/rules/evdev.lst
under the sectionoption
:altwin2:cmd_n_ctrl Win swapped with Ctrl
-
If you don't know where your keyboard configuration file is, you can edit it using dconf-editor, adding
"altwin2:cmd_n_ctrl"
inxkb-options
under org::gnome::desktop::input-sources as shown here. If you know where your configuration file is, you should include the new option in theXkbOptions
field as shown below:Section "InputClass" Identifier "keyboard-layout" Driver "evdev" MatchIsKeyboard "yes" Option "XkbLayout" "us, ru, ca, fr" Option "XkbOptions" "altwin2:cmd_n_ctrl" EndSection
-
Either reboot or restart
lightdm
to update the changes:sudo restart lightdm
NOTE: if any changes are made directly in the layout files, i.e. not using options, the cached files in /var/lib/xkb/
need to be deleted as indicated here.
Solution 2
In 16.04, here's the way I finally got this to work. Xmodmap doesn't work universally in all apps, gnome tweak tool lacked the function, dconf editing a custom altwin2 key swap (like the main answer here) failed, so I was tearing my hair out until I combined several answers into this complete, simple, and elegant solution:
gksudo gedit /usr/share/X11/xkb/symbols/pc
change it to:
default partial alphanumeric_keys modifier_keys
xkb_symbols "pc105" {
key <ESC> { [ Escape ] };
// The extra key on many European keyboards:
key <LSGT> { [ less, greater, bar, brokenbar ] };
// The following keys are common to all layouts.
key <BKSL> { [ backslash, bar ] };
key <SPCE> { [ space ] };
include "srvr_ctrl(fkey2vt)"
include "pc(editing)"
include "keypad(x11)"
key <BKSP> { [ BackSpace, BackSpace ] };
key <TAB> { [ Tab, ISO_Left_Tab ] };
key <RTRN> { [ Return ] };
key <CAPS> { [ Caps_Lock ] };
key <NMLK> { [ Num_Lock ] };
key <LFSH> { [ Shift_L ] };
key <LCTL> { [ Alt_L ] };
key <LWIN> { [ Super_L ] };
key <RTSH> { [ Shift_R ] };
key <RCTL> { [ Alt_R ] };
key <RWIN> { [ Super_R ] };
key <MENU> { [ Menu ] };
// Beginning of modifier mappings.
modifier_map Shift { Shift_L, Shift_R };
modifier_map Lock { Caps_Lock };
modifier_map Control{ Control_L, Control_R };
modifier_map Mod2 { Num_Lock };
modifier_map Mod4 { Super_L, Super_R };
// Fake keys for virtual<->real modifiers mapping:
key <LVL3> { [ ISO_Level3_Shift ] };
key <MDSW> { [ Mode_switch ] };
modifier_map Mod5 { <LVL3>, <MDSW> };
key <ALT> { [ NoSymbol, Control_L, Control_R ] };
//include "altwin(meta_alt)"
key <LALT> { [ Control_L ] };
key <RALT> { [ Control_R ] };
modifier_map Mod1 { Alt_L, Alt_R, Meta_L, Meta_R };
key <META> { [ NoSymbol, Meta_L, Meta_R ] };
modifier_map Mod1 { <META> };
key <SUPR> { [ NoSymbol, Super_L ] };
modifier_map Mod4 { <SUPR> };
key <HYPR> { [ NoSymbol, Hyper_L ] };
modifier_map Mod4 { <HYPR> };
// End of modifier mappings.
key <OUTP> { [ XF86Display ] };
key <KITG> { [ XF86KbdLightOnOff ] };
key <KIDN> { [ XF86KbdBrightnessDown ] };
key <KIUP> { [ XF86KbdBrightnessUp ] };
};
hidden partial alphanumeric_keys
xkb_symbols "editing" {
key <PRSC> {
type= "PC_ALT_LEVEL2",
symbols[Group1]= [ Print, Sys_Req ]
};
key <SCLK> { [ Scroll_Lock ] };
key <PAUS> {
type= "PC_CONTROL_LEVEL2",
symbols[Group1]= [ Pause, Break ]
};
key <INS> { [ Insert ] };
key <HOME> { [ Home ] };
key <PGUP> { [ Prior ] };
key <DELE> { [ Delete ] };
key <END> { [ End ] };
key <PGDN> { [ Next ] };
key <UP> { [ Up ] };
key <LEFT> { [ Left ] };
key <DOWN> { [ Down ] };
key <RGHT> { [ Right ] };
};
Save.
rm -rf /var/lib/xkb/*
(I don't know if this is required, but I did it.)
Reboot.
Related videos on Youtube
Aleksandar Savkov
Updated on September 18, 2022Comments
-
Aleksandar Savkov over 1 year
I want to use my Apple long aluminium keyboard with swapped Command and Ctrl keys. How is this done step by step on Trusty Tahr (14.04) using
xkb
?Note: This solution doesn't work for me as
xkb
replacedxmodmap
in 13.04 or even earlier. -
Aleksandar Savkov over 7 yearsThanks for that. I will test it when I migrate to 16.04 in the near future.
-
Tom Mercer over 7 yearsJust used this on my 16.10 upgrade. Worked very nicely.
-
Ben Davis about 7 yearsShould be
!option = symbols
section, notoptions = symbols
(spent time searching for "options =" to find the section). -
Aleksandar Savkov over 5 yearsSee also here: reddit.com/r/Ubuntu/comments/8lnr8q/remapping_keys
-
Seph over 4 yearsLike most things with xkb and xmodmap, doesn't work, probably broke my system in other way, I'm sick of this crap and I really wish linux would get its crap together with the most basic freaking thing about key mapping and binding.
-
Aleksandar Savkov over 4 yearsDo mind this was written in 2014 and doesn’t apply to modern distributions.
-
dominik about 4 yearsBy far the simplest answer, worked like a charm on my Fedora. Thanks!
-
Marcelo Myara over 3 yearsWorks like a charm on a Manjaro 20. Tks a lot.
-
NeilG over 2 yearsIt would be good to get some explanation of what's going on, what the syntax means, and if this is being applied on top of or is replacing the default set up, how to remove it, which path names and identifiers are mandatory and which are arbitrary, and how the different files in
/usr/share/X11/xkb
work together. -
NeilG over 2 yearsTo swap the ALT key with the Windows / Command / "Super" key using xkb I found this worked:
setxkbmap -option altwin:swap_lalt_lwin
. Run at startup somewhere. I don't know why or if swapping Cmd and Ctrl has to be so much more involved, or if there's some additional benefit to this long set up.