Compare commits

..

2 Commits

6 changed files with 324 additions and 38 deletions

View File

@ -4,7 +4,7 @@ mopidy:
bandcamp: ENC[AES256_GCM,data:diEx2fbkOR1oUav81jU5bNt/KNmbOaVzLV+G3zBUVXE7nEQpZNqVom0rgNrEVDGzH3u/IaA5eqG5ce9lE0BomeY8Z4MWI1xujhX5KsXdv21aw4UwsNgyLPuWhkN2POUMfCJlvekc/TFfFvJHyysx8aKxeI4dsg==,iv:cxx0cVkjOPG+hMD8JctJHdcICJt7ozpfRBVSCDBo6Ro=,tag:JRjwwvieGaGZJ+k56HWFaw==,type:str]
emailPassword: ENC[AES256_GCM,data:LALAvyuNN9bfa8D6ZK1YiFXRfxLOBi9kXA0N0Kr7h18eAI4hWQ==,iv:WtidILFfWCMKylax52JP+X57GfZyYlxJtiwrC6SADik=,tag:NvOrsL3fbmxQZp06GZhUZA==,type:str]
ssh:
hosts: ENC[AES256_GCM,data:j7+Ua5G8dePL5GO+Tf8+hnoJsSfKo2z4I0OcVfSyJ3dc6yyYZVho8iG9bqPAqVR5d7SJr391zCLMJp/jRDpDFLkzQB54udVKI8ob0C2w2xBznPZJsC7qZMptQ+n4IHO1ZROSi/vBadCUfEWKNO9e8gsroBYmliy/31M5IlA85Vx6q4Zx0qIFylfIhBDto3jD2DRcbjWP8NvjJcY7YLrN2sv8RR7QqX1q+0ZxpgFhg+W+a5Dz8JBVsPEdjNJqFAKAmUGKXf4bpEIS5lLUxxZweizEiWgo4nYJgA0kqVYEOiErOPgtpnBKiJlR+fLGuVwdGxVOUMvttZtyIgHc4CWgOJ0h67h4eVii+zeLn0GPJl3i2g5bjOArHKLfkKGduqii4n/1p9VvVTAOn5dj0/NtD2JNJF9kUDr1nMyMa1xA35gzv1vp/U55L6ZU/BRpBPzka6i8nGnCkDVdoUG0DKhN9ooXRpUS9L+W1iz480fzb6i/tfmlhx7Ms1T9VybYFkGLNkxnsrt5Oc24o0XD5/A1j8bJgNWo6aWSA748ZWtN0mXDzB5sH4TVtaZAGlyU9r/x5oCuWPN2qhZ8d2i7g5rceZW5ang/uyXNt8Le5cKvLw3Rhf4BTFhQ6+VJ4/SpdfnLZ17djjbwZO1DT5Nb0RUObcilcwbmUwqvmLbcrdmsfQMOcetRwFpIdoX6MjkRiC1WZ4cz8bMU7ArnK/n15dsIdaiiUfuOJAiBYut1PaJBoZDe8pXzOE6U1s57sejUf1T7NHp2epyevCAYuVG71dAFLn1oLM+FWXuBm6ogFLujoFh7XCVVqdf6j348/ekzBxDIemzS4G1+zflG3AteLWcslGVTNmx0rb3GlSHGNVNZoeHvYAHIIEyWpY4Yd01R8RhjrFXQo9comnpoQXSlFDvuUGTxuUpsariAof4wKLdpqj8Dc4ZaDvd1pAGVh7RBqR4rn4kClbWUVcSFy7QWs9T5Sw0fU/bLL76N6x9Y44P5NQLAJvZ0z8rhIPl0u8OwIhhEwkhWdFLSulk/N7+DVqrRpj7bB5hB8jZWspsl44IdiZWY3UPs7zs=,iv:3q4FYxDWPGyMqeKoSTRxSPvqZXzwg/NeHZh70d38HYM=,tag:jA8/5yi74/mOuu/b83WEeg==,type:str]
hosts: ENC[AES256_GCM,data:Z+ODSCeKqt2ipgR9ZMV13kHZSZrwr7pY+kXM2Ej2Mc7WrBXoN25T+OWPJ6uf70yBGMID1faaWtbMUCjsp6gjqIVR7UH59yVfuKGDQIw5FSy3bdyvADITjASJMFIfO1xsu8iY0h18PdUBqNNYnt27c+3Bxn5SP0r6OCUC48SkSeCVhxtFIIMR4ZiVHZwQ2pD1GwLjmdUPPSpEJg5vpjFhFKB6Ab8z+qN5GaYMov2NKivMNVTBQUHpgmf58D6MI/AnjUbVsLuOmp0V3lhy8/qX33tgogpVv/RA6gAITVlAf9rGwaF+axZ0iy0T/gF7VJEGX6RUHbVUJoX1j8szDq/P4oqczFubrZdmRIbutG4tEcnYXltMu2NELFP+bl/G4y1gIV2b+s0k+UQJXn4KaiyXbtQXvOJ91+s7iMyTDi4QQd07l7nFqGGgzoKTYVfQK0e5ilEofRQrXwAb+p6Pwkvth8ktONFgD0sQHL75a8lS//8Mzvqopy5Vp0FQJ+OSW89Eeu2wrw9yNP2yuMDX9tvgDuZV4hgvDa9tTxvfGoMDXWARhSBt/F/a4ZkrNV9unjgEXbkrewezn1Jk+XWtAlussbTEXkKG87v2Q0V8zBa8gsB/5g514dIP6+UJdc3GEJzMLkQNcHYn9r3Ou8n+YgXD8zu5OnZXtNZ/x+J6NxH7tudiO5O0XctRwJQibidS2ONUhdkQGBt1JrAysGbNTuXC8Sn391rc11lsH+wIGpZg4zR+rdP4FWs68v/o9WtCJDCejnlyQ1DQ+avLc0aT4xxJZh8uM2iSsfi/TzRr9w0wVe2y3xAxsQMCfvhFcl9agfmAgGZcfVPCU9nc4dIfdGW1kTN7s3Izvy4mYaqd9mv0xxYARf7roJDGWie0VNxXQVt2o1tIQCqAhZ/bbgPG5VDyD15LGDI8BZCFaAOKlXn+beVMt6E1JJPlHa0vOwnbMVVKcUS/d5jA9nnb20Pwz4F3b532/ERmSkVlcZmCKqQOxo0YADb7Cm1fFBj6Eum0+F+jspg9QQmMjPPsb+NbMqnFd5DNDY+e95hr7tUEy4/yxiXiM0cu1w==,iv:I4TtUJdQFOVik5L26XHukxix0FCm/JNi6nVZg5qRMqs=,tag:vnO6DlUW5XnougyiJzwNdg==,type:str]
sops:
age:
- recipient: age1ajemtm502nn2n4q7v4j8meyd5mxtcqngkkedxq2pqzuwu78zp93qnw8q48
@ -61,7 +61,7 @@ sops:
QmJKNDJUY0RSakhwNWlkOVpib0trc1kK0tQxD9I82pjfs54eruu+IjzVUmcVBCPw
9mp1xKiYRRMXt3YQn6MPiyuuX3l3UB5MH0RJMNtRq0D961rs+iiS5A==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2025-08-07T09:16:46Z"
mac: ENC[AES256_GCM,data:3PIJps2hoavPJ6ig+943FE73lBhCfxv8vuzmgTtooH386V12/PQN+Opt/ZoIbXU9w21XelZ/C5xPr8rcuw5ADx9K/KjdMm8jyLCO6/+iBf6SjnbC3E0DyiDit50UtWxKc32ryiJ8m5hYfX6O2H8WIGFa+6wp5KISV9pkc09CNZA=,iv:xzwEhhBJQOlde8Ib+tZpv+2CHfR83dFevdwERkYTsTE=,tag:SzdcZH19kSTnNs16754IMw==,type:str]
lastmodified: "2025-11-02T16:19:20Z"
mac: ENC[AES256_GCM,data:2UFvzqhsR9OecqRX/n2O5wJ1fcdhetNE37Vj56rL6tRxT42uU8SKy7hxROS0LcrwKs59Km7P1oO/mYW6eyuLAZ7R5MAm18R5UYIYpKV8oevNUYMl0bsJkMnzl+nxz2i0ceg38rsioS9frK9a29hbJiV6Vr9yubHNdtZF4YqRmH0=,iv:Cx2nN4Gm0L+aWi6jbLuSuzhhzD8W5PzCLmJajyb/oEo=,tag:6wM1m8LB+7Rd/F9h62C4gg==,type:str]
unencrypted_suffix: _unencrypted
version: 3.10.2
version: 3.11.0

View File

@ -16,6 +16,7 @@ in {
./rofi
./swaync.nix
./waybar.nix
./wlr-which.nix
./wlsunset.nix
];
@ -28,5 +29,6 @@ in {
obs.enable = mkDefault cfg.fullDesktop;
qt.enable = mkDefault cfg.fullDesktop;
rofi.enable = mkDefault cfg.fullDesktop;
wlr-which-key.enable = mkDefault cfg.fullDesktop;
};
}

View File

@ -117,8 +117,8 @@ in {
$menu = rofi -combi-modi drun,calc -show combi
bind = SUPER, Return, exec, ${pkgs.kitty}/bin/kitty ${pkgs.tmux}/bin/tmux
bind = SUPER, Space, submap, leader
bind = , Print, submap, screenshot
bind = SUPER, Space, exec, ${pkgs.wlr-which-key}/bin/wlr-which-key
bind = , Print, exec, ${pkgs.wlr-which-key}/bin/wlr-which-key -k s
submap = leader
bind = , l, exec, plock
@ -147,11 +147,13 @@ in {
bind = , u, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = buffers
bind = , d, killactive,
bind = , d, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = resize
binde = , $left, resizeactive, -10 0
binde = , $right, resizeactive, 10 0
@ -160,6 +162,7 @@ in {
bind = , q, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = rofi
bind = , b, exec, rofi-bluetooth
bind = , b, submap, reset
@ -173,6 +176,7 @@ in {
bind = , y, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = screenshot
bind = , Print, exec, screenshot
bind = , Print, submap, reset
@ -188,6 +192,7 @@ in {
bind = Shift, s, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = windows
bind = , period, submap, resize
bind = , $left, movefocus, l

View File

@ -0,0 +1,190 @@
{
config,
lib,
pkgs,
...
}: let
inherit
(lib)
literalExpression
mkIf
mkOption
mkEnableOption
types
;
cfg = config.home.desktop.wlr-which-key;
yamlFormat = pkgs.formats.yaml {};
# Convert kebab-case to snake_case
toSnakeCase = str: builtins.replaceStrings ["-"] ["_"] str;
# Recursively filter out null values and convert kebab-case keys to snake_case
filterNulls = value:
if lib.isAttrs value
then lib.mapAttrs' (n: v: lib.nameValuePair (toSnakeCase n) (filterNulls v)) (lib.filterAttrs (n: v: v != null) value)
else if lib.isList value
then map filterNulls value
else value;
menuEntryType = types.submodule {
freeformType = yamlFormat.type;
options = with types; {
key = mkOption {
type = str;
example = "p";
};
desc = mkOption {
type = str;
example = "Power";
};
cmd = mkOption {
type = nullOr str;
default = null;
example = "echo example";
};
keep-open = mkOption {
type = nullOr bool;
default = null;
example = true;
};
submenu = mkOption {
type = nullOr (listOf menuEntryType);
default = null;
example = literalExpression ''
[
{ key = "s"; desc = "Suspend"; cmd = "systemctl suspend"; }
{ key = "r"; desc = "Reboot"; cmd = "systemctl reboot"; }
{ key = "o"; desc = "Poweroff"; cmd = "systemctl poweroff"; }
]
'';
};
};
};
settingsType = types.submodule {
freeformType = yamlFormat.type;
options = with types; {
background = mkOption {
type = nullOr str;
default = null;
example = "#282828FF";
};
color = mkOption {
type = nullOr str;
default = null;
example = "#FBF1C7FF";
};
border = mkOption {
type = nullOr str;
default = null;
example = "#8EC07CFF";
};
anchor = mkOption {
type = nullOr (enum ["center" "top" "bottom" "left" "right" "top-left" "top-right" "bottom-left" "bottom-right"]);
default = null;
example = "top-left";
};
margin-top = mkOption {
type = nullOr int;
default = null;
example = "0";
};
margin-right = mkOption {
type = nullOr int;
default = null;
example = "0";
};
margin-bottom = mkOption {
type = nullOr int;
default = null;
example = "0";
};
margin-left = mkOption {
type = nullOr int;
default = null;
example = "0";
};
font = mkOption {
type = nullOr str;
default = null;
example = "monospace 10";
};
separator = mkOption {
type = nullOr str;
default = null;
example = " ";
};
border-width = mkOption {
type = nullOr (either float int);
default = null;
example = 4.0;
};
corder-r = mkOption {
type = nullOr (either float int);
default = null;
example = 20.0;
};
padding = mkOption {
type = nullOr (either float int);
default = null;
example = 15.0;
};
rows-per-column = mkOption {
type = nullOr int;
default = null;
example = 5;
};
column-padding = mkOption {
type = nullOr (either float int);
default = null;
example = 25.0;
};
inhibit-compositor-keyboard-shortcuts = mkOption {
type = bool;
default = true;
example = false;
};
auto_kbd_layout = mkOption {
type = bool;
default = true;
example = false;
};
namespace = mkOption {
type = nullOr str;
default = null;
example = "wlr_which_key";
};
menu = mkOption {
type = listOf menuEntryType;
default = [];
example = literalExpression ''
[
{
key = "p";
desc = "Power";
submenu = [
{ key = "s"; desc = "Suspend"; cmd = "systemctl suspend"; }
{ key = "r"; desc = "Reboot"; cmd = "systemctl reboot"; }
{ key = "o"; desc = "Poweroff"; cmd = "systemctl poweroff"; }
];
}
]
'';
};
};
};
in {
options.home.desktop.wlr-which-key = {
enable = mkEnableOption "Enables wlr-which-key";
package = lib.mkPackageOption pkgs "wlr-which-key" {};
settings = mkOption {
type = settingsType;
default = {};
description = "Configuration written to {file}`$XDG_CONFIG_HOME/wlr-which-key/config.yaml`.";
};
};
config = mkIf cfg.enable {
home.packages = [cfg.package];
xdg.configFile = {
"wlr-which-key/config.yaml".source = yamlFormat.generate "wlr-which-key-config.yml" (filterNulls cfg.settings);
};
};
}

View File

@ -10,31 +10,6 @@ with lib; let
with epkgs; [
mu4e
pdf-tools
tree-sitter
tree-sitter-langs
(treesit-grammars.with-grammars (grammar:
with grammar; [
tree-sitter-bash
tree-sitter-c
tree-sitter-cpp
tree-sitter-css
tree-sitter-dockerfile
tree-sitter-http
tree-sitter-javascript
tree-sitter-jsdoc
tree-sitter-json
tree-sitter-just
tree-sitter-markdown
tree-sitter-markdown-inline
tree-sitter-nix
tree-sitter-rust
tree-sitter-sql
tree-sitter-toml
tree-sitter-typescript
tree-sitter-typst
tree-sitter-vue
tree-sitter-yaml
]))
]
));
cfg = config.home.dev.editors.emacs;

View File

@ -1,6 +1,7 @@
{
pkgs,
config,
lib,
...
}: {
imports = [
@ -11,10 +12,36 @@
];
config = let
emacsPkg = with pkgs; ((emacsPackagesFor emacs).emacsWithPackages (
epkgs: [
epkgs.mu4e
epkgs.pdf-tools
emacsPackage = with pkgs; ((emacsPackagesFor emacs).emacsWithPackages (
epkgs:
with epkgs; [
mu4e
pdf-tools
tree-sitter
tree-sitter-langs
(treesit-grammars.with-grammars (grammar:
with grammar; [
tree-sitter-bash
tree-sitter-c
tree-sitter-cpp
tree-sitter-css
tree-sitter-dockerfile
tree-sitter-http
tree-sitter-javascript
tree-sitter-jsdoc
tree-sitter-json
tree-sitter-just
tree-sitter-markdown
tree-sitter-markdown-inline
tree-sitter-nix
tree-sitter-rust
tree-sitter-sql
tree-sitter-toml
tree-sitter-typescript
tree-sitter-typst
tree-sitter-vue
tree-sitter-yaml
]))
]
));
askpass = import ../modules/cli/scripts/askpass.nix {inherit pkgs;};
@ -30,14 +57,101 @@
home = {
sessionVariables = {
EDITOR = "${emacsPkg}/bin/emacsclient -c -a ${emacsPkg}/bin/emacs";
EDITOR = "${emacsPackage}/bin/emacsclient -c -a ${emacsPackage}/bin/emacs";
LAUNCH_EDITOR = "${launchWithEmacsclient}/bin/launch-with-emacsclient";
SUDO_ASKPASS = "${askpass}/bin/askpass";
LSP_USE_PLISTS = "true";
};
desktop.waybar.style = ./config/waybar/style.css;
dev.ai.claude.enable = true;
desktop = {
waybar.style = ./config/waybar/style.css;
wlr-which-key.settings = {
font = "Cascadia Code 12";
background = "#3b4252d0";
color = "#eceff4";
border = "#2e3440";
border_width = 2;
corner_r = 10;
rows_per_column = 5;
column_padding = 25;
inhibit_compositor_keyboard_shortcuts = true;
auto_kbd_layout = true;
menu = let
left = "c";
down = "t";
up = "s";
right = "r";
in [
{
key = "a";
desc = "Apps";
submenu = [
{ key = "b"; desc = "Browser"; cmd = "zen"; }
{ key = "B"; desc = "Qutebrowser"; cmd = "${pkgs.qutebrowser}/bin/qutebrowser"; }
{ key = "d"; desc = "Discord"; cmd = "${pkgs.vesktop}/bin/vesktop"; }
{ key = "e"; desc = "Emacs"; cmd = "${emacsPackage}/bin/emacsclient -c -n"; }
{ key = "g"; desc = "Gimp"; cmd = "${pkgs.gimp}/bin/gimp"; }
{ key = "n"; desc = "Nemo"; cmd = "${pkgs.nemo}/bin/nemo"; }
{
key = "r";
desc = "Rofi";
submenu = [
{ key = "b"; desc = "Bluetooth"; cmd = "rofi-bluetooth"; }
{ key = "e"; desc = "Emoji"; cmd = "rofi -show emoji"; }
{ key = "r"; desc = "App Menu"; cmd = "rofi -combi-modi drun,calc -show combi"; }
{ key = "s"; desc = "SSH"; cmd = "rofi -show ssh"; }
{ key = "y"; desc = "YouTube"; cmd = "ytplay"; }
];
}
];
}
{
key = "b";
desc = "Buffers";
submenu = [
{ key = "d"; desc = "Close"; cmd = "echo close"; }
{ key = "f"; desc = "Fullscreen"; cmd = "echo fullscreen"; }
{ key = "F"; desc = "Float"; cmd = "echo float"; }
{
key = ".";
desc = "Resize";
submenu = [
{ key = left; desc = "Decrease Width"; cmd = "echo decrease width"; keep-open = true; }
{ key = down; desc = "Increase Height"; cmd = "echo decrease height"; keep-open = true; }
{ key = up; desc = "Decrease Height"; cmd = "echo decrease height"; keep-open = true; }
{ key = right; desc = "Increase Width"; cmd = "echo increase width"; keep-open = true; }
];
}
];
}
{
key = "p";
desc = "Power";
submenu = [
{ key = "s"; desc = "Suspend"; cmd = "systemctl suspend"; }
{ key = "r"; desc = "Reboot"; cmd = "systemctl reboot"; }
{ key = "o"; desc = "Poweroff"; cmd = "systemctl poweroff"; }
];
}
{
key = "s";
desc = "Screenshots";
submenu = [
{ key = "Print"; desc = "Screenshot"; cmd = "screenshot"; }
{ key = "d"; desc = "Delayed"; cmd = "screenshot -d 3"; }
{ key = "D"; desc = "Select, Delay, Edit, and Copy"; cmd = "screenshot -secd 3"; }
{ key = "e"; desc = "Select, Edit, and Copy"; cmd = "screenshot -sec"; }
{ key = "g"; desc = "Select, Gimp, and Copy"; cmd = "screenshot -sgc"; }
{ key = "s"; desc = "Select and Copy"; cmd = "screenshot -sc"; }
];
}
];
};
};
dev = {
ai.claude.enable = true;
editors.emacs.package = emacsPackage;
};
fullDesktop = true;
shell.fish.enable = true;
};