diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..37e0011 --- /dev/null +++ b/default.nix @@ -0,0 +1,1137 @@ +# 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 generated hardware configuration + ./hardware-configuration.nix + + # 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 + ]; + + # 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? +} +