Keyboard Layout Customization: Difference between revisions
imported>Dmarcoux Add line about home-manager for home.keyboard = null |
imported>Voidless i18n.consoleUseXkbConfig was changed into console.useXkbConfig in release 20.09 |
||
Line 35: | Line 35: | ||
* <code>services.xserver.exportConfiguration</code>: Makes it so the above mentioned xkb directory (and the <code>xorg.conf</code> file) gets exported to <code>/etc/X11/xkb</code>, which is useful if you have to often look stuff up in it. | * <code>services.xserver.exportConfiguration</code>: Makes it so the above mentioned xkb directory (and the <code>xorg.conf</code> file) gets exported to <code>/etc/X11/xkb</code>, which is useful if you have to often look stuff up in it. | ||
* <code>services.xserver.xkbDir</code>: Allows you to set a different xkb directory altogether. All the above mentioned things will use this instead of the default one in regards to xkb stuff. | * <code>services.xserver.xkbDir</code>: Allows you to set a different xkb directory altogether. All the above mentioned things will use this instead of the default one in regards to xkb stuff. | ||
* <code> | * <code>console.useXkbConfig</code>: Makes it so the tty console has about the same layout as the one configured in the <code>services.xserver</code> options. | ||
=== Configs === | === Configs === |
Revision as of 11:25, 10 March 2021
Using xkbcomp
Simple
The easiest way to customize your keyboard layout on NixOS is with these options:
services.xserver.layout
: Keyboard layout, or multiple keyboard layouts separated by commas.services.xserver.xkbVariant
: X keyboard variantservices.xserver.xkbModel
: Keyboard model.services.xserver.xkbOptions
: X keyboard options; layout switching goes here.
You can find valid values for these options in $(nix-build --no-out-link '<nixpkgs>' -A xkeyboard_config)/etc/X11/xkb/rules/base.lst
Advanced
If the above options aren't enough, you can instead create your own keyboard layout by going through xkb. To get started, install xorg.xkbcomp
and run setxkbmap -print > layout.xkb
to get an initial file. This corresponds to your current layout. Use xkbcomp layout.xkb $DISPLAY
to load the file as your new layout. Refer to https://wiki.archlinux.org/index.php/X_KeyBoard_extension on how to edit this file.
Lots of examples can be found in $(nix-build --no-out-link '<nixpkgs>' -A xorg.xkeyboardconfig)/etc/X11/xkb/
. For available key symbols, see $(nix-build --no-out-link '<nixpkgs>' -A xorg.xproto)/include/X11/keysymdef.h
.
To load this file at the start of the X session, add the following to your configuration.nix
. The extra compilation step (xkbcomp
) helps catching layout errors at build time.
let
compiledLayout = pkgs.runCommand "keyboard-layout" {} ''
${pkgs.xorg.xkbcomp}/bin/xkbcomp ${./path/to/layout.xkb} $out
'';
in
services.xserver.displayManager.sessionCommands = "${pkgs.xorg.xkbcomp}/bin/xkbcomp ${compiledLayout} $DISPLAY";
If you are using home-manager, you also need to prevent home-manager from managing the keyboard by having home.keyboard = null;
in your home-manager configuration.
Relevant other options
services.xserver.exportConfiguration
: Makes it so the above mentioned xkb directory (and thexorg.conf
file) gets exported to/etc/X11/xkb
, which is useful if you have to often look stuff up in it.services.xserver.xkbDir
: Allows you to set a different xkb directory altogether. All the above mentioned things will use this instead of the default one in regards to xkb stuff.console.useXkbConfig
: Makes it so the tty console has about the same layout as the one configured in theservices.xserver
options.
Configs
Using xmodmap
Since it is much simpler to use xmodmap and also because I couldn|t get the xkbcomp way to work on my NixOS machine I decided to keep using xmodmap:
cat /etc/nixos/configuration.nix
...
let
myCustomLayout = pkgs.writeText "xkb-layout" ''
! Map umlauts to RIGHT ALT + <key>
keycode 108 = Mode_switch
keysym e = e E EuroSign
keysym c = c C cent
keysym a = a A adiaeresis Adiaeresis
keysym o = o O odiaeresis Odiaeresis
keysym u = u U udiaeresis Udiaeresis
keysym s = s S ssharp
! disable capslock
! remove Lock = Caps_Lock
'';
in
...
services.xserver.displayManager.sessionCommands = "${pkgs.xorg.xmodmap}/bin/xmodmap ${myCustomLayout}";
Works after boot and after suspend/resume.