I have a laptop keyboard and an external one, that I’d like to have running different keymaps (specifically different xkbOptions).
Is there a way to configure this declaratively?
I’d like the laptop keyboard to have ctrl:swapcaps
, but not the other keyboard.
1 Like
Use the following snippet:
services.xserver.displayManager.sessionCommands = ''
keyboardId=$(
${pkgs.xorg.xinput}/bin/xinput |
sed -nE 's/.*?MY IDENTIFIER.*?id=([0-9]+).*?master keyboard.*/\1/p'
)
if [[ $keyboardId ]]; then
${pkgs.xorg.setxkbmap}/bin/setxkbmap -device $keyboardId -option ctrl:swapcaps
fi
'';
Replace MY IDENTIFIER
with a pattern that identifies your keyboard.
Here is a complete VM example which swaps Caps Lock and Escape for a specific keyboard.
2 Likes
Thanks @earvstedt, that’s really helpful.
Unfortunately, I’m on GNOME wayland, and it looks like the setxkbmap
program has no effect for me.
As far as I can tell the recommended way to set this under GNOME wayland is via dconf / gsettings, which calls libinput, and there doesn’t seem to be support for per-device settings at the moment.
Unless anyone knows a way around this, I might go back to X11, and use @earvstedt’s answer.
1 Like