110 lines
2.5 KiB
Nix
110 lines
2.5 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}:
|
|
{
|
|
options.custom = with lib; {
|
|
keyd = {
|
|
enable = mkEnableOption "Enable keyd";
|
|
ids = mkOption {
|
|
type = types.listOf types.str;
|
|
default = [ ];
|
|
example = [
|
|
"0001:0001:70533846"
|
|
"3434:06a0:d7dfbeabt"
|
|
"046d:c339:9f276ca6"
|
|
];
|
|
description = "List of keyboard is that will be configured";
|
|
};
|
|
};
|
|
};
|
|
|
|
config = lib.mkIf config.custom.keyd.enable {
|
|
environment.systemPackages = with pkgs; [
|
|
keyd
|
|
];
|
|
|
|
users.groups.keyd = { };
|
|
services.keyd =
|
|
let
|
|
commonSettings = {
|
|
main = {
|
|
capslock = "layer(capslock)";
|
|
insert = "S-insert";
|
|
};
|
|
meta = {
|
|
# NOTE: c, v, x are NOT remapped here - they're handled by terminal/app configs
|
|
# This preserves Ctrl+C = SIGINT in terminals (macOS behavior)
|
|
|
|
# Undo/Redo/Save/Select All/Find
|
|
z = "C-z";
|
|
"shift+z" = "C-y";
|
|
s = "C-s";
|
|
a = "C-a";
|
|
f = "C-f";
|
|
|
|
# Tab/Window management
|
|
w = "C-w";
|
|
t = "C-t";
|
|
n = "C-n";
|
|
q = "A-F4";
|
|
|
|
# Text navigation (macOS-style)
|
|
left = "home";
|
|
right = "end";
|
|
up = "C-home";
|
|
down = "C-end";
|
|
backspace = "C-backspace";
|
|
|
|
# Other common shortcuts
|
|
r = "C-r";
|
|
p = "C-p";
|
|
o = "C-o";
|
|
l = "C-l";
|
|
"/" = "C-/";
|
|
};
|
|
"meta+shift" = {
|
|
left = "S-home";
|
|
right = "S-end";
|
|
up = "C-S-home";
|
|
down = "C-S-end";
|
|
};
|
|
"capslock:C" = { };
|
|
};
|
|
in
|
|
{
|
|
enable = true;
|
|
keyboards = {
|
|
default = {
|
|
ids = [ "*" ];
|
|
settings = commonSettings;
|
|
};
|
|
workstation = {
|
|
ids = config.custom.keyd.ids;
|
|
settings = lib.mkMerge [
|
|
commonSettings
|
|
{
|
|
main = {
|
|
leftalt = "layer(meta)";
|
|
leftmeta = "layer(alt)";
|
|
};
|
|
}
|
|
];
|
|
};
|
|
};
|
|
};
|
|
|
|
systemd.services.keyd.serviceConfig.CapabilityBoundingSet = [
|
|
"CAP_SETGID"
|
|
];
|
|
|
|
environment.etc."libinput/local-overrides.quirks".text = ''
|
|
[Serial Keyboards]
|
|
MatchUdevType=keyboard
|
|
MatchName=keyd virtual keyboard
|
|
AttrKeyboardIntegration=internal
|
|
'';
|
|
};
|
|
}
|