I have a Macbook Air that runs Linux. I want to swap the alt and super keys in both sides of the keyboard with each other.
How do I do this with cli tools?
Update
Following Drav Sloan’s answer I used the following:
keycode 64 = Alt_L keycode 133 = Super_L remove Mod1 = Alt_L remove Mod4 = Super_L add Mod1 = Super_L add Mod4 = Alt_L keycode 108 = Alt_R keycode 134 = Super_R remove Mod1 = Alt_R remove Mod4 = Super_R add Mod1 = Super_R add Mod4 = Alt_R
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
If you’re wanting to do this on an Apple keyboard, try this out:
echo 1|sudo tee /sys/module/hid_apple/parameters/swap_opt_cmd
To get this to work for a lower version of Linux you can try this out:
http://blog.chaselambda.com/2014/10/09/apple-keyboard-on-linux-3.8.html
Method 2
If you only want to swap left alt and super key execute the command in your terminal:
setxkbmap -option altwin:swap_alt_win
To restore the default behavior just use:
setxkbmap -option
Note: This is temporary. If you want the effects permanently add it to your startup file.
Method 3
One way to achieve that is via xmodmap. You can run xev to get key events. On running xev a box should appear and you can focus it and press the keys you want to swap. It should output details similar to for the Alt key:
KeyPress event, serial 28, synthetic NO, window 0x8800001, root 0x25, subw 0x0, time 2213877115, (126,91), root:(1639,475), state 0x0, keycode 14 (keysym 0xffe9, Alt_L), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False
I’m on a PC, and don’t have a “Command Key”, but have the equivalent “Windows Key”, and
xev gives:
KeyPress event, serial 28, synthetic NO, window 0x8000001, root 0x25, subw 0x0, time 2213687746, (111,74), root:(1624,98), state 0x0, keycode 93 (keysym 0xffeb, Super_L), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False
Because xmodmap has no idea of state, and can easily break key mappings, I suggest you do a:
xmodmap -pke > defaults
Then we create a xmodmap file:
keycode 14 = Alt_L keycode 93 = Super_L remove Mod1 = Alt_L remove Mod4 = Super_L add Mod1 = Super_L add Mod4 = Alt_L
Note how I’m using the keycodes that xev returned. Also here I’m only replacing the left super and alt keys (and leaving the right ones to their old behavior). Then we can simply run xmodmap, to set these keys:
$ xmodmap -v modmap.file
! modmap:
! 1: keycode 14 = Alt_L
keycode 0xe = Alt_L
! 2: keycode 93 = Super_L
keycode 0x5d = Super_L
! 3: remove Mod1 = Alt_L
! Keysym Alt_L (0xffe9) corresponds to keycode(s) 0xe
remove mod1 = 0xe
! 4: remove Mod4 = Super_L
! Keysym Super_L (0xffeb) corresponds to keycode(s) 0x5d
remove mod4 = 0x5d
! 5: add Mod1 = Super_L
add mod1 = Super_L
! 6: add Mod4 = Alt_L
add mod4 = Alt_L
!
! executing work queue
!
keycode 0xe = Alt_L
keycode 0x5d = Super_L
remove mod1 = 0xe
remove mod4 = 0x5d
add mod1 = Super_L
add mod4 = Alt_L
You can run without the -v (verbose) switch for silent running, but I find it useful if you made mistakes in your modmap file. If things go messy then just reapply your defaults:
xmodmap defaults
Modmap is often ran at start up of X, so you can have these applied as defaults if you put your modmap commands in ~/.xmodmaprc.
Method 4
$ xmodmap -pke
Take note of which keycodes alt and super are bound to, then in your home folder open/make a new file .xmodmaprc. For example, my super/alt keys are bound as such
keycode 64 = Alt_L Meta_L Alt_L Meta_L keycode 108 = Alt_R Meta_R Alt_R Meta_R keycode 133 = Super_L NoSymbol Super_L keycode 134 = Super_R NoSymbol Super_R
But to swap the keys, you would put the following in .xmodmaprc
keycode 64 = Super_L NoSymbol Super_L keycode 108 = Super_R NoSymbol Super_R keycode 133 = Alt_L Meta_L Alt_L Meta_L keycode 134 = Alt_R Meta_R Alt_R Meta_R
Method 5
In addition to coljamkop answer. If you need to swap other combination of service keys (Ctrl, Alt, etc.), you could use many other options for setxkbmap.
Run the following command to see desired options along with their descriptions (replace “alt” and/or “win” for other keys):
$ grep -E "(alt|win):" /usr/share/X11/xkb/rules/base.lst
Then set chosen option by setxkbmap:
$ setxkbmap -option *chosen option*
This method is fully described at Archlinux Wiki.
Method 6
If you are one of the unfortunate people like me that could not get xmodmap to switch right Alt with right Ctrl, then maybe this will help.
If you press right Alt and e and you get é then this solution is for you (needs improvement).
Run this in the terminal (check your keycodes with xev):
xmodmap -e "keycode 108 = Alt_R Meta_R Alt_R Meta_R"
then put this code in your .Xmodmap:
remove Control = Control_R remove Mod1 = Alt_R keycode 105 = Alt_R keycode 108 = Control_R add Control = Control_R add Mod1 = Alt_R
This code sets your Alt_Gr key to Alt_R, and then it swaps Alt_r with Ctrl_R.
If you want this to remain after you logout, put the following commands in any of your startup shell files, for example ~/.profile:
if [ -f $HOME/.Xmodmap ]; then xmodmap -e "keycode 108 = Alt_R Meta_R Alt_R Meta_R" /usr/bin/xmodmap $HOME/.Xmodmap fi
Method 7
If you’re on sway-wm you can add
input type:keyboard {
xkb_options altwin:swap_alt_win
}
to you’re sway config file. Or get your keyboard id with swaymsg -t get_inputs and replace input type:keyboard with input "12:34:your_id".
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0