Difference between revisions of "Keyboard Layout Customization"

From NixOS Wiki
Jump to: navigation, search
m (Update xkeyboardconfig attribute name)
Line 1: Line 1:
== Simple ==
+
== Using xkbcomp ==
 +
 
 +
=== Simple ===
  
 
The easiest way to customize your keyboard layout on NixOS is with these options:
 
The easiest way to customize your keyboard layout on NixOS is with these options:
Line 10: Line 12:
 
You can find valid values for these options in <code>$(nix-build --no-out-link '&lt;nixpkgs&gt;' -A xkeyboard_config)/etc/X11/xkb/rules/base.lst</code>
 
You can find valid values for these options in <code>$(nix-build --no-out-link '&lt;nixpkgs&gt;' -A xkeyboard_config)/etc/X11/xkb/rules/base.lst</code>
  
== Advanced ==
+
=== Advanced ===
  
 
If the above options aren't enough, you can instead create your own keyboard layout by going through xkb. To get started, install <code>xorg.xkbcomp</code> and run <code>setxkbmap -print &gt; layout.xkb</code> to get an initial file. This corresponds to your current layout. Use <code>xkbcomp layout.xkb $DISPLAY</code> 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.
 
If the above options aren't enough, you can instead create your own keyboard layout by going through xkb. To get started, install <code>xorg.xkbcomp</code> and run <code>setxkbmap -print &gt; layout.xkb</code> to get an initial file. This corresponds to your current layout. Use <code>xkbcomp layout.xkb $DISPLAY</code> 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.
Line 26: Line 28:
 
   services.xserver.displayManager.sessionCommands = "${pkgs.xorg.xkbcomp}/bin/xkbcomp ${compiledLayout} $DISPLAY";
 
   services.xserver.displayManager.sessionCommands = "${pkgs.xorg.xkbcomp}/bin/xkbcomp ${compiledLayout} $DISPLAY";
 
</source>
 
</source>
== Relevant other options ==
+
=== Relevant other options ===
  
 
* <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.
Line 32: Line 34:
 
* <code>i18n.consoleUseXkbConfig</code>: Makes it so the tty console has about the same layout as the one configured in the <code>services.xserver</code> options.
 
* <code>i18n.consoleUseXkbConfig</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 ===
  
 
* https://github.com/Infinisil/system/blob/master/config/new-modules/keylayout.nix
 
* https://github.com/Infinisil/system/blob/master/config/new-modules/keylayout.nix
 +
 +
== 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:
 +
 +
<source lang="nix">
 +
  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}";
 +
 +
</source>
 +
 +
Works after boot and after suspend/resume.

Revision as of 18:39, 25 November 2019

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 variant
  • services.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";

Relevant other options

  • services.xserver.exportConfiguration: Makes it so the above mentioned xkb directory (and the xorg.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.
  • i18n.consoleUseXkbConfig: Makes it so the tty console has about the same layout as the one configured in the services.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.