anchor.diff:        homerow.expect = [ "a" "r" "s" "t" "n" "e" "i" "o"         ];
       };
   
  -    extraConfig.i18n.consoleKeyMap = "colemak/colemak";
  +    extraConfig.console.keyMap = "colemak/colemak";
       extraConfig.services.xserver.layout = "us";
       extraConfig.services.xserver.xkbVariant = "colemak";
     };
  
positive.code:   '';
  
  
    mkKeyboardTest = layout: { extraConfig ? {}, tests }: with pkgs.lib; let
      combinedTests = foldAttrs (acc: val: acc ++ val) [] (builtins.attrValues tests);
      perlStr = val: "'${escape ["'" "\\"] val}'";
      lq = length combinedTests.qwerty;
      le = length combinedTests.expect;
      msg = "length mismatch between qwerty (${toString lq}) and expect (${toString le}) lists!";
      send   = concatMapStringsSep ", " perlStr combinedTests.qwerty;
      expect = if (lq == le) then concatStrings combinedTests.expect else throw msg;
  
    in makeTest {
      name = "keymap-${layout}";
  
      machine.services.xserver.desktopManager.xterm.enable = false;
      machine.i18n.consoleKeyMap = mkOverride 900 layout;
      machine.services.xserver.layout = mkOverride 900 layout;
      machine.imports = [ ./common/x11.nix extraConfig ];
  
      testScript = ''
  
        sub mkTest ($$) {
          my ($desc, $cmd) = @_;
  
          subtest $desc, sub {
            # prepare and start testReader
            $machine->execute("rm -f ${readyFile} ${resultFile}");
            $machine->succeed("$cmd ${testReader} ${toString le} ".q(${escapeShellArg expect} & ));
  
            if ($desc eq "Xorg keymap") {
              # make sure the xterm window is open and has focus
              $machine->waitForWindow(qr/testterm/);
              $machine->waitUntilSucceeds("${pkgs.xdotool}/bin/xdotool search --sync --onlyvisible --class testterm windowfocus --sync");
            }
  
            # wait for reader to be ready
            $machine->waitForFile("${readyFile}");
            $machine->sleep(1);
  
            # send all keys
            foreach ((${send})) { $machine->sendKeys($_); };
  
            # wait for result and check
            $machine->waitForFile("${resultFile}");
            $machine->succeed("grep -q 'PASS:' ${resultFile}");
          };
        };
  
        $machine->waitForX;
  
        mkTest "VT keymap", "openvt -sw --";
        mkTest "Xorg keymap", "DISPLAY=:0 xterm -title testterm -class testterm -fullscreen -e";
      '';
    };
  
  
negative.code:       altgr.expect = [ "@" "|"    "{" "[" "]" "}" ];
      };
  
      extraConfig.console.keyMap = "de";
      extraConfig.services.xserver.layout = "de";
    };
  }
  