From bb7c74da4b08fbd1a8553dfb7f16dd53d7487063 Mon Sep 17 00:00:00 2001 From: Jan Bulthuis Date: Wed, 17 Jul 2024 19:20:32 +0200 Subject: [PATCH] Started splitting up user and home manager configuration --- default.nix | 1149 +---------------------- merged.nix | 1124 ++++++++++++++++++++++ system.nix | 12 + test.nix | 11 + users.nix | 46 + users/base.nix | 8 + users/jan.nix | 12 + users/modules/default.nix | 10 + users/modules/tools/zathura/default.nix | 17 + 9 files changed, 1263 insertions(+), 1126 deletions(-) create mode 100644 merged.nix create mode 100644 system.nix create mode 100644 test.nix create mode 100644 users.nix create mode 100644 users/base.nix create mode 100644 users/jan.nix create mode 100644 users/modules/default.nix create mode 100644 users/modules/tools/zathura/default.nix diff --git a/default.nix b/default.nix index 1c4228f..7d25bdc 100644 --- a/default.nix +++ b/default.nix @@ -1,1134 +1,31 @@ -# Edit this configuration file to define what should be installed on -# your system. Help is available in the configuration.nix(5) man page, on -# https://search.nixos.org/options and in the NixOS manual (`nixos-help`). - { config, lib, pkgs, ... }: -let - nixvim = import (builtins.fetchGit { - url = "https://github.com/nix-community/nixvim"; - }); - stylix = import (pkgs.fetchFromGitHub { - owner = "danth"; - repo = "stylix"; - rev = "1ff9d37d27377bfe8994c24a8d6c6c1734ffa116"; - sha256 = "0dz8h1ga8lnfvvmvsf6iqvnbvxrvx3qxi0y8s8b72066mqgvy8y5"; - }); +{ + imports = [ + # Temporary until it has been subdivided into modules. + ./merged.nix - fontInstallPhase = '' - runHook preInstall + # Automation for user configuration + ./users.nix - install -Dm644 *.ttc -t $out/share/fonts/ + # System configuration options + ./system.nix - runHook postInstall - ''; - - my-wqy-zenhei = pkgs.stdenv.mkDerivation rec { - pname = "wqy-zenhei"; - version = "0.9.45"; - - src = pkgs.fetchurl { - url = "mirror://sourceforge/wqy/${pname}-${version}.tar.gz"; - hash = "sha256-5LfjBkdb+UJ9F1dXjw5FKJMMhMROqj8WfUxC8RDuddY="; - }; - - installPhase = fontInstallPhase; - }; - - my-wqy-microhei = pkgs.stdenv.mkDerivation rec { - pname = "wqy-microhei"; - version = "0.2.0-beta"; - - src = pkgs.fetchurl { - url = "mirror://sourceforge/wqy/${pname}-${version}.tar.gz"; - hash = "sha256-KAKsgCOqNqZupudEWFTjoHjTd///QhaTQb0jeHH3IT4="; - }; - - installPhase = fontInstallPhase; - }; - - my-wqy-bitmapsong = pkgs.stdenv.mkDerivation rec { - pname = "wqy-bitmapsong-pcf"; - version = "1.0.0-RC1"; - - src = pkgs.fetchurl { - url = "mirror://sourceforge/wqy/${pname}-${version}.tar.gz"; - #hash = "sha256-r2Vf7ftJCqu7jOc2AqCKaoR/r8eNw2P/OQGqbDOEyl0="; - hash = "sha256-0uvwkRUbvJ0remTnlP8dElRjaBVd6iukNYBTE/CTO7s="; - }; - - buildInputs = [ pkgs.fontforge ]; - buildPhase = '' - newName() { - test "''${1:5:1}" = i && _it=Italic || _it= - case ''${1:6:3} in - 400) test -z $it && _weight=Medium ;; - 700) _weight=Bold ;; - esac - _pt=''${1%.pcf} - _pt=''${_pt#*-} - echo "WenQuanYi_Bitmap_Song$_weight$_it$_pt" - } - - for i in *.pcf; do - fontforge -lang=ff -c "Open(\"$i\"); Generate(\"$(newName $i).otb\")" - done - ''; - installPhase = '' - install -Dm644 *.otb -t $out/share/fonts/ - ''; - }; -in { - imports = - [ - # Include home manager - - ]; - - # Enable NUR - nixpkgs.config.packageOverrides = pkgs: { - # TODO: Pin the version - nur = import (builtins.fetchTarball "https://github.com/nix-community/NUR/archive/master.tar.gz") { - inherit pkgs; - }; - }; - - # Use the systemd-boot EFI boot loader. - boot = { - loader = { - systemd-boot.enable = true; - systemd-boot.editor = false; - efi.canTouchEfiVariables = true; - timeout = 0; - }; - - tmp.cleanOnBoot = true; - - consoleLogLevel = 0; - initrd.verbose = false; - initrd.checkJournalingFS = false; - - plymouth = { - enable = false; - theme = "text"; - }; - - kernelParams = [ - "quiet" - "boot.shell_on_fail" - "loglevel=3" - "rd.systemd.show_status=false" - "rd.udev.log_level=3" - "udev.log_priority=3" - "video=efifb:nobgrt" - "bgrt_disable" - ]; - }; - - # Set up console - console = { - keyMap = "us"; - }; - - # Set up networking - networking.wireless.userControlled.enable = true; - networking.hostName = "20212060"; # Define your hostname. - networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. - networking.wireless.allowAuxiliaryImperativeNetworks = true; - - # Set up graphics - hardware.graphics.enable32Bit = true; - hardware.graphics.enable = true; - services.xserver.videoDrivers = ["nvidia"]; - hardware.nvidia = { - modesetting.enable = true; - powerManagement.enable = false; - powerManagement.finegrained = false; - open = false; - nvidiaSettings = true; - package = config.boot.kernelPackages.nvidiaPackages.stable; - prime = { - intelBusId = "PCI:0:2:0"; - nvidiaBusId = "PCI:1:0:0"; - offload = { - enable = true; - enableOffloadCmd = true; - }; - }; - }; - - # Set up tailscale - services.tailscale = { - enable = true; - useRoutingFeatures = "client"; - }; - - # Set time zone. - time.timeZone = "Europe/Amsterdam"; - - # Select internationalisation properties. - i18n.defaultLocale = "en_US.UTF-8"; - - # Allow unfree packages - nixpkgs.config.allowUnfree = true; - - # Enable sound - services.pipewire = { - enable = true; - alsa.enable = true; - pulse.enable = true; - }; - - # Set up input - services.libinput.enable = true; - - # Display manager - services.greetd = { - enable = true; - settings = { - default_session = { - command = "${pkgs.greetd.tuigreet}/bin/tuigreet --remember --greeting \"Hewwo! >_< :3\" --time --cmd river --asterisks"; - user = "greeter"; - }; - }; - }; - - # PAM setup - security.pam.services.waylock = {}; - - # Enable programs - programs.river.enable = true; - - xdg.portal = { - enable = true; - - extraPortals = [ - pkgs.xdg-desktop-portal-gtk - pkgs.xdg-desktop-portal-wlr - ]; - }; - - # Gamer moment - programs.steam.enable = true; - - # Define a user account. Don't forget to set a password with ‘passwd’. - users.users.jan = { - isNormalUser = true; - extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. - }; - - home-manager.backupFileExtension = "bak"; - home-manager.users.jan = let - # Theming constants - colors = config.home-manager.users.jan.lib.stylix.colors; - fonts = config.home-manager.users.jan.stylix.fonts; - borderSize = 1; - windowPadding = 2; - - waylockOptions = "-init-color 0x${colors.base00} -input-color 0x${colors.base02} -fail-color 0x${colors.base00}"; - in { - # Extra modules - imports = [ - nixvim.homeManagerModules.nixvim - stylix.homeManagerModules.stylix - ]; - - # Packages - home.packages = with pkgs; [ - # Programs - vscode - feishin - discord - obsidian - winbox - - # Utilities - pulsemixer - wl-clipboard - pinentry-rofi - wtype - waylock - playerctl - - # Fish plugin dependencies - grc - fzf - - # Rust development - rustc - cargo - rustfmt - - # Bitwarden - rofi-rbw - - # LaTeX libraries - (pkgs.texlive.combine { - inherit (pkgs.texlive) scheme-full; - }) - ]; - - # Allow unfree - nixpkgs.config.allowUnfree = true; - - # Stylix - stylix = { - enable = true; - polarity = "dark"; - - base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-dark-hard.yaml"; - fonts = { - monospace = { - package = pkgs.dina-font; - name = "Dina"; - }; - - sizes = { - terminal = 9; - }; - }; - - autoEnable = false; - targets = { - foot.enable = true; - nixvim.enable = true; - qutebrowser.enable = true; - vscode.enable = true; - zathura.enable = true; - }; - }; - - # Fish shell - programs.fish = { - enable = true; - - plugins = [ - { name = "done"; src = pkgs.fishPlugins.done.src; } - { name = "fzf"; src = pkgs.fishPlugins.fzf-fish.src; } - { name = "grc"; src = pkgs.fishPlugins.grc.src; } - ]; - }; - - # Bash prompt - programs.bash = { - enable = true; - initExtra = '' - if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] - then - shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" - exec ${pkgs.fish}/bin/fish $LOGIN_OPTION - fi - ''; - bashrcExtra = '' - FG_BLACK="\[$(tput setaf 0)\]" - FG_RED="\[$(tput setaf 1)\]" - FG_GREEN="\[$(tput setaf 2)\]" - FG_YELLOW="\[$(tput setaf 3)\]" - FG_BLUE="\[$(tput setaf 4)\]" - FG_MAGENTA="\[$(tput setaf 5)\]" - FG_CYAN="\[$(tput setaf 6)\]" - FG_WHITE="\[$(tput setaf 7)\]" - - RESET="\[$(tput sgr0)\]" - - export PS0="\n''${RESET}" - export PS1="''${FG_GREEN}\n│\w\n│" - export PS2="│" - ''; - }; - - # Direnv setup - programs.direnv = { - enable = true; - nix-direnv.enable = true; - }; - - # Zathura - programs.zathura = { - enable = true; - - options = { - guioptions = "none"; - }; - }; - - # Qutebrowser - programs.qutebrowser = { - enable = true; - - extraConfig = '' - config.set("colors.webpage.darkmode.enabled", False) - config.set("colors.webpage.preferred_color_scheme", "dark") - config.set("fonts.default_family", "${fonts.monospace.name}") - config.set("fonts.default_size", "${toString fonts.sizes.terminal}pt") - ''; - }; - - # Bitwarden client - programs.rbw = { - enable = true; - settings = { - base_url = "https://keys.bulthuis.dev"; - identity_url = "https://keys.bulthuis.dev"; - email = "jan@bulthuis.dev"; - pinentry = pkgs.pinentry; - }; - }; - - # Firefox - programs.firefox = { - enable = true; - policies = { - AppAutoUpdate = false; - BlockAboutAddons = true; - BlockAboutConfig = true; - BlockAboutProfiles = true; - DisableAppUpdate = true; - DisableFeedbackCommands = true; - DisableMasterPasswordCreation = true; - DisablePocket = true; - DisableProfileImport = true; - DisableProfileRefresh = true; - DisableSetDesktopBackground = true; - DisableTelemetry = true; - DisplayBookmarksToolbar = "never"; - DisplayMenuBar = "never"; - DNSOverHTTPS = { Enabled = false; }; - DontCheckDefaultBrowser = true; - PasswordManagerEnabled = false; - TranslateEnabled = true; - UseSystemPrintDialog = true; - }; - profiles.nixos = { - search.default = "DuckDuckGo"; - - extensions = with pkgs.nur.repos.rycee.firefox-addons; [ - ublock-origin - ]; - - settings = { - "browser.tabs.inTitlebar" = 0; - "extensions.autoDisableScopes" = 0; - }; - - # Force overwriting configuration file - search.force = true; - containersForce = true; - }; - }; - - # Email setup - accounts.email.accounts = { - Personal = { - primary = true; - realName = "Jan Bulthuis"; - userName = "jan@bulthuis.dev"; - address = "jan@bulthuis.dev"; - thunderbird.enable = true; - - flavor = "plain"; - imap = { - host = "mail.bulthuis.dev"; - port = 993; - }; - smtp = { - host = "mail.bulthuis.dev"; - port = 465; - }; - }; - }; - - # Thunderbird setup - programs.thunderbird = { - enable = true; - profiles.nixos = { - isDefault = true; - }; - }; - - # Rofi setup - programs.rofi = { - enable = true; - package = pkgs.rofi-wayland; - font = "${fonts.monospace.name} ${toString fonts.sizes.terminal}"; - theme = let - inherit (config.home-manager.users.jan.lib.formats.rasi) mkLiteral; - in { - "*" = { - background-color = mkLiteral "rgba(0, 0, 0, 0%)"; - border-color = mkLiteral colors.withHashtag.base05; - text-color = mkLiteral colors.withHashtag.base05; - }; - mainbox = { - background-color = mkLiteral colors.withHashtag.base00; - border = mkLiteral "${toString borderSize}px"; - }; - element-text = { - highlight = mkLiteral colors.withHashtag.base09; - }; - inputbar = { - children = mkLiteral "[textbox-search, entry]"; - }; - listview = { - padding = mkLiteral "2px 0px"; - }; - textbox-search = { - expand = false; - content = "> "; - }; - "inputbar, message" = { - padding = mkLiteral "2px"; - }; - element = { - padding = mkLiteral "0px 2px"; - }; - "element selected" = { - background-color = mkLiteral colors.withHashtag.base02; - }; - }; - }; - - # Dark mode - dconf.settings = { - "org/gnome/desktop/interface" = { - color-scheme = "prefer-dark"; - }; - }; - qt = { - enable = true; - platformTheme.name = "adwaita"; - style.name = "adwaita-dark"; - }; - systemd.user.sessionVariables = config.home-manager.users.jan.home.sessionVariables; - - # Configure GTK - gtk = let - css = '' - headerbar.default-decoration { - margin-bottom: 50px; - margin-top: -100px; - } - - window.csd, - window.csd decoration { - box-shadow: none; - } - ''; - in { - enable = true; - - # Dark mode - theme = { - name = "Adwaita-dark"; - package = pkgs.gnome-themes-extra; - }; - - # Disable CSD - gtk3.extraCss = css; - gtk4.extraCss = css; - }; - - # Cursors - home.pointerCursor = { - gtk.enable = true; - name = lib.mkForce "BreezeX-RosePine-Linux"; - package = lib.mkForce pkgs.rose-pine-cursor; - size = lib.mkForce 24; - x11 = { - defaultCursor = lib.mkForce "BreezeX-RosePine-Linux"; - enable = true; - }; - }; - - # Neovim setup - programs.nixvim = { - enable = true; - defaultEditor = true; - viAlias = true; - vimAlias = true; - - extraPackages = with pkgs; [ - ]; - - opts = { - number = true; - relativenumber = true; - - signcolumn = "yes"; - - ignorecase = true; - smartcase = true; - - tabstop = 4; - shiftwidth = 4; - softtabstop = 0; - expandtab = true; - smarttab = true; - - list = true; - listchars = "tab:»┈«,trail:·,extends:→,precedes:←,nbsp:␣"; - }; - - diagnostics = { - enable = true; - signs = true; - underline = true; - update_in_insert = true; - }; - - extraConfigLua = '' - vim.fn.sign_define("DiagnosticSignError", - {text = "", texthl = "DiagnosticSignError"}) - vim.fn.sign_define("DiagnosticSignWarn", - {text = "", texthl = "DiagnosticSignWarn"}) - vim.fn.sign_define("DiagnosticSignInfo", - {text = "", texthl = "DiagnosticSignInfo"}) - vim.fn.sign_define("DiagnosticSignHint", - {text = "💡", texthl = "DiagnosticSignHint"}) - ''; - - keymaps = [ - # Save shortcut - { - action = ":update"; - key = ""; - mode = "n"; - } - { - action = ":update"; - key = ""; - mode = "i"; - } - - # Neo tree - { - action = ":Neotree action=focus reveal toggle"; - key = "n"; - mode = "n"; - options.silent = true; - } - ]; - - autoCmd = [ - { - desc = "Automatic formatting"; - event = "BufWritePre"; - callback = { - __raw = '' - function() - vim.lsp.buf.format { - async = false, - } - end - ''; - }; - } - ]; - - highlight = { - Comment = { - italic = true; - fg = colors.withHashtag.base03; - }; - - }; - - plugins.lsp = { - enable = true; - }; - - #plugins.treesitter = { - # enable = true; - #}; - - plugins.cmp = { - enable = true; - - settings = { - mapping = { - "" = "cmp.mapping.complete()"; - "" = "cmp.mapping.scroll_docs(-4)"; - "" = "cmp.mapping.close()"; - "" = "cmp.mapping.scroll_docs(4)"; - "" = "cmp.mapping.confirm({ select = true })"; - "" = "cmp.mapping(cmp.mapping.select_prev_item(), {'i', 's'})"; - "" = "cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})"; - }; - sources = [ - { name = "path"; } - { name = "nvim_lsp"; } - ]; - }; - }; - - plugins.neo-tree = { - enable = true; - - closeIfLastWindow = true; - window = { - width = 30; - autoExpandWidth = true; - }; - - extraOptions = { - default_component_configs.git_status.symbols = { - # Change type - added = "+"; - deleted = "✕"; - modified = "✦"; - renamed = "→"; - - # Status type - untracked = "?"; - ignored = "▫"; - unstaged = "□"; - staged = "■"; - conflict = "‼"; - }; - }; - }; - - #plugins.cmp-nvim-lsp.enable = true; - - plugins.gitsigns = { - enable = true; - settings.current_line_blame = true; - }; - - #plugins.copilot-vim = { - # enable = true; - #}; - - plugins.rust-tools = { - enable = true; - }; - - plugins.vimtex = { - enable = true; - texlivePackage = null; - settings = { - view_method = "zathura"; - }; - }; - }; - programs.neovim.defaultEditor = true; - - # Foot setup - programs.foot = { - enable = true; - settings = { - main = let - font = fonts.monospace.name; - size = toString fonts.sizes.terminal; - in { - font = lib.mkForce "${font}:style=Regular:size=${size}"; - font-bold = "${font}:style=Bold:size=${size}"; - font-italic = "${font}:style=Italic:size=${size}"; - font-bold-italic = "${font}:style=Bold Italic:size=${size}"; - }; - }; - }; - - # Fuzzel setup - #programs.fuzzel = { - # enable = true; - # settings = { - # main = { - # font = "${fonts.monospace.name}:size=${toString fonts.sizes.terminal}"; -# icons-enabled = "no"; -# horizontal-pad = borderSize; -# vertical-pad = borderSize; -# inner-pad = 2; -# dpi-aware = "no"; -# }; -# colors = { -# background = colors.base00 + "ff"; -# text = colors.base05 + "ff"; -# match = colors.base09 + "ff"; -# selection = colors.base02 + "ff"; -# selection-text = colors.base05 + "ff"; -# selection-match = colors.base09 + "ff"; -# border = colors.base05 + "ff"; -# }; -# border = { -# width = borderSize; -# radius = 0; -# }; -# }; -# }; - - # Mako notifications setup - services.mako = { - enable = true; - anchor = "top-right"; - defaultTimeout = 5000; - backgroundColor = "#${colors.base00}ff"; - textColor = "#${colors.base05}ff"; - borderColor = "#${colors.base05}ff"; - progressColor = "#${colors.base09}ff"; - borderRadius = 0; - borderSize = borderSize; - font = "${fonts.monospace.name} ${toString fonts.sizes.terminal}"; - }; - - # Waybar setup - programs.waybar = { - enable = true; - systemd = { - enable = true; - }; - settings = { - mainBar = { - layer = "top"; - spacing = 16; - modules-left = [ - "river/tags" - ]; - modules-center = [ - #"river/window" - "mpris" - ]; - modules-right = [ - "pulseaudio" - "battery" - "clock" - ]; - "river/window" = { - max-length = 50; - }; - "river/tags" = { - tag-labels = [ - "一" - "二" - "三" - "四" - "五" - "六" - "七" - "八" - "九" - ]; - disable-click = false; - }; - pulseaudio = { - tooltip = false; - format = "{icon}   {volume}%"; # Spacing achieved using "Thin Space" - #format-muted = ""; - format-muted = "{icon}  --%"; # Spacing achieved using "Thin Space" - format-icons = { - #headphone = ""; - #default = [ "" "" ]; - headphone = ""; - headphone-muted = ""; - default = [ "" "" "" ]; - }; - }; - battery = { - format = "{icon} {capacity}%"; # Spacing achieved using "Thin Space" - format-charging = " {capacity}%"; # Spacing achieved using "Thin Space" - #format-icons = [ "󰂎" "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ]; - format-icons = [ "" "" "" "" "" "" "" "" "" "" "" ]; - interval = 1; - }; - clock = { - #format = "󰅐 {:%H:%M}"; - #format = "   {:%H:%M}"; # Spacing achieved using "Thin Space" - format = "{:%H:%M}"; - }; - mpris = { - format = "{dynamic}"; - tooltip-format = ""; - interval = 1; - }; - }; - }; - style = '' - window#waybar { - color: #${colors.base05}; - background-color: #${colors.base00}; - border-style: none none solid none; - border-width: ${toString borderSize}px; - border-color: #${colors.base01}; - font-size: 12px; - font-family: "${fonts.monospace.name}"; - } - - .modules-right { - margin: 0 8px 0 0; - } - - #tags button { - color: #${colors.base03}; - padding: 0 5px 1px 5px; - border-radius: 0; - font-size: 16px; - font-family: "Unifont"; - } - - #tags button.occupied { - color: #${colors.base05}; - } - - #tags button.focused { - color: #${colors.base09}; - } - - #tags.button.bell { - color: #${colors.base0A}; - } - ''; - }; - - # River setup - wayland.windowManager.river = { - enable = true; - xwayland.enable = true; - settings = let - layout = "rivertile"; - layoutOptions = "-outer-padding ${toString windowPadding} -view-padding ${toString windowPadding}"; - modes = ["normal" "locked"]; - tags = [1 2 3 4 5 6 7 8 9]; - - # Quick pow function - pow2 = power: - if power != 0 - then 2 * (pow2 (power - 1)) - else 1; - - # Modifiers - main = "Super"; - ssm = "Super+Shift"; - sas = "Super+Alt+Shift"; - sam = "Super+Alt"; - scm = "Super+Control"; - scam = "Super+Control+Alt"; - ssc = "Super+Shift+Control"; - in { - default-layout = "${layout}"; - set-repeat = "50 300"; - xcursor-theme = "BreezeX-RosePine-Linux 24"; - keyboard-layout = "-options \"caps:escape\" us"; - - border-width = toString borderSize; - background-color = "0x${colors.base00}"; - border-color-focused = "0x${colors.base05}"; - border-color-unfocused = "0x${colors.base01}"; - border-color-urgent = "0x${colors.base09}"; - - spawn = [ - "\"${layout} ${layoutOptions}\"" - "\"systemctl --user restart waybar\"" - ]; - map = (lib.attrsets.recursiveUpdate ({ - normal = { - "${main} Q" = "close"; - "${ssm} E" = "spawn \"systemctl --user stop waybar && riverctl exit\""; - - # Basic utilities - "${main} X " = "spawn \"waylock -fork-on-lock ${waylockOptions}\""; - "${ssm} Return" = "spawn foot"; - "${main} P" = "spawn \"rofi -show drun\""; - "${ssm} P" = "spawn rofi-rbw"; - - # Window focus - "${main} J" = "focus-view next"; - "${main} K" = "focus-view previous"; - - # Swap windows - "${ssm} J" = "swap next"; - "${ssm} K" = "swap previous"; - "${main} Return" = "zoom"; - - # Main ratio - "${main} H" = "send-layout-cmd rivertile 'main-ratio -0.05'"; - "${main} L" = "send-layout-cmd rivertile 'main-ratio +0.05'"; - - # Main count - "${ssm} H" = "send-layout-cmd rivertile 'main-count +1'"; - "${ssm} L" = "send-layout-cmd rivertile 'main-count -1'"; - - # Tags - "${main} 0" = "set-focused-tags ${toString (pow2 32 - 1)}"; - "${ssm} 0" = "set-view-tags ${toString (pow2 32 - 1)}"; - - # Orientation - "${main} Up" = "send-layout-cmd rivertile \"main-location top\""; - "${main} Right" = "send-layout-cmd rivertile \"main-location right\""; - "${main} Down" = "send-layout-cmd rivertile \"main-location bottom\""; - "${main} Left" = "send-layout-cmd rivertile \"main-location left\""; - - # Move floating windows - "${sam} H" = "move left 100"; - "${sam} J" = "move down 100"; - "${sam} K" = "move up 100"; - "${sam} L" = "move right 100"; - - # Snap floating windows - "${scam} H" = "snap left"; - "${scam} J" = "snap down"; - "${scam} K" = "snap up"; - "${scam} L" = "snap right"; - - # Resize floating windows - "${sas} H" = "resize horizontal -100"; - "${sas} J" = "resize vertical 100"; - "${sas} K" = "resize vertical -100"; - "${sas} L" = "resize horizontal 100"; - - # Toggle modes - "${main} Space" = "toggle-float"; - "${main} F" = "toggle-fullscreen"; - } // builtins.listToAttrs (builtins.concatLists (map (tag: [ - { name = "${main} ${toString tag}"; value = "set-focused-tags ${toString (pow2 (tag - 1))}"; } - { name = "${ssm} ${toString tag}"; value = "set-view-tags ${toString (pow2 (tag - 1))}"; } - { name = "${scm} ${toString tag}"; value = "toggle-focused-tags ${toString (pow2 (tag - 1))}"; } - { name = "${ssc} ${toString tag}"; value = "toggle-view-tags ${toString (pow2 (tag - 1))}"; } - ]) tags)); - }) (builtins.listToAttrs (map (mode: { - name = "${mode}"; - value = { - # Control volume - "None XF86AudioRaiseVolume" = "spawn \"pulsemixer --change-volume +5\""; - "None XF86AudioLowerVolume" = "spawn \"pulsemixer --change-volume -5\""; - "None XF86AudioMute" = "spawn \"pulsemixer --toggle-mute\""; - - # Control brightness - "None XF86MonBrightnessUp" = "spawn \"brightnessctl set +5%\""; - "None XF86MonBrightnessDown" = "spawn \"brightnessctl set 5%-\""; - - # Control music playback - "None XF86Messenger" = "spawn \"playerctl previous\""; - "None XF86Go" = "spawn \"playerctl play-pause\""; - "None Cancel" = "spawn \"playerctl next\""; - }; - }) modes))); - map-pointer = { - normal = { - "${main} BTN_LEFT" = "move-view"; - "${main} BTN_RIGHT" = "resize-view"; - "${main} BTN_MIDDLE" = "toggle-float"; - }; - }; - input = { - "'*'" = { - accel-profile = "adaptive"; - pointer-accel = "0.5"; - scroll-factor = "0.8"; - }; - "'*Synaptics*'" = { - natural-scroll = "enabled"; - }; - }; - rule-add = { - "-app-id" = { - "'bar'" = "csd"; - "'*'" = "ssd"; - }; - }; - }; - }; - - home.stateVersion = "24.05"; - }; - - # Global neovim - programs.neovim = { - enable = true; - defaultEditor = true; - }; - - # dconf - programs.dconf.enable = true; - - # Fonts - fonts.packages = with pkgs; [ - my-wqy-zenhei - my-wqy-microhei - my-wqy-bitmapsong - cozette - #uw-ttyp0 - #ucs-fonts - dina-font # Cool but too small :( - #unifont # Replace with Kissinger2 - #unifont_upper # Replace with Kissinger 2 - (nerdfonts.override { fonts = ["NerdFontsSymbolsOnly"]; }) - ]; - fonts.fontconfig.defaultFonts = { - serif = [ - "DejaVu Serif" - ]; - sansSerif = [ - "DejaVu Sans" - ]; - monospace = [ - "Dina" - ]; - emoji = [ - "CozetteVector" - "Noto Color Emoji" - ]; - }; - fonts.fontconfig.localConf = '' - - Dina - - Dina - Cozette - CozetteVector - Fixed - Symbols Nerd Font Mono - WenQuanYi Bitmap Song - - - ''; - - # List packages installed in system profile. To search, run: - # $ nix search wget - environment.systemPackages = with pkgs; [ - git - vim - neovim - wget - curl - brightnessctl + # Import test configuration + ./test.nix ]; - # Some programs need SUID wrappers, can be configured further or are - # started in user sessions. - # programs.mtr.enable = true; - # programs.gnupg.agent = { - # enable = true; - # enableSSHSupport = true; - # }; - - # Open ports in the firewall. - # networking.firewall.allowedTCPPorts = [ ... ]; - # networking.firewall.allowedUDPPorts = [ ... ]; - # Or disable the firewall altogether. - # networking.firewall.enable = false; - - # Copy the NixOS configuration file and link it from the resulting system - # (/run/current-system/configuration.nix). This is useful in case you - # accidentally delete configuration.nix. - system.copySystemConfiguration = true; - - # This option defines the first version of NixOS you have installed on this particular machine, - # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. - # - # Most users should NEVER change this value after the initial install, for any reason, - # even if you've upgraded your system to a new NixOS release. - # - # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, - # so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how - # to actually do that. - # - # This value being lower than the current NixOS release does NOT mean your system is - # out of date, out of support, or vulnerable. - # - # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, - # and migrated your data accordingly. - # - # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . - system.stateVersion = "24.05"; # Did you read the comment? -} + options = { + custom.laptop = lib.mkOption { + type = lib.types.bool; + default = false; + example = true; + description = "Whether the current system is a laptop."; + }; + }; + config = { + # Set the state version + system.stateVersion = "24.05" + }; +} \ No newline at end of file diff --git a/merged.nix b/merged.nix new file mode 100644 index 0000000..f72769a --- /dev/null +++ b/merged.nix @@ -0,0 +1,1124 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page, on +# https://search.nixos.org/options and in the NixOS manual (`nixos-help`). + +{ config, lib, pkgs, ... }: + +let + nixvim = import (builtins.fetchGit { + url = "https://github.com/nix-community/nixvim"; + }); + stylix = import (pkgs.fetchFromGitHub { + owner = "danth"; + repo = "stylix"; + rev = "1ff9d37d27377bfe8994c24a8d6c6c1734ffa116"; + sha256 = "0dz8h1ga8lnfvvmvsf6iqvnbvxrvx3qxi0y8s8b72066mqgvy8y5"; + }); + + fontInstallPhase = '' + runHook preInstall + + install -Dm644 *.ttc -t $out/share/fonts/ + + runHook postInstall + ''; + + my-wqy-zenhei = pkgs.stdenv.mkDerivation rec { + pname = "wqy-zenhei"; + version = "0.9.45"; + + src = pkgs.fetchurl { + url = "mirror://sourceforge/wqy/${pname}-${version}.tar.gz"; + hash = "sha256-5LfjBkdb+UJ9F1dXjw5FKJMMhMROqj8WfUxC8RDuddY="; + }; + + installPhase = fontInstallPhase; + }; + + my-wqy-microhei = pkgs.stdenv.mkDerivation rec { + pname = "wqy-microhei"; + version = "0.2.0-beta"; + + src = pkgs.fetchurl { + url = "mirror://sourceforge/wqy/${pname}-${version}.tar.gz"; + hash = "sha256-KAKsgCOqNqZupudEWFTjoHjTd///QhaTQb0jeHH3IT4="; + }; + + installPhase = fontInstallPhase; + }; + + my-wqy-bitmapsong = pkgs.stdenv.mkDerivation rec { + pname = "wqy-bitmapsong-pcf"; + version = "1.0.0-RC1"; + + src = pkgs.fetchurl { + url = "mirror://sourceforge/wqy/${pname}-${version}.tar.gz"; + #hash = "sha256-r2Vf7ftJCqu7jOc2AqCKaoR/r8eNw2P/OQGqbDOEyl0="; + hash = "sha256-0uvwkRUbvJ0remTnlP8dElRjaBVd6iukNYBTE/CTO7s="; + }; + + buildInputs = [ pkgs.fontforge ]; + buildPhase = '' + newName() { + test "''${1:5:1}" = i && _it=Italic || _it= + case ''${1:6:3} in + 400) test -z $it && _weight=Medium ;; + 700) _weight=Bold ;; + esac + _pt=''${1%.pcf} + _pt=''${_pt#*-} + echo "WenQuanYi_Bitmap_Song$_weight$_it$_pt" + } + + for i in *.pcf; do + fontforge -lang=ff -c "Open(\"$i\"); Generate(\"$(newName $i).otb\")" + done + ''; + installPhase = '' + install -Dm644 *.otb -t $out/share/fonts/ + ''; + }; +in { + imports = + [ + # Include home manager + + ]; + + # Enable NUR + nixpkgs.config.packageOverrides = pkgs: { + # TODO: Pin the version + nur = import (builtins.fetchTarball "https://github.com/nix-community/NUR/archive/master.tar.gz") { + inherit pkgs; + }; + }; + + # Use the systemd-boot EFI boot loader. + boot = { + loader = { + systemd-boot.enable = true; + systemd-boot.editor = false; + efi.canTouchEfiVariables = true; + timeout = 0; + }; + + tmp.cleanOnBoot = true; + + consoleLogLevel = 0; + initrd.verbose = false; + initrd.checkJournalingFS = false; + + plymouth = { + enable = false; + theme = "text"; + }; + + kernelParams = [ + "quiet" + "boot.shell_on_fail" + "loglevel=3" + "rd.systemd.show_status=false" + "rd.udev.log_level=3" + "udev.log_priority=3" + "video=efifb:nobgrt" + "bgrt_disable" + ]; + }; + + # Set up console + console = { + keyMap = "us"; + }; + + # Set up networking + networking.wireless.userControlled.enable = true; + networking.hostName = "20212060"; # Define your hostname. + networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. + networking.wireless.allowAuxiliaryImperativeNetworks = true; + + # Set up graphics + hardware.graphics.enable32Bit = true; + hardware.graphics.enable = true; + services.xserver.videoDrivers = ["nvidia"]; + hardware.nvidia = { + modesetting.enable = true; + powerManagement.enable = false; + powerManagement.finegrained = false; + open = false; + nvidiaSettings = true; + package = config.boot.kernelPackages.nvidiaPackages.stable; + prime = { + intelBusId = "PCI:0:2:0"; + nvidiaBusId = "PCI:1:0:0"; + offload = { + enable = true; + enableOffloadCmd = true; + }; + }; + }; + + # Set up tailscale + services.tailscale = { + enable = true; + useRoutingFeatures = "client"; + }; + + # Set time zone. + time.timeZone = "Europe/Amsterdam"; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + + # Allow unfree packages + nixpkgs.config.allowUnfree = true; + + # Enable sound + services.pipewire = { + enable = true; + alsa.enable = true; + pulse.enable = true; + }; + + # Set up input + services.libinput.enable = true; + + # Display manager + services.greetd = { + enable = true; + settings = { + default_session = { + command = "${pkgs.greetd.tuigreet}/bin/tuigreet --remember --greeting \"Hewwo! >_< :3\" --time --cmd river --asterisks"; + user = "greeter"; + }; + }; + }; + + # PAM setup + security.pam.services.waylock = {}; + + # Enable programs + programs.river.enable = true; + + xdg.portal = { + enable = true; + + extraPortals = [ + pkgs.xdg-desktop-portal-gtk + pkgs.xdg-desktop-portal-wlr + ]; + }; + + # Gamer moment + programs.steam.enable = true; + + # Define a user account. Don't forget to set a password with ‘passwd’. + # users.users.jan = { + # isNormalUser = true; + # extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. + # }; + + home-manager.backupFileExtension = "bak"; + home-manager.users.jan = let + # Theming constants + colors = config.home-manager.users.jan.lib.stylix.colors; + fonts = config.home-manager.users.jan.stylix.fonts; + borderSize = 1; + windowPadding = 2; + + waylockOptions = "-init-color 0x${colors.base00} -input-color 0x${colors.base02} -fail-color 0x${colors.base00}"; + in { + # Extra modules + imports = [ + nixvim.homeManagerModules.nixvim + stylix.homeManagerModules.stylix + ]; + + # Packages + home.packages = with pkgs; [ + # Programs + vscode + feishin + discord + obsidian + winbox + + # Utilities + pulsemixer + wl-clipboard + pinentry-rofi + wtype + waylock + playerctl + + # Fish plugin dependencies + grc + fzf + + # Rust development + rustc + cargo + rustfmt + + # Bitwarden + rofi-rbw + + # LaTeX libraries + (pkgs.texlive.combine { + inherit (pkgs.texlive) scheme-full; + }) + ]; + + # Allow unfree + nixpkgs.config.allowUnfree = false; + + # Stylix + stylix = { + enable = true; + polarity = "dark"; + + base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-dark-hard.yaml"; + fonts = { + monospace = { + package = pkgs.dina-font; + name = "Dina"; + }; + + sizes = { + terminal = 9; + }; + }; + + autoEnable = false; + targets = { + foot.enable = true; + nixvim.enable = true; + qutebrowser.enable = true; + vscode.enable = true; + zathura.enable = true; + }; + }; + + # Fish shell + programs.fish = { + enable = true; + + plugins = [ + { name = "done"; src = pkgs.fishPlugins.done.src; } + { name = "fzf"; src = pkgs.fishPlugins.fzf-fish.src; } + { name = "grc"; src = pkgs.fishPlugins.grc.src; } + ]; + }; + + # Bash prompt + programs.bash = { + enable = true; + initExtra = '' + if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] + then + shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" + exec ${pkgs.fish}/bin/fish $LOGIN_OPTION + fi + ''; + bashrcExtra = '' + FG_BLACK="\[$(tput setaf 0)\]" + FG_RED="\[$(tput setaf 1)\]" + FG_GREEN="\[$(tput setaf 2)\]" + FG_YELLOW="\[$(tput setaf 3)\]" + FG_BLUE="\[$(tput setaf 4)\]" + FG_MAGENTA="\[$(tput setaf 5)\]" + FG_CYAN="\[$(tput setaf 6)\]" + FG_WHITE="\[$(tput setaf 7)\]" + + RESET="\[$(tput sgr0)\]" + + export PS0="\n''${RESET}" + export PS1="''${FG_GREEN}\n│\w\n│" + export PS2="│" + ''; + }; + + # Direnv setup + programs.direnv = { + enable = true; + nix-direnv.enable = true; + }; + + # Qutebrowser + programs.qutebrowser = { + enable = true; + + extraConfig = '' + config.set("colors.webpage.darkmode.enabled", False) + config.set("colors.webpage.preferred_color_scheme", "dark") + config.set("fonts.default_family", "${fonts.monospace.name}") + config.set("fonts.default_size", "${toString fonts.sizes.terminal}pt") + ''; + }; + + # Bitwarden client + programs.rbw = { + enable = true; + settings = { + base_url = "https://keys.bulthuis.dev"; + identity_url = "https://keys.bulthuis.dev"; + email = "jan@bulthuis.dev"; + pinentry = pkgs.pinentry; + }; + }; + + # Firefox + programs.firefox = { + enable = true; + policies = { + AppAutoUpdate = false; + BlockAboutAddons = true; + BlockAboutConfig = true; + BlockAboutProfiles = true; + DisableAppUpdate = true; + DisableFeedbackCommands = true; + DisableMasterPasswordCreation = true; + DisablePocket = true; + DisableProfileImport = true; + DisableProfileRefresh = true; + DisableSetDesktopBackground = true; + DisableTelemetry = true; + DisplayBookmarksToolbar = "never"; + DisplayMenuBar = "never"; + DNSOverHTTPS = { Enabled = false; }; + DontCheckDefaultBrowser = true; + PasswordManagerEnabled = false; + TranslateEnabled = true; + UseSystemPrintDialog = true; + }; + profiles.nixos = { + search.default = "DuckDuckGo"; + + extensions = with pkgs.nur.repos.rycee.firefox-addons; [ + ublock-origin + ]; + + settings = { + "browser.tabs.inTitlebar" = 0; + "extensions.autoDisableScopes" = 0; + }; + + # Force overwriting configuration file + search.force = true; + containersForce = true; + }; + }; + + # Email setup + accounts.email.accounts = { + Personal = { + primary = true; + realName = "Jan Bulthuis"; + userName = "jan@bulthuis.dev"; + address = "jan@bulthuis.dev"; + thunderbird.enable = true; + + flavor = "plain"; + imap = { + host = "mail.bulthuis.dev"; + port = 993; + }; + smtp = { + host = "mail.bulthuis.dev"; + port = 465; + }; + }; + }; + + # Thunderbird setup + programs.thunderbird = { + enable = true; + profiles.nixos = { + isDefault = true; + }; + }; + + # Rofi setup + programs.rofi = { + enable = true; + package = pkgs.rofi-wayland; + font = "${fonts.monospace.name} ${toString fonts.sizes.terminal}"; + theme = let + inherit (config.home-manager.users.jan.lib.formats.rasi) mkLiteral; + in { + "*" = { + background-color = mkLiteral "rgba(0, 0, 0, 0%)"; + border-color = mkLiteral colors.withHashtag.base05; + text-color = mkLiteral colors.withHashtag.base05; + }; + mainbox = { + background-color = mkLiteral colors.withHashtag.base00; + border = mkLiteral "${toString borderSize}px"; + }; + element-text = { + highlight = mkLiteral colors.withHashtag.base09; + }; + inputbar = { + children = mkLiteral "[textbox-search, entry]"; + }; + listview = { + padding = mkLiteral "2px 0px"; + }; + textbox-search = { + expand = false; + content = "> "; + }; + "inputbar, message" = { + padding = mkLiteral "2px"; + }; + element = { + padding = mkLiteral "0px 2px"; + }; + "element selected" = { + background-color = mkLiteral colors.withHashtag.base02; + }; + }; + }; + + # Dark mode + dconf.settings = { + "org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + }; + }; + qt = { + enable = true; + platformTheme.name = "adwaita"; + style.name = "adwaita-dark"; + }; + systemd.user.sessionVariables = config.home-manager.users.jan.home.sessionVariables; + + # Configure GTK + gtk = let + css = '' + headerbar.default-decoration { + margin-bottom: 50px; + margin-top: -100px; + } + + window.csd, + window.csd decoration { + box-shadow: none; + } + ''; + in { + enable = true; + + # Dark mode + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; + + # Disable CSD + gtk3.extraCss = css; + gtk4.extraCss = css; + }; + + # Cursors + home.pointerCursor = { + gtk.enable = true; + name = lib.mkForce "BreezeX-RosePine-Linux"; + package = lib.mkForce pkgs.rose-pine-cursor; + size = lib.mkForce 24; + x11 = { + defaultCursor = lib.mkForce "BreezeX-RosePine-Linux"; + enable = true; + }; + }; + + # Neovim setup + programs.nixvim = { + enable = true; + defaultEditor = true; + viAlias = true; + vimAlias = true; + + extraPackages = with pkgs; [ + ]; + + opts = { + number = true; + relativenumber = true; + + signcolumn = "yes"; + + ignorecase = true; + smartcase = true; + + tabstop = 4; + shiftwidth = 4; + softtabstop = 0; + expandtab = true; + smarttab = true; + + list = true; + listchars = "tab:»┈«,trail:·,extends:→,precedes:←,nbsp:␣"; + }; + + diagnostics = { + enable = true; + signs = true; + underline = true; + update_in_insert = true; + }; + + extraConfigLua = '' + vim.fn.sign_define("DiagnosticSignError", + {text = "", texthl = "DiagnosticSignError"}) + vim.fn.sign_define("DiagnosticSignWarn", + {text = "", texthl = "DiagnosticSignWarn"}) + vim.fn.sign_define("DiagnosticSignInfo", + {text = "", texthl = "DiagnosticSignInfo"}) + vim.fn.sign_define("DiagnosticSignHint", + {text = "💡", texthl = "DiagnosticSignHint"}) + ''; + + keymaps = [ + # Save shortcut + { + action = ":update"; + key = ""; + mode = "n"; + } + { + action = ":update"; + key = ""; + mode = "i"; + } + + # Neo tree + { + action = ":Neotree action=focus reveal toggle"; + key = "n"; + mode = "n"; + options.silent = true; + } + ]; + + autoCmd = [ + { + desc = "Automatic formatting"; + event = "BufWritePre"; + callback = { + __raw = '' + function() + vim.lsp.buf.format { + async = false, + } + end + ''; + }; + } + ]; + + highlight = { + Comment = { + italic = true; + fg = colors.withHashtag.base03; + }; + + }; + + plugins.lsp = { + enable = true; + }; + + #plugins.treesitter = { + # enable = true; + #}; + + plugins.cmp = { + enable = true; + + settings = { + mapping = { + "" = "cmp.mapping.complete()"; + "" = "cmp.mapping.scroll_docs(-4)"; + "" = "cmp.mapping.close()"; + "" = "cmp.mapping.scroll_docs(4)"; + "" = "cmp.mapping.confirm({ select = true })"; + "" = "cmp.mapping(cmp.mapping.select_prev_item(), {'i', 's'})"; + "" = "cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})"; + }; + sources = [ + { name = "path"; } + { name = "nvim_lsp"; } + ]; + }; + }; + + plugins.neo-tree = { + enable = true; + + closeIfLastWindow = true; + window = { + width = 30; + autoExpandWidth = true; + }; + + extraOptions = { + default_component_configs.git_status.symbols = { + # Change type + added = "+"; + deleted = "✕"; + modified = "✦"; + renamed = "→"; + + # Status type + untracked = "?"; + ignored = "▫"; + unstaged = "□"; + staged = "■"; + conflict = "‼"; + }; + }; + }; + + #plugins.cmp-nvim-lsp.enable = true; + + plugins.gitsigns = { + enable = true; + settings.current_line_blame = true; + }; + + #plugins.copilot-vim = { + # enable = true; + #}; + + plugins.rust-tools = { + enable = true; + }; + + plugins.vimtex = { + enable = true; + texlivePackage = null; + settings = { + view_method = "zathura"; + }; + }; + }; + programs.neovim.defaultEditor = true; + + # Foot setup + programs.foot = { + enable = true; + settings = { + main = let + font = fonts.monospace.name; + size = toString fonts.sizes.terminal; + in { + font = lib.mkForce "${font}:style=Regular:size=${size}"; + font-bold = "${font}:style=Bold:size=${size}"; + font-italic = "${font}:style=Italic:size=${size}"; + font-bold-italic = "${font}:style=Bold Italic:size=${size}"; + }; + }; + }; + + # Fuzzel setup + #programs.fuzzel = { + # enable = true; + # settings = { + # main = { + # font = "${fonts.monospace.name}:size=${toString fonts.sizes.terminal}"; +# icons-enabled = "no"; +# horizontal-pad = borderSize; +# vertical-pad = borderSize; +# inner-pad = 2; +# dpi-aware = "no"; +# }; +# colors = { +# background = colors.base00 + "ff"; +# text = colors.base05 + "ff"; +# match = colors.base09 + "ff"; +# selection = colors.base02 + "ff"; +# selection-text = colors.base05 + "ff"; +# selection-match = colors.base09 + "ff"; +# border = colors.base05 + "ff"; +# }; +# border = { +# width = borderSize; +# radius = 0; +# }; +# }; +# }; + + # Mako notifications setup + services.mako = { + enable = true; + anchor = "top-right"; + defaultTimeout = 5000; + backgroundColor = "#${colors.base00}ff"; + textColor = "#${colors.base05}ff"; + borderColor = "#${colors.base05}ff"; + progressColor = "#${colors.base09}ff"; + borderRadius = 0; + borderSize = borderSize; + font = "${fonts.monospace.name} ${toString fonts.sizes.terminal}"; + }; + + # Waybar setup + programs.waybar = { + enable = true; + systemd = { + enable = true; + }; + settings = { + mainBar = { + layer = "top"; + spacing = 16; + modules-left = [ + "river/tags" + ]; + modules-center = [ + #"river/window" + "mpris" + ]; + modules-right = [ + "pulseaudio" + "battery" + "clock" + ]; + "river/window" = { + max-length = 50; + }; + "river/tags" = { + tag-labels = [ + "一" + "二" + "三" + "四" + "五" + "六" + "七" + "八" + "九" + ]; + disable-click = false; + }; + pulseaudio = { + tooltip = false; + format = "{icon}   {volume}%"; # Spacing achieved using "Thin Space" + #format-muted = ""; + format-muted = "{icon}  --%"; # Spacing achieved using "Thin Space" + format-icons = { + #headphone = ""; + #default = [ "" "" ]; + headphone = ""; + headphone-muted = ""; + default = [ "" "" "" ]; + }; + }; + battery = { + format = "{icon} {capacity}%"; # Spacing achieved using "Thin Space" + format-charging = " {capacity}%"; # Spacing achieved using "Thin Space" + #format-icons = [ "󰂎" "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ]; + format-icons = [ "" "" "" "" "" "" "" "" "" "" "" ]; + interval = 1; + }; + clock = { + #format = "󰅐 {:%H:%M}"; + #format = "   {:%H:%M}"; # Spacing achieved using "Thin Space" + format = "{:%H:%M}"; + }; + mpris = { + format = "{dynamic}"; + tooltip-format = ""; + interval = 1; + }; + }; + }; + style = '' + window#waybar { + color: #${colors.base05}; + background-color: #${colors.base00}; + border-style: none none solid none; + border-width: ${toString borderSize}px; + border-color: #${colors.base01}; + font-size: 12px; + font-family: "${fonts.monospace.name}"; + } + + .modules-right { + margin: 0 8px 0 0; + } + + #tags button { + color: #${colors.base03}; + padding: 0 5px 1px 5px; + border-radius: 0; + font-size: 16px; + font-family: "Unifont"; + } + + #tags button.occupied { + color: #${colors.base05}; + } + + #tags button.focused { + color: #${colors.base09}; + } + + #tags.button.bell { + color: #${colors.base0A}; + } + ''; + }; + + # River setup + wayland.windowManager.river = { + enable = true; + xwayland.enable = true; + settings = let + layout = "rivertile"; + layoutOptions = "-outer-padding ${toString windowPadding} -view-padding ${toString windowPadding}"; + modes = ["normal" "locked"]; + tags = [1 2 3 4 5 6 7 8 9]; + + # Quick pow function + pow2 = power: + if power != 0 + then 2 * (pow2 (power - 1)) + else 1; + + # Modifiers + main = "Super"; + ssm = "Super+Shift"; + sas = "Super+Alt+Shift"; + sam = "Super+Alt"; + scm = "Super+Control"; + scam = "Super+Control+Alt"; + ssc = "Super+Shift+Control"; + in { + default-layout = "${layout}"; + set-repeat = "50 300"; + xcursor-theme = "BreezeX-RosePine-Linux 24"; + keyboard-layout = "-options \"caps:escape\" us"; + + border-width = toString borderSize; + background-color = "0x${colors.base00}"; + border-color-focused = "0x${colors.base05}"; + border-color-unfocused = "0x${colors.base01}"; + border-color-urgent = "0x${colors.base09}"; + + spawn = [ + "\"${layout} ${layoutOptions}\"" + "\"systemctl --user restart waybar\"" + ]; + map = (lib.attrsets.recursiveUpdate ({ + normal = { + "${main} Q" = "close"; + "${ssm} E" = "spawn \"systemctl --user stop waybar && riverctl exit\""; + + # Basic utilities + "${main} X " = "spawn \"waylock -fork-on-lock ${waylockOptions}\""; + "${ssm} Return" = "spawn foot"; + "${main} P" = "spawn \"rofi -show drun\""; + "${ssm} P" = "spawn rofi-rbw"; + + # Window focus + "${main} J" = "focus-view next"; + "${main} K" = "focus-view previous"; + + # Swap windows + "${ssm} J" = "swap next"; + "${ssm} K" = "swap previous"; + "${main} Return" = "zoom"; + + # Main ratio + "${main} H" = "send-layout-cmd rivertile 'main-ratio -0.05'"; + "${main} L" = "send-layout-cmd rivertile 'main-ratio +0.05'"; + + # Main count + "${ssm} H" = "send-layout-cmd rivertile 'main-count +1'"; + "${ssm} L" = "send-layout-cmd rivertile 'main-count -1'"; + + # Tags + "${main} 0" = "set-focused-tags ${toString (pow2 32 - 1)}"; + "${ssm} 0" = "set-view-tags ${toString (pow2 32 - 1)}"; + + # Orientation + "${main} Up" = "send-layout-cmd rivertile \"main-location top\""; + "${main} Right" = "send-layout-cmd rivertile \"main-location right\""; + "${main} Down" = "send-layout-cmd rivertile \"main-location bottom\""; + "${main} Left" = "send-layout-cmd rivertile \"main-location left\""; + + # Move floating windows + "${sam} H" = "move left 100"; + "${sam} J" = "move down 100"; + "${sam} K" = "move up 100"; + "${sam} L" = "move right 100"; + + # Snap floating windows + "${scam} H" = "snap left"; + "${scam} J" = "snap down"; + "${scam} K" = "snap up"; + "${scam} L" = "snap right"; + + # Resize floating windows + "${sas} H" = "resize horizontal -100"; + "${sas} J" = "resize vertical 100"; + "${sas} K" = "resize vertical -100"; + "${sas} L" = "resize horizontal 100"; + + # Toggle modes + "${main} Space" = "toggle-float"; + "${main} F" = "toggle-fullscreen"; + } // builtins.listToAttrs (builtins.concatLists (map (tag: [ + { name = "${main} ${toString tag}"; value = "set-focused-tags ${toString (pow2 (tag - 1))}"; } + { name = "${ssm} ${toString tag}"; value = "set-view-tags ${toString (pow2 (tag - 1))}"; } + { name = "${scm} ${toString tag}"; value = "toggle-focused-tags ${toString (pow2 (tag - 1))}"; } + { name = "${ssc} ${toString tag}"; value = "toggle-view-tags ${toString (pow2 (tag - 1))}"; } + ]) tags)); + }) (builtins.listToAttrs (map (mode: { + name = "${mode}"; + value = { + # Control volume + "None XF86AudioRaiseVolume" = "spawn \"pulsemixer --change-volume +5\""; + "None XF86AudioLowerVolume" = "spawn \"pulsemixer --change-volume -5\""; + "None XF86AudioMute" = "spawn \"pulsemixer --toggle-mute\""; + + # Control brightness + "None XF86MonBrightnessUp" = "spawn \"brightnessctl set +5%\""; + "None XF86MonBrightnessDown" = "spawn \"brightnessctl set 5%-\""; + + # Control music playback + "None XF86Messenger" = "spawn \"playerctl previous\""; + "None XF86Go" = "spawn \"playerctl play-pause\""; + "None Cancel" = "spawn \"playerctl next\""; + }; + }) modes))); + map-pointer = { + normal = { + "${main} BTN_LEFT" = "move-view"; + "${main} BTN_RIGHT" = "resize-view"; + "${main} BTN_MIDDLE" = "toggle-float"; + }; + }; + input = { + "'*'" = { + accel-profile = "adaptive"; + pointer-accel = "0.5"; + scroll-factor = "0.8"; + }; + "'*Synaptics*'" = { + natural-scroll = "enabled"; + }; + }; + rule-add = { + "-app-id" = { + "'bar'" = "csd"; + "'*'" = "ssd"; + }; + }; + }; + }; + + home.stateVersion = "24.05"; + }; + + # Global neovim + programs.neovim = { + enable = true; + defaultEditor = true; + }; + + # dconf + programs.dconf.enable = true; + + # Fonts + fonts.packages = with pkgs; [ + my-wqy-zenhei + my-wqy-microhei + my-wqy-bitmapsong + cozette + #uw-ttyp0 + #ucs-fonts + dina-font # Cool but too small :( + #unifont # Replace with Kissinger2 + #unifont_upper # Replace with Kissinger 2 + (nerdfonts.override { fonts = ["NerdFontsSymbolsOnly"]; }) + ]; + fonts.fontconfig.defaultFonts = { + serif = [ + "DejaVu Serif" + ]; + sansSerif = [ + "DejaVu Sans" + ]; + monospace = [ + "Dina" + ]; + emoji = [ + "CozetteVector" + "Noto Color Emoji" + ]; + }; + fonts.fontconfig.localConf = '' + + Dina + + Dina + Cozette + CozetteVector + Fixed + Symbols Nerd Font Mono + WenQuanYi Bitmap Song + + + ''; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + git + vim + neovim + wget + curl + brightnessctl + ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + # networking.firewall.enable = false; + + # Copy the NixOS configuration file and link it from the resulting system + # (/run/current-system/configuration.nix). This is useful in case you + # accidentally delete configuration.nix. + system.copySystemConfiguration = true; + + # This option defines the first version of NixOS you have installed on this particular machine, + # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. + # + # Most users should NEVER change this value after the initial install, for any reason, + # even if you've upgraded your system to a new NixOS release. + # + # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, + # so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how + # to actually do that. + # + # This value being lower than the current NixOS release does NOT mean your system is + # out of date, out of support, or vulnerable. + # + # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, + # and migrated your data accordingly. + # + # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . + system.stateVersion = "24.05"; # Did you read the comment? +} \ No newline at end of file diff --git a/system.nix b/system.nix new file mode 100644 index 0000000..316193f --- /dev/null +++ b/system.nix @@ -0,0 +1,12 @@ +{ config, lib, pkgs, ... }: + +{ + options = { + custom.laptop = lib.mkOption { + type = lib.types.bool; + default = false; + example = true; + description = "Whether the current system is a laptop."; + }; + }; +} \ No newline at end of file diff --git a/test.nix b/test.nix new file mode 100644 index 0000000..14d8b3e --- /dev/null +++ b/test.nix @@ -0,0 +1,11 @@ +{ config, lib, pkgs, ... }: + +{ + config = { + custom.users.jan = { + enable = true; + sudo = true; + configuration = ./users/jan.nix; + }; + }; +} \ No newline at end of file diff --git a/users.nix b/users.nix new file mode 100644 index 0000000..4a97419 --- /dev/null +++ b/users.nix @@ -0,0 +1,46 @@ +{ config, lib, pkgs, ... }: + +let + userModule = lib.types.submodule { + options = { + enable = lib.mkOption { + type = lib.types.bool; + default = false; + example = true; + description = "Whether the user is enabled."; + }; + sudo = lib.mkOption { + type = lib.types.bool; + default = false; + example = true; + description = "Whether the user is allowed sudo access."; + }; + configuration = lib.mkOption { + type = lib.types.path; + default = ./users/base.nix; + description = "What home manager configuration to use for this user."; + }; + }; + }; +in { + options = { + custom.users = lib.mkOption { + type = lib.types.attrsOf userModule; + default = {}; + description = "Users configured on this system."; + }; + }; + + config = { + users.users = lib.attrsets.concatMapAttrs (name: value: { + ${name} = { + isNormalUser = true; + extraGroups = lib.mkIf value.sudo [ "wheel" ]; + }; + }) config.custom.users; + + home-manager.users = lib.attrsets.concatMapAttrs (name: value: { + ${name} = value.configuration; + }) config.custom.users; + }; +} \ No newline at end of file diff --git a/users/base.nix b/users/base.nix new file mode 100644 index 0000000..5802a9a --- /dev/null +++ b/users/base.nix @@ -0,0 +1,8 @@ +{ ... }: + +{ + imports = [ + # Import all modules + ./modules/default.nix + ]; +} \ No newline at end of file diff --git a/users/jan.nix b/users/jan.nix new file mode 100644 index 0000000..f9ea0ad --- /dev/null +++ b/users/jan.nix @@ -0,0 +1,12 @@ +{ ... }: + +{ + imports = [ + # Import base configuration + ./base.nix + ]; + + config = { + modules.zathura.enable = true; + }; +} \ No newline at end of file diff --git a/users/modules/default.nix b/users/modules/default.nix new file mode 100644 index 0000000..cbf7966 --- /dev/null +++ b/users/modules/default.nix @@ -0,0 +1,10 @@ +{ input, pkgs, config, ... }: + +{ + # Set the state version + home.stateVersion = "24.05"; + + imports = [ + ./tools/zathura/default.nix + ]; +} \ No newline at end of file diff --git a/users/modules/tools/zathura/default.nix b/users/modules/tools/zathura/default.nix new file mode 100644 index 0000000..b1f7e0c --- /dev/null +++ b/users/modules/tools/zathura/default.nix @@ -0,0 +1,17 @@ +{config, lib, pkgs, ... }: + +let + cfg = config.modules.zathura; +in { + options.modules.zathura.enable = lib.mkEnableOption "zathura"; + + config = lib.mkIf cfg.enable { + programs.zathura = { + enable = true; + + options = { + guioptions = "none"; + }; + }; + }; +} \ No newline at end of file