From e0a023da4ff29d90ba2df51d6fd92bbf582402b2 Mon Sep 17 00:00:00 2001 From: js0ny Date: Mon, 9 Mar 2026 23:22:42 +0000 Subject: [PATCH 1/4] chore: remove dups --- nixcfgs/hosts/zephyrus/default.nix | 3 ++- nixcfgs/modules/home/do-not-track.nix | 13 +------------ nixcfgs/modules/lib/do-not-track-vars.nix | 14 ++++++++++++++ nixcfgs/modules/nixos/core/do-not-track.nix | 13 +------------ .../nixos/services/{exp.nix => syncthing.nix} | 1 - nixcfgs/modules/nixos/services/tailscale.nix | 3 +++ nixcfgs/users/js0ny/config.nix | 14 -------------- nixcfgs/users/js0ny/default.nix | 1 - nixcfgs/users/js0ny/zen.nix | 1 - nixcfgs/users/js0ny/zephyrus.nix | 2 -- 10 files changed, 21 insertions(+), 44 deletions(-) create mode 100644 nixcfgs/modules/lib/do-not-track-vars.nix rename nixcfgs/modules/nixos/services/{exp.nix => syncthing.nix} (56%) create mode 100644 nixcfgs/modules/nixos/services/tailscale.nix delete mode 100644 nixcfgs/users/js0ny/config.nix diff --git a/nixcfgs/hosts/zephyrus/default.nix b/nixcfgs/hosts/zephyrus/default.nix index 1b95fd5..c8a542e 100644 --- a/nixcfgs/hosts/zephyrus/default.nix +++ b/nixcfgs/hosts/zephyrus/default.nix @@ -45,7 +45,8 @@ # services ../../modules/nixos/services/docker.nix - ../../modules/nixos/services/exp.nix + ../../modules/nixos/services/syncthing.nix + ../../modules/nixos/services/tailscale.nix ]; # Hostname diff --git a/nixcfgs/modules/home/do-not-track.nix b/nixcfgs/modules/home/do-not-track.nix index 476e411..e9188a8 100644 --- a/nixcfgs/modules/home/do-not-track.nix +++ b/nixcfgs/modules/home/do-not-track.nix @@ -1,15 +1,4 @@ {...}: { # See: https://consoledonottrack.com/ - home.sessionVariables = { - DO_NOT_TRACK = "1"; - GATSBY_TELEMETRY_DISABLED = "1"; - HOMEBREW_NO_ANALYTICS = "1"; - STNOUPGRADE = "1"; - DOTNET_CLI_TELEMETRY_OPTOUT = "1"; - SAM_CLI_TELEMETRY = "0"; - AZURE_CORE_COLLECT_TELEMETRY = "0"; - GEMINI_TELEMETRY_ENABLED = "false"; - SCARF_NO_ANALYTICS = "true"; - ANONYMIZED_TELEMETRY = "false"; - }; + home.sessionVariables = import ../lib/do-not-track-vars.nix; } diff --git a/nixcfgs/modules/lib/do-not-track-vars.nix b/nixcfgs/modules/lib/do-not-track-vars.nix new file mode 100644 index 0000000..390c15f --- /dev/null +++ b/nixcfgs/modules/lib/do-not-track-vars.nix @@ -0,0 +1,14 @@ +# Shared telemetry opt-out variables +# See: https://consoledonottrack.com/ +{ + DO_NOT_TRACK = "1"; + GATSBY_TELEMETRY_DISABLED = "1"; + HOMEBREW_NO_ANALYTICS = "1"; + STNOUPGRADE = "1"; + DOTNET_CLI_TELEMETRY_OPTOUT = "1"; + SAM_CLI_TELEMETRY = "0"; + AZURE_CORE_COLLECT_TELEMETRY = "0"; + GEMINI_TELEMETRY_ENABLED = "false"; + SCARF_NO_ANALYTICS = "true"; + ANONYMIZED_TELEMETRY = "false"; +} diff --git a/nixcfgs/modules/nixos/core/do-not-track.nix b/nixcfgs/modules/nixos/core/do-not-track.nix index edee396..87e92dd 100644 --- a/nixcfgs/modules/nixos/core/do-not-track.nix +++ b/nixcfgs/modules/nixos/core/do-not-track.nix @@ -1,15 +1,4 @@ {...}: { # See: https://consoledonottrack.com/ - environment.variables = { - DO_NOT_TRACK = "1"; - GATSBY_TELEMETRY_DISABLED = "1"; - HOMEBREW_NO_ANALYTICS = "1"; - STNOUPGRADE = "1"; - DOTNET_CLI_TELEMETRY_OPTOUT = "1"; - SAM_CLI_TELEMETRY = "0"; - AZURE_CORE_COLLECT_TELEMETRY = "0"; - GEMINI_TELEMETRY_ENABLED = "false"; - SCARF_NO_ANALYTICS = "true"; - ANONYMIZED_TELEMETRY = "false"; - }; + environment.variables = import ../../lib/do-not-track-vars.nix; } diff --git a/nixcfgs/modules/nixos/services/exp.nix b/nixcfgs/modules/nixos/services/syncthing.nix similarity index 56% rename from nixcfgs/modules/nixos/services/exp.nix rename to nixcfgs/modules/nixos/services/syncthing.nix index ad7a3b7..b1af04b 100644 --- a/nixcfgs/modules/nixos/services/exp.nix +++ b/nixcfgs/modules/nixos/services/syncthing.nix @@ -1,4 +1,3 @@ {...}: { services.syncthing.enable = true; - services.tailscale.enable = true; } diff --git a/nixcfgs/modules/nixos/services/tailscale.nix b/nixcfgs/modules/nixos/services/tailscale.nix new file mode 100644 index 0000000..ef50609 --- /dev/null +++ b/nixcfgs/modules/nixos/services/tailscale.nix @@ -0,0 +1,3 @@ +{...}: { + services.tailscale.enable = true; +} diff --git a/nixcfgs/users/js0ny/config.nix b/nixcfgs/users/js0ny/config.nix deleted file mode 100644 index a19f3af..0000000 --- a/nixcfgs/users/js0ny/config.nix +++ /dev/null @@ -1,14 +0,0 @@ -{pkgs, ...}: { - my = { - desktop = { - preferredApps = { - shell = pkgs.zsh; - interactiveShell = pkgs.fish; - terminal = { - package = pkgs.kitty; - execArg = "-e"; - }; - }; - }; - }; -} diff --git a/nixcfgs/users/js0ny/default.nix b/nixcfgs/users/js0ny/default.nix index 806d934..3388102 100644 --- a/nixcfgs/users/js0ny/default.nix +++ b/nixcfgs/users/js0ny/default.nix @@ -9,7 +9,6 @@ in { imports = [ ../../modules/home/options.nix ../../modules/home/do-not-track.nix - # ./config.nix ]; home.username = username; home.homeDirectory = diff --git a/nixcfgs/users/js0ny/zen.nix b/nixcfgs/users/js0ny/zen.nix index a02c0b6..6edf216 100644 --- a/nixcfgs/users/js0ny/zen.nix +++ b/nixcfgs/users/js0ny/zen.nix @@ -38,7 +38,6 @@ ./programs/darwin/alt-tab.nix ./programs/darwin/iina.nix - ../../modules/home/do-not-track.nix ../../modules/home/darwin.nix ../../modules/home/programs/lsd.nix diff --git a/nixcfgs/users/js0ny/zephyrus.nix b/nixcfgs/users/js0ny/zephyrus.nix index 96a16e7..a5709b3 100644 --- a/nixcfgs/users/js0ny/zephyrus.nix +++ b/nixcfgs/users/js0ny/zephyrus.nix @@ -91,8 +91,6 @@ in { ./programs/desktop/gnome/copyous.nix ./programs/desktop/wayland-wm/niri - ../../modules/home/do-not-track.nix - # General Program config ../../modules/home/programs/eza.nix # ../../modules/home/programs/winboat.nix From 1b5c26bc046b436ed84588bc331bede45f97c490 Mon Sep 17 00:00:00 2001 From: js0ny Date: Sun, 15 Mar 2026 21:07:36 +0000 Subject: [PATCH 2/4] chore: reorg --- home/dot_config/nvim/init.lua | 41 +--- home/dot_config/nvim/lua/config/colors.lua | 2 +- home/dot_config/nvim/lua/config/fcitx.lua | 27 +++ home/dot_config/nvim/lua/plugins/dap.lua | 1 - .../lua/plugins/mod/lualine/components.lua | 1 - nixcfgs/hosts/zephyrus/default.nix | 3 + nixcfgs/modules/lib/mergetools.nix | 188 ++++++++++++++++++ nixcfgs/modules/nixos/core/binfmt.nix | 3 + nixcfgs/modules/nixos/services/restic.nix | 82 ++++++++ nixcfgs/users/js0ny/lib/mergetools.nix | 119 ----------- nixcfgs/users/js0ny/packages/cli.nix | 2 + nixcfgs/users/js0ny/packages/devtools.nix | 2 +- nixcfgs/users/js0ny/packages/gaming.nix | 12 +- nixcfgs/users/js0ny/packages/gui.nix | 2 + .../programs/{ => browsers}/chromium.nix | 0 .../{ => browsers}/firefox/addons.nix | 0 .../{ => browsers}/firefox/betterfox.nix | 0 .../{ => browsers}/firefox/default.nix | 0 .../{ => browsers}/firefox/search.nix | 0 .../users/js0ny/programs/cherry-studio.nix | 4 +- .../js0ny/programs/{ => editors}/emacs.nix | 0 .../js0ny/programs/{ => editors}/neovide.nix | 0 .../js0ny/programs/{ => editors}/nvim.nix | 0 .../js0ny/programs/{ => editors}/vscode.nix | 0 .../programs/{ => editors}/zed-editor.nix | 0 nixcfgs/users/js0ny/programs/fsearch.nix | 4 +- nixcfgs/users/js0ny/programs/fzf.nix | 25 ++- .../js0ny/programs/{ => media}/celluloid.nix | 0 .../cider-2/default.nix} | 12 +- .../js0ny/programs/media/cider-2/lib.nix} | 0 .../js0ny/programs/{ => media}/elisa.nix | 4 +- .../js0ny/programs/{ => media}/feishin.nix | 4 +- .../js0ny/programs/{ => media}/gallery-dl.nix | 0 .../js0ny/programs/{ => media}/lollypop.nix | 0 .../users/js0ny/programs/{ => media}/mpv.nix | 0 .../js0ny/programs/{ => media}/obs-studio.nix | 0 .../js0ny/programs/{ => media}/picard.nix | 0 .../programs/{ => productivity}/anki.nix | 0 .../{ => productivity}/libreoffice.nix | 0 .../{ => productivity}/obsidian/default.nix | 0 .../obsidian/obsidian-grep.nix | 2 +- .../obsidian/vimrc-support.nix | 0 .../programs/{ => productivity}/readest.nix | 4 +- .../programs/{ => productivity}/sdcv.nix | 0 .../{ => productivity}/sioyek/default.nix | 0 .../sioyek/sioyek-copy-page.sh | 0 .../{ => productivity}/thunderbird.nix | 0 .../js0ny/programs/{ => social}/discord.nix | 0 .../js0ny/programs/{ => social}/telegram.nix | 0 .../programs/{ => terminals}/ghostty.nix | 0 .../js0ny/programs/{ => terminals}/kitty.nix | 0 .../js0ny/programs/{ => terminals}/tmux.nix | 0 nixcfgs/users/js0ny/zen.nix | 24 +-- nixcfgs/users/js0ny/zephyrus.nix | 70 ++++--- 54 files changed, 411 insertions(+), 227 deletions(-) create mode 100644 home/dot_config/nvim/lua/config/fcitx.lua create mode 100644 nixcfgs/modules/lib/mergetools.nix create mode 100644 nixcfgs/modules/nixos/core/binfmt.nix create mode 100644 nixcfgs/modules/nixos/services/restic.nix delete mode 100644 nixcfgs/users/js0ny/lib/mergetools.nix rename nixcfgs/users/js0ny/programs/{ => browsers}/chromium.nix (100%) rename nixcfgs/users/js0ny/programs/{ => browsers}/firefox/addons.nix (100%) rename nixcfgs/users/js0ny/programs/{ => browsers}/firefox/betterfox.nix (100%) rename nixcfgs/users/js0ny/programs/{ => browsers}/firefox/default.nix (100%) rename nixcfgs/users/js0ny/programs/{ => browsers}/firefox/search.nix (100%) rename nixcfgs/users/js0ny/programs/{ => editors}/emacs.nix (100%) rename nixcfgs/users/js0ny/programs/{ => editors}/neovide.nix (100%) rename nixcfgs/users/js0ny/programs/{ => editors}/nvim.nix (100%) rename nixcfgs/users/js0ny/programs/{ => editors}/vscode.nix (100%) rename nixcfgs/users/js0ny/programs/{ => editors}/zed-editor.nix (100%) rename nixcfgs/users/js0ny/programs/{ => media}/celluloid.nix (100%) rename nixcfgs/users/js0ny/programs/{cider-2.nix => media/cider-2/default.nix} (88%) rename nixcfgs/{modules/home/programs/cider-2.nix => users/js0ny/programs/media/cider-2/lib.nix} (100%) rename nixcfgs/users/js0ny/programs/{ => media}/elisa.nix (68%) rename nixcfgs/users/js0ny/programs/{ => media}/feishin.nix (80%) rename nixcfgs/users/js0ny/programs/{ => media}/gallery-dl.nix (100%) rename nixcfgs/users/js0ny/programs/{ => media}/lollypop.nix (100%) rename nixcfgs/users/js0ny/programs/{ => media}/mpv.nix (100%) rename nixcfgs/users/js0ny/programs/{ => media}/obs-studio.nix (100%) rename nixcfgs/users/js0ny/programs/{ => media}/picard.nix (100%) rename nixcfgs/users/js0ny/programs/{ => productivity}/anki.nix (100%) rename nixcfgs/users/js0ny/programs/{ => productivity}/libreoffice.nix (100%) rename nixcfgs/users/js0ny/programs/{ => productivity}/obsidian/default.nix (100%) rename nixcfgs/users/js0ny/programs/{ => productivity}/obsidian/obsidian-grep.nix (92%) rename nixcfgs/users/js0ny/programs/{ => productivity}/obsidian/vimrc-support.nix (100%) rename nixcfgs/users/js0ny/programs/{ => productivity}/readest.nix (76%) rename nixcfgs/users/js0ny/programs/{ => productivity}/sdcv.nix (100%) rename nixcfgs/users/js0ny/programs/{ => productivity}/sioyek/default.nix (100%) rename nixcfgs/users/js0ny/programs/{ => productivity}/sioyek/sioyek-copy-page.sh (100%) rename nixcfgs/users/js0ny/programs/{ => productivity}/thunderbird.nix (100%) rename nixcfgs/users/js0ny/programs/{ => social}/discord.nix (100%) rename nixcfgs/users/js0ny/programs/{ => social}/telegram.nix (100%) rename nixcfgs/users/js0ny/programs/{ => terminals}/ghostty.nix (100%) rename nixcfgs/users/js0ny/programs/{ => terminals}/kitty.nix (100%) rename nixcfgs/users/js0ny/programs/{ => terminals}/tmux.nix (100%) diff --git a/home/dot_config/nvim/init.lua b/home/dot_config/nvim/init.lua index 7472234..71baf88 100644 --- a/home/dot_config/nvim/init.lua +++ b/home/dot_config/nvim/init.lua @@ -57,43 +57,4 @@ if vim.g.neovide then vim.g.neovide_input_macos_option_key_is_meta = "only_left" end --- TODO: Refractor this part to submodules --- 存储输入法状态的变量 -vim.g.input_layout = nil - --- 退出插入模式时:记录当前输入法并切换到英文 -local function fcitx2en() - -- 使用 fcitx5-remote -n 获取当前输入法名称 - local current_layout = vim.fn.system("fcitx5-remote -n") - -- 去除换行符 - vim.g.input_layout = vim.trim(current_layout) - - -- 切换到英文输入法 - vim.fn.system("fcitx5-remote -s keyboard-us") -end - --- 进入插入模式时:恢复之前的输入法状态 -local function fcitx2zh() - -- 如果之前记录了输入法状态,则恢复 - if vim.g.input_layout ~= nil and vim.g.input_layout ~= "" then - vim.fn.system("fcitx5-remote -s " .. vim.g.input_layout) - end -end - --- 设置 ttimeoutlen -vim.opt.ttimeoutlen = 150 - --- 创建自动命令组 -local fcitx_group = vim.api.nvim_create_augroup("FcitxToggle", { clear = true }) - --- 退出插入模式时切换到英文并记录状态 -vim.api.nvim_create_autocmd("InsertLeave", { - group = fcitx_group, - callback = fcitx2en, -}) - --- 进入插入模式时恢复之前的输入法 -vim.api.nvim_create_autocmd("InsertEnter", { - group = fcitx_group, - callback = fcitx2zh, -}) +require("config.fcitx") diff --git a/home/dot_config/nvim/lua/config/colors.lua b/home/dot_config/nvim/lua/config/colors.lua index 6b143f9..95f62e4 100644 --- a/home/dot_config/nvim/lua/config/colors.lua +++ b/home/dot_config/nvim/lua/config/colors.lua @@ -1,7 +1,7 @@ -- This file *currently* contains the colorscheme for lualine (status line) local M = {} --- TODO: Change the palatte when the colorscheme changes +-- NOTE: Currently only handles catppuccin latte/mocha palettes if vim.g.colors_name == "catppuccin-latte" then M.scheme = require("catppuccin.palettes.latte") diff --git a/home/dot_config/nvim/lua/config/fcitx.lua b/home/dot_config/nvim/lua/config/fcitx.lua new file mode 100644 index 0000000..9f94c67 --- /dev/null +++ b/home/dot_config/nvim/lua/config/fcitx.lua @@ -0,0 +1,27 @@ +vim.g.input_layout = nil + +local function fcitx2en() + local current_layout = vim.fn.system("fcitx5-remote -n") + vim.g.input_layout = vim.trim(current_layout) + vim.fn.system("fcitx5-remote -s keyboard-us") +end + +local function fcitx2zh() + if vim.g.input_layout ~= nil and vim.g.input_layout ~= "" then + vim.fn.system("fcitx5-remote -s " .. vim.g.input_layout) + end +end + +vim.opt.ttimeoutlen = 150 + +local fcitx_group = vim.api.nvim_create_augroup("FcitxToggle", { clear = true }) + +vim.api.nvim_create_autocmd("InsertLeave", { + group = fcitx_group, + callback = fcitx2en, +}) + +vim.api.nvim_create_autocmd("InsertEnter", { + group = fcitx_group, + callback = fcitx2zh, +}) diff --git a/home/dot_config/nvim/lua/plugins/dap.lua b/home/dot_config/nvim/lua/plugins/dap.lua index 1258bee..37c5cc7 100644 --- a/home/dot_config/nvim/lua/plugins/dap.lua +++ b/home/dot_config/nvim/lua/plugins/dap.lua @@ -1,4 +1,3 @@ --- TODO: -- Debugger setups return { { diff --git a/home/dot_config/nvim/lua/plugins/mod/lualine/components.lua b/home/dot_config/nvim/lua/plugins/mod/lualine/components.lua index 5770894..c95df8d 100644 --- a/home/dot_config/nvim/lua/plugins/mod/lualine/components.lua +++ b/home/dot_config/nvim/lua/plugins/mod/lualine/components.lua @@ -115,7 +115,6 @@ M.progress = { "progress", } --- TODO: Implement orgmode M.orgmode = { function() return _G.orgmode.statusline() diff --git a/nixcfgs/hosts/zephyrus/default.nix b/nixcfgs/hosts/zephyrus/default.nix index c8a542e..0873eca 100644 --- a/nixcfgs/hosts/zephyrus/default.nix +++ b/nixcfgs/hosts/zephyrus/default.nix @@ -10,6 +10,7 @@ ../../modules/nixos ../../modules/nixos/core/nix-ld.nix ../../modules/nixos/core/nftables.nix + ../../modules/nixos/core/binfmt.nix # this is a laptop ../../modules/nixos/desktop @@ -47,6 +48,8 @@ ../../modules/nixos/services/docker.nix ../../modules/nixos/services/syncthing.nix ../../modules/nixos/services/tailscale.nix + # TODO: Configure restic backup (see the file for setup instructions) + # ../../modules/nixos/services/restic.nix ]; # Hostname diff --git a/nixcfgs/modules/lib/mergetools.nix b/nixcfgs/modules/lib/mergetools.nix new file mode 100644 index 0000000..7535e90 --- /dev/null +++ b/nixcfgs/modules/lib/mergetools.nix @@ -0,0 +1,188 @@ +# mergetools.nix — Dual-mode config merge library +# +# Supports both Home Manager ("home") and NixOS system-level ("system") modes. +# All targets are ABSOLUTE paths regardless of mode. +# +# Usage (home mode — default): +# mergetools = import ../../modules/lib/mergetools.nix { inherit pkgs lib config; }; +# myConfig = mergetools.mkMergedJson { +# name = "my-config"; +# target = "${config.home.homeDirectory}/.config/app/config.json"; +# settings = { key = "value"; }; +# }; +# # Then: imports = [ myConfig ]; +# +# Usage (system mode): +# mergetools = import ../../modules/lib/mergetools.nix { inherit pkgs lib config; }; +# myConfig = mergetools.mkMergedJson { +# name = "my-config"; +# target = "/var/lib/myapp/config.json"; +# settings = { key = "value"; }; +# mode = "system"; +# # owner = "myapp"; # default: "root" +# # group = "myapp"; # default: "root" +# # permissions = "0640"; # default: "0644" +# }; +# # Then: imports = [ myConfig ]; +{ + config, + lib, + pkgs, + ... +}: let + mkForceVar = force: + if force + then "true" + else "false"; + + # Derive a safe relative path for home.file from an absolute target. + # Strips the leading $HOME/ to get the relative portion. + # e.g., "/home/js0ny/.config/foo" -> ".config/foo" + stripHomePrefix = target: let + homeDir = config.home.homeDirectory; + homeDirSlash = homeDir + "/"; + len = builtins.stringLength homeDirSlash; + in + if lib.hasPrefix homeDirSlash target + then builtins.substring len (builtins.stringLength target - len) target + else builtins.abort "mergetools (home mode): target '${target}' must start with '${homeDirSlash}'"; + + # ── Home mode ────────────────────────────────────────────────────── + + mkHomeMerge = { + name, + target, + patchContent, + mergeCmdStr, + force, + emptyInit, + }: let + relTarget = stripHomePrefix target; + patchFile = "${relTarget}.nix-managed"; + in { + home.file."${patchFile}".text = patchContent; + + home.activation."merge-${name}" = lib.hm.dag.entryAfter ["writeBoundary"] '' + TARGET="${target}" + PATCH="$HOME/${patchFile}" + FORCE="${mkForceVar force}" + + if [ -f "$TARGET" ] || [ "$FORCE" = "true" ]; then + if [ -f "$PATCH" ]; then + verboseEcho "Merging Nix managed config into: $TARGET" + run mkdir -p "$(dirname "$TARGET")" + if [ ! -f "$TARGET" ]; then + echo '${emptyInit}' > "$TARGET" + fi + run ${mergeCmdStr} + fi + else + verboseEcho "Skipping merge for $TARGET: file missing and force=false" + fi + ''; + }; + + # ── System mode ──────────────────────────────────────────────────── + + mkSystemMerge = { + name, + target, + patchContent, + mergeCmdStr, + force, + emptyInit, + owner ? "root", + group ? "root", + permissions ? "0644", + }: let + patchFile = pkgs.writeText "${name}.nix-managed" patchContent; + in { + system.activationScripts."merge-${name}" = lib.stringAfter ["etc"] '' + TARGET="${target}" + PATCH="${patchFile}" + FORCE="${mkForceVar force}" + + if [ -f "$TARGET" ] || [ "$FORCE" = "true" ]; then + echo "mergetools: Merging Nix managed config into: $TARGET" + mkdir -p "$(dirname "$TARGET")" + if [ ! -f "$TARGET" ]; then + echo '${emptyInit}' > "$TARGET" + fi + ${mergeCmdStr} + chown ${owner}:${group} "$TARGET" + chmod ${permissions} "$TARGET" + else + echo "mergetools: Skipping merge for $TARGET: file missing and force=false" + fi + ''; + }; + + # ── Dispatch ─────────────────────────────────────────────────────── + + mkMerge = {mode ? "home", ...} @ args: let + # Strip mode-irrelevant attrs before passing + homeArgs = builtins.removeAttrs args ["mode" "owner" "group" "permissions"]; + systemArgs = builtins.removeAttrs args ["mode"]; + in + if mode == "home" + then mkHomeMerge homeArgs + else if mode == "system" + then mkSystemMerge systemArgs + else builtins.abort "mergetools: unknown mode '${mode}', expected 'home' or 'system'"; + + # ── Public API ───────────────────────────────────────────────────── + + mkMergedYaml = { + name, + target, + settings, + force ? false, + mode ? "home", + owner ? "root", + group ? "root", + permissions ? "0644", + }: + mkMerge { + inherit name target mode force owner group permissions; + patchContent = lib.generators.toYAML {} settings; + # $TARGET and $PATCH are shell variables set in the activation script + mergeCmdStr = ''${pkgs.yq-go}/bin/yq -i -oy -P ". *= load(\"$PATCH\")" "$TARGET"''; + emptyInit = "{}"; + }; + + mkMergedJson = { + name, + target, + settings, + force ? false, + mode ? "home", + owner ? "root", + group ? "root", + permissions ? "0644", + }: + mkMerge { + inherit name target mode force owner group permissions; + patchContent = builtins.toJSON settings; + mergeCmdStr = ''${pkgs.yq-go}/bin/yq -i -o json -P --indent 2 ". *= load(\"$PATCH\")" "$TARGET"''; + emptyInit = "{}"; + }; + + mkMergedIni = { + name, + target, + settings, + force ? false, + mode ? "home", + owner ? "root", + group ? "root", + permissions ? "0644", + }: + mkMerge { + inherit name target mode force owner group permissions; + patchContent = lib.generators.toINI {} settings; + mergeCmdStr = ''${pkgs.crudini}/bin/crudini --merge "$TARGET" < "$PATCH"''; + emptyInit = ""; + }; +in { + inherit mkMergedYaml mkMergedJson mkMergedIni; +} diff --git a/nixcfgs/modules/nixos/core/binfmt.nix b/nixcfgs/modules/nixos/core/binfmt.nix new file mode 100644 index 0000000..4258919 --- /dev/null +++ b/nixcfgs/modules/nixos/core/binfmt.nix @@ -0,0 +1,3 @@ +{...}: { + boot.binfmt.emulatedSystems = ["aarch64-linux"]; +} diff --git a/nixcfgs/modules/nixos/services/restic.nix b/nixcfgs/modules/nixos/services/restic.nix new file mode 100644 index 0000000..50cd18c --- /dev/null +++ b/nixcfgs/modules/nixos/services/restic.nix @@ -0,0 +1,82 @@ +# TODO: Configure restic backup +# +# This is a skeleton for services.restic.backups. +# NixOS provides `services.restic.backups.` which creates systemd +# timers that run restic backup on a schedule. +# +# Steps to complete: +# 1. Add a restic repository password to sops secrets: +# In secrets/secrets.yaml, add: +# restic_repo_password: "your-secure-password" +# Then reference it below via sops.secrets."RESTIC_REPO_PASSWORD" +# +# 2. Choose a backup repository backend and set `repository`: +# - Local: "/mnt/backup/restic-repo" +# - SFTP: "sftp:user@host:/path/to/repo" +# - S3: "s3:https://s3.amazonaws.com/bucket-name" +# - B2: "b2:bucket-name:/" +# - Rclone: "rclone:remote:path" +# +# 3. For cloud backends, add credential env vars: +# - S3: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY +# - B2: B2_ACCOUNT_ID, B2_ACCOUNT_KEY +# Store these in sops and pass them via `environmentFile` +# +# 4. Set `paths` to directories you want to back up +# +# 5. Set `exclude` patterns for files to skip +# +# 6. Set `timerConfig` for backup schedule (systemd timer syntax) +# +# 7. Optionally configure `pruneOpts` for automatic old snapshot cleanup +# +# 8. Initialize the repo: `restic -r init` +# +{config, ...}: { + services.restic.backups = { + # TODO: Rename this backup job as needed + main = { + # TODO: Set your restic repository URL (see step 2 above) + repository = "/mnt/backup/restic-repo"; + + # TODO: Add "RESTIC_REPO_PASSWORD" to sops secrets, then uncomment: + # passwordFile = config.sops.secrets."RESTIC_REPO_PASSWORD".path; + + # TODO: For cloud backends, create an env file with credentials: + # environmentFile = config.sops.secrets."RESTIC_ENV".path; + + # TODO: Set directories to back up + paths = [ + # "/home/js0ny/Documents" + # "/home/js0ny/Projects" + # "/home/js0ny/Academia" + ]; + + # TODO: Set exclude patterns + exclude = [ + ".cache" + ".local/share/Trash" + "node_modules" + ".venv" + "__pycache__" + "target" # Rust/Maven build artifacts + "result" # Nix build results + ]; + + # TODO: Set backup schedule (default: daily at 3am) + timerConfig = { + OnCalendar = "daily"; + Persistent = true; # Run missed backups after sleep/shutdown + RandomizedDelaySec = "1h"; + }; + + # TODO: Uncomment to enable automatic snapshot pruning + # pruneOpts = [ + # "--keep-daily 7" + # "--keep-weekly 4" + # "--keep-monthly 6" + # "--keep-yearly 2" + # ]; + }; + }; +} diff --git a/nixcfgs/users/js0ny/lib/mergetools.nix b/nixcfgs/users/js0ny/lib/mergetools.nix deleted file mode 100644 index 8d1861b..0000000 --- a/nixcfgs/users/js0ny/lib/mergetools.nix +++ /dev/null @@ -1,119 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - # Helper to handle the logic check string - # 如果 force 为 true,Bash 变量 FORCE 为 "true",否则为 "false" - # In Nix, (toString true) yields "1" - mkForceVar = force: - if force - then "true" - else "false"; - - mkMergedYaml = { - name, - target, - settings, - force ? false, - }: let - yamlContent = lib.generators.toYAML {} settings; - patchFile = "${target}.nix-managed"; - in { - home.file."${patchFile}".text = yamlContent; - - home.activation."merge-${name}" = lib.hm.dag.entryAfter ["writeBoundary"] '' - TARGET="$HOME/${target}" - PATCH="$HOME/${patchFile}" - FORCE="${mkForceVar force}" - - if [ -f "$TARGET" ] || [ "$FORCE" = "true" ]; then - if [ -f "$PATCH" ]; then - verboseEcho "Merging Nix managed YAML config into: $TARGET" - - # 只有在确定要操作时,才创建目录和空文件 - run mkdir -p "$(dirname "$TARGET")" - - if [ ! -f "$TARGET" ]; then - echo "{}" > "$TARGET" - fi - - run ${pkgs.yq-go}/bin/yq -i -oy -P ". *= load(\"$PATCH\")" "$TARGET" - fi - else - verboseEcho "Skipping merge for $TARGET: file missing and force=false" - fi - ''; - }; - - mkMergedJson = { - name, - target, - settings, - force ? false, - }: let - jsonContent = builtins.toJSON settings; - patchFile = "${target}.nix-managed"; - in { - home.file."${patchFile}".text = jsonContent; - - home.activation."merge-${name}" = lib.hm.dag.entryAfter ["writeBoundary"] '' - TARGET="$HOME/${target}" - PATCH="$HOME/${patchFile}" - FORCE="${mkForceVar force}" - - if [ -f "$TARGET" ] || [ "$FORCE" = "true" ]; then - if [ -f "$PATCH" ]; then - verboseEcho "Merging Nix managed JSON config into: $TARGET" - - run mkdir -p "$(dirname "$TARGET")" - - if [ ! -f "$TARGET" ]; then - echo "{}" > "$TARGET" - fi - - run ${pkgs.yq-go}/bin/yq -i -o json -P --indent 2 ". *= load(\"$PATCH\")" "$TARGET" - fi - else - verboseEcho "Skipping merge for $TARGET: file missing and force=false" - fi - ''; - }; - - mkMergedIni = { - name, - target, - settings, - force ? false, - }: let - iniContent = lib.generators.toINI {} settings; - patchFile = "${target}.nix-managed"; - in { - home.file."${patchFile}".text = iniContent; - - home.activation."merge-${name}" = lib.hm.dag.entryAfter ["writeBoundary"] '' - TARGET="$HOME/${target}" - PATCH="$HOME/${patchFile}" - FORCE="${mkForceVar force}" - - if [ -f "$TARGET" ] || [ "$FORCE" = "true" ]; then - if [ -f "$PATCH" ]; then - verboseEcho "Merging Nix managed INI config into: $TARGET" - - run mkdir -p "$(dirname "$TARGET")" - - if [ ! -f "$TARGET" ]; then - echo "" > "$TARGET" - fi - - run ${pkgs.crudini}/bin/crudini --merge "$TARGET" < "$PATCH" - fi - else - verboseEcho "Skipping merge for $TARGET: file missing and force=false" - fi - ''; - }; -in { - inherit mkMergedYaml mkMergedJson mkMergedIni; -} diff --git a/nixcfgs/users/js0ny/packages/cli.nix b/nixcfgs/users/js0ny/packages/cli.nix index a7ee6b1..dbbc6a9 100644 --- a/nixcfgs/users/js0ny/packages/cli.nix +++ b/nixcfgs/users/js0ny/packages/cli.nix @@ -73,6 +73,8 @@ visidata proton-pass-cli pass + # rar: Unfree, the only way (afaik) to unarchive some very old partition rars + rar ] ++ ( if pkgs.stdenv.isDarwin diff --git a/nixcfgs/users/js0ny/packages/devtools.nix b/nixcfgs/users/js0ny/packages/devtools.nix index 01cbaaa..95dba4a 100644 --- a/nixcfgs/users/js0ny/packages/devtools.nix +++ b/nixcfgs/users/js0ny/packages/devtools.nix @@ -28,6 +28,6 @@ systemd.user.tmpfiles.rules = [ "d ${config.xdg.dataHome}/cargo 0755 ${config.home.username} users -" "d ${config.xdg.dataHome}/go 0755 ${config.home.username} users -" - "f ${config.xdg.stateHome}/python 0755 ${config.home.username} users -" + "d ${config.xdg.stateHome}/python 0755 ${config.home.username} users -" ]; } diff --git a/nixcfgs/users/js0ny/packages/gaming.nix b/nixcfgs/users/js0ny/packages/gaming.nix index 42da3ce..a9701a3 100644 --- a/nixcfgs/users/js0ny/packages/gaming.nix +++ b/nixcfgs/users/js0ny/packages/gaming.nix @@ -5,10 +5,10 @@ ... }: let noname = pkgs.callPackage ../../../pkgs/noname/default.nix {}; - mergetools = import ../lib/mergetools.nix {inherit pkgs lib config;}; + mergetools = import ../../../modules/lib/mergetools.nix {inherit pkgs lib config;}; mkMergedJson = mergetools.mkMergedJson; mkMergedIni = mergetools.mkMergedIni; - pdxrel = ".local/share/Paradox Interactive"; + pdxrel = "${config.home.homeDirectory}/.local/share/Paradox Interactive"; # pdxbase = "${config.home.homeDirectory}/${pdxrel}"; euvbase = "${config.home.homeDirectory}/.local/share/Steam/steamapps/compatdata/3450310/pfx/drive_c/users/steamuser/Documents/Paradox Interactive/Europa Universalis V"; paradoxLauncherUserSettings = mkMergedJson { @@ -29,7 +29,7 @@ # 经典 $HOME 下拉屎 pdxSdkSettingsV3 = mkMergedJson { name = "pdxSdkaccountJsonV3"; - target = "PDX/SDK/victoria3/account.json"; + target = "${config.home.homeDirectory}/PDX/SDK/victoria3/account.json"; settings = { telemetryEnabled = false; }; @@ -43,7 +43,7 @@ }; pdxSdkTelemetryV3 = mkMergedJson { name = "pdxSdktelemetryConsentV3"; - target = "PDX/SDK/victoria3/telemetry_consent.json"; + target = "${config.home.homeDirectory}/PDX/SDK/victoria3/telemetry_consent.json"; settings = { telemetry_consent_choice = "denied"; }; @@ -65,7 +65,7 @@ }; prismLauncherCfg = mkMergedIni { name = "prism-launcher-config"; - target = ".local/share/PrismLauncher/prismlauncher.cfg"; + target = "${config.home.homeDirectory}/.local/share/PrismLauncher/prismlauncher.cfg"; settings = { General = { Language = "zh"; @@ -85,7 +85,7 @@ }; ryujinxConfig = mkMergedJson { name = "ryujinx-config"; - target = ".config/Ryujinx/Config.json"; + target = "${config.home.homeDirectory}/.config/Ryujinx/Config.json"; settings = { game_dir = [ "${config.home.homeDirectory}/Games/ROM/Nintendo - Nintendo Switch" diff --git a/nixcfgs/users/js0ny/packages/gui.nix b/nixcfgs/users/js0ny/packages/gui.nix index ec1cd3f..e873dd1 100644 --- a/nixcfgs/users/js0ny/packages/gui.nix +++ b/nixcfgs/users/js0ny/packages/gui.nix @@ -117,6 +117,8 @@ in { readest openclaw + kid3 + # Use Wayland for Jetbrains # (jetbrains.idea-ultimate.override { # vmopts = ''-Dawt.toolkit.name=WLToolkit''; diff --git a/nixcfgs/users/js0ny/programs/chromium.nix b/nixcfgs/users/js0ny/programs/browsers/chromium.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/chromium.nix rename to nixcfgs/users/js0ny/programs/browsers/chromium.nix diff --git a/nixcfgs/users/js0ny/programs/firefox/addons.nix b/nixcfgs/users/js0ny/programs/browsers/firefox/addons.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/firefox/addons.nix rename to nixcfgs/users/js0ny/programs/browsers/firefox/addons.nix diff --git a/nixcfgs/users/js0ny/programs/firefox/betterfox.nix b/nixcfgs/users/js0ny/programs/browsers/firefox/betterfox.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/firefox/betterfox.nix rename to nixcfgs/users/js0ny/programs/browsers/firefox/betterfox.nix diff --git a/nixcfgs/users/js0ny/programs/firefox/default.nix b/nixcfgs/users/js0ny/programs/browsers/firefox/default.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/firefox/default.nix rename to nixcfgs/users/js0ny/programs/browsers/firefox/default.nix diff --git a/nixcfgs/users/js0ny/programs/firefox/search.nix b/nixcfgs/users/js0ny/programs/browsers/firefox/search.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/firefox/search.nix rename to nixcfgs/users/js0ny/programs/browsers/firefox/search.nix diff --git a/nixcfgs/users/js0ny/programs/cherry-studio.nix b/nixcfgs/users/js0ny/programs/cherry-studio.nix index 0c4ebc0..89f79ba 100644 --- a/nixcfgs/users/js0ny/programs/cherry-studio.nix +++ b/nixcfgs/users/js0ny/programs/cherry-studio.nix @@ -4,11 +4,11 @@ config, ... }: let - mergetools = import ../lib/mergetools.nix {inherit pkgs lib config;}; + mergetools = import ../../../modules/lib/mergetools.nix {inherit pkgs lib config;}; mkMergedJson = mergetools.mkMergedJson; cherryStudioConfig = mkMergedJson { name = "cherry-studio-config"; - target = ".config/cherry-studio/config.json"; + target = "${config.home.homeDirectory}/.config/cherry-studio/config.json"; settings = { enableDeveloperMode = true; enableDataCollection = false; diff --git a/nixcfgs/users/js0ny/programs/emacs.nix b/nixcfgs/users/js0ny/programs/editors/emacs.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/emacs.nix rename to nixcfgs/users/js0ny/programs/editors/emacs.nix diff --git a/nixcfgs/users/js0ny/programs/neovide.nix b/nixcfgs/users/js0ny/programs/editors/neovide.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/neovide.nix rename to nixcfgs/users/js0ny/programs/editors/neovide.nix diff --git a/nixcfgs/users/js0ny/programs/nvim.nix b/nixcfgs/users/js0ny/programs/editors/nvim.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/nvim.nix rename to nixcfgs/users/js0ny/programs/editors/nvim.nix diff --git a/nixcfgs/users/js0ny/programs/vscode.nix b/nixcfgs/users/js0ny/programs/editors/vscode.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/vscode.nix rename to nixcfgs/users/js0ny/programs/editors/vscode.nix diff --git a/nixcfgs/users/js0ny/programs/zed-editor.nix b/nixcfgs/users/js0ny/programs/editors/zed-editor.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/zed-editor.nix rename to nixcfgs/users/js0ny/programs/editors/zed-editor.nix diff --git a/nixcfgs/users/js0ny/programs/fsearch.nix b/nixcfgs/users/js0ny/programs/fsearch.nix index 24deafc..10fd09e 100644 --- a/nixcfgs/users/js0ny/programs/fsearch.nix +++ b/nixcfgs/users/js0ny/programs/fsearch.nix @@ -4,12 +4,12 @@ config, ... }: let - mergetools = import ../lib/mergetools.nix {inherit pkgs lib config;}; + mergetools = import ../../../modules/lib/mergetools.nix {inherit pkgs lib config;}; mkMergeIni = mergetools.mkMergedIni; # username = config.home.username; fsearchConf = mkMergeIni { name = "fsearch-conf"; - target = ".config/fsearch/fsearch.conf"; + target = "${config.home.homeDirectory}/.config/fsearch/fsearch.conf"; settings = { Interface = { single_click_open = false; diff --git a/nixcfgs/users/js0ny/programs/fzf.nix b/nixcfgs/users/js0ny/programs/fzf.nix index 0d7ca57..d5c51d6 100644 --- a/nixcfgs/users/js0ny/programs/fzf.nix +++ b/nixcfgs/users/js0ny/programs/fzf.nix @@ -22,8 +22,31 @@ fi ''; }; + ii-fzf = pkgs.writeShellApplication { + name = "ii-fzf"; + runtimeInputs = with pkgs; [fzf]; + text = '' + _file="" + + if command -v fd >/dev/null 2>&1; then + _file=$(fd --type f --exclude '*.lock' | fzf --height 40% --reverse -1 -q "''${1:-}") + else + # Fallback to 'find' + _file=$(find . -type f ! -name '*.lock' | fzf --height 40% --reverse -1 -q "''${1:-}") + fi + + # In POSIX shell, if fzf is cancelled (Esc/Ctrl-C), + # the command substitution simply returns an empty string. + # So, we check if the variable '_file' is non-empty ('-n'). + if [ -n "$_file" ]; then + xdg-open "$_file" + else + echo "No file selected." + fi + ''; + }; in { - home.packages = [edit-fzf]; + home.packages = [edit-fzf ii-fzf]; programs.fzf = { enable = true; enableBashIntegration = true; diff --git a/nixcfgs/users/js0ny/programs/celluloid.nix b/nixcfgs/users/js0ny/programs/media/celluloid.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/celluloid.nix rename to nixcfgs/users/js0ny/programs/media/celluloid.nix diff --git a/nixcfgs/users/js0ny/programs/cider-2.nix b/nixcfgs/users/js0ny/programs/media/cider-2/default.nix similarity index 88% rename from nixcfgs/users/js0ny/programs/cider-2.nix rename to nixcfgs/users/js0ny/programs/media/cider-2/default.nix index 606721c..a041c5d 100644 --- a/nixcfgs/users/js0ny/programs/cider-2.nix +++ b/nixcfgs/users/js0ny/programs/media/cider-2/default.nix @@ -17,11 +17,13 @@ echo "marketplaceID: 12" >> "$out/theme.yml" echo 'version: "25.02"' >> "$out/theme.yml" ''; - mergetools = import ../lib/mergetools.nix {inherit pkgs lib config;}; + mergetools = + import ../../../../../modules/lib/mergetools.nix + {inherit pkgs lib config;}; mkMergedYaml = mergetools.mkMergedYaml; ciderSpaConfig = mkMergedYaml { name = "cider-spa-config"; - target = ".config/sh.cider.genten/spa-config.yml"; + target = "${config.home.homeDirectory}/.config/sh.cider.genten/spa-config.yml"; settings = { general = { language = "zh-CN"; @@ -35,8 +37,8 @@ appearance = "auto"; # default: Mojave useAdaptiveColors = true; - # TODO: Change to "native" when using simple WM - # Electron does not render the three buttons in title bar when "native" + # NOTE: "native" breaks window controls on tiling WMs (Electron bug). + # "default" works on both GNOME and Niri, so keep it. titleBarStyle = "default"; layoutType = "default"; fonts = { @@ -81,7 +83,7 @@ }; in { imports = [ - ../../../modules/home/programs/cider-2.nix + ./lib.nix ciderSpaConfig ]; diff --git a/nixcfgs/modules/home/programs/cider-2.nix b/nixcfgs/users/js0ny/programs/media/cider-2/lib.nix similarity index 100% rename from nixcfgs/modules/home/programs/cider-2.nix rename to nixcfgs/users/js0ny/programs/media/cider-2/lib.nix diff --git a/nixcfgs/users/js0ny/programs/elisa.nix b/nixcfgs/users/js0ny/programs/media/elisa.nix similarity index 68% rename from nixcfgs/users/js0ny/programs/elisa.nix rename to nixcfgs/users/js0ny/programs/media/elisa.nix index 45eb648..e56aeef 100644 --- a/nixcfgs/users/js0ny/programs/elisa.nix +++ b/nixcfgs/users/js0ny/programs/media/elisa.nix @@ -4,11 +4,11 @@ lib, ... }: let - mergetools = import ../lib/mergetools.nix {inherit pkgs lib config;}; + mergetools = import ../../../../modules/lib/mergetools.nix {inherit pkgs lib config;}; mkMergeIni = mergetools.mkMergedIni; elisarc = mkMergeIni { name = "elisarc"; - target = ".config/elisarc"; + target = "${config.home.homeDirectory}/.config/elisarc"; settings = { ElisaFileIndexer = { "RootPath[$e]" = "$HOME/Music"; diff --git a/nixcfgs/users/js0ny/programs/feishin.nix b/nixcfgs/users/js0ny/programs/media/feishin.nix similarity index 80% rename from nixcfgs/users/js0ny/programs/feishin.nix rename to nixcfgs/users/js0ny/programs/media/feishin.nix index a66465f..6bcfc37 100644 --- a/nixcfgs/users/js0ny/programs/feishin.nix +++ b/nixcfgs/users/js0ny/programs/media/feishin.nix @@ -4,11 +4,11 @@ config, ... }: let - mergetools = import ../lib/mergetools.nix {inherit pkgs lib config;}; + mergetools = import ../../../../modules/lib/mergetools.nix {inherit pkgs lib config;}; mkMergedJson = mergetools.mkMergedJson; feishinConfig = mkMergedJson { name = "feishin-config"; - target = ".config/feishin/config.json"; + target = "${config.home.homeDirectory}/.config/feishin/config.json"; settings = { theme = "system"; window_has_frame = false; diff --git a/nixcfgs/users/js0ny/programs/gallery-dl.nix b/nixcfgs/users/js0ny/programs/media/gallery-dl.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/gallery-dl.nix rename to nixcfgs/users/js0ny/programs/media/gallery-dl.nix diff --git a/nixcfgs/users/js0ny/programs/lollypop.nix b/nixcfgs/users/js0ny/programs/media/lollypop.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/lollypop.nix rename to nixcfgs/users/js0ny/programs/media/lollypop.nix diff --git a/nixcfgs/users/js0ny/programs/mpv.nix b/nixcfgs/users/js0ny/programs/media/mpv.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/mpv.nix rename to nixcfgs/users/js0ny/programs/media/mpv.nix diff --git a/nixcfgs/users/js0ny/programs/obs-studio.nix b/nixcfgs/users/js0ny/programs/media/obs-studio.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/obs-studio.nix rename to nixcfgs/users/js0ny/programs/media/obs-studio.nix diff --git a/nixcfgs/users/js0ny/programs/picard.nix b/nixcfgs/users/js0ny/programs/media/picard.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/picard.nix rename to nixcfgs/users/js0ny/programs/media/picard.nix diff --git a/nixcfgs/users/js0ny/programs/anki.nix b/nixcfgs/users/js0ny/programs/productivity/anki.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/anki.nix rename to nixcfgs/users/js0ny/programs/productivity/anki.nix diff --git a/nixcfgs/users/js0ny/programs/libreoffice.nix b/nixcfgs/users/js0ny/programs/productivity/libreoffice.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/libreoffice.nix rename to nixcfgs/users/js0ny/programs/productivity/libreoffice.nix diff --git a/nixcfgs/users/js0ny/programs/obsidian/default.nix b/nixcfgs/users/js0ny/programs/productivity/obsidian/default.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/obsidian/default.nix rename to nixcfgs/users/js0ny/programs/productivity/obsidian/default.nix diff --git a/nixcfgs/users/js0ny/programs/obsidian/obsidian-grep.nix b/nixcfgs/users/js0ny/programs/productivity/obsidian/obsidian-grep.nix similarity index 92% rename from nixcfgs/users/js0ny/programs/obsidian/obsidian-grep.nix rename to nixcfgs/users/js0ny/programs/productivity/obsidian/obsidian-grep.nix index 30af660..2be0fc5 100644 --- a/nixcfgs/users/js0ny/programs/obsidian/obsidian-grep.nix +++ b/nixcfgs/users/js0ny/programs/productivity/obsidian/obsidian-grep.nix @@ -14,7 +14,7 @@ exit 1 } - # TODO: Add tag search support + # DEPRECATED: Consider removing in favour of Obsidian's official CLI. rg --line-number --color=always "" | fzf --ansi \ --delimiter : \ diff --git a/nixcfgs/users/js0ny/programs/obsidian/vimrc-support.nix b/nixcfgs/users/js0ny/programs/productivity/obsidian/vimrc-support.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/obsidian/vimrc-support.nix rename to nixcfgs/users/js0ny/programs/productivity/obsidian/vimrc-support.nix diff --git a/nixcfgs/users/js0ny/programs/readest.nix b/nixcfgs/users/js0ny/programs/productivity/readest.nix similarity index 76% rename from nixcfgs/users/js0ny/programs/readest.nix rename to nixcfgs/users/js0ny/programs/productivity/readest.nix index 638d91c..d2ccb93 100644 --- a/nixcfgs/users/js0ny/programs/readest.nix +++ b/nixcfgs/users/js0ny/programs/productivity/readest.nix @@ -4,11 +4,11 @@ config, ... }: let - mergetools = import ../lib/mergetools.nix {inherit pkgs lib config;}; + mergetools = import ../../../../modules/lib/mergetools.nix {inherit pkgs lib config;}; mkMergedJson = mergetools.mkMergedJson; readestSettings = mkMergedJson { name = "readest-settings"; - target = ".config/com.bilingify.readest/settings.json"; + target = "${config.home.homeDirectory}/.config/com.bilingify.readest/settings.json"; settings = { globalViewSettings = { serifFont = "LXGW WenKai GB Screen"; diff --git a/nixcfgs/users/js0ny/programs/sdcv.nix b/nixcfgs/users/js0ny/programs/productivity/sdcv.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/sdcv.nix rename to nixcfgs/users/js0ny/programs/productivity/sdcv.nix diff --git a/nixcfgs/users/js0ny/programs/sioyek/default.nix b/nixcfgs/users/js0ny/programs/productivity/sioyek/default.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/sioyek/default.nix rename to nixcfgs/users/js0ny/programs/productivity/sioyek/default.nix diff --git a/nixcfgs/users/js0ny/programs/sioyek/sioyek-copy-page.sh b/nixcfgs/users/js0ny/programs/productivity/sioyek/sioyek-copy-page.sh similarity index 100% rename from nixcfgs/users/js0ny/programs/sioyek/sioyek-copy-page.sh rename to nixcfgs/users/js0ny/programs/productivity/sioyek/sioyek-copy-page.sh diff --git a/nixcfgs/users/js0ny/programs/thunderbird.nix b/nixcfgs/users/js0ny/programs/productivity/thunderbird.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/thunderbird.nix rename to nixcfgs/users/js0ny/programs/productivity/thunderbird.nix diff --git a/nixcfgs/users/js0ny/programs/discord.nix b/nixcfgs/users/js0ny/programs/social/discord.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/discord.nix rename to nixcfgs/users/js0ny/programs/social/discord.nix diff --git a/nixcfgs/users/js0ny/programs/telegram.nix b/nixcfgs/users/js0ny/programs/social/telegram.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/telegram.nix rename to nixcfgs/users/js0ny/programs/social/telegram.nix diff --git a/nixcfgs/users/js0ny/programs/ghostty.nix b/nixcfgs/users/js0ny/programs/terminals/ghostty.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/ghostty.nix rename to nixcfgs/users/js0ny/programs/terminals/ghostty.nix diff --git a/nixcfgs/users/js0ny/programs/kitty.nix b/nixcfgs/users/js0ny/programs/terminals/kitty.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/kitty.nix rename to nixcfgs/users/js0ny/programs/terminals/kitty.nix diff --git a/nixcfgs/users/js0ny/programs/tmux.nix b/nixcfgs/users/js0ny/programs/terminals/tmux.nix similarity index 100% rename from nixcfgs/users/js0ny/programs/tmux.nix rename to nixcfgs/users/js0ny/programs/terminals/tmux.nix diff --git a/nixcfgs/users/js0ny/zen.nix b/nixcfgs/users/js0ny/zen.nix index 6edf216..5a946a9 100644 --- a/nixcfgs/users/js0ny/zen.nix +++ b/nixcfgs/users/js0ny/zen.nix @@ -15,24 +15,24 @@ # Programs ./programs/aichat.nix - ./programs/firefox - ./programs/emacs.nix - ./programs/zed-editor.nix + ./programs/browsers/firefox + ./programs/editors/emacs.nix + ./programs/editors/zed-editor.nix ./programs/rime - ./programs/sdcv.nix + ./programs/productivity/sdcv.nix ./programs/fzf.nix ./programs/sops.nix - ./programs/nvim.nix + ./programs/editors/nvim.nix ./programs/pdf2zh/uv.nix ./programs/yazi.nix ./programs/edit-clipboard.nix - ./programs/neovide.nix - ./programs/ghostty.nix - ./programs/tmux.nix - ./programs/kitty.nix - ./programs/anki.nix - ./programs/sioyek - ./programs/telegram.nix + ./programs/editors/neovide.nix + ./programs/terminals/ghostty.nix + ./programs/terminals/tmux.nix + ./programs/terminals/kitty.nix + ./programs/productivity/anki.nix + ./programs/productivity/sioyek + ./programs/social/telegram.nix # ./programs/retroarch.nix # Package broken on macOS ./programs/darwin/duti.nix ./programs/darwin/alt-tab.nix diff --git a/nixcfgs/users/js0ny/zephyrus.nix b/nixcfgs/users/js0ny/zephyrus.nix index a5709b3..c4addb2 100644 --- a/nixcfgs/users/js0ny/zephyrus.nix +++ b/nixcfgs/users/js0ny/zephyrus.nix @@ -32,19 +32,51 @@ in { ./programs/shell/carapace.nix ./programs/shell/direnv.nix - # Personal Program - ./programs/chromium.nix - ./programs/firefox - ./programs/emacs.nix - ./programs/vscode.nix + # Browsers + ./programs/browsers/chromium.nix + ./programs/browsers/firefox + + # Editors + ./programs/editors/emacs.nix + ./programs/editors/nvim.nix + ./programs/editors/neovide.nix + ./programs/editors/vscode.nix + ./programs/editors/zed-editor.nix + + # Terminals + ./programs/terminals/ghostty.nix + ./programs/terminals/kitty.nix + ./programs/terminals/tmux.nix + + # Media + ./programs/media/cider-2 + ./programs/media/celluloid.nix + ./programs/media/elisa.nix + ./programs/media/feishin.nix + ./programs/media/gallery-dl.nix + ./programs/media/lollypop.nix + ./programs/media/mpv.nix + ./programs/media/obs-studio.nix + ./programs/media/picard.nix + + # Productivity + ./programs/productivity/anki.nix + ./programs/productivity/libreoffice.nix + ./programs/productivity/obsidian + ./programs/productivity/readest.nix + ./programs/productivity/sdcv.nix + ./programs/productivity/sioyek + ./programs/productivity/thunderbird.nix + + # Social + ./programs/social/discord.nix + ./programs/social/telegram.nix + + # Utilities & misc # ./programs/xilinx.nix ./programs/mime.nix - ./programs/zed-editor.nix ./programs/rime - ./programs/sdcv.nix ./programs/fzf.nix - ./programs/libreoffice.nix - ./programs/nvim.nix ./programs/ollama.nix ./programs/sops.nix ./programs/pdf2zh/container.nix @@ -54,34 +86,14 @@ in { ./programs/magick.nix ./programs/miniserve.nix ./programs/retroarch.nix - ./programs/neovide.nix ./programs/edit-clipboard.nix - ./programs/discord.nix - ./programs/mpv.nix - ./programs/thunderbird.nix - ./programs/obs-studio.nix - ./programs/ghostty.nix - ./programs/obsidian ./programs/aichat.nix - ./programs/tmux.nix - ./programs/kitty.nix ./programs/wine.nix - ./programs/anki.nix ./programs/libvirt.nix ./programs/block-desktop-entries.nix ./programs/pwa.nix ./programs/walker.nix - ./programs/sioyek - ./programs/celluloid.nix - ./programs/picard.nix - ./programs/cider-2.nix - ./programs/telegram.nix - ./programs/feishin.nix ./programs/fsearch.nix - ./programs/elisa.nix - ./programs/lollypop.nix - ./programs/gallery-dl.nix - ./programs/readest.nix # ./programs/openclaw.nix ./programs/libmagic.nix From f740b78081fdcb855c34a1e06832d68e3711941c Mon Sep 17 00:00:00 2001 From: js0ny Date: Sun, 15 Mar 2026 21:43:13 +0000 Subject: [PATCH 3/4] dot(niri): wpctl with notification --- nixcfgs/flake.lock | 191 ++++++++++-------- .../desktop/wayland-wm/niri/keymaps.nix | 11 +- .../programs/desktop/wayland-wm/packages.nix | 1 + .../desktop/wayland-wm/volume-notify.nix | 46 +++++ 4 files changed, 158 insertions(+), 91 deletions(-) create mode 100644 nixcfgs/users/js0ny/programs/desktop/wayland-wm/volume-notify.nix diff --git a/nixcfgs/flake.lock b/nixcfgs/flake.lock index bb80f50..20dccce 100644 --- a/nixcfgs/flake.lock +++ b/nixcfgs/flake.lock @@ -100,11 +100,11 @@ ] }, "locked": { - "lastModified": 1771987897, - "narHash": "sha256-5pNQFGxG3fxS9pGnNBJjT76veotKIKq2XpAVFGAhCdI=", + "lastModified": 1772764582, + "narHash": "sha256-hSwjmpXHFqzSXrndVekA0IheKrbC7wi0IbfZTYwlmXw=", "owner": "caelestia-dots", "repo": "cli", - "rev": "b0d68f0a1c48fa138d6fde94dcbecea801a86a01", + "rev": "4bcd42f482d038b98145b0b03388244b68b7d35d", "type": "github" }, "original": { @@ -122,11 +122,11 @@ "quickshell": "quickshell" }, "locked": { - "lastModified": 1772330657, - "narHash": "sha256-cWblprYsDUeAWA57xAqxIjNxXvDI/rqYn6TFp2OPi/k=", + "lastModified": 1773574600, + "narHash": "sha256-RsBgiq93SjlYVHSYtz/ESALa7WgbLu+xcH0oTJRjztQ=", "owner": "caelestia-dots", "repo": "shell", - "rev": "278fd4a4ed1bfb42c3fe197ff38b587539c012aa", + "rev": "377778596acf90451d1bd19f0c03b5f1c0467958", "type": "github" }, "original": { @@ -140,11 +140,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1772153824, - "narHash": "sha256-T65qXmlcD9qFpPTi+mOXsn4dIkO2N8Ls67nqmuzepv0=", + "lastModified": 1773403535, + "narHash": "sha256-47MZaFrHxNO8tVUAmtVnerXUw2WWVluBOiU9MulN/yM=", "owner": "catppuccin", "repo": "nix", - "rev": "4b0f5b7bf7b3eeb484d49524f3c9791864ab9362", + "rev": "d45b5665cc638bad1b794350de02f4dd41b0bb47", "type": "github" }, "original": { @@ -174,11 +174,11 @@ "systems": "systems_2" }, "locked": { - "lastModified": 1770910218, - "narHash": "sha256-IyHoHbhLFuIgFG+n7dqHwJaXuNnRaEsxCfAsfudV1KY=", + "lastModified": 1773079031, + "narHash": "sha256-RvCzINnVISBT3d0F1DoIcQFbQsbRJISW9qZeKTzmNaA=", "owner": "abenz1267", "repo": "elephant", - "rev": "c354a596ec7a7e34e9c26478dc7ef9680bc23e6d", + "rev": "53afe39cef252010f7c55bd33c5bae6dd50dcf0c", "type": "github" }, "original": { @@ -195,11 +195,11 @@ ] }, "locked": { - "lastModified": 1772672954, - "narHash": "sha256-OGEqiNZnLjQd0R2Ei+0QW9Y+t2MZy8vAOS8caNiQxbw=", + "lastModified": 1773537505, + "narHash": "sha256-MsOpMvnnUjYPAtyApi93HcoHD91pAiCXHrjOCG3F7zY=", "owner": "petrkozorezov", "repo": "firefox-addons-nix", - "rev": "8c947cfbce2f6a769c0fcb736fd2eb14ff83b64b", + "rev": "4e6bf49ad4fb8c9ddbb1b4fe2ef63b1b4ab4609a", "type": "github" }, "original": { @@ -285,11 +285,11 @@ ] }, "locked": { - "lastModified": 1765835352, - "narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=", + "lastModified": 1772408722, + "narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "a34fae9c08a15ad73f295041fec82323541400a9", + "rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3", "type": "github" }, "original": { @@ -440,11 +440,11 @@ ] }, "locked": { - "lastModified": 1765774562, - "narHash": "sha256-UQhfCggNGDc7eam+EittlYmeW89CZVT1KkFIHZWBH7k=", + "lastModified": 1771131391, + "narHash": "sha256-HPBNYf7HiKtBVy7/69vKpLYHX6wTcUxndxmybzDlXP8=", "owner": "hercules-ci", "repo": "hercules-ci-effects", - "rev": "edcbb19948b6caf1700434e369fde6ff9e6a3c93", + "rev": "0b152e0f7c5cc265a529cd63374b80e2771b207b", "type": "github" }, "original": { @@ -460,11 +460,11 @@ ] }, "locked": { - "lastModified": 1772633327, - "narHash": "sha256-jl+DJB2DUx7EbWLRng+6HNWW/1/VQOnf0NsQB4PlA7I=", + "lastModified": 1773608492, + "narHash": "sha256-QZteyExJYSQzgxqdsesDPbQgjctGG7iKV/6ooyQPITk=", "owner": "nix-community", "repo": "home-manager", - "rev": "5a75730e6f21ee624cbf86f4915c6e7489c74acc", + "rev": "9a40ec3b78fc688d0908485887d355caa5666d18", "type": "github" }, "original": { @@ -498,11 +498,11 @@ "xwayland-satellite-unstable": "xwayland-satellite-unstable" }, "locked": { - "lastModified": 1772698812, - "narHash": "sha256-7+K/VaZ7TXUeUGSYshg8wC3UsRZHB+M4x6r38Q1B79c=", + "lastModified": 1773577199, + "narHash": "sha256-Z77lGBRlueA+igtScByJ0soMRnEy5T/XG9w661OCPaw=", "owner": "sodiboo", "repo": "niri-flake", - "rev": "5641625ef950f024e3e0e3f38bb91f876290c0be", + "rev": "afc45f69929e5b5ab23d903b24532cfe718de6be", "type": "github" }, "original": { @@ -531,11 +531,11 @@ "niri-unstable": { "flake": false, "locked": { - "lastModified": 1772207631, - "narHash": "sha256-Jkkg+KqshFO3CbTszVVpkKN2AOObYz+wMsM3ONo1z5g=", + "lastModified": 1773130184, + "narHash": "sha256-3bwx4WqCB06yfQIGB+OgIckOkEDyKxiTD5pOo4Xz2rI=", "owner": "YaLTeR", "repo": "niri", - "rev": "e708f546153f74acf33eb183b3b2992587a701e5", + "rev": "b07bde3ee82dd73115e6b949e4f3f63695da35ea", "type": "github" }, "original": { @@ -551,11 +551,11 @@ ] }, "locked": { - "lastModified": 1772379624, - "narHash": "sha256-NG9LLTWlz4YiaTAiRGChbrzbVxBfX+Auq4Ab/SWmk4A=", + "lastModified": 1773000227, + "narHash": "sha256-zm3ftUQw0MPumYi91HovoGhgyZBlM4o3Zy0LhPNwzXE=", "owner": "nix-darwin", "repo": "nix-darwin", - "rev": "52d061516108769656a8bd9c6e811c677ec5b462", + "rev": "da529ac9e46f25ed5616fd634079a5f3c579135f", "type": "github" }, "original": { @@ -587,11 +587,11 @@ ] }, "locked": { - "lastModified": 1772341813, - "narHash": "sha256-/PQ0ubBCMj/MVCWEI/XMStn55a8dIKsvztj4ZVLvUrQ=", + "lastModified": 1773552174, + "narHash": "sha256-mHSRNrT1rjeYBgkAlj07dW3+1nFEgAd8Gu6lgyfT9DU=", "owner": "nix-community", "repo": "nix-index-database", - "rev": "a2051ff239ce2e8a0148fa7a152903d9a78e854f", + "rev": "8faeb68130df077450451b6734a221ba0d6cde42", "type": "github" }, "original": { @@ -612,11 +612,11 @@ ] }, "locked": { - "lastModified": 1773046894, - "narHash": "sha256-Hf5Q6gkaSXojSu9neW0dxvefUc3aA2T8ZQLTdGKIGOU=", + "lastModified": 1773607491, + "narHash": "sha256-EQ4R6eSwnlpVjRrcfnIPlenCrnumkKU5mA0MkzkYaMo=", "owner": "openclaw", "repo": "nix-openclaw", - "rev": "b39fc7f507097858273bda50834c6ab7367d7b09", + "rev": "4136401fbfbed632df86825dfdd4bac2f8d2b285", "type": "github" }, "original": { @@ -630,11 +630,11 @@ "nixpkgs": "nixpkgs_5" }, "locked": { - "lastModified": 1773038583, - "narHash": "sha256-E9Z/7U2ozB7nvCUZp9QlWllFl1yNXaInnuBSiRV5qh4=", + "lastModified": 1773561580, + "narHash": "sha256-wT0bKTp45YnMkc4yXQvk943Zz/rksYiIjEXGdWzxnic=", "owner": "openclaw", "repo": "nix-steipete-tools", - "rev": "561592b0b1aa9b53595618fd867be633a192da54", + "rev": "cd4c429ff3b3aaef9f92e59812cf2baf5704b86f", "type": "github" }, "original": { @@ -647,14 +647,15 @@ "inputs": { "flake-compat": "flake-compat", "flake-parts": "flake-parts_2", - "nixpkgs": "nixpkgs_6" + "nixpkgs": "nixpkgs_6", + "nixpkgs-nixcord": "nixpkgs-nixcord" }, "locked": { - "lastModified": 1772671545, - "narHash": "sha256-7CFg6ppK000u+bd87+6HSVkFSC8PKm/N22MMZMtYla4=", + "lastModified": 1773597570, + "narHash": "sha256-A6KsirR9kxR1wVFTr8aagk5vUT3rvKTf79Qht6YkxUA=", "owner": "kaylorben", "repo": "nixcord", - "rev": "9c048e21aa13ab529f00ab1f13c3793ba0b49b7c", + "rev": "1cc0ddb766e459b7187e6aeb8b2e046d37361dc4", "type": "github" }, "original": { @@ -672,11 +673,11 @@ ] }, "locked": { - "lastModified": 1769288622, - "narHash": "sha256-GaDPnzDQAx5WRi12XVttCHsVw0VkOMYNpniT7KHYNfk=", + "lastModified": 1773434720, + "narHash": "sha256-mK4yEIF+qF7qtAzC5x8GU8kh5lY4v397azT+m1nBvRQ=", "owner": "nixpak", "repo": "nixpak", - "rev": "4276954ad4f877d79801fd8952af38a3370bcb65", + "rev": "1bf4e77b07ce445779894f17ab21016db5f58a4e", "type": "github" }, "original": { @@ -731,13 +732,29 @@ "type": "github" } }, - "nixpkgs-stable": { + "nixpkgs-nixcord": { "locked": { - "lastModified": 1772598333, - "narHash": "sha256-YaHht/C35INEX3DeJQNWjNaTcPjYmBwwjFJ2jdtr+5U=", + "lastModified": 1773222311, + "narHash": "sha256-BHoB/XpbqoZkVYZCfXJXfkR+GXFqwb/4zbWnOr2cRcU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "fabb8c9deee281e50b1065002c9828f2cf7b2239", + "rev": "0590cd39f728e129122770c029970378a79d076a", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1773524153, + "narHash": "sha256-Jms57zzlFf64ayKzzBWSE2SGvJmK+NGt8Gli71d9kmY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f278faa1d0c2fc835bd331d4666b59b505a410", "type": "github" }, "original": { @@ -797,11 +814,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1771848320, - "narHash": "sha256-0MAd+0mun3K/Ns8JATeHT1sX28faLII5hVLq0L3BdZU=", + "lastModified": 1773122722, + "narHash": "sha256-FIqHByVqxCprNjor1NqF80F2QQoiiyqanNNefdlvOg4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "2fc6539b481e1d2569f25f8799236694180c0993", + "rev": "62dc67aa6a52b4364dd75994ec00b51fbf474e50", "type": "github" }, "original": { @@ -829,11 +846,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1772624091, - "narHash": "sha256-QKyJ0QGWBn6r0invrMAK8dmJoBYWoOWy7lN+UHzW1jc=", + "lastModified": 1773389992, + "narHash": "sha256-wvfdLLWJ2I9oEpDd9PfMA8osfIZicoQ5MT1jIwNs9Tk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "80bdc1e5ce51f56b19791b52b2901187931f5353", + "rev": "c06b4ae3d6599a672a6210b7021d699c351eebda", "type": "github" }, "original": { @@ -861,11 +878,11 @@ }, "nixpkgs_6": { "locked": { - "lastModified": 1772465433, - "narHash": "sha256-ywy9troNEfpgh0Ee+zaV1UTgU8kYBVKtvPSxh6clYGU=", + "lastModified": 1773222311, + "narHash": "sha256-BHoB/XpbqoZkVYZCfXJXfkR+GXFqwb/4zbWnOr2cRcU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c581273b8d5bdf1c6ce7e0a54da9841e6a763913", + "rev": "0590cd39f728e129122770c029970378a79d076a", "type": "github" }, "original": { @@ -877,11 +894,11 @@ }, "nixpkgs_7": { "locked": { - "lastModified": 1772674223, - "narHash": "sha256-/suKbHSaSmuC9UY7G0VRQ3aO+QKqxAQPQ19wG7QNkF8=", + "lastModified": 1773507054, + "narHash": "sha256-Q8U5VXgrcxmCxPtCCJCIZkcAX3FCZwGh1GNVIXxMND0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "66d9241e3dc2296726dc522e62dbfe89c7b449f3", + "rev": "e80236013dc8b77aa49ca90e7a12d86f5d8d64c9", "type": "github" }, "original": { @@ -893,11 +910,11 @@ }, "nixpkgs_8": { "locked": { - "lastModified": 1772624091, - "narHash": "sha256-QKyJ0QGWBn6r0invrMAK8dmJoBYWoOWy7lN+UHzW1jc=", + "lastModified": 1773389992, + "narHash": "sha256-wvfdLLWJ2I9oEpDd9PfMA8osfIZicoQ5MT1jIwNs9Tk=", "owner": "nixos", "repo": "nixpkgs", - "rev": "80bdc1e5ce51f56b19791b52b2901187931f5353", + "rev": "c06b4ae3d6599a672a6210b7021d699c351eebda", "type": "github" }, "original": { @@ -929,11 +946,11 @@ "nixpkgs": "nixpkgs_8" }, "locked": { - "lastModified": 1772725591, - "narHash": "sha256-I5WiAHsTkgUNOEtNvysNC7zVt4VNV0Ve3qsuiTQ9RiI=", + "lastModified": 1773608735, + "narHash": "sha256-dqaylgm5x/cjyqo/V1kAsiyQQ5S6/Kc8QGBAUem9nlg=", "owner": "nix-community", "repo": "NUR", - "rev": "3567b1d67fc040f0a9206b1824069b68fe172f05", + "rev": "21d9c792956edffe574411dcf08ea1429175e07a", "type": "github" }, "original": { @@ -998,11 +1015,11 @@ ] }, "locked": { - "lastModified": 1771926182, - "narHash": "sha256-QbXuSLhiSxOq6ydBL3+KGe1aiYWBW+e3J6qjJZaRMq0=", + "lastModified": 1772925576, + "narHash": "sha256-mMoiXABDtkSJxCYDrkhJ/TrrJf5M46oUfIlJvv2gkZ0=", "ref": "refs/heads/master", - "rev": "cddb4f061bab495f4473ca5f2c571b6c710efef7", - "revCount": 744, + "rev": "15a84097653593dd15fad59a56befc2b7bdc270d", + "revCount": 750, "type": "git", "url": "https://git.outfoxxed.me/outfoxxed/quickshell" }, @@ -1044,11 +1061,11 @@ ] }, "locked": { - "lastModified": 1772495394, - "narHash": "sha256-hmIvE/slLKEFKNEJz27IZ8BKlAaZDcjIHmkZ7GCEjfw=", + "lastModified": 1773550941, + "narHash": "sha256-wa/++bL2QeMUreNFBZEWluQfOYB0MnQIeGNMuaX9sfs=", "owner": "Mic92", "repo": "sops-nix", - "rev": "1d9b98a29a45abe9c4d3174bd36de9f28755e3ff", + "rev": "c469b6885f0dcd5c7c56bd935a0f08dbcd9e79e1", "type": "github" }, "original": { @@ -1269,11 +1286,11 @@ "systems": "systems_6" }, "locked": { - "lastModified": 1771062828, - "narHash": "sha256-y1jBFFO0u+V21y3YldHZozrDwVJVrdC+o3c4M8/rasU=", + "lastModified": 1773212610, + "narHash": "sha256-jYvDe44MLx444BfiO1EtCKgHoKfXeIG1DvAw7P2qCrY=", "owner": "abenz1267", "repo": "walker", - "rev": "19b1104585305e0806b842af341630f72038a4b9", + "rev": "04ec7aa1b0cf2524370d99d43283c3050178a813", "type": "github" }, "original": { @@ -1340,11 +1357,11 @@ "xwayland-satellite-unstable": { "flake": false, "locked": { - "lastModified": 1772429643, - "narHash": "sha256-M+bAeCCcjBnVk6w/4dIVvXvpJwOKnXjwi/lDbaN6Yws=", + "lastModified": 1773499041, + "narHash": "sha256-XZ4/tVdLeAYDgKe4JD4C7yYUKydMxwt8c2j6APFWcIc=", "owner": "Supreeeme", "repo": "xwayland-satellite", - "rev": "10f985b84cdbcc3bbf35b3e7e43d1b2a84fa9ce2", + "rev": "309d8e2a29953f7465dc14c939e2afe4682c0aa9", "type": "github" }, "original": { @@ -1360,11 +1377,11 @@ ] }, "locked": { - "lastModified": 1772685307, - "narHash": "sha256-5xthZHeqwBeXNhnRIlxnCuaZLky0SZ6vQsxtd+eqhTU=", + "lastModified": 1773290160, + "narHash": "sha256-u09eF4Oafi+OIbTtKe/EWil26q1glcTATiSA7dF1oCI=", "owner": "youwen5", "repo": "zen-browser-flake", - "rev": "dc92d88524ee83308795bc90f6a9f1d965265aaa", + "rev": "c7cb51b30960757ed9fb8eb28567b32585d0a688", "type": "github" }, "original": { diff --git a/nixcfgs/users/js0ny/programs/desktop/wayland-wm/niri/keymaps.nix b/nixcfgs/users/js0ny/programs/desktop/wayland-wm/niri/keymaps.nix index be5e236..0f33d3c 100644 --- a/nixcfgs/users/js0ny/programs/desktop/wayland-wm/niri/keymaps.nix +++ b/nixcfgs/users/js0ny/programs/desktop/wayland-wm/niri/keymaps.nix @@ -61,16 +61,19 @@ in { # spawn-sh "cliphist list | ${launcher} -dmenu | cliphist decode | wl-copy"; spawn "${launcher}" "-m" "clipboard"; + # See ../volume-notify.nix "XF86AudioRaiseVolume".allow-when-locked = true; "XF86AudioRaiseVolume".action = - spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; + spawn "volume-notify" "up"; "XF86AudioLowerVolume".allow-when-locked = true; "XF86AudioLowerVolume".action = - spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; + spawn "volume-notify" "down"; "XF86AudioMute".allow-when-locked = true; - "XF86AudioMute".action = spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; + "XF86AudioMute".action = + spawn "volume-notify" "mute"; "XF86AudioMicMute".allow-when-locked = true; - "XF86AudioMicMute".action = spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; + "XF86AudioMicMute".action = + spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; "XF86MonBrightnessUp" = { action = spawn "brightnessctl" "set" "10%+"; diff --git a/nixcfgs/users/js0ny/programs/desktop/wayland-wm/packages.nix b/nixcfgs/users/js0ny/programs/desktop/wayland-wm/packages.nix index bd77bbd..9a63643 100644 --- a/nixcfgs/users/js0ny/programs/desktop/wayland-wm/packages.nix +++ b/nixcfgs/users/js0ny/programs/desktop/wayland-wm/packages.nix @@ -48,6 +48,7 @@ in { ./sunsetr.nix ./systemd.nix ./dunst.nix + ./volume-notify.nix ]; home.packages = with pkgs; [ swayidle # Screensaver diff --git a/nixcfgs/users/js0ny/programs/desktop/wayland-wm/volume-notify.nix b/nixcfgs/users/js0ny/programs/desktop/wayland-wm/volume-notify.nix new file mode 100644 index 0000000..c1597c4 --- /dev/null +++ b/nixcfgs/users/js0ny/programs/desktop/wayland-wm/volume-notify.nix @@ -0,0 +1,46 @@ +{pkgs, ...}: let + volume-notify = pkgs.writeShellApplication { + name = "volume-notify"; + + runtimeInputs = with pkgs; [ + wireplumber + gawk + gnugrep + libnotify + ]; + + text = '' + if [ $# -eq 0 ]; then + echo "Usage: volume-notify {up|down|mute}" + exit 1 + fi + + case "$1" in + up) + wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+ + ;; + down) + wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1- + ;; + mute) + wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle + ;; + *) + echo "Invalid argument: $1" + exit 1 + ;; + esac + + if wpctl get-volume @DEFAULT_AUDIO_SINK@ | grep -q 'MUTED'; then + TEXT="Volume: Muted" + else + VOLUME=$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{print $2 * 100}') + TEXT="Volume: ''${VOLUME}%" + fi + + notify-send -h string:x-canonical-private-synchronous:volume -t 1500 "🔊 Audio" "$TEXT" + ''; + }; +in { + home.packages = [volume-notify]; +} From 877cabbb42b4f90065663711fdcedf5da4c962b3 Mon Sep 17 00:00:00 2001 From: js0ny Date: Sun, 15 Mar 2026 21:49:09 +0000 Subject: [PATCH 4/4] dot(pw): mic name --- .../modules/nixos/desktop/host-machine.nix | 1 + nixcfgs/modules/nixos/hardware/pipewire.nix | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 nixcfgs/modules/nixos/hardware/pipewire.nix diff --git a/nixcfgs/modules/nixos/desktop/host-machine.nix b/nixcfgs/modules/nixos/desktop/host-machine.nix index af2d1bb..43c2c84 100644 --- a/nixcfgs/modules/nixos/desktop/host-machine.nix +++ b/nixcfgs/modules/nixos/desktop/host-machine.nix @@ -2,6 +2,7 @@ imports = [ ./xremap.nix ./diskutil.nix + ../hardware/pipewire.nix ]; # Use the systemd-boot EFI boot loader. boot.loader.systemd-boot.enable = true; diff --git a/nixcfgs/modules/nixos/hardware/pipewire.nix b/nixcfgs/modules/nixos/hardware/pipewire.nix new file mode 100644 index 0000000..bf60492 --- /dev/null +++ b/nixcfgs/modules/nixos/hardware/pipewire.nix @@ -0,0 +1,19 @@ +{...}: { + environment.etc."wireplumber/wireplumber.conf.d/51-rename-alsa-devices.conf".text = '' + + monitor.alsa.rules = [ + { + matches = [ + { + node.name = "alsa_input.pci-0000_65_00.6.analog-stereo" + } + ] + actions = { + update-props = { + node.description = "内置麦克风" + } + } + } + ] + ''; +}