From ccf46b865e00044e8b150c9213495f83f086a4b1 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 25 Apr 2025 23:10:55 +0800 Subject: [PATCH] init --- README.md | 172 ++ flake.lock | 103 + flake.nix | 82 + home/core.nix | 112 + home/desktop.nix | 56 + home/server.nix | 26 + libs/default.nix | 8 + libs/mkNixosSystem.nix | 22 + modules/home/develop.nix | 18 + modules/home/fcitx.nix | 26 + .../home/hyprland/conf/hypr/animations.conf | 23 + modules/home/hyprland/conf/hypr/hyprland.conf | 143 ++ .../home/hyprland/conf/hypr/keybindings.conf | 146 ++ modules/home/hyprland/conf/hypr/monitors.conf | 22 + modules/home/hyprland/conf/hypr/nvidia.conf | 26 + .../conf/hypr/scripts/brightnesscontrol.sh | 42 + .../hyprland/conf/hypr/scripts/cliphist.sh | 64 + .../hyprland/conf/hypr/scripts/create-dirs.sh | 4 + .../conf/hypr/scripts/dontkillsteam.sh | 5 + .../hyprland/conf/hypr/scripts/gamemode.sh | 14 + .../conf/hypr/scripts/logoutlaunch.sh | 49 + .../hyprland/conf/hypr/scripts/modeswitch.sh | 52 + .../conf/hypr/scripts/resetxdgportal.sh | 12 + .../conf/hypr/scripts/systemupdate.sh | 27 + .../hyprland/conf/hypr/scripts/themeselect.sh | 49 + .../hyprland/conf/hypr/scripts/themeswitch.sh | 125 ++ .../conf/hypr/scripts/volumecontrol.sh | 76 + modules/home/hyprland/conf/hypr/theme.conf | 41 + .../home/hyprland/conf/hypr/userprefs.conf | 19 + .../home/hyprland/conf/hypr/windowrules.conf | 30 + modules/home/hyprland/conf/kitty/kitty.conf | 88 + modules/home/hyprland/conf/mako/config | 28 + modules/home/hyprland/conf/rofi/config.rasi | 126 ++ .../home/hyprland/conf/waybar/config.jsonc | 205 ++ modules/home/hyprland/conf/waybar/style.css | 143 ++ .../conf/wlogout/icons/hibernate_dark.png | Bin 0 -> 17133 bytes .../conf/wlogout/icons/hibernate_light.png | Bin 0 -> 8061 bytes .../hyprland/conf/wlogout/icons/lock_dark.png | Bin 0 -> 10224 bytes .../conf/wlogout/icons/lock_light.png | Bin 0 -> 11112 bytes .../conf/wlogout/icons/logout_dark.png | Bin 0 -> 9045 bytes .../conf/wlogout/icons/logout_light.png | Bin 0 -> 6858 bytes .../conf/wlogout/icons/reboot_dark.png | Bin 0 -> 15512 bytes .../conf/wlogout/icons/reboot_light.png | Bin 0 -> 17669 bytes .../conf/wlogout/icons/shutdown_dark.png | Bin 0 -> 16101 bytes .../conf/wlogout/icons/shutdown_light.png | Bin 0 -> 7851 bytes .../conf/wlogout/icons/suspend_dark.png | Bin 0 -> 16347 bytes .../conf/wlogout/icons/suspend_light.png | Bin 0 -> 19168 bytes modules/home/hyprland/conf/wlogout/layout_1 | 41 + modules/home/hyprland/conf/wlogout/layout_2 | 27 + .../home/hyprland/conf/wlogout/style_1.css | 104 + .../home/hyprland/conf/wlogout/style_2.css | 82 + modules/home/hyprland/default.nix | 93 + modules/home/hyprland/env.nix | 39 + modules/home/theme.nix | 47 + modules/home/v2ray/default.nix | 11 + modules/home/vscode/default.nix | 31 + modules/home/vscode/keybindings.json | 69 + modules/home/vscode/settings.json | 52 + modules/home/wechat.nix | 11 + modules/home/xdg.nix | 84 + modules/home/zsh/default.nix | 46 + modules/home/zsh/powerlevel10k/p10k.zsh | 1844 +++++++++++++++++ modules/nixos/adb.nix | 5 + modules/nixos/audio.nix | 26 + modules/nixos/core/boot.nix | 22 + modules/nixos/core/default.nix | 41 + modules/nixos/core/system.nix | 104 + modules/nixos/fonts/default.nix | 43 + modules/nixos/fonts/fhs-fonts.nix | 25 + modules/nixos/gnome.nix | 47 + modules/nixos/nvidia.nix | 28 + modules/nixos/samba.nix | 39 + modules/nixos/sysatomic.nix | 61 + modules/nixos/user.nix | 70 + modules/nixos/virtualize/android.nix | 7 + modules/nixos/virtualize/appimage.nix | 9 + modules/nixos/virtualize/docker.nix | 14 + modules/nixos/virtualize/libvirtd/default.nix | 45 + modules/nixos/virtualize/libvirtd/hooks.nix | 37 + .../qemu.d/win11/prepare/begin/start.sh | 44 + .../libvirtd/qemu.d/win11/release/end/stop.sh | 13 + modules/nixos/virtualize/nixos-generators.nix | 6 + modules/nixos/virtualize/virtualbox.nix | 15 + modules/nixos/virtualize/wine.nix | 12 + modules/nixos/zfs.nix | 7 + nixos-install.sh | 5 + nixos-switch.sh | 3 + nixpkgs.nix | 8 + non-nixos-install.sh | 6 + overlays/default.nix | 41 + pkgs/default.nix | 5 + pkgs/waydroid-script/default.nix | 67 + pkgs/waydroid-script/setup.py | 16 + profiles/apollo/configuration.nix | 67 + profiles/apollo/default.nix | 14 + profiles/apollo/hardware-configuration.nix | 58 + profiles/apollo/hm/default.nix | 6 + profiles/apollo/hm/hyprland.nix | 11 + profiles/apollo/hm/ssh/config | 66 + profiles/apollo/hm/ssh/default.nix | 10 + profiles/apollo/mount.nix | 91 + profiles/apollo/network.nix | 42 + profiles/gaea/configuration.nix | 52 + profiles/gaea/default.nix | 14 + profiles/gaea/hardware-configuration.nix | 58 + profiles/gaea/hm/default.nix | 6 + profiles/gaea/hm/hyprland.nix | 15 + profiles/gaea/hm/ssh.nix | 61 + profiles/gaea/mount.nix | 26 + profiles/gaea/network.nix | 42 + profiles/luna/configuration.nix | 42 + profiles/luna/default.nix | 14 + profiles/luna/hardware-configuration.nix | 58 + profiles/luna/network.nix | 30 + 114 files changed, 6419 insertions(+) create mode 100644 README.md create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 home/core.nix create mode 100644 home/desktop.nix create mode 100644 home/server.nix create mode 100644 libs/default.nix create mode 100644 libs/mkNixosSystem.nix create mode 100644 modules/home/develop.nix create mode 100644 modules/home/fcitx.nix create mode 100644 modules/home/hyprland/conf/hypr/animations.conf create mode 100644 modules/home/hyprland/conf/hypr/hyprland.conf create mode 100644 modules/home/hyprland/conf/hypr/keybindings.conf create mode 100644 modules/home/hyprland/conf/hypr/monitors.conf create mode 100644 modules/home/hyprland/conf/hypr/nvidia.conf create mode 100755 modules/home/hyprland/conf/hypr/scripts/brightnesscontrol.sh create mode 100755 modules/home/hyprland/conf/hypr/scripts/cliphist.sh create mode 100644 modules/home/hyprland/conf/hypr/scripts/create-dirs.sh create mode 100755 modules/home/hyprland/conf/hypr/scripts/dontkillsteam.sh create mode 100755 modules/home/hyprland/conf/hypr/scripts/gamemode.sh create mode 100755 modules/home/hyprland/conf/hypr/scripts/logoutlaunch.sh create mode 100755 modules/home/hyprland/conf/hypr/scripts/modeswitch.sh create mode 100755 modules/home/hyprland/conf/hypr/scripts/resetxdgportal.sh create mode 100755 modules/home/hyprland/conf/hypr/scripts/systemupdate.sh create mode 100755 modules/home/hyprland/conf/hypr/scripts/themeselect.sh create mode 100755 modules/home/hyprland/conf/hypr/scripts/themeswitch.sh create mode 100755 modules/home/hyprland/conf/hypr/scripts/volumecontrol.sh create mode 100644 modules/home/hyprland/conf/hypr/theme.conf create mode 100644 modules/home/hyprland/conf/hypr/userprefs.conf create mode 100644 modules/home/hyprland/conf/hypr/windowrules.conf create mode 100644 modules/home/hyprland/conf/kitty/kitty.conf create mode 100644 modules/home/hyprland/conf/mako/config create mode 100644 modules/home/hyprland/conf/rofi/config.rasi create mode 100644 modules/home/hyprland/conf/waybar/config.jsonc create mode 100644 modules/home/hyprland/conf/waybar/style.css create mode 100644 modules/home/hyprland/conf/wlogout/icons/hibernate_dark.png create mode 100644 modules/home/hyprland/conf/wlogout/icons/hibernate_light.png create mode 100644 modules/home/hyprland/conf/wlogout/icons/lock_dark.png create mode 100644 modules/home/hyprland/conf/wlogout/icons/lock_light.png create mode 100644 modules/home/hyprland/conf/wlogout/icons/logout_dark.png create mode 100644 modules/home/hyprland/conf/wlogout/icons/logout_light.png create mode 100644 modules/home/hyprland/conf/wlogout/icons/reboot_dark.png create mode 100644 modules/home/hyprland/conf/wlogout/icons/reboot_light.png create mode 100644 modules/home/hyprland/conf/wlogout/icons/shutdown_dark.png create mode 100644 modules/home/hyprland/conf/wlogout/icons/shutdown_light.png create mode 100644 modules/home/hyprland/conf/wlogout/icons/suspend_dark.png create mode 100644 modules/home/hyprland/conf/wlogout/icons/suspend_light.png create mode 100644 modules/home/hyprland/conf/wlogout/layout_1 create mode 100644 modules/home/hyprland/conf/wlogout/layout_2 create mode 100644 modules/home/hyprland/conf/wlogout/style_1.css create mode 100644 modules/home/hyprland/conf/wlogout/style_2.css create mode 100644 modules/home/hyprland/default.nix create mode 100644 modules/home/hyprland/env.nix create mode 100644 modules/home/theme.nix create mode 100644 modules/home/v2ray/default.nix create mode 100644 modules/home/vscode/default.nix create mode 100644 modules/home/vscode/keybindings.json create mode 100644 modules/home/vscode/settings.json create mode 100644 modules/home/wechat.nix create mode 100644 modules/home/xdg.nix create mode 100644 modules/home/zsh/default.nix create mode 100644 modules/home/zsh/powerlevel10k/p10k.zsh create mode 100644 modules/nixos/adb.nix create mode 100644 modules/nixos/audio.nix create mode 100644 modules/nixos/core/boot.nix create mode 100644 modules/nixos/core/default.nix create mode 100644 modules/nixos/core/system.nix create mode 100644 modules/nixos/fonts/default.nix create mode 100644 modules/nixos/fonts/fhs-fonts.nix create mode 100644 modules/nixos/gnome.nix create mode 100644 modules/nixos/nvidia.nix create mode 100644 modules/nixos/samba.nix create mode 100644 modules/nixos/sysatomic.nix create mode 100644 modules/nixos/user.nix create mode 100644 modules/nixos/virtualize/android.nix create mode 100644 modules/nixos/virtualize/appimage.nix create mode 100644 modules/nixos/virtualize/docker.nix create mode 100644 modules/nixos/virtualize/libvirtd/default.nix create mode 100644 modules/nixos/virtualize/libvirtd/hooks.nix create mode 100644 modules/nixos/virtualize/libvirtd/qemu.d/win11/prepare/begin/start.sh create mode 100644 modules/nixos/virtualize/libvirtd/qemu.d/win11/release/end/stop.sh create mode 100644 modules/nixos/virtualize/nixos-generators.nix create mode 100644 modules/nixos/virtualize/virtualbox.nix create mode 100644 modules/nixos/virtualize/wine.nix create mode 100644 modules/nixos/zfs.nix create mode 100755 nixos-install.sh create mode 100755 nixos-switch.sh create mode 100644 nixpkgs.nix create mode 100644 non-nixos-install.sh create mode 100644 overlays/default.nix create mode 100644 pkgs/default.nix create mode 100644 pkgs/waydroid-script/default.nix create mode 100644 pkgs/waydroid-script/setup.py create mode 100644 profiles/apollo/configuration.nix create mode 100644 profiles/apollo/default.nix create mode 100644 profiles/apollo/hardware-configuration.nix create mode 100644 profiles/apollo/hm/default.nix create mode 100644 profiles/apollo/hm/hyprland.nix create mode 100644 profiles/apollo/hm/ssh/config create mode 100644 profiles/apollo/hm/ssh/default.nix create mode 100644 profiles/apollo/mount.nix create mode 100644 profiles/apollo/network.nix create mode 100644 profiles/gaea/configuration.nix create mode 100644 profiles/gaea/default.nix create mode 100644 profiles/gaea/hardware-configuration.nix create mode 100644 profiles/gaea/hm/default.nix create mode 100644 profiles/gaea/hm/hyprland.nix create mode 100644 profiles/gaea/hm/ssh.nix create mode 100644 profiles/gaea/mount.nix create mode 100644 profiles/gaea/network.nix create mode 100644 profiles/luna/configuration.nix create mode 100644 profiles/luna/default.nix create mode 100644 profiles/luna/hardware-configuration.nix create mode 100644 profiles/luna/network.nix diff --git a/README.md b/README.md new file mode 100644 index 0000000..6b2d78f --- /dev/null +++ b/README.md @@ -0,0 +1,172 @@ +# NixOS 和 Home Manager 配置 + +这是一个基于 Nix Flakes 的 NixOS 和 Home Manager 配置仓库,支持多台机器的配置管理。当前系统版本基于 NixOS 24.11。 + +## 目录结构 + +``` +├── home # home manager 配置信息 +│ ├── core.nix # 核心的通用配置,由其他配置引入 +│ ├── desktop.nix # 桌面环境配置 +│ └── server.nix # 服务器配置 +├── libs # 自定义库函数 +│ ├── default.nix # 导出所有库函数 +│ └── mkNixosSystem.nix # 创建nixosSystem的通用函数 +├── modules # 通用模块,不同机器可以根据的需要引入 +│ ├── home # home manager 通用模块 +│ │ └── - # home manager 通用模块 +│ └── nixos # nixos 通用模块 +│ └── - # nixos 通用模块 +├── overlays # 安装包的修改配置 +│ └── - # 安装包的修改配置 +├── pkgs # 自定义软件包 +│ └── - +├── profiles # 不同机器的配置文件, 放置只有特定主机可以使用的配置 +│ ├── apollo # 主服务器配置 +│ │ ├── configuration.nix # 主要配置文件,包含系统模块、服务、用户设置等 +│ │ └── default.nix # 入口文件,负责创建nixosSystem并选择使用的nixpkgs版本 +│ ├── gaea # 主用机配置 +│ │ ├── configuration.nix # 主要配置文件,包含系统模块、服务、用户设置等 +│ │ └── default.nix # 入口文件,负责创建nixosSystem并选择使用的nixpkgs版本 +│ └── luna # 虚拟机配置 +│ ├── configuration.nix # 主要配置文件,包含系统模块、服务、用户设置等 +│ └── default.nix # 入口文件,负责创建nixosSystem并选择使用的nixpkgs版本 +├── flake.lock # flake 锁定文件 +├── flake.nix # nix flake 入口 +├── nixos-install.sh # nixos 全新安装脚本 +├── nixos-switch.sh # 日常更新系统脚本 +├── non-nixos-install.sh # 非NixOS系统安装home-manager配置脚本 +└── nixpkgs.nix # 从flake.lock中提取nixpkgs版本信息,用于非flake命令 +``` + +## 如何安装? + +0. 准备一个 64 位的 nixos [minimal iso image](https://channels.nixos.org/nixos-24.11/latest-nixos-minimal-x86_64-linux.iso) 烧录好,然后进入 live 系统。 +1. 分区 + +使用 fdisk 或 parted 工具进行分区。现在假设两个分区为:`/dev/sda1` `/dev/sda2`。 + +```bash +# 使用parted分区 +parted /dev/nvme0n1 mklabel gpt +parted /dev/nvme0n1 mkpart primary fat32 1MiB 1024MiB +parted /dev/nvme0n1 mkpart primary btrfs 1024MiB 95% +``` + +2. 格式化分区 + +```bash + mkfs.fat -F 32 /dev/nvme0n1p1 # boot / EFI 分区 + mkfs.btrfs /dev/nvme0n1p2 # 系统分区 +``` + +3. 挂载 + +```bash + mount /dev/nvme0n1p2 /mnt + btrfs subvolume create /mnt/home # home 分区 + btrfs subvolume create /mnt/nix # nix 分区 + btrfs subvolume create /mnt/swap # swap 分区 + + umount /mnt + mount -o compress=zstd /dev/nvme0n1p2 /mnt + mkdir -p /mnt/{boot,nix,home,swap} + mount /dev/nvme0n1p1 /mnt/boot + mount -o compress=zstd,noatime,subvol=nix /dev/nvme0n1p2 /mnt/nix + mount -o compress=noatime,subvol=swap /dev/nvme0n1p2 /mnt/swap + mount -o compress=zstd,subvol=home /dev/nvme0n1p2 /mnt/home + + btrfs filesystem mkswapfile --size 16g --uuid clear /mnt/swap/swapfile +``` + +3.1 不变系统 + +如果希望使用不变原子系统(即系统更新时不会修改当前运行的系统,而是创建新的系统生成),在 profile 中引入 `modules/nixos/sysatomic.nix` 模块。这种情况下的挂载方式更简单: + +```bash + mkdir -p /mnt/{boot,nix} + mount /dev/nvme0n1p2 /mnt/nix + mount /dev/nvme0n1p1 /mnt/boot +``` + +4. 生成一个基本的配置 + +```bash + nixos-generate-config --root /mnt +``` + +5. 克隆仓库到本地 + +```bash +git clone https://github.com/synebula/.nix.git /mnt/nix/.nix +cd /mnt/nix/.nix +``` + +6. 将 /mnt/etc/nixos 中的 `hardware-configuration.nix` 拷贝到 `/mnt/.nix/profiles//hardware-configuration.nix`, 其中``指需要的 profile。 + +```bash +cp /mnt/etc/nixos/hardware-configuration.nix /mnt/.nix/profiles//hardware-configuration.nix +``` + +7. 用户名修改: 编辑 `/mnt/.nix/flake.nix` 修改 **username**、**useremail** 和 **sysversion**(系统版本)变量。 + +8. 使用 `mkpasswd {PASSWORD} -m sha-512` 命令生成的密码哈希串替换掉 `/mnt/.nix/modules/nixos/user-group.nix` 中的 `users.users..hashedPassword` 值替换掉。 + +9. 安装 + +```bash +./nixos-install.sh + +# 或者 + +nixos-install --option substituters "https://mirrors.ustc.edu.cn/nix-channels/store https://cache.nixos.org" --no-root-passwd --flake .# + +``` + +10. 重启 + +```bash +reboot +``` + +## 日常使用 + +### NixOS 系统更新 + +在完成对配置文件的修改后,使用以下命令更新系统: + +```bash +# 执行 bash alias +nixos-switch + +# 或执行本机脚本 +./nixos-switch.sh +``` + +### 非 NixOS 系统安装 home-manager 配置 + +在非 NixOS 系统上(如 Ubuntu、Arch Linux 等),可以使用以下命令安装 home-manager 配置: + +```bash +./non-nixos-install.sh +``` + +## 自定义配置 + +要添加新的机器配置,可以在`profiles`目录下创建新的目录,并根据现有的配置文件进行修改。 + +要添加新的模块,可以在`modules`目录下创建新的模块文件,并在相应的配置文件中引入。 + +## profiles 目录和 nixosSystem 创建 + +在这个配置中,我们使用了一个抽象的方法来创建 nixosSystem,同时保留了每个 profile 自行决定使用哪个版本的 nixpkgs 的能力,并简化了参数传递: + +1. **libs/mkNixosSystem.nix** - 这个文件提供了一个通用函数,用于创建 nixosSystem。它接受以下参数: + + - `args`: 从 flake.nix 传递的所有参数,包含 self、inputs、outputs、username 等 + - `nixpkgs`: 要使用的 nixpkgs (由 profile 的 default.nix 决定) + - `path`: profile 目录的路径 + +2. **profiles/[hostname]/default.nix** - 这是配置的入口文件,负责选择使用的 nixpkgs 版本并调用 libs.mkNixosSystem 函数。 + +3. **profiles/[hostname]/configuration.nix** - 包含实际的配置内容,如系统模块、服务、用户设置等。 diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..45888d9 --- /dev/null +++ b/flake.lock @@ -0,0 +1,103 @@ +{ + "nodes": { + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1744743431, + "narHash": "sha256-iyn/WBYDc7OtjSawbegINDe/gIkok888kQxk3aVnkgg=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "c61bfe3ae692f42ce688b5865fac9e0de58e1387", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "release-24.11", + "repo": "home-manager", + "type": "github" + } + }, + "home-manager-unstable": { + "inputs": { + "nixpkgs": [ + "nixpkgs-unstable" + ] + }, + "locked": { + "lastModified": 1745205007, + "narHash": "sha256-k67bEcLkSo13TIBfs0CGYkJjG12aaikabMtxWbSeqr0=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "3fbe9a2b76ff5c4dcb2a2a2027dac31cfc993c8c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "impermanence": { + "locked": { + "lastModified": 1737831083, + "narHash": "sha256-LJggUHbpyeDvNagTUrdhe/pRVp4pnS6wVKALS782gRI=", + "owner": "nix-community", + "repo": "impermanence", + "rev": "4b3e914cdf97a5b536a889e939fb2fd2b043a170", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "impermanence", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1744440957, + "narHash": "sha256-FHlSkNqFmPxPJvy+6fNLaNeWnF1lZSgqVCl/eWaJRc4=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "26d499fc9f1d567283d5d56fcf367edd815dba1d", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-24.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-unstable": { + "locked": { + "lastModified": 1744932701, + "narHash": "sha256-fusHbZCyv126cyArUwwKrLdCkgVAIaa/fQJYFlCEqiU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "b024ced1aac25639f8ca8fdfc2f8c4fbd66c48ef", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "home-manager-unstable": "home-manager-unstable", + "impermanence": "impermanence", + "nixpkgs": "nixpkgs", + "nixpkgs-unstable": "nixpkgs-unstable" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..12d453c --- /dev/null +++ b/flake.nix @@ -0,0 +1,82 @@ +{ + outputs = { self, nixpkgs, nixpkgs-unstable, home-manager, home-manager-unstable, ... }@inputs: + let + inherit (self) outputs; + inherit (nixpkgs) lib; + username = "alex"; + useremail = "reizero@live.com"; + hostname = "luna"; + sysversion = "24.11"; + libs = import ./libs; + in + rec { + # Your custom packages and modifications, exported as overlays + overlays = import ./overlays { inherit inputs; }; + + # NixOS configuration entrypoint + # Available through 'nixos-rebuild --flake .#your-hostname' + # The default.nix file in each profile directory is responsible for creating its own nixosSystem. + nixosConfigurations = + with builtins; listToAttrs (map + (profile: { + name = profile; + value = import ./profiles/${profile} { + inherit self libs inputs outputs username useremail sysversion; + }; + }) + (attrNames (readDir ./profiles)) + ); + + # Standalone home-manager configuration entrypoint + # Available through 'home-manager --flake .#your-username@your-hostname' + # Or run 'nix build .#homeConfigurations..activationPackage' in none-nixos distro first + homeConfigurations = { + "${username}" = home-manager-unstable.lib.homeManagerConfiguration { + pkgs = nixpkgs-unstable.packages.x86_64-linux; # Home-manager requires 'pkgs' instance + extraSpecialArgs = { + inherit inputs outputs username useremail sysversion; + hyprland = inputs.hyprland; + }; + modules = [ + # > Our main home-manager configuration file < + ./home/desktop.nix + + # Ony non-nixos use home-manager standalone, use this config fixing issues. + { + targets.genericLinux.enable = true; + } + ]; + }; + }; + }; + + inputs = { + # Nixpkgs + nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; + nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable"; + + # The Nix User Repository + # nur.url = github:nix-community/NUR; + + # Home manager + home-manager = { + url = "github:nix-community/home-manager/release-24.11"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + home-manager-unstable = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs-unstable"; + }; + + # Impermanence system + impermanence.url = "github:nix-community/impermanence"; + + # TODO: Add any other flake you might need + # hardware.url = "github:nixos/nixos-hardware"; + + # Shameless plug: looking for a way to nixify your themes and make + # everything match nicely? Try nix-colors! + # nix-colors.url = "github:misterio77/nix-colors"; + }; + +} diff --git a/home/core.nix b/home/core.nix new file mode 100644 index 0000000..fb39c85 --- /dev/null +++ b/home/core.nix @@ -0,0 +1,112 @@ +# This is your home-manager configuration file +# Use this to configure your home environment (it replaces ~/.config/nixpkgs/home.nix) + +{ outputs, lib, config, pkgs, username, useremail, sysversion, ... }: { + + home = { + inherit username; + homeDirectory = "/home/${username}"; + + # Add stuff for your user as you see fit: + packages = with pkgs; [ + nixpkgs-fmt + ]; + }; + + # Enable git + programs = { + git = { + enable = true; + + userName = username; + userEmail = useremail; + + includes = [ + { + # use diffrent email & name for work + path = "~/work/.gitconfig"; + condition = "gitdir:~/work/"; + } + ]; + + extraConfig = { + init.defaultBranch = "master"; + push.autoSetupRemote = true; + pull.rebase = true; + + # replace https with ssh + # url = { + # "ssh://git@github.com/" = { + # insteadOf = "https://github.com/"; + # }; + # "ssh://git@gitlab.com/" = { + # insteadOf = "https://gitlab.com/"; + # }; + # "ssh://git@bitbucket.com/" = { + # insteadOf = "https://bitbucket.com/"; + # }; + # }; + }; + + }; + + bash = { + enable = true; + enableCompletion = true; + bashrcExtra = ""; + shellAliases = { + la = "ls -la"; + ll = "ls -l"; + "nixos-switch" = "sudo nixos-rebuild switch --flake /home/${username}/.nix"; + }; + }; + + vim = { + enable = true; + defaultEditor = true; + plugins = with pkgs.vimPlugins; [ vim-airline ]; + settings = { ignorecase = true; }; + extraConfig = '' + set mouse=a + set expandtab + set tabstop=2 + set softtabstop=2 + set shiftwidth=2 + ''; + }; + }; + + + nixpkgs = { + # You can add overlays here + overlays = [ + # Add overlays your own flake exports (from overlays and pkgs dir): + outputs.overlays.additions + outputs.overlays.modifications + outputs.overlays.unstable-packages + + # You can also add overlays exported from other flakes: + # neovim-nightly-overlay.overlays.default + + # Or define it inline, for example: + # (final: prev: { + # hi = final.hello.overrideAttrs (oldAttrs: { + # patches = [ ./change-hello-to-hi.patch ]; + # }); + # }) + ]; + # Configure your nixpkgs instance + config = { + # Disable if you don't want unfree packages + allowUnfree = true; + # Workaround for https://github.com/nix-community/home-manager/issues/2942 + allowUnfreePredicate = (_: true); + }; + }; + + # Nicely reload system units when changing configs + systemd.user.startServices = "sd-switch"; + + # https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion + home.stateVersion = sysversion; +} diff --git a/home/desktop.nix b/home/desktop.nix new file mode 100644 index 0000000..7b3b1d6 --- /dev/null +++ b/home/desktop.nix @@ -0,0 +1,56 @@ +# This is your home-manager configuration file +# Use this to configure your home environment (it replaces ~/.config/nixpkgs/home.nix) + +{ inputs, outputs, lib, config, pkgs, username, useremail, ... }: +{ + # You can import other home-manager modules here + imports = [ + # If you want to use modules your own flake exports (from modules/home-manager): + # outputs.homeManagerModules.example + + # Or modules exported from other flakes (such as nix-colors): + # inputs.nix-colors.homeManagerModules.default + + # You can also split up your configuration and import pieces of it here: + ./core.nix + ../modules/home/hyprland + ../modules/home/vscode + ../modules/home/zsh + ../modules/home/xdg.nix + ../modules/home/theme.nix + ../modules/home/fcitx.nix + ../modules/home/wechat.nix + ]; + + home = { + # Add stuff for your user as you see fit: + packages = with pkgs; [ + bc # GNU software calculator + vlc + imv # image viewer + microsoft-edge + chromium + wpsoffice + yazi # terminal file manager + + zip + unzip + usbutils # lsusb etc. + lsof # lsof process util + htop # process monitor + pciutils # lspci etc. + ]; + + sessionVariables = { + JAVA_HOME = ""; + }; + }; + + + + # Enable home-manager and git + programs = { + home-manager.enable = true; + # git.enable = true; + }; +} diff --git a/home/server.nix b/home/server.nix new file mode 100644 index 0000000..4cf2f63 --- /dev/null +++ b/home/server.nix @@ -0,0 +1,26 @@ +# This is your home-manager configuration file +# Use this to configure your home environment (it replaces ~/.config/nixpkgs/home.nix) + +{ inputs, outputs, lib, config, pkgs, username, useremail, ... }: { + # You can import other home-manager modules here + imports = [ + # If you want to use modules your own flake exports (from modules/home-manager): + # outputs.homeManagerModules.example + + # Or modules exported from other flakes (such as nix-colors): + # inputs.nix-colors.homeManagerModules.default + + # You can also split up your configuration and import pieces of it here: + # ./nvim.nix + ./core.nix + ]; + + home = { + # Add stuff for your user as you see fit: + packages = with pkgs; [ + ]; + }; + + # Enable home-manager and git + programs = { }; +} diff --git a/libs/default.nix b/libs/default.nix new file mode 100644 index 0000000..da1b209 --- /dev/null +++ b/libs/default.nix @@ -0,0 +1,8 @@ +let + # 导入mkNixosSystem函数 + mkNixosSystemLib = import ./mkNixosSystem.nix; +in +{ + # 导出mkNixosSystem函数 + inherit (mkNixosSystemLib) mkNixosSystem; +} diff --git a/libs/mkNixosSystem.nix b/libs/mkNixosSystem.nix new file mode 100644 index 0000000..433e7d7 --- /dev/null +++ b/libs/mkNixosSystem.nix @@ -0,0 +1,22 @@ +# 这个文件提供了一个通用函数,用于创建nixosSystem +{ + # 创建nixosSystem的通用函数 + # 这个函数只负责创建nixosSystem,不处理nixpkgs的选择 + # args: 从flake.nix传递的所有参数 + # profile: 要使用的nixpkgs (由profile的default.nix决定) + # path: profile目录的路径 + mkNixosSystem = { args, nixpkgs, path }: + let + # 获取profile名称(目录名) + profile = builtins.baseNameOf path; + specialArgs = args // { hostname = profile; }; # 添加hostname + in + nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + inherit specialArgs; + modules = [ + # 导入configuration.nix模块,其中包含了实际的配置 + "${path}/configuration.nix" + ]; + }; +} diff --git a/modules/home/develop.nix b/modules/home/develop.nix new file mode 100644 index 0000000..607643a --- /dev/null +++ b/modules/home/develop.nix @@ -0,0 +1,18 @@ +{ pkgs, ... }: + +{ + imports = [ + ]; + + home = { + packages = with pkgs.unstable; [ + dbeaver-bin + go + nodejs + yarn + + steam-run + jetbrains.idea-community + ]; + }; +} diff --git a/modules/home/fcitx.nix b/modules/home/fcitx.nix new file mode 100644 index 0000000..5ab3647 --- /dev/null +++ b/modules/home/fcitx.nix @@ -0,0 +1,26 @@ +# 输入法配置模块 +{ config, lib, pkgs, ... }: { + + i18n.inputMethod = { + enabled = "fcitx5"; + fcitx5 = { + addons = with pkgs; [ + fcitx5-gtk + fcitx5-chinese-addons + fcitx5-nord + ]; + waylandFrontend = true; # available in home-manager-25.05 + }; + }; + + gtk = { + gtk3.extraConfig = lib.mkOptionDefault { + gtk-im-module = "fcitx"; + }; + + gtk4.extraConfig = lib.mkOptionDefault { + gtk-im-module = "fcitx"; + }; + }; + +} diff --git a/modules/home/hyprland/conf/hypr/animations.conf b/modules/home/hyprland/conf/hypr/animations.conf new file mode 100644 index 0000000..6246d41 --- /dev/null +++ b/modules/home/hyprland/conf/hypr/animations.conf @@ -0,0 +1,23 @@ + +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ + + +# Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more + +animations { + enabled = yes + bezier = wind, 0.05, 0.9, 0.1, 1.05 + bezier = winIn, 0.1, 1.1, 0.1, 1.1 + bezier = winOut, 0.3, -0.3, 0, 1 + bezier = liner, 1, 1, 1, 1 + animation = windows, 1, 6, wind, slide + animation = windowsIn, 1, 6, winIn, slide + animation = windowsOut, 1, 5, winOut, slide + animation = windowsMove, 1, 5, wind, slide + animation = border, 1, 1, liner + animation = borderangle, 1, 30, liner, loop + animation = fade, 1, 10, default + animation = workspaces, 1, 5, wind +} + diff --git a/modules/home/hyprland/conf/hypr/hyprland.conf b/modules/home/hyprland/conf/hypr/hyprland.conf new file mode 100644 index 0000000..e3ddc5a --- /dev/null +++ b/modules/home/hyprland/conf/hypr/hyprland.conf @@ -0,0 +1,143 @@ +###################################################################################### +#AUTOGENERATED HYPR CONFIG. +#PLEASE USE THE CONFIG PROVIDED IN THE GIT REPO /examples/hypr.conf AND EDIT IT, +#OR EDIT THIS ONE ACCORDING TO THE WIKI INSTRUCTIONS. +######################################################################################## + +# Please note not all available settings / options are set here. +# For a full list, see the wiki +# autogenerated = 1 # remove this line to remove the warning + + + +# █▀▄▀█ █▀█ █▄░█ █ ▀█▀ █▀█ █▀█ +# █░▀░█ █▄█ █░▀█ █ ░█░ █▄█ █▀▄ + +# See https://wiki.hyprland.org/Configuring/Monitors/ + +# monitor = DP-1, 2560x1080@144, 0x0, 1 +monitor = ,preferred,auto,auto + + + +# █░░ ▄▀█ █░█ █▄░█ █▀▀ █░█ +# █▄▄ █▀█ █▄█ █░▀█ █▄▄ █▀█ + +# See https://wiki.hyprland.org/Configuring/Keywords/ for more +# Execute your favorite apps at launch + +exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP # for XDPH +exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP # for XDPH +exec-once = /usr/lib/polkit-kde-authentication-agent-1 # authentication dialogue for GUI apps +exec-once = waybar # launch the system panel +exec-once = blueman-applet # systray app for BT +exec-once = nm-applet --indicator # systray app for Network/Wifi +exec-once = mako # start notification demon +exec-once = wl-paste --type text --watch cliphist store # clipboard store text data +exec-once = wl-paste --type image --watch cliphist store # clipboard store image data +exec-once = ~/.config/swww/swwwallpaper.sh # start wallpaper daemon +exec-once = fcitx5 -d -r +#exec-once = swayidle -w timeout 900 'hyprctl dispatch dpms off' resume 'hyprctl dispatch dpms on' # turn off monitor after 15 mins + + + +# █▀▀ █▄░█ █░█ +# ██▄ █░▀█ ▀▄▀ + +# Some default env vars. + +# env = XDG_CURRENT_DESKTOP,Hyprland +# env = XDG_SESSION_TYPE,wayland +# env = XDG_SESSION_DESKTOP,Hyprland +# env = GDK_BACKEND,wayland +# env = QT_QPA_PLATFORM,wayland +# #env = QT_STYLE_OVERRIDE,kvantum +# env = QT_QPA_PLATFORMTHEME,qt5ct +# env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1 +# env = QT_AUTO_SCREEN_SCALE_FACTOR,1 +# env = XDG_PICTURES_DIR,$HOME/Pictures + + + +# █ █▄░█ █▀█ █░█ ▀█▀ +# █ █░▀█ █▀▀ █▄█ ░█░ + +# For all categories, see https://wiki.hyprland.org/Configuring/Variables/ + +input { + kb_layout = us + kb_variant = + kb_model = + kb_options = + kb_rules = + follow_mouse = 0 # 0 = disabled, 1 = enabled, 2 = enabled but only when mouse is over a window + + touchpad { + natural_scroll = no + } + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. + force_no_accel = 1 + numlock_by_default = true +} + +# Example per-device config +# See https://wiki.hyprland.org/Configuring/Keywords/#executing for more + +#device:epic mouse V1 { +# sensitivity = -0.5 +#} + +# See https://wiki.hyprland.org/Configuring/Variables/ for more + +gestures { + workspace_swipe = true + workspace_swipe_fingers = 3 +} + + + +# █░░ ▄▀█ █▄█ █▀█ █░█ ▀█▀ █▀ +# █▄▄ █▀█ ░█░ █▄█ █▄█ ░█░ ▄█ + +# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more + +dwindle { + pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = yes # you probably want this +} + +# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more + +#master { +# new_is_master = true +#} + + + +# █▀▄▀█ █ █▀ █▀▀ +# █░▀░█ █ ▄█ █▄▄ + +# See https://wiki.hyprland.org/Configuring/Variables/ for more + +misc { + vrr = 0 +} + + + +# █▀ █▀█ █░█ █▀█ █▀▀ █▀▀ +# ▄█ █▄█ █▄█ █▀▄ █▄▄ ██▄ + +# Source a file (multi-file configs) +# source = ~/.config/hypr/myColors.conf + +source = ~/.config/hypr/animations.conf +source = ~/.config/hypr/keybindings.conf +source = ~/.config/hypr/windowrules.conf +source = ~/.config/hypr/theme.conf +source = ~/.config/hypr/monitors.conf # initially empty, to be configured by user and remains static +source = ~/.config/hypr/userprefs.conf # initially empty, to be configured by user and remains static + +# Note: as userprefs.conf is sourced at the end, settings configured in this file will override the defaults + diff --git a/modules/home/hyprland/conf/hypr/keybindings.conf b/modules/home/hyprland/conf/hypr/keybindings.conf new file mode 100644 index 0000000..4c2a995 --- /dev/null +++ b/modules/home/hyprland/conf/hypr/keybindings.conf @@ -0,0 +1,146 @@ +# █▄▀ █▀▀ █▄█ █▄▄ █ █▄░█ █▀▄ █ █▄░█ █▀▀ █▀ +# █░█ ██▄ ░█░ █▄█ █ █░▀█ █▄▀ █ █░▀█ █▄█ ▄█ + + +# See https://wiki.hyprland.org/Configuring/Keywords/ for more +# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more + +################################################ +# Main modifier +################################################ +$mainMod = SUPER # windows key +$terminal = kitty +$filemanager = dolphin + + + +################################################ +# Main actions +################################################ +bind = $mainMod, Q, exec, ~/.config/hypr/scripts/dontkillsteam.sh # killactive, # kill the window on focus +bind = $mainMod CTRL, delete, exit, # kill hyperland session +bind = $mainMod, F, togglefloating, # toggle the window on focus to float +bind = $mainMod, L, exec, swaylock # lock screen +bind = $mainMod, P, pseudo, # dwindle +bind = $mainMod, S, togglesplit, # split screen +bind = $mainMod, return, fullscreen, # toggle the window on focus to fullscreen + +# Application shortcuts +bind = $mainMod, grave, exec, $terminal # ~ open terminal +bind = $mainMod, E, exec, $filemanager # open file manager +bind = $mainMod, V, exec, code # open vscode + +################################################ +# Control actions +################################################ +# Rofi is toggled on/off if you repeat the key presses +bind = $mainMod, SPACE, exec, pkill rofi || rofi -show drun # launch desktop applications +bind = $mainMod, tab, exec, pkill rofi || rofi -show window # switch between desktop applications +bind = $mainMod, D, exec, pkill rofi || rofi -show filebrowser # browse system files +bind = $mainMod, R, exec, pkill rofi || rofi -show run # run a command + +# Audio control +# bind = , F10, exec, ~/.config/hypr/scripts/volumecontrol.sh -o m # toggle audio mute +# binde = , F11, exec, ~/.config/hypr/scripts/volumecontrol.sh -o d # decrease volume +# binde = , F12, exec, ~/.config/hypr/scripts/volumecontrol.sh -o i # increase volume +bind = , XF86AudioMute, exec, ~/.config/hypr/scripts/volumecontrol.sh -o m # toggle audio mute +bind = , XF86AudioMicMute, exec, ~/.config/hypr/scripts/volumecontrol.sh -i m # toggle microphone mute +binde = , XF86AudioLowerVolume, exec, ~/.config/hypr/scripts/volumecontrol.sh -o d # decrease volume +binde = , XF86AudioRaiseVolume, exec, ~/.config/hypr/scripts/volumecontrol.sh -o i # increase volume +bind = , XF86AudioPlay, exec, playerctl play-pause +bind = , XF86AudioPause, exec, playerctl play-pause +bind = , XF86AudioNext, exec, playerctl next +bind = , XF86AudioPrev, exec, playerctl previous + +# Brightness control +binde = , XF86MonBrightnessUp, exec, ~/.config/hypr/scripts/brightnesscontrol.sh i # increase brightness +binde = , XF86MonBrightnessDown, exec, ~/.config/hypr/scripts/brightnesscontrol.sh d # decrease brightness + +# Screenshot/screencapture +bind = , PRINT, exec, hyprshot -m window # logout menu +bind = ALT, PRINT, exec, hyprshot -m region # logout menu +bind = $CONTROL SHIFT, P, pass, ^(com\.obsproject\.Studio)$ # start/stop obs screen recording + + +################################################ +# Exec custom scripts +################################################ +bind = $mainMod, G, exec, ~/.config/hypr/scripts/gamemode.sh # disable hypr effects for gamemode + + + +################################################ +# Window actions +################################################ +# Move focus with mainMod + arrow keys +bind = $mainMod, left, movefocus, l +bind = $mainMod, right, movefocus, r +bind = $mainMod, up, movefocus, u +bind = $mainMod, down, movefocus, d +bind = ALT, Tab, movefocus, d + +# Resize windows +binde = $mainMod CONTROL, right, resizeactive, 10 0 +binde = $mainMod CONTROL, left, resizeactive, -10 0 +binde = $mainMod CONTROL, up, resizeactive, 0 -10 +binde = $mainMod CONTROL, down, resizeactive, 0 10 + +# Move Window with mainMod + SHIFT + arrow keys +bind = $mainMod SHIFT, left, movewindow, l +bind = $mainMod SHIFT, right, movewindow, r +bind = $mainMod SHIFT, up, movewindow, u +bind = $mainMod SHIFT, down, movewindow, d + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + + +################################################ +# Workspace actions +################################################ +# Switch workspaces with mainMod + [0-9] +bind = $mainMod, 1, workspace, 1 +bind = $mainMod, 2, workspace, 2 +bind = $mainMod, 3, workspace, 3 +bind = $mainMod, 4, workspace, 4 +bind = $mainMod, 5, workspace, 5 +bind = $mainMod, 6, workspace, 6 +bind = $mainMod, 7, workspace, 7 +bind = $mainMod, 8, workspace, 8 +bind = $mainMod, 9, workspace, 9 +bind = $mainMod, 0, workspace, 10 + +# Move active window to a workspace with mainMod + SHIFT + [0-9] +bind = $mainMod SHIFT, 1, movetoworkspace, 1 +bind = $mainMod SHIFT, 2, movetoworkspace, 2 +bind = $mainMod SHIFT, 3, movetoworkspace, 3 +bind = $mainMod SHIFT, 4, movetoworkspace, 4 +bind = $mainMod SHIFT, 5, movetoworkspace, 5 +bind = $mainMod SHIFT, 6, movetoworkspace, 6 +bind = $mainMod SHIFT, 7, movetoworkspace, 7 +bind = $mainMod SHIFT, 8, movetoworkspace, 8 +bind = $mainMod SHIFT, 9, movetoworkspace, 9 +bind = $mainMod SHIFT, 0, movetoworkspace, 10 + +# Move window to workspace Super + Alt + [0-9] +bind = $mainMod ALT, 1, movetoworkspacesilent, 1 +bind = $mainMod ALT, 2, movetoworkspacesilent, 2 +bind = $mainMod ALT, 3, movetoworkspacesilent, 3 +bind = $mainMod ALT, 4, movetoworkspacesilent, 4 +bind = $mainMod ALT, 5, movetoworkspacesilent, 5 +bind = $mainMod ALT, 6, movetoworkspacesilent, 6 +bind = $mainMod ALT, 7, movetoworkspacesilent, 7 +bind = $mainMod ALT, 8, movetoworkspacesilent, 8 +bind = $mainMod ALT, 9, movetoworkspacesilent, 9 +bind = $mainMod ALT, 0, movetoworkspacesilent, 10 + +# Special workspaces (scratchpad) +bind = $mainMod ALT, S, movetoworkspacesilent, special +bind = $mainMod CONTROL, S, togglespecialworkspace, + +# Scroll through existing workspaces with mainMod + scroll +bind = $mainMod CTRL, right, workspace, e+1 +bind = $mainMod, mouse_up, workspace, e+1 +bind = $mainMod CTRL, left, workspace, e-1 +bind = $mainMod, mouse_down, workspace, e-1 \ No newline at end of file diff --git a/modules/home/hyprland/conf/hypr/monitors.conf b/modules/home/hyprland/conf/hypr/monitors.conf new file mode 100644 index 0000000..c5db16a --- /dev/null +++ b/modules/home/hyprland/conf/hypr/monitors.conf @@ -0,0 +1,22 @@ +# █▀▄▀█ █▀█ █▄░█ █ ▀█▀ █▀█ █▀█ █▀ +# █░▀░█ █▄█ █░▀█ █ ░█░ █▄█ █▀▄ ▄█ + +# See https://wiki.hyprland.org/Configuring/Monitors/ + +# monitor = name, resolution, offset, scale, extra-args +# monitor = ,preferred,auto,auto +monitor = HDMI-A-2, 1920x1080@60, 1080x0, 1 +monitor = HDMI-A-3, preferred, auto, 1 +# monitor = DP-3, 1920x1080@60, x0, 1, transform,1 + +workspace = 1,monitor:HDMI-A-3 +workspace = 2,monitor:HDMI-A-3 +workspace = 3,monitor:HDMI-A-3 +workspace = 4,monitor:HDMI-A-3 +workspace = 5,monitor:HDMI-A-3 + +workspace = 6,monitor:HDMI-A-2 +workspace = 7,monitor:HDMI-A-2 +workspace = 8,monitor:HDMI-A-2 +workspace = 9,monitor:HDMI-A-2 +workspace = 10,monitor:HDMI-A-2 diff --git a/modules/home/hyprland/conf/hypr/nvidia.conf b/modules/home/hyprland/conf/hypr/nvidia.conf new file mode 100644 index 0000000..af6395b --- /dev/null +++ b/modules/home/hyprland/conf/hypr/nvidia.conf @@ -0,0 +1,26 @@ + +# █▄░█ █░█ █ █▀▄ █ ▄▀█ +# █░▀█ ▀▄▀ █ █▄▀ █ █▀█ + +# Hyprland Nvidia Configuration +# See https://wiki.hyprland.org/Nvidia/ +env = LIBVA_DRIVER_NAME,nvidia +env = __GLX_VENDOR_LIBRARY_NAME,nvidia # Disable this if you have issues with screensharing + +# If you want to try hardware cursors, +# you can enable them by setting `cursor:no_hardware_cursors = false` , +# but it will require also enabling `cursor:allow_dumb_copy` +# which may cause small to major hitches whenever the cursor shape changes. +# If this is a problem on your system, keep hardware cursors disabled. +cursor:no_hardware_cursors = true # Set to true to avoid hitches +# cursor:allow_dumb_copy = true + +# https://wiki.hyprland.org/Nvidia/#va-api-hardware-video-acceleration +# Hardware video acceleration on Nvidia and Wayland is +# possible with the nvidia-vaapi-driver. +# This may solve specific issues in Electron apps. +env = NVD_BACKEND,direct # Requires 'libva-nvidia-driver' package + +# https://wiki.hyprland.org/Nvidia/#regarding-environment-variables +# If you encounter crashes in Firefox, remove this line +env = GBM_BACKEND,nvidia-drm diff --git a/modules/home/hyprland/conf/hypr/scripts/brightnesscontrol.sh b/modules/home/hyprland/conf/hypr/scripts/brightnesscontrol.sh new file mode 100755 index 0000000..c0e1696 --- /dev/null +++ b/modules/home/hyprland/conf/hypr/scripts/brightnesscontrol.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +ncolor="-h string:bgcolor:#343d46 -h string:fgcolor:#c0c5ce -h string:frcolor:#c0c5ce" + +function send_notification { + brightness=`brightnessctl info | grep -oP "(?<=\()\d+(?=%)" | cat` + brightinfo=$(brightnessctl info | awk -F"'" '/Device/ {print $2}') + + angle="$(((($brightness + 2) / 5) * 5))" + ico="~/.config/dunst/icons/vol/vol-${angle}.svg" + bar=$(seq -s "." $(($brightness / 15)) | sed 's/[0-9]//g') + + if [ $brightness -ne 0 ]; then + notify-send $ncolor "brightctl" -i $ico -a "$brightness$bar" "Device: $brightinfo" -r 91190 -t 800 + + else + notify-send -i $ico "Brightness: ${brightness}%" -a "$brightinfo" -u low -r 91190 -t 800 + fi + +} + +function get_brightness { + brightnessctl -m | grep -o '[0-9]\+%' | head -c-2 +} + +case $1 in +i) + # increase the backlight by 5% + brightnessctl set +5% + send_notification + ;; +d) + if [[ $(get_brightness) -lt 5 ]]; then + # avoid 0% brightness + brightnessctl set 1% + else + # decrease the backlight by 5% + brightnessctl set 5%- + fi + send_notification + ;; +esac diff --git a/modules/home/hyprland/conf/hypr/scripts/cliphist.sh b/modules/home/hyprland/conf/hypr/scripts/cliphist.sh new file mode 100755 index 0000000..3f5208d --- /dev/null +++ b/modules/home/hyprland/conf/hypr/scripts/cliphist.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env sh + +theme_file="$HOME/.config/hypr/themes/theme.conf" +roconf="~/.config/rofi/clipboard.rasi" + + +# set position + +case $2 in + 1) # top left + pos="window {location: north west; anchor: north west; x-offset: 20px; y-offset: 20px;}" + ;; + 2) # top right + pos="window {location: north east; anchor: north east; x-offset: -20px; y-offset: 20px;}" + ;; + 3) # bottom left + pos="window {location: south east; anchor: south east; x-offset: -20px; y-offset: -20px;}" + ;; + 4) # bottom right + pos="window {location: south west; anchor: south west; x-offset: 20px; y-offset: -20px;}" + ;; +esac + + +# read hypr theme border + +hypr_border=`awk -F '=' '{if($1~" rounding ") print $2}' $theme_file | sed 's/ //g'` +hypr_width=`awk -F '=' '{if($1~" border_size ") print $2}' $theme_file | sed 's/ //g'` +wind_border=$(( hypr_border * 3/2 )) +elem_border=`[ $hypr_border -eq 0 ] && echo "5" || echo $hypr_border` +r_override="window {border: ${hypr_width}px; border-radius: ${wind_border}px;} entry {border-radius: ${elem_border}px;} element {border-radius: ${elem_border}px;}" + + +# read hypr font size + +#fnt_size=`awk '{if($6=="monospace-font-name") print $NF}' $theme_file | sed "s/'//g"` +fnt_override=`gsettings get org.gnome.desktop.interface monospace-font-name | awk '{gsub(/'\''/,""); print $NF}'` +fnt_override="configuration {font: \"JetBrainsMono Nerd Font ${fnt_override}\";}" + + +# clipboard action + +case $1 in + c) cliphist list | rofi -dmenu -theme-str "entry { placeholder: \"Copy...\";} ${pos} ${r_override}" -theme-str "${fnt_override}" -config $roconf | cliphist decode | wl-copy + ;; + d) cliphist list | rofi -dmenu -theme-str "entry { placeholder: \"Delete...\";} ${pos} ${r_override}" -theme-str "${fnt_override}" -config $roconf | cliphist delete + ;; + w) if [ `echo -e "Yes\nNo" | rofi -dmenu -theme-str "entry { placeholder: \"Clear Clipboard History?\";} ${pos} ${r_override}" -theme-str "${fnt_override}" -config $roconf` == "Yes" ] ; then + cliphist wipe + fi + ;; + *) echo -e "cliphist.sh [action] [position]\nwhere action," + echo "c : cliphist list and copy selected" + echo "d : cliphist list and delete selected" + echo "w : cliphist wipe database" + echo "where position," + echo "1 : top left" + echo "2 : top right" + echo "3 : bottom right" + echo "4 : bottom left" + exit 1 + ;; +esac + diff --git a/modules/home/hyprland/conf/hypr/scripts/create-dirs.sh b/modules/home/hyprland/conf/hypr/scripts/create-dirs.sh new file mode 100644 index 0000000..a1d868e --- /dev/null +++ b/modules/home/hyprland/conf/hypr/scripts/create-dirs.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +# 创建截图目录 +mkdir -p $HOME/tmp/Screenshots diff --git a/modules/home/hyprland/conf/hypr/scripts/dontkillsteam.sh b/modules/home/hyprland/conf/hypr/scripts/dontkillsteam.sh new file mode 100755 index 0000000..d162ddc --- /dev/null +++ b/modules/home/hyprland/conf/hypr/scripts/dontkillsteam.sh @@ -0,0 +1,5 @@ +if [[ $(hyprctl activewindow -j | jq -r ".class") == "Steam" ]]; then + xdotool windowunmap $(xdotool getactivewindow) +else + hyprctl dispatch killactive "" +fi diff --git a/modules/home/hyprland/conf/hypr/scripts/gamemode.sh b/modules/home/hyprland/conf/hypr/scripts/gamemode.sh new file mode 100755 index 0000000..ad0bd89 --- /dev/null +++ b/modules/home/hyprland/conf/hypr/scripts/gamemode.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env sh +HYPRGAMEMODE=$(hyprctl getoption animations:enabled | sed -n '2p' | awk '{print $2}') +if [ $HYPRGAMEMODE = 1 ] ; then + hyprctl --batch "\ + keyword animations:enabled 0;\ + keyword decoration:drop_shadow 0;\ + keyword decoration:blur:enabled 0;\ + keyword general:gaps_in 0;\ + keyword general:gaps_out 0;\ + keyword general:border_size 1;\ + keyword decoration:rounding 0" + exit +fi +hyprctl reload diff --git a/modules/home/hyprland/conf/hypr/scripts/logoutlaunch.sh b/modules/home/hyprland/conf/hypr/scripts/logoutlaunch.sh new file mode 100755 index 0000000..a596e89 --- /dev/null +++ b/modules/home/hyprland/conf/hypr/scripts/logoutlaunch.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env sh + +# detect monitor y res +res=`cat /sys/class/drm/*/modes | head -1 | cut -d 'x' -f 2` + +# scale config layout and style +case $1 in + 1) wlColms=6 + export mgn=$(( res * 10 / 100 )) + export hvr=$(( res * 5 / 100 )) ;; + 2) wlColms=2 + export mgn=$(( res * 8 / 100 )) + export mgn2=$(( res * 65 / 100 )) + export hvr=$(( res * 3 / 100 )) + export hvr2=$(( res * 60 / 100 )) ;; + *) echo "Error: invalid parameter passed..." + exit 1 ;; +esac + +# scale font size +export fntSize=$(( res * 2 / 100 )) + +# detect gtk system theme +export gtkThm="Catppuccin-Latte" #`gsettings get org.gnome.desktop.interface gtk-theme | sed "s/'//g"` +export csMode=`gsettings get org.gnome.desktop.interface color-scheme | sed "s/'//g" | awk -F '-' '{print $2}'` +export BtnCol=`[ "$csMode" == "dark" ] && ( echo "black" ) || ( echo "white" )` +export BtnBkg=`[ "$csMode" == "dark" ] && ( echo "color" ) || ( echo "bg" )` +export WindBg=`[ "$csMode" == "dark" ] && ( echo "rgba(0,0,0,0.5)" ) || ( echo "rgba(255,255,255,0.6)" )` +export wbarTheme="$HOME/.config/waybar/themes/${gtkThm}.css" + +# eval hypr border radius +hyprTheme="$HOME/.config/hypr/themes/${gtkThm}.conf" +hypr_border=`awk -F '=' '{if($1~" rounding ") print $2}' $hyprTheme | sed 's/ //g'` +export active_rad=$(( hypr_border * 5 )) +export button_rad=$(( hypr_border * 8 )) + +# set file variables +wLayout="$HOME/.config/wlogout/layout_$1" +wlTmplt="$HOME/.config/wlogout/style_$1.css" + +# eval config files +wlStyle=`envsubst < $wlTmplt` + +# eval padding +y_pad=$(( res * 20 / 100 )) + +# launch wlogout +wlogout -b $wlColms -c 0 -r 0 -T $y_pad -B $y_pad --layout $wLayout --css <(echo "$wlStyle") --protocol layer-shell + diff --git a/modules/home/hyprland/conf/hypr/scripts/modeswitch.sh b/modules/home/hyprland/conf/hypr/scripts/modeswitch.sh new file mode 100755 index 0000000..86898ae --- /dev/null +++ b/modules/home/hyprland/conf/hypr/scripts/modeswitch.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env sh + +## main script ## +CFGDIR="$HOME/.config" +X_MODE=$1 + +## check mode ## +if [ "$X_MODE" == "dark" ] || [ "$X_MODE" == "light" ] ; then + S_MODE="$X_MODE" + +elif [ "$X_MODE" == "switch" ] ; then + X_MODE=`readlink $CFGDIR/swww/wall.set | awk -F "." '{print $NF}'` + + if [ "$X_MODE" == "dark" ] ; then + S_MODE="light" + flatpak --user override --env=GTK_THEME=Catppuccin-Latte + + elif [ "$X_MODE" == "light" ] ; then + S_MODE="dark" + flatpak --user override --env=GTK_THEME=Catppuccin-Mocha + + else + echo "ERROR: unable to fetch wallpaper mode." + fi + +else + echo "ERROR: unknown mode, use 'dark', 'light' or 'switch'." + exit 1 +fi + +### hyprland ### +ln -fs $CFGDIR/hypr/${S_MODE}.conf $CFGDIR/hypr/theme.conf +hyprctl reload + +### swwwallpaper ### +x=`echo $S_MODE | cut -c 1` +$CFGDIR/swww/swwwallpaper.sh -$x + +### qt5ct ### +ln -fs $CFGDIR/qt5ct/colors/${S_MODE}.conf $CFGDIR/qt5ct/colors/theme.conf + +### rofi ### +ln -fs $CFGDIR/rofi/${S_MODE}.rasi $CFGDIR/rofi/theme.rasi + +### kitty ### +ln -fs $CFGDIR/kitty/${S_MODE}.conf $CFGDIR/kitty/theme.conf +killall -SIGUSR1 kitty + +### waybar ### +ln -fs $CFGDIR/waybar/${S_MODE}.css $CFGDIR/waybar/style.css +sleep 1 +killall -SIGUSR2 waybar diff --git a/modules/home/hyprland/conf/hypr/scripts/resetxdgportal.sh b/modules/home/hyprland/conf/hypr/scripts/resetxdgportal.sh new file mode 100755 index 0000000..32983ec --- /dev/null +++ b/modules/home/hyprland/conf/hypr/scripts/resetxdgportal.sh @@ -0,0 +1,12 @@ +#!/bin/bash +sleep 1 +killall xdg-desktop-portal-hyprland +killall xdg-desktop-portal-gnome +killall xdg-desktop-portal-kde +killall xdg-desktop-portal-lxqt +killall xdg-desktop-portal-wlr +killall xdg-desktop-portal +sleep 1 +/usr/lib/xdg-desktop-portal-hyprland & +sleep 2 +/usr/lib/xdg-desktop-portal & diff --git a/modules/home/hyprland/conf/hypr/scripts/systemupdate.sh b/modules/home/hyprland/conf/hypr/scripts/systemupdate.sh new file mode 100755 index 0000000..22e4784 --- /dev/null +++ b/modules/home/hyprland/conf/hypr/scripts/systemupdate.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +# Check release +if [ ! -f /etc/arch-release ] ; then + exit 0 +fi + +# Check for updates +aur=$(yay -Qua | wc -l) +ofc=$(pacman -Qu | wc -l) + +# Calculate total available updates +upd=$(( ofc + aur )) +echo "$upd" + +# Show tooltip +if [ $upd -eq 0 ] ; then + echo " Packages are up to date" +else + echo "󱓽 Official $ofc 󱓾 AUR $aur" +fi + +# Trigger upgrade +if [ "$1" == "up" ] ; then + kitty --title systemupdate sh -c 'yay -Syu' +fi + diff --git a/modules/home/hyprland/conf/hypr/scripts/themeselect.sh b/modules/home/hyprland/conf/hypr/scripts/themeselect.sh new file mode 100755 index 0000000..6384166 --- /dev/null +++ b/modules/home/hyprland/conf/hypr/scripts/themeselect.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env sh + +## set variables ## +BaseDir=`dirname $(realpath $0)` +ThemeCtl="$HOME/.config/swww/wall.ctl" +ThumbDir="$HOME/.config/swww/Themes-Ctl" +RofiConf="$HOME/.config/rofi/themeselect.rasi" +ThemeSet="$HOME/.config/hypr/themes/theme.conf" + + +## show and apply theme ## +if [ -z "$1" ] ; then + + hypr_border=`awk -F '=' '{if($1~" rounding ") print $2}' $ThemeSet | sed 's/ //g'` + elem_border=$(( hypr_border * 5 )) + icon_border=$(( elem_border - 5 )) + r_override="element {border-radius: ${elem_border}px;} element-icon {border-radius: ${icon_border}px;}" + + ThemeSel=$(cat $ThemeCtl | while read line + do + thm=`echo $line | cut -d '|' -f 2` + wal=`echo $line | cut -d '|' -f 3` + echo -en "$thm\x00icon\x1f$ThumbDir/${thm}.png\n" + done | rofi -dmenu -theme-str "${r_override}" -config $RofiConf) + + if [ ! -z $ThemeSel ] ; then + ${BaseDir}/themeswitch.sh -s $ThemeSel + fi + +## regenerate thumbnails ## +elif [ "$1" == "T" ] ; then + + echo "refreshing thumbnails..." + cat $ThemeCtl | while read line + do + thm=`echo $line | cut -d '|' -f 2` + wal=`echo $line | cut -d '|' -f 3` + wal=`eval echo $wal` + + echo "croping image from wallpaper $ThumbDir/${thm}.png..." + convert $wal -thumbnail 500x500^ -gravity center -extent 500x500 $ThumbDir/${thm}.png + #convert $wal -gravity Center -crop 1080x1080+0+0 $ThumbDir/${thm}.png + #echo "applying rounded corner mask and generating $ThumbDir/${thm}.png..." + #convert -size 1080x1080 xc:none -draw "roundrectangle 0,0,1080,1080,80,80" $ThumbDir/roundedmask.png + #convert $ThumbDir/${thm}_tmp.png -matte $ThumbDir/roundedmask.png -compose DstIn -composite $ThumbDir/${thm}.png + done + +fi + diff --git a/modules/home/hyprland/conf/hypr/scripts/themeswitch.sh b/modules/home/hyprland/conf/hypr/scripts/themeswitch.sh new file mode 100755 index 0000000..13610db --- /dev/null +++ b/modules/home/hyprland/conf/hypr/scripts/themeswitch.sh @@ -0,0 +1,125 @@ +#!/usr/bin/env sh + +# set variables +BaseDir=`dirname $(realpath $0)` +ConfDir="$HOME/.config" +ThemeCtl="$ConfDir/swww/wall.ctl" + + +# evaluate options +while getopts "npst" option ; do + case $option in + + n ) # set next theme + ThemeSet=`head -1 $ThemeCtl | cut -d '|' -f 2` #default value + flg=0 + while read line + do + if [ $flg -eq 1 ] ; then + ThemeSet=`echo $line | cut -d '|' -f 2` + break + elif [ `echo $line | cut -d '|' -f 1` -eq 1 ] ; then + flg=1 + fi + done < $ThemeCtl + export xtrans="center" ;; + + p ) # set previous theme + ThemeSet=`tail -1 $ThemeCtl | cut -d '|' -f 2` #default value + flg=0 + while read line + do + if [ $flg -eq 1 ] ; then + ThemeSet=`echo $line | cut -d '|' -f 2` + break + elif [ `echo $line | cut -d '|' -f 1` -eq 1 ] ; then + flg=1 + fi + done < <( tac $ThemeCtl ) + export xtrans="outer" ;; + + s ) # set selected theme + shift $((OPTIND -1)) + ThemeSet=$1 ;; + + t ) # display tooltip + echo "" + echo "󰆊 Next/Previous Theme" + exit 0 ;; + + * ) # invalid option + echo "n : set next theme" + echo "p : set previous theme" + echo "s : set theme from parameter" + echo "t : display tooltip" + exit 1 ;; + esac +done + + +# update theme control +if [ `cat $ThemeCtl | awk -F '|' -v thm=$ThemeSet '{if($2==thm) print$2}' | wc -w` -ne 1 ] ; then + echo "Unknown theme selected: $ThemeSet" + echo "Available themes are:" + cat $ThemeCtl | cut -d '|' -f 2 + exit 1 +else + echo "Selected theme: $ThemeSet" + sed -i "s/^1/0/g" $ThemeCtl + awk -F '|' -v thm=$ThemeSet '{OFS=FS} {if($2==thm) $1=1; print$0}' $ThemeCtl > $BaseDir/tmp && mv $BaseDir/tmp $ThemeCtl +fi + + +# swwwallpaper +getWall=`grep '^1|' $ThemeCtl | cut -d '|' -f 3` +getWall=`eval echo $getWall` +ln -fs $getWall $ConfDir/swww/wall.set +$ConfDir/swww/swwwallpaper.sh + +if [ $? -ne 0 ] ; then + echo "ERROR: Unable to set wallpaper" + exit 1 +fi + + +# vs code +sed -i "/workbench.colorTheme/c\ \"workbench.colorTheme\": \"${ThemeSet}\"," $ConfDir/Code/User/settings.json + + +# kitty +ln -fs $ConfDir/kitty/themes/${ThemeSet}.conf $ConfDir/kitty/themes/theme.conf +killall -SIGUSR1 kitty + + +# qt5ct +sed -i "/^color_scheme_path=/c\color_scheme_path=$ConfDir/qt5ct/colors/${ThemeSet}.conf" $ConfDir/qt5ct/qt5ct.conf +IconSet=`awk -F "'" '$0 ~ /gsettings set org.gnome.desktop.interface icon-theme/{print $2}' $ConfDir/hypr/themes/${ThemeSet}.conf` +sed -i "/^icon_theme=/c\icon_theme=${IconSet}" $ConfDir/qt5ct/qt5ct.conf + + +# flatpak GTK +flatpak --user override --env=GTK_THEME="${ThemeSet}" +flatpak --user override --env=ICON_THEME="${IconSet}" + + +# rofi +ln -fs $ConfDir/rofi/themes/${ThemeSet}.rasi $ConfDir/rofi/themes/theme.rasi + + +# hyprland +ln -fs $ConfDir/hypr/themes/${ThemeSet}.conf $ConfDir/hypr/themes/theme.conf +hyprctl reload + + +# refresh thumbnails +$BaseDir/themeselect.sh T & + + +# send notification +ncolor="-h string:bgcolor:#343d46 -h string:fgcolor:#c0c5ce -h string:frcolor:#c0c5ce" +notify-send $ncolor "theme" -a " ${ThemeSet}" -i "~/.config/dunst/icons/paint.svg" -r 91190 -t 2200 + + +# waybar +$ConfDir/waybar/wbarconfgen.sh + diff --git a/modules/home/hyprland/conf/hypr/scripts/volumecontrol.sh b/modules/home/hyprland/conf/hypr/scripts/volumecontrol.sh new file mode 100755 index 0000000..ddf119a --- /dev/null +++ b/modules/home/hyprland/conf/hypr/scripts/volumecontrol.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env sh + + +# define functions + +function print_error +{ +cat << "EOF" + ./volumecontrol.sh -[device] + ...valid device are... + i -- [i]nput decive + o -- [o]utput device + ...valid actions are... + i -- ncrease volume [+5] + d -- ecrease volume [-5] + m -- ute [x] +EOF +exit 1 +} + +function notify_vol +{ + vol=`pamixer $srce --get-volume | cat` + angle="$(( (($vol+2)/5) * 5 ))" + ico="${icodir}/vol-${angle}.svg" + bar=$(seq -s "." $(($vol / 15)) | sed 's/[0-9]//g') + notify-send $ncolor "volctl" -a "$vol$bar" "$nsink" -i $ico -r 91190 -t 800 +} + +function notify_mute +{ + mute=`pamixer $srce --get-mute | cat` + if [ "$mute" == "true" ] ; then + notify-send $ncolor "volctl" -a "muted" "$nsink" -i ${icodir}/muted-${dvce}.svg -r 91190 -t 800 + else + notify-send $ncolor "volctl" -a "unmuted" "$nsink" -i ${icodir}/unmuted-${dvce}.svg -r 91190 -t 800 + fi +} + + +# set device source + +while getopts io SetSrc +do + case $SetSrc in + i) nsink=$(pamixer --list-sources | grep "_input." | head -1 | awk -F '" "' '{print $NF}' | sed 's/"//') + srce="--default-source" + dvce="mic" ;; + o) nsink=$(pamixer --get-default-sink | grep "_output." | awk -F '" "' '{print $NF}' | sed 's/"//') + srce="" + dvce="speaker" ;; + esac +done + +if [ $OPTIND -eq 1 ] ; then + print_error +fi + + +# set device action + +shift $((OPTIND -1)) +step="${2:-5}" +icodir="~/.config/dunst/icons/vol" +ncolor="-h string:bgcolor:#343d46 -h string:fgcolor:#c0c5ce -h string:frcolor:#c0c5ce" + +case $1 in + i) pamixer $srce -i ${step} + notify_vol ;; + d) pamixer $srce -d ${step} + notify_vol ;; + m) pamixer $srce -t + notify_mute ;; + *) print_error ;; +esac + diff --git a/modules/home/hyprland/conf/hypr/theme.conf b/modules/home/hyprland/conf/hypr/theme.conf new file mode 100644 index 0000000..11a8aca --- /dev/null +++ b/modules/home/hyprland/conf/hypr/theme.conf @@ -0,0 +1,41 @@ +exec = hyprctl setcursor Bibata-Modern-Ice 20 +exec = gsettings set org.gnome.desktop.interface cursor-theme 'Bibata-Modern-Ice' +exec = gsettings set org.gnome.desktop.interface cursor-size 20 + +exec = kvantummanager --set Catppuccin-Latte +exec = gsettings set org.gnome.desktop.interface icon-theme 'Tela-circle-grey' +exec = gsettings set org.gnome.desktop.interface gtk-theme 'Catppuccin-Latte' +exec = gsettings set org.gnome.desktop.interface color-scheme 'prefer-light' + +exec = gsettings set org.gnome.desktop.interface font-name 'Cantarell 10' +exec = gsettings set org.gnome.desktop.interface document-font-name 'Cantarell 10' +exec = gsettings set org.gnome.desktop.interface monospace-font-name 'CaskaydiaCove Nerd Font Mono 9' +exec = gsettings set org.gnome.desktop.interface font-antialiasing 'rgba' +exec = gsettings set org.gnome.desktop.interface font-hinting 'full' + +env = XCURSOR_THEME,Bibata-Modern-Ice +env = XCURSOR_SIZE,20 + +general { + gaps_in = 2 + gaps_out = 4 + border_size = 2 + col.active_border = rgba(dc8a78ff) rgba(8839efff) 45deg + col.inactive_border = rgba(7287fdcc) rgba(179299cc) 45deg + layout = dwindle + resize_on_border = true +} + +decoration { + rounding = 10 + blur { + enabled = yes + size = 6 + passes = 3 + new_optimizations = on + ignore_opacity = on + xray = false + } +} + +blurls = waybar diff --git a/modules/home/hyprland/conf/hypr/userprefs.conf b/modules/home/hyprland/conf/hypr/userprefs.conf new file mode 100644 index 0000000..37e7de9 --- /dev/null +++ b/modules/home/hyprland/conf/hypr/userprefs.conf @@ -0,0 +1,19 @@ + +# █▀▀ █▄░█ █░█ +# ██▄ █░▀█ ▀▄▀ + +# Some default env vars. + +#env = MANGOHUD,1 +#env = MANGOHUD_DLSYM,1 + + +# █▀▄▀█ █ █▀ █▀▀ +# █░▀░█ █ ▄█ █▄▄ + +# See https://wiki.hyprland.org/Configuring/Variables/ for more + +misc { + vrr = 0 +} + diff --git a/modules/home/hyprland/conf/hypr/windowrules.conf b/modules/home/hyprland/conf/hypr/windowrules.conf new file mode 100644 index 0000000..7e50d68 --- /dev/null +++ b/modules/home/hyprland/conf/hypr/windowrules.conf @@ -0,0 +1,30 @@ + +# █░█░█ █ █▄░█ █▀▄ █▀█ █░█░█   █▀█ █░█ █░░ █▀▀ █▀ +# ▀▄▀▄▀ █ █░▀█ █▄▀ █▄█ ▀▄▀▄▀   █▀▄ █▄█ █▄▄ ██▄ ▄█ + + +# Example windowrule v1 +# windowrule = float, ^(kitty)$ +# Example windowrule v2 +# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$ +# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more + +# Float rules for system dialogs and popups +# windowrulev2 = center, class:^((?!fcitx).)*$ +windowrulev2 = center,class:^(.*)$,title:^(Open [Ff]ile) +windowrulev2 = center,class:^(.*)$,title:^(Open [Ff]older) +windowrulev2 = center,class:^(.*)$,title:^(Save [Ff]ile) +windowrulev2 = center,class:^(.*)$,title:^(Save [Aa]s) +windowrulev2 = center,class:^(.*)$,title:^(Location)$ +windowrulev2 = center,class:^(Code)$ + +windowrulev2 = opacity 0.90 0.90,class:^(Code)$ +windowrulev2 = opacity 0.80 0.80,class:^(code-url-handler)$ +windowrulev2 = opacity 0.80 0.80,class:^(kitty)$ + +windowrulev2 = opacity 0.80 0.70,class:^(pavucontrol)$ +windowrulev2 = opacity 0.80 0.70,class:^(blueman-manager)$ + +windowrulev2 = float,class:^(pavucontrol)$ +windowrulev2 = float,class:^(blueman-manager)$ + diff --git a/modules/home/hyprland/conf/kitty/kitty.conf b/modules/home/hyprland/conf/kitty/kitty.conf new file mode 100644 index 0000000..77ae653 --- /dev/null +++ b/modules/home/hyprland/conf/kitty/kitty.conf @@ -0,0 +1,88 @@ +# vim:ft=kitty + +## name: Catppuccin Latte 🐑 +## author: Pocco81 (https://github.com/Pocco81) +## license: MIT +## upstream: https://github.com/catppuccin/kitty/blob/main/latte.conf +## blurb: Soothing pastel theme for the high-spirited! + + + +# The basic colors +foreground #4C4F69 +background #EFF1F5 +selection_foreground #EFF1F5 +selection_background #DC8A78 + +# Cursor colors +cursor #DC8A78 +cursor_text_color #EFF1F5 + +# URL underline color when hovering with mouse +url_color #7287FD + +# Kitty window border colors +active_border_color #8839EF +inactive_border_color #7C7F93 +bell_border_color #E64553 + +# OS Window titlebar colors +wayland_titlebar_color system +macos_titlebar_color system + +# Tab bar colors +active_tab_foreground #EFF1F5 +active_tab_background #8839EF +inactive_tab_foreground #4C4F69 +inactive_tab_background #9CA0B0 +tab_bar_background #BCC0CC + +# Colors for marks (marked text in the terminal) +mark1_foreground #EFF1F5 +mark1_background #1E66F5 +mark2_foreground #EFF1F5 +mark2_background #8839EF +mark3_foreground #EFF1F5 +mark3_background #209FB5 + +# The 16 terminal colors + +# black +color0 #4C4F69 +color8 #6C6F85 + +# red +color1 #D20F39 +color9 #D20F39 + +# green +color2 #40A02B +color10 #40A02B + +# yellow +color3 #DF8E1D +color11 #DF8E1D + +# blue +color4 #1E66F5 +color12 #1E66F5 + +# magenta +color5 #EA76CB +color13 #EA76CB + +# cyan +color6 #179299 +color14 #179299 + +# white +color7 #ACB0BE +color15 #ACB0BE + +# 终端兼容性设置 +term xterm-256color +shell_integration no-rc + +# 修复 SSH 退格键问题 +map ctrl+h send_text all \x08 +backspace_sends_backspace yes diff --git a/modules/home/hyprland/conf/mako/config b/modules/home/hyprland/conf/mako/config new file mode 100644 index 0000000..cb148bd --- /dev/null +++ b/modules/home/hyprland/conf/mako/config @@ -0,0 +1,28 @@ +sort=-time +layer=overlay +background-color=#2e3440 +width=360 +height=160 +padding=10 +border-size=2 +border-color=#88c0d0 +border-radius=15 +icons=1 +max-icon-size=64 +default-timeout=10000 +ignore-timeout=1 +font=monospace 8 + +[urgency=low] +border-color=#cccccc + +[urgency=normal] +border-color=#d08770 + +[urgency=high] +border-color=#bf616a +default-timeout=0 + +[category=mpd] +default-timeout=2000 +group-by=category \ No newline at end of file diff --git a/modules/home/hyprland/conf/rofi/config.rasi b/modules/home/hyprland/conf/rofi/config.rasi new file mode 100644 index 0000000..a038244 --- /dev/null +++ b/modules/home/hyprland/conf/rofi/config.rasi @@ -0,0 +1,126 @@ +/* MACOS SPOTLIGHT LIKE THEME FOR ROFI */ + +/* 基本配置项 */ +configuration { + show-icons: true; + icon-theme: "Papirus"; + drun-display-format: "{icon} {name}"; + display-drun: ""; +} + +/* 全局变量和样式设置 */ +* { + font: "Montserrat 12"; + + bg0: #ffffff; + bg1: #e0e0e0; + bg2: #0860f2e6; + bg3: rgba(0, 0, 0, 0.015); + + fg0: #242424; + fg1: #ffffff; + fg2: #24242480; + + background-color: @bg0; + text-color: @fg0; + + margin: 0px; + padding: 0px; + spacing: 0px; +} + +/* 主窗口样式 */ +window { + background-color: @bg0; + location: center; + width: 560px; + height: 450px; + border-radius: 8px; + border: 1px; + border-color: @bg1; +} + +/* 搜索输入栏样式 */ +inputbar { + font: "Montserrat 18"; + padding: 12px; + spacing: 12px; + children: [ icon-search, entry]; +} + +/* 搜索图标样式 */ +icon-search { + expand: false; + filename: "search"; + size: 24px; +} + +/* 元素垂直对齐设置 */ +icon-search, +element-icon, +element-text { + vertical-align: 0.5; +} + +/* 搜索输入框样式 */ +entry { + font: inherit; + vertical-align: 0.5; + text-align: center; + padding: 5px; + spacing: 10px; + placeholder: "Search"; + placeholder-color: @fg2; +} + +/* 消息区域样式 */ +message { + border: 2px 0 0; + border-color: @bg1; + background-color: @bg1; +} + +/* 文本框样式 */ +textbox { + padding: 8px 24px; +} + +/* 列表视图样式 */ +listview { + lines: 10; + columns: 1; + fixed-height: false; + border: 1px 0 0; + border-color: @bg1; +} + +/* 列表项基本样式 */ +element { + padding: 8px 16px; + spacing: 16px; + border: 0px; + border-radius: 4px; + background-color: transparent; + children: [ element-icon, element-text]; +} + + +element normal.normal { + background-color: @bg3; +} + +element alternate.normal { + background-color: @bg3; +} + +/* 选中状态的列表项样式 */ +element selected.active, +element selected.normal { + text-color: @fg1; + background-color: @bg2; +} + +/* 列表项图标样式 */ +element-icon { + size: 1.35em; +} diff --git a/modules/home/hyprland/conf/waybar/config.jsonc b/modules/home/hyprland/conf/waybar/config.jsonc new file mode 100644 index 0000000..da28b29 --- /dev/null +++ b/modules/home/hyprland/conf/waybar/config.jsonc @@ -0,0 +1,205 @@ +// --// waybar config generated by wbarconfgen.sh //-- // + +{ + // sourced from header module // + + "layer": "top", + "position": "top", + "mod": "dock", + "height": 28, + "exclusive": true, + "passthrough": false, + "gtk-layer-shell": true, + + // positions generated based on config.ctl // + + "modules-left": [ + "custom/lr", + "hyprland/workspaces", + "hyprland/window", + "custom/rr" + ], + "modules-center": ["custom/lr", "clock", "custom/rr"], + "modules-right": [ + "custom/lr", + "wlr/taskbar", + "custom/rr", + "custom/lr", + "tray", + "custom/rr", + "custom/lr", + "cpu", + "temperature", + "memory", + "custom/rr", + "custom/lr", + "network", + "bluetooth", + "wireplumber", + "wireplumber#microphone", + "custom/cliphist", + "custom/power", + "custom/rr" + ], + + // sourced from modules based on config.ctl // + + "custom/power": { + "format": "{}", + "exec": "echo ; echo  logout", + "on-click": "~/.config/hypr/scripts/logoutlaunch.sh 2", + "interval": 86400, // once every day + "tooltip": true + }, + + "custom/cliphist": { + "format": "{}", + "exec": "echo ; echo 󰅇 clipboard history", + "on-click": "sleep 0.1 && ~/.config/hypr/scripts/cliphist.sh c 1", + //"on-click-right": "sleep 0.1 && ~/.config/hypr/scripts/cliphist.sh d", + "on-click-middle": "sleep 0.1 && ~/.config/hypr/scripts/cliphist.sh w 1", + "interval": 86400, // once every day + "tooltip": true + }, + + "custom/mode": { + "format": "{}", + "exec": "echo ; echo 󰟡 switch mode", + "on-click": "~/.config/hypr/scripts/themeswitch.sh -n", + "on-click-right": "~/.config/hypr/scripts/themeswitch.sh -p", + "on-click-middle": "sleep 0.1 && ~/.config/hypr/scripts/themeselect.sh", + "interval": 86400, // once every day + "tooltip": true + }, + + "hyprland/workspaces": { + "disable-scroll": true, + "on-click": "activate", + "persistent_workspaces": { + "1": ["HDMI-A-3"], + "2": ["HDMI-A-3"], + "3": ["HDMI-A-3"], + "4": ["HDMI-A-3"], + "5": ["HDMI-A-3"], + "6": ["HDMI-A-2"], + "7": ["HDMI-A-2"], + "8": ["HDMI-A-2"], + "9": ["HDMI-A-2"], + "10": ["HDMI-A-2"] + } + }, + + "clock": { + "format": "{:%Y/%m/%d %H:%M}", + "format-alt": "{:%I:%M%p 周%u}", + "tooltip-format": "{calendar}", + "locale": "zh_CN.UTF-8" + }, + + "wlr/taskbar": { + "format": "{icon}", + "icon-size": 14, + "icon-theme": "papirus-icon-theme", + "spacing": 0, + "tooltip-format": "{title}", + "on-click": "activate", + "on-click-middle": "close", + "ignore-list": ["Alacritty"], + "app_ids-mapping": { + "firefoxdeveloperedition": "firefox-developer-edition" + } + }, + + "tray": { + "icon-size": 14, + "spacing": 4 + }, + + "cpu": { + "interval": 10, + "format": "󰍛 {usage}%", + "format-alt": "{icon0}{icon1}{icon2}{icon3}", + "format-icons": ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"] + }, + + "temperature": { + "interval": 10, + "hwmon-path": "/sys/devices/platform/coretemp.0/hwmon/hwmon2/temp1_input", + "format": " {temperatureC}°C" + }, + + "memory": { + "interval": 30, + "format": " {percentage}%", + "format-alt": " {used}GB", + "max-length": 10, + "tooltip": true, + "tooltip-format": " {used:0.1f}GB/{total:0.1f}GB" + }, + + "network": { + // "interface": "wlp2*", // (Optional) To force the use of this interface + "format-wifi": "󰤨 {essid}", + "format-ethernet": "󱘖 Wired", + "tooltip-format": "󱘖 {ipaddr}  {bandwidthUpBytes}  {bandwidthDownBytes}", + "format-linked": "󱘖 {ifname} (No IP)", + "format-disconnected": " Disconnected", + "format-alt": "󰤨 {signalStrength}%", + "interval": 5 + }, + + "bluetooth": { + "format": "", + "format-disabled": "", // an empty format will hide the module + "format-connected": " {num_connections}", + "tooltip-format": " {device_alias}", + "tooltip-format-connected": "{device_enumerate}", + "tooltip-format-enumerate-connected": " {device_alias}" + }, + + "wireplumber": { + "format": "{icon} {volume}", + "format-muted": "󰝟", + "on-click": "pavucontrol -t 3", + "on-click-middle": "~/.config/hypr/scripts/volumecontrol.sh -o m", + "on-scroll-up": "~/.config/hypr/scripts/volumecontrol.sh -o i", + "on-scroll-down": "~/.config/hypr/scripts/volumecontrol.sh -o d", + "tooltip-format": "{icon} {desc} // {volume}%", + "scroll-step": 5, + "format-icons": { + "headphone": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", + "car": "", + "default": ["", "", ""] + } + }, + + "wireplumber#microphone": { + "format": "{format_source}", + "format-source": "", + "format-source-muted": "", + "on-click": "c -t 4", + "on-click-middle": "~/.config/hypr/scripts/volumecontrol.sh -i m", + "on-scroll-up": "~/.config/hypr/scripts/volumecontrol.sh -i i", + "on-scroll-down": "~/.config/hypr/scripts/volumecontrol.sh -i d", + "tooltip-format": "{format_source} {source_desc} // {source_volume}%", + "scroll-step": 5 + }, + + // modules for padding // + + "custom/lr": { + "format": " ", + "interval": "once", + "tooltip": false + }, + + "custom/rr": { + "format": " ", + "interval": "once", + "tooltip": false + } +} diff --git a/modules/home/hyprland/conf/waybar/style.css b/modules/home/hyprland/conf/waybar/style.css new file mode 100644 index 0000000..5852913 --- /dev/null +++ b/modules/home/hyprland/conf/waybar/style.css @@ -0,0 +1,143 @@ +@define-color bar-bg rgba(0, 0, 0, 0); +@define-color main-color #cdd6f4; +@define-color main-bg #11111b; +@define-color tool-bg #1e1e2e; +@define-color tool-color #cdd6f4; +@define-color tool-border #11111b; +@define-color wb-color #cdd6f4; +@define-color wb-act-bg #a6adc8; +@define-color wb-act-color #313244; +@define-color wb-hvr-bg #f5c2e7; +@define-color wb-hvr-color #313244; + +* { + border: none; + border-radius: 0px; + font-family: "JetBrainsMono Nerd Font"; + font-weight: bold; + font-size: 12px; + min-height: 12px; +} + +window#waybar { + background: @bar-bg; +} + +tooltip { + background: @tool-bg; + color: @tool-color; + border-radius: 16px; + border-width: 1px; + border-style: solid; + border-color: @tool-border; +} + +#workspaces button { + box-shadow: none; + text-shadow: none; + padding: 0px; + border-radius: 8px; + margin-top: 2px; + margin-bottom: 2px; + margin-left: 2px; + margin-right: 2px; + padding-left: 2px; + padding-right: 2px; + color: @wb-color; + animation: gradient_f 20s ease-in infinite; + transition: all 0.5s cubic-bezier(0.55, -0.68, 0.48, 1.682); +} + +#workspaces button.active { + background: @wb-act-bg; + color: @wb-act-color; + animation: gradient_f 20s ease-in infinite; + transition: all 0.3s cubic-bezier(0.55, -0.68, 0.48, 1.682); +} + +#workspaces button:hover { + background: @wb-hvr-bg; + color: @wb-hvr-color; + padding-left: 2px; + padding-right: 2px; + animation: gradient_f 20s ease-in infinite; + transition: all 0.3s cubic-bezier(0.55, -0.68, 0.48, 1.682); +} + +#taskbar button { + box-shadow: none; + text-shadow: none; + padding: 0px; + border-radius: 8px; + margin-top: 2px; + margin-bottom: 2px; + margin-right: 2px; + padding-left: 2px; + padding-left: 2px; + padding-right: 2px; + color: @wb-color; + animation: gradient_f 20s ease-in infinite; + transition: all 0.5s cubic-bezier(0.55, -0.68, 0.48, 1.682); +} + +#taskbar button.active { + background: @wb-act-bg; + color: @wb-act-color; + animation: gradient_f 20s ease-in infinite; + transition: all 0.3s cubic-bezier(0.55, -0.68, 0.48, 1.682); +} + +#taskbar button:hover { + background: @wb-hvr-bg; + color: @wb-hvr-color; + padding-left: 2px; + padding-right: 2px; + animation: gradient_f 20s ease-in infinite; + transition: all 0.3s cubic-bezier(0.55, -0.68, 0.48, 1.682); +} + +#cpu, +#memory, +#temperature, +#battery, +#clock, +#workspaces, +#window, +#taskbar, +#network, +#bluetooth, +#wireplumber, +#mpris, +#custom-updates, +#custom-wallchange, +#custom-mode, +#custom-cliphist, +#custom-power, +#custom-wbar, +#custom-lr, +#custom-rr, +#tray { + color: @main-color; + background: @main-bg; + opacity: 1; + margin: 4px 0px 4px 0px; + padding-left: 4px; + padding-right: 4px; +} + +#workspaces, +#taskbar { + padding: 0px; +} + +#custom-rr { + border-radius: 0px 24px 24px 0px; + margin-right: 4px; + padding-right: 2px; +} + +#custom-lr { + border-radius: 24px 0px 0px 24px; + margin-left: 4px; + padding-left: 2px; +} diff --git a/modules/home/hyprland/conf/wlogout/icons/hibernate_dark.png b/modules/home/hyprland/conf/wlogout/icons/hibernate_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6f98a083153af3e959e1ab0be330a17ae9ce94af GIT binary patch literal 17133 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 z೾m{OPN!}r}!TZscIC(PRr(KS!?Jr}j_hh~@`MrC6 zE%r%iTEZg9fwbmF&j7&L2;b=nWF*WtX?^oM4DcPUQR#89$?I@5OQ=X|PGcmeNNub0 z{;&vtG*Ovf_4+#A4D_IL!`o4rRZG-o^;Ddq+*xl8wNRALUB_dX=W-(`9v#28Q;zM| z>g=4_2D?XB4Z*lbfnB7z8JxyR(c({%eEZ>G$X<`Q{H59A`YJF()xPyS5*7 zBE%}5Ka2V}I@9zyzW+OvTu|GZ4ktJU@!`-YZc{6kQP`m_ehwsB@&z|p%#|VcjMWP> zc)Kya&sObypV+GgF1lIW!%@)W2}J-cksHH}L#WfMG9rE+3dhC;BVG|R);7M)(yqyk zPV)WwEJAQQ!Q^C433nv^_+(4=O%SbFWF+*1FWg2CkeH}JsD;&2WmaeV16H}g&!G2W zW`waFV-xO9q2pb63|rG+aW!x@j0qwOOR1JX*nYfBQlU+IKN$Cf8nK|>=WsaVyq5<# zE1wL+(!{(t^74#;%tB@wBtV29bD9+D_A_`(U818xwp<9liR+N^i`7-#86pb@Pgg*v zTi<5wmUSIB>%tdCfVVn3g{iv8{G@0gJ!UgM+8^8`W$!2@8Ibr~HQ&4xOC#3NQUW_8 z_O1Px8Gxe45d4+(X4hk`TruMMCPiy52KEM9%&wW{L@`0grG`8L1L3kCy@ca2$Sh5M zqr@lv0=sDDaV`qq`m@2423Q`swFNZlBcE07Aa(4qJ?0$mBlll}28d3$O9iB&(<-Av>B47eK#zYXR04;xJ(I)~;S=Bo|>8KmhK*l{LI^N8f)N0Zl_7({e zmQ<8r-UvF)ixwp9!b(_Ca!Z)>Q?)JoxwT0LdI{cfppUr^#*VDtnbl==P7CHl=d?K8 z4!VMm+@`jGq`-!aBobcV<#-L9LHr9D$fk-0GF zn7?qCJUO7)YycI|zAhL{; z06psA_3}7woE#32BZ-}33n9=Db_p7Efj>+^S9}k3hz83Hzv`Xp-l&LNQ3+8nA@a6=p{RWuaxOtjTh?pa@8 zTyF8B&yZp4M$GoEx^_o4$Q;jiOUfQ@SFA$=(DT1Xd`&Zhh)Gdt?pvE|O3w!=;&>(G zIv`eKu-$S(PWr|6B`Qx~&4cTAsrkIQ>oW-vu*EgsE$mBN*<9Z(N9c22r9%oa)BI-t zgy)0`LhEXC^1GuQS_`fr7s2Bp;=}_lyW@;hzgYxSwtQK6k867`GlhyQC%xhL+G1Dp zcH}eK^uzO0ab}d507&)y>R*GzWvGr$Ql$BTrg#f^EV>NwAD@B{3+aCymYzHl^OF99 SKKP*ufHttuuRP;=<^KUOrh=6K literal 0 HcmV?d00001 diff --git a/modules/home/hyprland/conf/wlogout/icons/hibernate_light.png b/modules/home/hyprland/conf/wlogout/icons/hibernate_light.png new file mode 100644 index 0000000000000000000000000000000000000000..cea1ebcda3150999e6c734ed78b794d58d994c82 GIT binary patch literal 8061 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 E5BRz3kpKVy literal 0 HcmV?d00001 diff --git a/modules/home/hyprland/conf/wlogout/icons/lock_dark.png b/modules/home/hyprland/conf/wlogout/icons/lock_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b4c8c523eb1747a1fb9e5b99fe3e47c5718201f7 GIT binary patch literal 10224 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 E10BzIp#T5? literal 0 HcmV?d00001 diff --git a/modules/home/hyprland/conf/wlogout/icons/logout_dark.png b/modules/home/hyprland/conf/wlogout/icons/logout_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b918ce7496113ff9c6bd5cc2e931e5a3f8b83a75 GIT binary patch literal 9045 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 literal 0 HcmV?d00001 diff --git a/modules/home/hyprland/conf/wlogout/icons/logout_light.png b/modules/home/hyprland/conf/wlogout/icons/logout_light.png new file mode 100644 index 0000000000000000000000000000000000000000..33ecdc1b5d9f540b1552eb7f6a2e28b6016062b6 GIT binary patch literal 6858 zcmeHLdsviZ7Jp|LU<8!`MUX5$hFnFR`@mcR8Du~v<&r{@Qt-{pH^a!>oEc;^g-=P- zBrlbcMx|SB7cZ-2scA9<;&yp-Gc(JzXWH4qauc+Rk_da=VYpb@E3@xJeQ z&-tBme(!k?%(uEAZ~BO^xG;p!2u+T97D7yzG7&ojhVR{{euCkzRI$dO(M&>YSb!#j zg%~iynv6knCL;(1fp{f6Q833k_=#f#`^P$%-w~KU1@nmk9qdrVV4@K)Hozl>`Dhql zg~#-0udgF8#~-%;CkJL2xo@1V$t@tne36hZk%GNYEKv&OO0k3xNt9BlGFb-NjI9F^ zVWfEx^Rofv5mRPnfhIGPusdu9lbJ%u-LP~+T26Dp=oR_%wr}4jFD__F$gF&gnDqCT zizZH6Q80PmH)WSkrk9^w|Kb68*zVxanlU>@@{hlzJP@|r8?kD~nkWCb<|%jStnx@- z?fci{?awwZy~5}=Y<$IVLcVqWrVX0$D@v-1*hjdJFkYSbPL$*a#eFlIolDO(AG>mh zb>i}oD{YTW3VxC?b(wq9*DJFQXQaMu`nuuDYTeE$NiA(Hx{&0YuD?`%`lamn_(!j& zN(_3*cP%3Awo^wPF|WV2Eh<0qSai_~OKOf&E4~|Jd}FTh+o_%5iNO|X^M%6Z95QkS zCqb2cXLKQ%kZ~ycvDL$$osia*xwiD~`kA}KVijWwYQx^WRNK?k{^^#Z?+%kCJ;7RB zYQCmpu`e=rt+dp{pIvx?#ZC>HGxu0&1yl0;i!$ZhF82AeA^hFwIJII~5oI_F0>JDSA!1A=7PNC;MF;(zxX=mt83kR8>{+ zt0a7z!zd6b6bgY*ED(!%puux4vbsn&&+1IX5WN^`%Bgdh>@JhdN?=S0q zKb^sWfO$Xe4cdLV`;|c}H&>~)=_+w}8g&{M`&a61I+I@MpX!p6lXb!r1y3uKXnE3P zSqe`fmKb;`T2iDJX?4k3iEt2<#_DvDRvm?*0Gw|E9IZkmk{IAH#WIM-ta;ZWtlL(VjWCKd~Qw}FoBF6OhPX7)*79}JD#FDs90l+VZT$Gs( zigei=g*KZxjoaUK`?qu9I_XIlsU}?%fcE#{!oEH{S(vOG;9Z$()0+&7{+%|yJVa{m zk>{A4;D3={)O(|5Qww@my-Tynf0YQre<_rtt~UiIxscNP;{>eUEnPWjHB!($0_EB# zH{GNZbW*Kcn?h1h0PssnN@P5RUIf47GPyokDAlHjeunO}8C+GQgUT=hkH8g_r~fY$ zG0}feNjJt)RZihk0K#}eIZrIqn~5S@%V}*VA+P%VpdI^+(yeGE*PkWz5-7vEB2^JBDTH`qkP8e#AScM{0Q&3$x z%_hcxRK?m;AJ1oae1~KAULQt3GtQ$ydq*K(1ZqOaJ5_M6IR;thBRdn(F@InowC6$e z@&kD32|X-N0N3yW0p4e*U z1HaDrIlAg5vH_33P#@SDYA^$i`}6q~^jmG+f|*;X4`fF`p1;ZQ00a#XKR=RyV^5Nm z&p_**-rRZq#LhQ1O&*WXnI#?V*Y6Y&cy_gY=~|APcO(dTOun8g#^){_gu~_wPjXdI z3Z3&BKZ4lkOI2~8{qnj-He}gyYz_-_TG&uAC%uoszRFdeMI)rz3Q7|n-+`4@MMFGX zY|F+#ZR@cfO=loPF!44Hw||>p!fF*LboA_cW77^A1F$DW0^0D&TrkH1dVj@RpUlRN z8(6S$_`dqQA~lUr-IP2G_^t4jtc_T$NxYS-LI+rM(=@Cc$qC<}EnE%QvAo(O@I!z2 z&B*Q8LH33C^p}L|xy1K1ZSTc2*Ds@AfBwOb+h#5pUC~$p>cSH-k({o#!x52gcy2s* zt2-Uw)GB-Fl3^SqnAdbZ5@M#yuoJaPh%?|4u?(oCNKPHjmCeqE@Kh{Tq6#Oy9H+x! zG-22Oe`a>)wLQ)+nE(8#p=*AZoZ;PWE%!xqG}Mo0&|idNB0L>Imj9g4|F*o`uJWnaO2Q@_F4bk%w|dT;pC$a6NGhK>q6qWT{{*X)FG00tW2eLU>cE-E;r}NGtWPjz3F?9Q)ZBdBLpwC7wtLi7Bbuc)28X8i%CX2h}I+hU@?4*dh$eNrL&pyNdCA)rei#njHmg;huH7@w}z= z6YNQwXvSW)v5Rdbl?if7yjh9fof}fR|LprJ3fXNtjRq_w;+X4N=?}r!92->f zOgqE`MGKJN`B&=xrdzkZCO1_dZ~`R>E$cTp9)JK|R1oohiZn!Z0-*b|qhT?0$DRe_ z_D}Bd84X=w49_q$h~M9qI#}HhRUq|@id|n$vUehTVo;!;bxe5aPv&T3E%*QbRX=_b z!`m7{=lXt-)RY@qw=+AQQ2ztc@#SA-d6J+8C&a;DP0!U)BTxbqDmxUKQeC<_NX14g mb=bFy8FGY!rRrZPH)M4l2hg}w&uI;M+M_RA$#vL9T@iFU`FFl#@-zb({U>3pdiRrE=0Q=U!sz)y#HYM|}LE(I=6*tE=MUt@87wlGpv=&QRX! zs{33voUaZ$Jd8{1!(IBxO=5cUJ!!vf^<#eL8-#{534Xyna2pF}T!B7I2}%?mk6eT^ z>cX5{UbzQARqm2Cv|V->zm3x?lEBaN(XJ(LsU1VcOApVt;V8!SaDvQB35IN_c>tm^0`{ zMj@d%5mg0M1(f{BXun8hF?}Wx-B52IZH%$W-w@!Hp4hqYaJ;snVpLR=LX?U^NT{!( zl9ra1B1&0NSy>*`kPnLq4)=_f4-OMQfcOi;7#D^O^}~nzg#?QnV0wCmM1<>!iGlY; z{$XDb-pcBq@WEk!vjFm;810EyR8l}G1_depdyTO0laV0E-v<3JYlPXy;Bkr=Tv$j% zC>D1z5*HjU{_hap*nif?M}!9c>5ey65f_LH0#(DnR+avv$%BadXN?02eEov(e`S_zZ(Kp|0nK$X#b<{f0RKjD=Tf|5NyPOd1zxjv4i%ty+g2m z-r9ePN?x97DqdJ6c_lBbr@X4VmzTVzH%dibQ$-o4s)hAb_wn-lHz;&)Sh!~}7Iy#z zf-CreIBLq?>ONR?HF-@9RTX(vFC0$Z3+1CMk5yIGQdUz}RYsw_{|&+>)DQGZ&%l4T z>Hx|cg!1y%^z!jm!pbXot9r|;s(Pu)YpUba&B6 zIQ@b=eQ}ETVBbGC4hYviZj06vQ&vFzOJW=78SVpC&=a%t3yz5X*A08WAe>#e=K-5a z>RQSg8k%YvC>2#zO%;uQDLLXo!$40w!2FXt|J*qk7HzOIAhDhYehLEok%N8FHVVag zhKGdOhlB*`iTyL{{`0mK7*5`v;hx5x;W!ZVpLy8+A9+|7rKYX&m-z>9Rw3SgJ~970 z?StSE(FOIvAvg021KW@JBl;_%>~QD*y87!f(C<$uiHQ6O3T;p9UtI|EjKuvlSRmG4 zx3K3tgMD#e_W0Xf{~`DLU$}yj21*I*1;(|yii(oFDo#xc^d=uQc`a2X4XnB{82B34 zKP>zcJuJj0Jjyc^cib1`5#$PV&p$Ji$gw{ICHs|k)>wm<+|48}2-t~WtE~bCIPT_*Vr=TeCWl0BrK?r=& zqW7{eH3s$%e)pQ6WP=g}-t2T305EeO91tMCkPj3xgrluaGR!gZGIB88QDjdC01*If zeB3^IY z+qp9t<&NoM=hhqs#2Ak$r-^zVg2K%Ra4yDMb2C#LnJ>gey*1~i!unhSR#)d@K7?p;^#sX5f2oKyg7H=(B_`vK>0T*`VrcG3Cx)( z5S|BFBp#+{dz?R&cWA!=$qk@cKd@b;?}B0pGn8P;F%Le}gJVeqBB%cJRxgQogGfhd znqB=#iKAZX-P1rz0wkt*0)i6l;qKAj+bv|cN{Z`$PYLws^TDa3n4^z4W9_mm0df`F zF9t|jml3|^61MXOX?alp6;5)A+i9z=x&JD!pvk(M(^CY4QF$!89H88^C$Wsj+fwaPTPD_w-%3C_! z_SQNl-JWz}j7~F508It7%VweUhTShAlzK`m(d`*qM28F2hnh&Z%gqK3zl662RgCJn z>LG6>BTEzpLS6NMkas}9W>Bm0&Z!ds0Yk%Pw&(d_tC*j0&#p^7y9cEoiOSv&ATP3uJ4OVat% zF3&%G-y^?2*FyhPnZHxEe04b>;;FGVV=S}l@zIC@SUS?-td6Jfo;yUa3H#js-h|Dl z_tRQ~M6|;&uV$vxwSX7S#g1nIg^o%3_b2tCw!tPGXK!tB%-9MQE#yI*pzd-cC|V}B zgII#tE{)yrtqhER(pC<8xU7KuQpOt1jBmW%*og@{4U6kAHpG-!i#9O_r3P1qKP#1J zI-%LMVvJ$44x`pO3%EFP3$e1)#$L}^IJz&qR4SkMIQMY!rHd_UB9vO-(6k_;T={5_ z1JYBif_$umu|L}hws-~NZA#BEWwUA;?NF_VsyhZNokGgN_1WXHX*Ufe0gS~_x;TE# z55?yiaw&n-)6|pgr=Bx2mS62vq)+bbyf@tgxgT|%kwv;YIC)ag^bpSbdtxSC3V+Sx z0+_3LbmQZW1r#JJKZu1!M|G=dO>toY-5cU_`1bbFgQlFB4Srw=aaDG2h0YSWlxC1u z0V4}wweg(zCk~!a5jCSkDmO*yyiA>r`k|zqcnU1}His`y)SAP)S~GYTi~-0d7^S~7 zbQ?nK*nHoP>pEyl;CLqk8b)>^So@UpDow*$Z|!Y ziyMcUNfi~Z`@+X@*z->Na6ubRT1nZr>h)e%J(ws@jWE-o>iW{hLK8Cd-^=X~;|`?#1kV8t`9m*uy5Gxr%m6JPbS+q{@SR3ZgQ;1isw2C(v;d87aTw`xYn(s zjKqT$H9~c1ZtWj>9O7_z_5z~4f;h3@=}OpcKZIeN#Xfb9qD2WQ`jEh9LHNnqYR~4& zVVzYnrf}{CEL9*ujRL32CSMA3_|3X|WcpB6)qD2Mex}LhQpu*NUq0<68JLG_5`j4p zQ704Z6uD|V^K!1s$p4B3HqW%vqc9~$Ag)%wr^)j`*)ftZI!%Yc`ScHKKY1FKdZ^>s zYZKtcslDZDVF;V@1SbCiY+5cxN;MTfRUb=}Rof-712#7{H)^@+D7F@U{8sgMEvy;( zB#-QfJt~!=DNyfo?F%Ksm%N`o+Puba_FiGXP$HtKk3-fdD48xCXVoJNV^i(H=nCJD zyOO029T}~EYCL7E)i3OfDD;hf^kKn5GrJ`awx3B%OL3BjV4|gRNkW}C)vZax-VX`e z=EE_8K#QqnkyY`*#jrgC(4X^ksO}aXS!u7fOgT-lli1R0g%<{%d(;)H z=XrNUIs8x*M2ZiSHkItO`1Qu;+Ge569M4>Vxyc-C<+LT$zC*gXON45XY*p5s#TeIU z7L1HIB{);~V`Af{JKUA=moj-Ua+%rHiG-wDduSNRyf2qR5Y=SN&>Cbf zt!bL6L13CAYtP$;`o?l~>&fgJ4@}8Xv#Cs`5Q)+Vl1vbkb|j{3C1ONT`c7oK+kT89Mpt0JPIe7=khYNlN3uiwnSY5;C}eIp}%Vfv8L zJ`^HaNb@yEv3b;9J?owZr?ps4PT4MT{&W4AZ+H3ib0;CmcGaQ3Jc7#& z<N4`W~gC+2%na_#huNg&&m9!*WpjxF^YHiN3B-qN*e&^dqG?Mx)zsOLLMvrrL9q0|n zF%)kj3B)%S!V6A)CxGDu{rh{%G z@lB$b=5+=~$V3H2kHk-TH%No3>ER>r9X4LNVw3$l z96hMfiBHjGv7u#+bCY%c?ePM*_|j zFDr5f# zEEZ}zz9%wPJnyxNUbj~Y5qmZQ(|}6x=Y{IX-8ZSdh+nEeI=nOGE})AR;5+BsUBtQ> zeJVmKYdE}Y`Fmw5NWX`B&BZHKAoXuQ9 z=%PJr({^ITSOfI%>MAY$3bH6t&us29C4+J*1u5)q zMxJS!wl%}txC-Hs7`)LBjIpA(Odzt{=TNPkMTzKzYxX>$Q9O4~rfpk8S#hkWDNwoA zt-uV5;^p(u98@D#jGtXf`H`7&f+XODq6LbfDYz7Iw-Jc}L!VjwLDH~UB3n3eptT%X zYGvzn&HCQ?aE>X@T%?+#j44Cnv@LnA3og)=C`ga?Pj4evT2M`>939uM8CcvqCC6YQ zz=ZbCAL716x9M(l{hGVPfQW(;3u!of1WAGydLNtBks+p_1iu9wLl(`aKoq40R;T@r z%{Gb>Q)p}*B53)aEyg|&YmGzSkK8ij`F1UlG_1W$nMC~BXP@P1d$(gSTTZXnjxxi% zJqj z=XtzUgQYi0^m~7DaNfj1vgS__-js=jogV?g)GNw$@r zn@jE_%;D`96gH0sp69NOrtZZJaF}7LBI)u>grpt|q;!p^)(P&{{ctA@M)`e)d$6L~ zQK}zC#2D6KDTXAH28T08Ow*=R$G|8-A&sxcm#7b#SVfz8ji5m9)q0-0%G|Vl1Nr`` z;!N)H%}-tKAmUAv3E%yxT?@=v{S!M6XWv^foMfAo0MV)n>2C7I>}d9&!uvssqM!zgs z;!dj4fIADFm%HV|xKOKeK58#ETQrM|x!inxqAlf~KCdauhfm4b3=-%sb@yF)&s+W` zi9YQ&;!Ijg0PC86N#%T%^V?9-$hII!oPGi4K{%*<%W~os;H$cDB`5yEmK$gJ?$P!V zK@$1LO~?fI_pMcR_zMY*ev_U-Nj~r`=uz0^SWB9SQANDe%v3Ll+_ea6;yZs;tM*jX z8{FEp%OiVtTG`Pu&t4?IYN~7+;s`XTjM2yV)Idi+f?Y1kpi?&%@cl4Ict(7y4a2jb zlm}lVGRgg{6-7TSUe&c`*{|^g9-W zN&C&`k^X+)pPk!R`>TdyGtyyj_j=cDiSSQ>gsNWPDjnO^@a2+SRx^x*8~1!e5`o(i zxHu%{7A1~vZiS$W$pKe%e(=Sy*lyBU?^}>uR?Eyj_1pCUh6dEnW+Qt=LGC1(Wz*|r zjl306?`8Lg%|1FYpt@=l(YfjuqtC!vTNhM-kZa+Sv4r}Xcy#ge-^s54r9#XaoSJdH zZ1Gns5Us4;T5cuz&aClmxmUZHS z^dQd|kykv!BK7_D@i5+it$m;IdZZuo(U;>#*GG#b04d{!6?sq(b3)_tE5~OK<~V#e zS~+XZqX!+YiuQ>UVjPM;zq>B;TXeh@>8ImkB5-%TbPe`(k5S}9c6mnUIQ)!GNaU9Or0uYRf@IWUoeh9a9D??BWJz5z@Zu`W7@~7Oo0`>C`xNE!U{m5*DhBEm-1HFoaQDZiMxhL&%|6qqNSw(+YT(j zm74$qW!f``4ACV2HDrZud&Gt!7CPYgmNx+UWM2Zkwg4B(z)yb1Spr>LzKVMWqt_(R zZXDteKBq1?l>!doh`Jnl;i9RSYgoUsB%t(oe-6?=o&qY-UNMdwLHvrK7wKQJBH6Pk z2|=DiVsqpnH~D7rGe0JPDyqEBoHGrdy7Pdgqciy`L9HaR!UFuOaox%toH-B)NzsIf zpu2m9ILl5Kn*!V5U_PvILt`|0uHkz*K@BgkG>f?oX@FEruALym?>&=4P=vr$Gct=j{KJdQ{AOYs&I}l1JR?{$ z_NnF!2p<7u7ITfNRYn3GM14-^df~DoX&CqkGBpRv9)f4liVy0tXnz9VB0zr&2=CP$ zFF_U^_ga#+ONV=GFpd-k#DWvt>siJTxlVDyDbBLrP0J3XVG)blkZ<`jeSjIs5-8Sy zRg|cJc3hQD!}p4UHl%2Q-BpG>eR~;f#^^RUp18nU2t$1pAQ*~7`{(d&cYEIjetGC@ z^J~13nYA1-BX#>(B?nyV(Sz^_%v38pe+Dvf7s3bs)vpENJ2aCICT~)x4d5Y|2?<35 zk?Hu}lQj-#4D4B2_@t+n6mT&5l|c?9`-^aoEEV9uu-Vh};otyx_yP;;IY@Ly6{mAB zG;5EA!ZcnCJ`j89o>hlD9r7P9LKeXhh93fet%84aXF#@H&FQ1H1e%ox8-MzPAOu{# zBXx^(Erq&s6ShiU+%_i($aS3sn!~Jt3nq16=|PY;{Dg&GAn-YO&pZqGb)KFA#@S~U z0)oP}$!JKjPbqj?Is$~7)cK??+mq}a>yg0G4;i3cjcI+jtSd^m!47qCw11~ZAT-Mn zIxrL|gAS#q@B?U&VHdeB0RUW21>f(LAW!>K(&1>5H*|ocqMzx?R4 z_oa}V@aTDh4)wla!5{DF5O>p9OE1 z-gA~U-Z%&ZtL>8wD@&jZ2$MOaipIoPUdH#*QPQiBfDPFB=<#Pr=?*xxXnFVT1Q+4S zfo=ThN(DR55d;JQDShYN%hR@Ji}?wBnZP=1Ebt)a^AF88WP+{s8&0qrl7=HvO&V6j zaTb8KnCk||csa7@3L6;lYm`!D2_Rs!ugnAtUyuqQ8tUxy7!FV~55Jj0qJNL4X$p4h zRXyAnc?GAQIvBZIn#zODXS%`BW}%!-4g(o2es$`4+4emZAmbhVkzgG#iO%Ykpfgen!`_lEp(dZR)o=ST}X6=Ebf&rz_ z9^nh?zo7+jhU;?AG)Rp;mO!g%f+>5obj={Jzb+J83e)7^^9QFAiF{xp2s&^isE*B$ z^!!uh>>*zue~umOh4y$2IBQ8l#Km2slp>b$3SyxZ`t1?Zf6Yn-Vs0D33!~B+b8rs{ zd}8vVH9WF5-h#ws0VJI1Pn@_DBQec6-w;v(%4)ng@ZscuX_rTEYMN-_d!Q0#^4 zziR)neuXJ|i)R`ujz4_fx|Bp#o`=a@QI%{iPd~i(%q(~J5zAt+25nTmrJsw+-I*wk zE}kyB-u2MB{ar`y&vj5CIwfMQQlNEYe(#z@QSiRTVDv9z2iZ7Og(&8c&FiOkBEzDLaDa@lpnTOi>W0zKI*)|1GFQ;peK~6pM``IO~ z-|t?rpC3{#x{IDHl!)Q4!#p7|MsXo1gdYk2??RqT-LZh=dz1;BX_qd&S=jw z^aKxXoMnv@;yX8#ZGYb2it1h|L*$FCnR0O-kD?Y4k=hkP>krAE2$#g?X zU3c8i?6%?C%OaI7(r&>Qu`Cr2E=Azk@j1P=m`>M2-@pEZmh2ynGG%HH9Mo~1TVPxp zI6le{%UE=^baeqL>O_T$hBOr$7IL29MseQ@L1q}EJ6vXl!SnO)+- zMq-MUE#}PjWbq$ZBY|+&Nr#lec6J$WUeikCg8q~421ZSh>;0kLpD9*Bw2gVIiQ8F@^Mo$nfsAc;_KZ-rF#1h>yDEKEQMV2Vat|HVFfzG+)nDG z+cX+aOXTG9G5|sQGA3HB!N#{>{lm0N!IDkwAN;2;A9-CK{`04>dGvFV3zT+tn-MKB z%p9#8x_`l1A$P4mBCbd+xq30me`c=0Y~nV=X=v@zku$N+NhfZlY-22Bp0Jy&xVr;e zpKVXYay+hI+`XvC`GMirxp#9-TA_xmlb!wXksygC)MI~;Gb_r`J^Jgjt}=^KlRFPo z2%pZ-wEB^I{=X4!=PrkFSpqFskN~nm+C-}YjDF7cl$6>x<|x34yU!&!PYA*Ccx3qZ zErV<-we@C~oPQ2^m_@XynWs9lSvNI(;rJ)_>&|Fr;ek?loZ{6ZqipS8jbHG=O3hG^ z&CBu0WYX4&&wCN9D4EpstpZ8Mb`^@wxt*0z*yY6Jm7{72#EEwdrW0WgL>AR^9$~eUdZ;9 zLsK-qRkK@(yp0w3)|k;hVjbP7@S<&BV4DFg5fKN~aB~9t#C5q76raxjWhd*A^@nNkC<_C!+Cwbkw)pEqf!eMZ~h-efZvn^keU0|o~C){+@G3ko3QI(_%m ztg?0UMyb!|M`zp`Y4Ph;9z6HBqr<+(tV=dQ!STlzAF$M*P1IlC*0LXd#dV}mecEv| zq$u&sj4b!&QYLTI=!k@K`N+5d*fMuoD=kE?!hPXz?!xI`XJT!3KWn#)OualkP>1_H z4POk6IAuVxSMRu(3ho(Tkv`Z9pm*iFSfqiDT55NGejBwl=C^c(Q^xeN&aL=b$K3wE z`Xf2;stlRrwlB%aBmG&O@C;T4L{7DB2r`#OP!b((S^TWQ=85u>Vim!n$0+}khyq43Aq*e3D}g}0UY3pY3VxLEy%5NDQxdyft3MoXF07j)fi z6G2N~ju)AD{3C5xR_1;6x5ik3>5Z6Wdflupen{n86Ds}y<~jRJee6;~r26<2lRp2A zyy$yp5U!3$tpXNguiK_>nmMWA$?b3<-@CaNaF6hEUb5X`l$a*vFY(7OG3?`#-71kq zftb;iTJE|lEJBrMtzOW#jx&bn`~rl^&OvEP2TiC7IbX_j4hU8CyK{277@N9Zd~rIS zXJtdNC~l0XL*p!o+E>f#v=4CyHnwlrn_< z-U8#KDCwgPSKZL@YE_&*>UF{i%$qpm{e&9(*pla*>PpdL5Y_F_mR-;{(DU{CZznBAK1!6w|AQo`}XWiBiFTw-tTqP;ykvR_+upGmxU*Ywd&UU zCsK>8kWJQKfr5nk?t?bSq21Gut9{nXyg003LJ?V3HF8o%;^ok|^GLs-smN2gN$;}p zPy3(@6Q8>~*AIge8gj>aPbEZk0<1=rG@0zBf@- z1%3v4ELDV@vUXAFmL=}8SS)Wr_6?nLS41W!enb=$kV%?HoO7Lpw~u!Wss$s5C#o3v z{8h5;p+(O&SK+~rPYCX*z7S*gO^O>PMN;a*T&v&R{W~egY*L}E zC5BL1kdeH!(JQVgSMy5u+inw3l{buVzQvzw`n zFZtJx4w!fMAjtJ&i9-)st65HIWk6eO@^viVpSeT7C4fQm$G|F-XA;&hM)nD>fFTtd zpa&!I<#R7(A$faPn9Ew&p6)qh4)Rmw$j)ljee>?u^^^wij?Q_L7bN=Zk;)E1Vh3vh z+0ymISf<$5#i04 z*`$3J@Qd0b`8AmS$qVJhaeV`3<`W8(qiO7WN0TEEgWyLQ%lap@9e+qgwdnPnit`jK zdH>kj!xZxu+MLm-(4_cQ&#at^Bw{^3%U&P3I9QL!&N)X-H~ntQgr3)CcD~+5-FJ(- zkMO9)yBR-Y^&Zh~Ix(oSQ?n>L*#!?=z&|Vk(k2 z{oP76ck4bYT5#34sM88a!IBS8| z$6wAKtifC2((a~QY&~!MXu`PBoQu0p6CW*Ym#U+$zku+P)|Fb=_PW~-d9WQQ#$yTN z$^x4jdOxFRPE}jgpI$)|gVoUK-z+`uC$$bA*#PD`OH|@M@bJxm; z_I%B?N@ROsjyzdm@SRpdtYI%bLMEgH9OjVDqkG`%-8h7z z$IrHNJ6R90#eV`^HydHD%jpVnn=1a%F{@)nA`2Xa_Ph?Kt|H|yff`py$oG#GXAXZZ zRA2kp6wc8nnuSEGY3IdVTbXn@&Aju-GY46u-a!b-o{rruxbcYcCI#FebaWBn3N+<> zr%WSyI-3t(D&H&;Q&ogFbr9uJ*HDEdWYDxeCDQ^$i-H=624+d3Nj08;j=o3F$PN-M zlNL$UqcBVGZ#qF%l}kZoH^CW>N(OUfP`w{w%I5;AuN?BYkVd~}O=a__yPu1ke{l_# z;8aCy<-VC7yJbOo{+_sB!^O5!0&b`%N21Fkk$5bE0aQOv^)Qk{V+Ks3yY{b;KprUl z#I_U{67n0YkUVVo|H$Fi(KrWjve^1=?uv}B9=R{@yzKT#MbNz zwMx4^61jWf_-NDI1rID8{T_}|pW;Tccfd0Cx6Ijl3{2ZU=46v3A&W3uKq6!U8g74% z>TaW%^Ex9QiOyAqY>LsmF46B=eK|Gp)}3T88Vm43Htg{OtH@H{O{RhV$0BH%#`Bcv z!$}Fbk2h=OY+zDjN04Y-jTBxK@7u|+YZbL?MLqD*9w zH$BJtY%4Unt8LE#chr-J6)s3aN=G#lxe5J1t1P`1!}dttI3Z1)7mX>~;)U%!A-daT zJd19$`^p{p^CuvT#yGCi_eomL+lU9+f1RAG}SxI>=ene9|DW7M{ zVa~gcA;N%<^I>pVBPTtf(-3@%y!DINIh~d~_j{qCKG{^<;Fu2t+@DuuyafxPKMQ<4 zoH!!!>vyE&kvl5%d?!b7A#$EFiNYSwMFZ;`D6Nni+#igep19ybhrz{>DrV!u6rs$7 zOB6Bcmj`lUN9G%<%(!@X6E%d9d0gt9AIZGsfowx2H!rSQMK=eVeUBP4Sar#{PYFKB z?{V4XG54k@9ziR7FN*%6M(<2yo{+<D1o$CfXAn}AgTr!;a|h0n$nwo?#Hw(d7V7Zm^jCTG zSpHcGmhI*vX&cyGXk?`yxRfy`#?Xtg{5cI25(_rWNdBm+_;Z;_=k9!=qh6tC7E~dN zgzSzQSIY_#+#w+yBb&osL5@UwrfkCern$3%57dCZ47oHRg~r^N_&OQ>19wWvBCN0% zT)kyn4abAe74&7$$3SyXF^Oz4Z#oK_YE!>mMM5>N-YX}sJ!c}9#zRMk{4WO!d8W23 z5~n%9{Y0d%VusT0SjK`qmI|2%(T6rqD$%ALCUz~r^;Z9ew?}u*_>0ocPqUM4cU0jrZo%jZQ+M3Jn=^S=utQwPZ~Wtwy>r^?GtNr33&0eG!8EE zWiF0kKX}}1^s2ARsRZ_&cRF$4>Z|$hm3`NCo~pfsfNDrIH2P-6nb~H_)!A$A#d5+B zvlws#k>H*Ol`^|}oN}3I1kK>-IrX?L!7c{=1?b=T-iF}jJvkDwt#f*hBGT>xui2cFe k|7_naxNX0m%QBF2Csy-1UyQX~|?5CQ2eAU)EhCUQg+MGQqc7C>nNB1NTa z1VKRo=~AN}MX6DwNXu{IId5CPyVhObb?^P}1wv-eJoA~SO?_rxwLE=_i(P~r001t$ zu>k=9;7}3{u%e-_pAmx_&{rSH7VnA29|2gQ2Z$1e1Yl5VmlF1GX*di4AfW67=)()8 zcWHJ%A~4kN@9R)n^zU>Uls^17&2EEAFgU;kedj_SWhlKD`Ywe&-dFx=s~Jk~{;>Z3 zHHK2V$p830g*Ug9P?lFxlvh!O>MJU%XenxFDXT~*sc5Ml)lyN0s9|^h#nCR(zV5T8 z5Xv9k`udi5eSHaXP@t!`9|-^=a$|1k7`IvOy=-A$RP;o{*0TM8e&}O~BOf20J$&-A zrOcCAmmmFl=lfF%8#LG-p;+Ps%DClwo@q6(U!wCQmL;X$OG=AyCY;B7itpakSjuaQ zS%d9(rk8m3YTWV3xP_Oz>=1jFwHf;dtn}~;UX>NiGiGhUF_UebYtNCrKbqHOt{p+8 z!gQ$-8Q&5N8&7CAd4J1YyXsypE8RZR?v6fcy!9&d{b%(a$t&C1DxMxH%k4^TcL!ev z3D!Km%WHw@q_d@;?2Nl@_K00bQ@}Ew{q^^FX6w@X?3b_E)TL?2NN2xIcO>f~yduFrZvS}L z9FkQVVPn_n>ZC{)+7+hYAXj+TFPEW44#VG)S8c;;c8y!Xxz!6a}~IL1o+YYXay z@8ZPRj7ALbShegY7n#g@J>ziHJjKhl8^8w?-~ry){7v!y8DtsB-}_|-T^w;rRObJ32zS_tj$q#MRT$~>Abgb zWDv{Q`ouB6P67akZfIZngqe;x|c%uMXB0 z@+1AgAd-ZtysEsSoMD7_m@-zET|zs^!&8f3VDvWx^rVA59}+^=QcwsF50?*Dkq->= zQc%*=)KpMZR!~-!gDB*JF9w9TM#u#OAKZob3&VgE>>lJz4)G2Qkl4j^bqfp)(ZOP& za*2QN=T9~_|0jGv@ZVa1^q~;pN>)&kS5)x#SNQiD!6AlW5Xj#Q{V!_-6EBiU3ItMc zU}%s#$uNu*5OVO}Aw1mwS)UvlZj@UCiHO=kJnTvuHuWK#FzU^-~DocRnPGmVOY) zH6$>I7#QfMgZ<~I`_E!?s5^PMhPWEIhL9l8e~!b%e~iO2iqL5M7yG+#=7ApGo)`aj z)VrNWLK~uoOm6HQ47Gppch+A$%8GR1ucyBr{k(s7B?*b&okGji{Vx%MUBgHozxjl) z{wi`m?;7Amf<}+O-Sr>&-v0|%P*qcRb#qr#lsl@Vt|X_btmrQ1=B}bDr=qF|xt6Ai zs=KD=f1(EmdWM9%29Zv9L3)IA1-a+%8A{^tZ$nA{Cw2IF(ykRCg~=&u$SJG*Lt(0a zD@@^UffaVgjDJY1t?>WTiS}=Te;Z_=dVl3XgBLUwD*SUW{99+c!_NQ1pTBMK|F8uJ z`oE3*kM#Rrb^TXe|050jkBI;4UH?_r|40M>BjW#h*Z(zjvHxp3MGAmcLE+G5DWXSi z8QN%}-Aqpz{N8c_zx1ESK`Az}@ws3C;NaW+z<}&rAt;k21aEH0GQ%p!%7gU;OBMk@ z0>B%bAV!QWOolf&8a`eBzEpS!$*c9p)Up0s$rRKcL)24jViVSOkF4HvTgx+zBV`X+ z1q)dtn-bk%2HBS=mwt-uIl1)5&)l`OPP_A*2Q&|P73kCq@5JVN>0P1ao{RDvZd}T) z9p*Hq;qd=Qe}lx=M^Ylk$S!b2jP0|X88(pBg;TLk{E*b@r|=b+1tOU0MR^YrT?7~& z+ZRiB0%>LdE_77Uh2MqC<*bXL3(AGJO1p}%owWz^>ACLLLe;2z5BdeVtBc9@GK_wJ z-gnSJXc*AqYJ=tL9^vP^JHuul*UA?ty-2haEqyha}P`Qv-&o$1FrekeaN%)yFm zm?Zj4FRufOgLB-YvQ!ja3Lu1~Qt~Ky)C#KqxN@lTc{heC`6wAhmSY?$_1d$`lfI9; zi-L=dOJ}0(`y;Qj_xwCFsoTKY@MOoV&eH=f;az229>47bmSNpO%L>;E=_lwx^cRuE zbWe$L;Vi(|F7pF%;8!Jj^=jgc3R=e@IP>VanW;GO0?}b;_a`j zDA>Th?w_~ELBDqW76iVMNTQA)0+C_M(%bpwtm5zthV34C5|rPViDi` z#T1=i=7s7(#iF!bD_%izKT-mHDf$!}gZA@f2HVDHPb(b-h83MjK7)l?y;03ZKFml? zwC$Pglb}(vKoqDMs?4}vi{%4KWMzOr^prRz$8MjV^JdC!-8Y`SD&P zLY;ix;CijrV37wMM)v|=6TA1CLW&f;j^ak^?!nmG?d!_rbl}<&(%2UgFIb0R(2dhL%ZVXpw`zVztD#VUV}$Lp4mTKN{{X`!OU-|k0Tpg zuh$yvGoTC8W$6)gHD3cMp#PHjN9W3=3a`+IhF6d8C+m{oL!!t4OUP0yjjmubxJkWz zs-0YBAZLMoglIMojdID@MO?{NBKm%h)5fYj)*6hz3hEPiIAb|%MAO(Pk)R0}MQuCi zcCJic3jR%)zL#DG#t$c&0fTDezQzvcj-&g6dw03;iDX7|G2SJPzMM_j zNN0V6jJ54$&18i%f1^f_k)Al(QJNwkgUK`u^`$3)+q+oAXED@X;q{_qNw~_aFx8!U zr2>-$JZzWQaX;vGtn8!+&48{+Z=qDu?Gef_OPJFc=kH4{XZK=o#R!X`0&kGhMN2Vf zM-KlSsd&w&tw?Fb3#+Jv&8SL9I{&G2_B~|@rc!}{R5xD7(kzTQc8=fi>5m-FEkwj0 zv#nKEN}PnFSR*(i9&>N#3-2)+dJXokc%e#%L~Tm-WJZ|HMh3Eh-CP%28d%mjhvff= z8BS!Qs18~eWnYR8HW+1Usb}hOO~5CR6R-&@mhIQzeXcDNQ@|JQJES*)R)ecO8e(3V^0q zH?F8xZfj*g4=fqISZf6J?$ayPOrTi+Q+942LOd-Hy<=9Zx8+Q2v6{R+!Xf8)2w`t2 zCsrF{Q0`vK`LNggft}sDOaoUn#4zhPd^$OCU&Xapu4Wag@55rZ%7=Ouwkq+DwTG6a z#u3K=g-~>6%%L# z$n;3xs@Xry5xqyFcT5qM0wf?#0nR_CW?Q&2pz$njqXqOIHg@mq^rvo9M~vD#tl0|F zdLH#&yv?r$v*d|lW3(lX4wq8W`uBzQ=_Sp6i>d8?7OG4>Zs0flDQ26Eeh_4i%0W(T z-(guH5k@q)KL4G{xIjMydJ`*WOVrCzVo0&Q82g`OW(yF(Gjz!ca>H(aSngE!z}=OB zO+i4f_*wl@+^Uv%Gi4wUCwAttkK$edJDe>pN4Ql zul!w9?!jY-z@lg7Rm7Wl`vqZv55|H|LLKO8I@JpMkzYsX=MvEKNH4Bl=3zkxtdeC4 zHa{#g=Qh585joR>Q4ZlQ`@j^S>l>kdWs^| zKy?%(*m3s~0cJ#?f@@ADdb{)i>_pK|`WetJV7oF*;{$_9HxE^x@0Z&Sbw37i(!z4?c zrZ}mplDB0U5&UG*6HbO0Lm93n))Y-$xT8tFbCaCm(`UdD(3 zmw50)@mc$k;DX_KeW(7lu4wO^xS_l~v| zr)vdT&`UBn_u2r@#|nAxKgQ`zQj|+X}`h@PPM;CC}pJNqCWdld3S#o$} ztmPqfnt&Btm*eNrXvGM)2CtBJstHG}I61(SM(L*V`w_h9MwW8l#(#bT`Su|TVdIE~ zW)vQr1Uu9o491zl1fS4#nP1e3R39c$4pJY8>I!J%S2$A(4Q;d0Eiw)T^QQ=Qm8VWK{hs#Fle7j6o$~E^;}RO`gZ-R}=Eec@UfL zLkPEOV5eXMqM1l-z|WJ9JJ-TWZLN#>G12y!(muJOX+&U|g*BcuCZur`TNgl-F#U!v zCB3M8!ZzfY1KdfFu1n%i*35k#pz-sGngvJxkGSwMERu?w92Ge#4w*I z%d@!SK9~8uUt#q?SvqTunNRu}Fd!0g%q0VVTu*+m{L)7`{T0ypyXdFFG;uWdov{up z!gD|PmMm7y&wy;|Ex<6MJLCkkHli%+iYU`+xOL`@+5Ee$&OQ%vDE?L^dj2n3joJ^> z{pd&4^0GZcVm?p*@vSbEs-%`RsFGZGV3WFSf4=EcRvpoIw8?JZ2#BN(sa%_8!c z^I{&du}jK|FS;6bXpl&+RZAZn$hfbml0HD0^jA)w_vg~MRSejV6KNC-7%oCXY9su7 zQ%ejK9xyh2p!EeV$D}`c$^wzk0f-mb{b-o^CE}u~hLBH6WP2Hw;iJP;w=`#(_HTtf zh&)Sve-GhoVnuPJyp{sG{CUYFgK}#ITQGXaQ@6%X9?wxN&X`NItz_WnkF?k#s%%8N zLV+KmJX@s5An|9M>1@3v9xm~f?WU#4RO zF9Vf>pR7VN&fh)M>Q}nCO&i2-A_h1t;JPj<-iL3XcI?j26kHYcG8WNNK;+A7z%tEi z#gkNVr$d>3cpX1e`iD!YltUCQKdI0$7LMi_rc}-;!fn6ft)gtO@G}d+5~1xqdmGF= z_iZuTzT6rl%>k(#r{VH1Mi4`=?u^U@LeuP;08~Y)3|23gi;SL@>UY_`*VnUsBFBi} zDFajI&qX$fUlSPLWM3F8sPo40yP@bEm-eSj72QZ*>^i0I>rS6d6tW@SfAG`UY1{P3 zn`_{H?7fDHNGlT_m_35$Ny&>z&huZd!+MS=t{1S2xh@+YdD8}VTbYEXg}Gp=dC5|8 zQHT4GE?=V$V%211*PU4#`B)*2sN%rt!}?h{Ikr*$^=IaVh8MZ|Y(`_s=cq+~B6zMU zDRSK1UgVQ6wcZ7=uZ?FZbJ%;ChB$%=51@crthtCg+P(o6VXEEEoKPt$0o6c%^GcUM zScvXjt&%D_lap}-GHb%qeG#EL3H%4K9SASrzB!;;S%0cshJ$@4hInjq(q+Kd=Z-I> z$;zacKLhE967yRAdJ$4L$8(z%OpYOeW1i=Yv|sc>8`mIlljNGWjLR_~B#AkF?V*pkl1YnPmOkYC`>$7L7l&PwNTXPVS5RN+?c@$jp0kku8N z+4yJ5I1slfOGfRClgTq=x+lcu%?)T0{FA^fg&l@ByVN`x80Y9x?R}z&yQ%~ZU7lng zEn%~%nQbYe+8=bgJkNEz-=BDlU|xF;cl9X6_n_N*>?L0lb*oAF{Bu5+FLJoJG}{_8 z3J{Gi=?ZvehyvNt#5;hEg%2Z&D5yI(=E~7^k+Ec@b_FNbcZmHNzaq!zppVIXitovBLp)TU63eeT=Yv9;*&n;Q} z(rvwfY!a62wK!rzFzJQooYDDw1V3Bw0W`!^+rtDe#DK}**&aZ(P3dx@RpgUaXByg1 zo@{LL?KRvJmH=b=PxvR`!C;iOc92rfpmD#87@-eAy)r8HdGicx9|>JWH9vrl53@eN z25y7AlEg$S3$&^{H%eOt6MxQ8b<=i%EFHmvbwm=QDh(lKOHg43y_H@VWkuF-M z#ssG?$x-6g-oukWbfe?&B7_zb>Adt!39Q@xQpuz|*ek!y#0KSHwFsUn%+OpMt?+J* z_K>bZw}<#zB@h;d2FsZ4oIA8Z{+saq3N8XJhv-8+z@Iga1|E(DPkZ3uuosXdj~tQC z;+SI|;!GyDAKOn&L|@GQ-ih@X@Cp}H^=u3nMKGyR>4p1oH_D${9he(tamx86bQ0$Ud@_D<*}E$sTdQ~OyN9xtJIF$C>TY>pj`~NF1 zJ$%=fbM#b{Sf^JW>TABcidU2srCKc>M^fi(ct$x#iFy9(a@0^n>B?&G#u3HI<4WTIBpof+6==!>d7)E$T2H*+bb%ij~uQfOr ztW_e4-NKaCV;VM$%9tUjH{ST(wvoQzPy@&SESy72OSMRPp0LVO7RKv1ybnznyZ|Y1 zTMCG;KWE^VQ@zFfG3!hdnPFK$IXpTC9kNuI0q7Y=;mVx{2t9^2t`eMXi5iH zU2;lVvRJk)9rc-+{`o*v^xP=x%kzCm;w1rr==-rR^Dfb51 zp0eLeya48CZAV2(!Xi#}JXQb#er(+;G}?4B@%HKXG3^6aB$vSyx@~vrwF7Y_-}7;w zavWCl=W}uZ&Nn$K@|#h|7*V~Vc%RFG#c7^ivP?@p3RP2Mc_^-6<~pwSMGV-hdQwtRa7qf;UjA~O#AJ==2{xqJeI85ePZ#didxN|a zH@#pErQR7yFarpi{nfTBg_1p1ULDggZ9l}PnKbN|MAMF$%q+q=f$;JfV3fKfcrcI?i>l|pp z8RSi`>jCC753Y~I1~6_H4nMzbHrHqXt+GP%8VCXR)jec4_x5t&XW29Z*SI&-j*AAu zaHWnp!(Ss?r6&>P@kvZ$f`Smr>~-~f2NQ4kDlDTx1zS{kj-x zq*uH#NU`NU#OPemUc11}sM48u+)7$*J#1A4_SNMw=ZpQ+*ZCZ@L90im(vG)F=9`4u zrvQIbU^p?+TqQl`*$fr8Qm7KVR|LaHaWn^xY<@ZXBv$Ct?R*4nFtw*N5HV9VS~CSz zSnVM$7J>JF=kLI_-XkRnszLFruAQgb5IbWQyAZxsO|er0Y+yIm&7q#7;z3ML?UE_M z;@I=%eYtJjQ97_!N4Mi7$t^LvHS|ILtgflD5k88I$B~h5ad_T8bGWAXgc!vJ{&+yj zuzdppzZ~O4OOt^mCSC=to3erV^!t5j{nM1^3(GWUotM^cp4BDJ2nL`EK|0$@LoGPz zO<91U%tu+=aNc}|^A>+9aCux@=$$Vc7>TL2tLHG6p5&SEaK4Ru`)M|fFd~?clqgAk z8zl#O6}l2f-FBd<7UAjV2Ycqxu5=}~u~JYpZ}BZZeTcHvyp%lU^tqoc zxRQ2_YX3?ca4ZKfrm=^37YA)NVehB_h%`cWdbO)0{w?`jaZvr@WuyxmdcDW}iUZ25 zHqewN@bPY1e_jv3c_xDob5J?$HH+TXl#S(=36udQt&qx2 z|HAn>psxezawAcw;O<1(d?&5&Wy(RAZ5iaz#aUfVW4f|=$-E-Q7CfGFwkvh`*q&Rc1+fY4QaW6N&W z<6m2Tky~}f_kVOsL9BTk4u7jA33MB@_xC_{5c#smNvfL_0G~mPzHgSni~R8#f-f;= zJ3jJ&IaeXJzk11pCXxY^pNG?T-KAAh40Y!mKsyvxM~Uc)FoD-%9t z0-Nw^NymkP`cUJgQ2r6&u4v9o?*b_Ac=8M&l?lk^ORw7C30MBKwJPRk1ATCFUGz0jZ`1&7b0xjSZc90J0|EAmbq0eY5HN&EFj48+X| z73K8j(NNBJNTUAcBY2+^aK%<(zze|Pe`%)@W+9g|@B+}ImaAv+1eUj`{G+hLacGy) z-O8?-0SeF@(HF8=f-6C>9lu`y6Y_#f;FV!tn}jL1gu8M*^&kz|CeL(>H0?>*RXbPE z8~K|`Frmz>RVzqapKUo@h*0Yoh}IpVg_bOkMuHa}&%r0p!^B zE5RC|gJs&_aZS(ECAHtoey%Yw_%q^8<5?9zGXPf3gZn*L_}?m-$T0`d2e2KVA|U}@ z){}~Z0)5WHQ+~Ur>3j>6_vB(dhne(S^x}CdxMKX}avv!4gAYOjlyT}ge-i)*n7=%4 zP8(!5rForrnj^5nlAQ@m%yU96d7v&SQLMTyo$YwCFr}8tw(5@W2mA|4Cg$>BUnz;k zpxW=8CRMAaBTpcvB?oeV@%J|+@kO1`UBt!i`Egp|~rFO#T5U>*4Il0QdS%>pJ-~>%pda!LL>3YapgTd)%j^_>hkma7t3><$3;GmtN zr(OObJsO$}odcjeIS}b`#f;=UXvzkD&g$~t@TYK5;~$C>Z{b3FnlVa`$1fMBiKBL= zpmP2!0pu8m&=fuLm@c*lE)T2w5uIL`{2p=}K^4j-)Bl30$MIkrRP;*pw7Wd{NY%ZW z3LID0d3u(a(l=7YNus& zHJ`r|w>x~Jpmk?hgn?hx9VQ0Dhy6GQa)D(!HzmD6r`x+LmVMx4lkEpSs%BQPgPNbE zP6eQ?Nm&XzFw_rCc!r{E+8NRUF~JwO8@N;ei(7$F^bxg(`OQKYzRk@m2i+{_m0&%! zNT*)X`>vBX=IQFSU!j#!z@SZ;X5-xhD>W!aGIggYQAikb3LXwW1wW|WDd|n!Id}>( z<%8GtQl~LtNoJH#QA@qJ`M&U`%h56pctS}BU_rWe!b@)PL_G;j@0Bhp$?DR*!+55t zhz*--SGbnQb?~D)*h{I^o{?mu#9-Y{7C(+_YKW_rV}nj2p(RqRd+Um_fX1VN7FF!j z@!C&=)nG(#3|?okPYkle7og?a3KF0!B2%BfZ1tcp~z%HP*f)zuk+=t=I~DC_M2Je zZ9P&XtGn`N|MK9-gvhUm9<+76jL9r!gmmp#@a+35FNf>A$DN^dY`&+0cOYdSMV<8U z%3cf$Tpd*E)-Rz`rx2{)J%bgpWt?{^sOHAkROT7uy>{GzizIv{l5#w{plhjC1F zrnRw8)`=wA6vY&B^k7C&UOObx%nQi^j zjl{R?LAU?1vaTSeTR>pT>&#nen_!>TOqj67-V`tf~g%F-ivph8W*CClS<^ zq(qy&VJmv5(LI^7wvZJPVCqKgMp+%hEG1#*@}NZ})10N}jqT0}a7>>OwI(CCKBDW% zxIK7sbB2AVHuc!Ptt-l~b;T$e@Jgeu z2i82Dc5O@~)3kPV^D6iQB{r~fi%l`fXSUcXIr+t4);CkJgSgs0UzMAcH=b6RfTZPp zTYTUxBFFHbKU&{#tygfz+~lV`U^fGrKM5TuxtstSA&EPO`INa^JHv0jh- zB9I9*wke$?aNIyHzR_+L?@#O6_y{x)a?;C)-ABT@jgC8aB;<0J*JXC@T(XzBjAXX- z?Wp5%E5$q>;?Db#M(TI(S+nHZUsqT^JhTjJdmfT2=n>GjU-rv|mJ*PzCpbFw8y&US ztKAXXD4o7ib0YSgFV*oGId@Z#@nkC@=^bWCS`oH>%l(hSj12>bU11kDz9T+s+%X?? z=^>>}8CSX(6Rl}f1+$;;;qlDWkS}+Q@JHVEgM3+?qo1-Z&$NAG$nX*^-o)_>=^1oJ zdwfY)K-A66R6k-jlT(Cgynq-mjgeel*Ft0t{&6j`caQapCQ$U-RxHXCxJe42cW?Y^ z>XB7kXXZ8fY8m%io|9ZN6y$o^q=ktn8?y3`fM`rCEV?S;YU0!nU+kA}jxEPLbclvWZ0Tw3>otA%FmnbO;dmZ!6 za7E1FyBgAy^f31U<^DspcHwfSti&DhZEWXiG9+6K=K>;|mey@tx)7VQnqez2-aPx|*ds|Q3*-vAi;yc6>Dqxpo2gR7L0uH8Xj-{}blF0NerzkG z*mw3(Wp=_{F7x<#BF>dZB5rrimJ0C4BU`Zhk057@EH} zHH?gXN(MND+%0@h8phz*4QtC8n?mc4Up&}Lp06LW8J!WZt!xR2P8lRTzr}2Ac@J)A zHg6rDs&7RirU9;c2An)2)bnCf!|4#+Jr+voe^KFgQda0c%WzdA7ADY_+DJNN;G zWO{=$HR;p6di5x>xdCS&VGcSWLQErc%~#sDlg`Eagt@29wCl|Uun);dTUBu3CmgjZx(U9lz6P$h*W);LAe;_0bpY#SN&YV*;ra<<|$0NNDtv<%SW^O8oztK-1(iq z^yR{j8!JicO!pG;6#M&ztqZ?C3+Qp1Wi7?U>0)&UKDD;+jEXmOTsTSSE;l{8q9?zs z5ydkkqNZY!4_mj*xfG`(nu7hfr}U-2uFWCM-pxppZ>{2bCr+#V#TWi*eB8pLTPqE)fYXF!e3L#6ib&IG~9 zkp^ND`mIa6r7MU4;89Ydc@)&;4iA;Z(FUbNfw-i^YN#{a3#e|kg;ycSh6aUBvj;*y z<#IcSVe}TOmtqeM-P2Rqw>yq2(rJmKPbn8xarC^G*EgNE6{>FK!#h^`p8?WEG1TQ< zqBot`j|~$nXQtg8_eVS|d~^N;x4HDb3_@gsV3etW*?cvf=?jHz1jf+oZU;Jlyr*4a zzVHO{)x|Z~HKec|qqpsZx4d9ER{q8~yuT8rK@B_H6C(jR7q#M{+KzO`Jtsu2$x7+O zhIG-uZ1~q9`9ngGm-O9aXWM~^IoUCmdO5+ZIs|kjByZlnqG2O0bN1WlgI%8pGBC)s ze5GMO7#|mp2lAQ6SODjw#M*hU8>fLObgrAZvCl1kO7}sx5SaTsA2Fv?$Ii`=%l>)` zAE*gRNf%iRS*Vp>Y-ReekD|}fw9aE01H6|Y!w}+`AA5i|ftsZYVS0V-`w&s8>nv3= z`W5R2%_+*K1omz{fGr)-To3m_ zyToq7oo^=In7?W0v~5uo$ykE<>Jv=;SRAaoHsqv>ZUWOsn)(yCT9>wtR$VmtrXyW+ zYX0_1&0)GiiJ^6I_J)Gwx-%;J0Y>l-{jJSIgoP(-t(U~RzJ4xaKBt(Io8s^biUJL) z*g9#C>v@K?^j>rGhmEcfX#rd}frBmm<3T8H;QzE3cKV1UH0h0}(Wh?+Q-1kd)TZ<$ zuTDPlDi(xAorAppV=(6X`%4|8dWh#husI;$^aTc9z*HB!YPoe#csNY?mHGo5w;O3N?rlD)v{^&zx-0nsF$#Aw>UhCZxtFW0U3lqGPy6 z1saOJr5`Il(0Ng&%EIJZsC3aWokIfOu0RUsT9c=nqQplq{;WIZ*|5wJWBN8YbI|S5 z%qxz^174IB=zba(o~u@G=%k+E53nFcBXH-SfF}f$~(s#%Z0&inw2wTAc~; z3$Wa?E{qmfM0lCJkUe9c+C69yd)8_D!E@@33vK)HZ=c99pdF3#=;(&*kbYc!UCHAs zwe({X@cBG~)*Wt2)BNGx!0H%u`H|YHM`;@q*czt++DkLUO^)b$J;RX;vrIR-VDbT) zNaW`@R|8oqdUZ@qg}bkhx7TdRHi}>pLmaRg(MmS<$*iDG-xk`M3*A{me|b{<@k;Fz zeVvvTuui(jG>VSYdJUP58g}p5jI$e~g(bquK0YqT3;0sMpRtf=`~0#EvllK3@MvWi z`=sPiq3Pr`ymP1oF`V)+*5FeKK=;IBUaulyW)R* zh3NB*4J=VhFGLG*N7pmH|NI^~e;bHEC_e4$(c-e5l%f$EE`Usa@hvYXpi9i2wxtWv z-@nkBzYRsgFWaLV${F6CMV(5l9=7DS?XSX0zB!WX^qG(rWnH z>tkI~coJ8-a^?$k(`1^x{CrKx_!QDi*kfk<($L|OJ$zK>qvzY6j8oG6)jt2&@}~;R zZyYRXtwSvO*)j?|YD$oED&Qd!HT;}EP1zK@wYTv`WvjD!^?vfrq#a`)%2}$OQM~2k zvif?N?I+uIe;7U8I<@fnDvP+vx~aaqBRv`lrMcJYgxD_0yUee=?w)f$nGm$1_gPO>-*#j?K)$Zf)+bRjO{C}R~;@XNK zZtgLLj#I|2CiqQmVq4>+$W?C-;|WYzo-Im3(}<um7Icz0XljJ0L`<>GV=y{OJ-bH>ox=t1!w|d8@QV_fKCZ4N+BQFc z<4x*;D=?dJF6g#*;QtH^YTjE)x^|j>ywysJ`qA29xP}>dp zS$F8*uc8`Rg{azJ6=zT$kiMnD=tU>9=yJSy0$rQMmAp2BDWIIt^RW3nm_>8u3wj*e z5bb5Xt>~^y2A?SY&^`A_YTj7$-X#eHvkmN|6acO_c0SY&0k!$! zP7F>lHa{upD$!z00VeCnjNU1@U8dI!mjPr9+IiK^jKJfd)BXZrvBoGDmNMv62Co6Y%bSyVKurB8jh$QIWYbR16z%mOCFF)|PdW_<~k zjM`zz^uO^+7$^yk>7Y;ZQJJUdbKq-qEEE^N)Vrly3X&|7^X!pf~*n?D2tQ(^29zQis znT%!VmwwJFO8zcD8I->wx+S{*=O$(POjF02j6>ro2*&P@&m~TqIp@!+Dl_y9R@kSn zf*!x|XDbziw?qYh&cFpN&A%61sr>#L;so*J_s*yOhzMpq5Y~e}4O^@>`jeAV_;STR zKJNPoCY~-vSEUE-DhG-|-ANpM>vLH7tDfP}+Boi^_?VhF5ExUF-Wv+G01ezW zpHtZ=h1U~cHb(7r)`q7LJ4Cuk>9?(JYBwco`1)9vJwRA)9HQ%ebzUSQ_>Y^m3IQ_bF5YJHRhs@k;Mo ztXq*d_syh`91<9xOF_s?c zHODDHFJWZ&9(GCJsL@hnv*og-`pA6vOd(M}W8KVdBQ{m(XXtk~X6}P+D>J_+%$pm` z&E}?En}EZ0RnQ!KO-^{-U9L_#_ueR4(yRE&hSXme|(DKj%0KkAWIcoy| zP_PIEsNvx2SM-}*@HK{YLV6*Q5&$*$0YXA300>w*hJ^e}847^`FtGYE_^^QGW0>QI z2SWM#oe7qC|0?H$WwF0tjv2~Bpa28-E(RY3u*?R&tHH-N?N44^VEOom`uDF1SURTs zkGC<>+)7A6MqW-vQ3=GCQ&7~9Q`1mT6p~leP*TxQPzRwQW&f1um{Q;6@Enjzim!oz z71F>!C?qu4%QpZE0MW$>x!NYZR&1%3u6OS?s5x0ZJ!ue8FC_7y(q8OLs+DBJH`I?; zx<0RRDq7TNYbmLcI36&{jI?RA&|V@l{qZ0p?@mU3w1h%3uymbXrBPIUy%To+o*<}BD#MFZ7h-lh@mZF!Z;?Jk@7jD0K7Rvd!{x*vx zb3eO%d3@3cHuWcmccY8rCpjjA|-BGw~d4?{t{3VnDvFiG%TijB@Y}w{%lFe53gEND)$DLp+u-Hx6m1?dk%6Q%q|*g+qR_O){gcQQYxfe8+jL3;*Y zz{*4ih8!CV(9(?#L1X-};X)U%-o8QF!fWl_!a}~D+QN>?=5ppC23Q|olh{zKZLEbI zCe|OL?kTLRL#q|70TKwrhNFd|0|SD>G@`YIf78_f%g5ES!a~16!u_>{oj^Y_2oA*x zDak0w$VnSU`$j4V>(B~mg?f5v*qk-`iv;+kE$kB>9-<*D8x<8L6Qw8<9O^AAudc2x zE2kiKhX78yqBbOcQ+}I3iqISQu;<`iFdh zA?D_PlMf2}OADYrWTVj`vhp%=vVnoJ|B4Y7ZWsv?`AeYxB}SNCObAxi1{)R}5sJYY zMq-1)MgEn9C+2VbkciNL-`(-V$YKMqfgorY$W{K|SRRkKzcG$g;O!e2@*4|O_P;@f z`+EITS^p;6am(-S{Hq`!`rmZ_4f-E_{|yX6nVV~z4aP(qi-$a`Equ&h!!sD;>#6a( zsESrmRJkChE{*k6QoCC`5$VHxTRdL=sGU!^)G zV@B=JTV$Z!J&a@(44-3 zXm6}+NRapMhGT_m=vyJRg%xDv{#j!cfDZQp5wwNR`36Nq|Fgl)HxO$Zjy~3=yo$Pl zs;Zi@x}3U#vWm)|-TqC_0UH_ydg3w7-*e}0^kcJVfSmyqi$3;KkihSHurC@0p;&Zy zaHw5yaDcY(-?Q%D&F0{6@Coga=l>K`${7Yw`1phyO{<6jYPZmN# z|7G$Y>G!|t`mehFBMtmV!2k8G|ElXh(!hTN{9o_-f2JLEtVZ3Op>;`k4^H zgBJXPnekcR==is+^L`#!Lla`+90mY%tj7-oxKYdnR#Jr{%?+u(P;*kB5J=g0w*>$~ z0P?K9UG((IY*Y)sedp2lE#zrDfTR}9p`bqDBBoF8=8_|!--e?$WzMJ5ZT-WYQbwg^ zLUQ5NQ%OIz6BX37rg^723x#Mze_f-cIk~Za=oB_GFyI@vrl=Su!i zk+EmpRnk|y5V6zd1jI9Mxe#Nx?EX-bCjMk(Ap$wu%(H%;QRdKmMHFS;ZceC}&Z4;Y zY4O9{n|mxA0$|_lc^Erx^=2g5#%b;{5D-;ol5t4&u5Hyu$}WMaG=ge0KiuYdvudbhg~>>{HIi9kzlP$8mV z>au7D2*R+OSd|#dg|~A|E8K1t^x85b4Elv$@doZq9uO)NrYoKvbDTyCy-m9cRP0W@ zq<*1S59ADbQ;EpI2B3Npr4O@k7mbA88iU4*cuBR*w&?tWj{|amPi3ST;0CJb$2UJP z>B*u}9 zJ>#QUZ_V*6G*1$r5C9%(XY3>Zm}J6zKPia(s&zr8*5!4eobmIQ-<{+oE!+ z^D~^VB&tmqPv$H)P+)8jo-4?C&`L>^A;wc3?HQ3_WNET98A+xge_cE)TotE7wI5#9 zzEQCO^ck;klZ$=4%3jvyq~HIF>*k9-eXsqGucWhNl#BZrf+8>i*abtoip*Mt_oq6l* zd&p*!|8Xmq*|v&qa6))_YDa#che+HgYhh5~$1f=yz=AZO0`vORQu-cf`Z*@exCIrv zoJe|v^MJt=_qVi4h%8eQk=ISV!j%*YzqBvTlR8OXTY_+uI0ZCfT__~L;;>8e#5IK5 zM6E579v(z>nSHypJNvPgeKOoVh$YONK?b!{Iwza$v``alJC*AJ5aScnB@L76sS4GN(LeT$Cu8&VXOiimAkX887RDYNG;L>x4 z7b_1Hq!gRm1-!Xn+BC9o_w2PTC!kUynfk$He!HHzL@2S&Ku^6H|!*QQZ)@|&AZnHpZn0+FOo0jjJHJGLQm#2fNr#vOZW(`AcB z-j}SM0O~H}r1OJE)(x-Hh==(6!mzJ0eO9?$BtiT!yRsJ}fJ~jBMngBV*l8oELFVlX zois}~w<|}XW#K&3bI*61;=VN9oqQlzt)`-I>BdMhC*aMKN~w1pesH(N)Il`%!w=FR z)kJOOtR=N%$sp(eF-Pgd$t;P-cbUbgjJWihiy6;z%nFH%%DgOEon1bHcqpe=XDUM% zNTx<(fv3+>lCJ2LUvvW43}4g9QgIu;jc<~m!~IYbaH5DG5*CWlftq~zaAYidsLY$5 z@jz_vn&PF&;VfA4aB?9j*NEA*#OB(t@};xI&|-gj4j`t@$&H@RpRLY0fMT$v zIZH_X2ogWRB?bH-YxS5(rH`_RSoL*!QC!)jLC>){1D@mEtQ-wi9rw8L3ab$!CU&o1 ze6uz}Lvjp_=cf;mMNH>Z;nQil9>>W^VZGT&)q$qJ zvP5&9Appb10XP#C(YFO1?a%c+Fe)pKeoAfgQgB;QZct1L_~si%_9`p2Mtnw!SXsgv??1clgFk;fq&!@u43Q z$Y_koTPL#1jOUXWzKT6>N@DJQp*;_n?EE?vgmINkroPJPs6!uEo*A_?f2GK@ zoh2{UpJ?jDZ}s&ZP_(!)3@vNlg{ne(vxMzAKkgn4He2G76fd_;ac<+~oq+Iuc2ZMc zPW2RNr>_j!!q_s%_3d*SNv975vC7E9KjJa?Hu7`TgYt(o8H=fWw-G2z>;k2+!|;;7 z^yReO#~-P{*`LoW%KS1YugoZ*zIrhsZ3tQ>Y(Qfhm5?cHPlqeVryAY96q8DHndJjP zvMvUKx}p6gEVa;j&$?o@ofOtrb}1G*IVW5e#0bw;1Y1Y;DI5vaX;-#q8`9TS7xzDW z#O=16nCt<)X!^12IzPr_w%6ga#MC)bHp#Qx#7&pXgQ6@a0#4I%xysUJ#;oQ zH>(w5xF;prxWwIf0Y@HC^LZsCLEK5B-0FV38=l+fHp?!BS~0P;h%%&&5z-X|x-W19 zSq4qe#y`o>Y+fKkrNh+W$yU_{Oi+m>K!`9I&g)Gc&^?GCZz@H~Bac3oNM<_?IN)ge zW3+SVJU}me?qKVelgTqJG8Z`-m3z@7F#D=4PK5d@Renbu$r)TU!o`W#`t>B^vt4TAVY zjYK%%@-xyF&64B`CB`ZVy7Knd2j9)ES3E>Ui;qFeC~7I-nx9#f874D`^>?D=Y*vCG zO>lR)^t1eiMchq*81WIS%7RsBiI7xiXqvT2U33A_;46bsZlxKuY?>>;HWoro;`?}| zjct-6x>u~iX&AyN+|jsNN&?wzB!Va+Avz%c^QOoyS}_BN97XdD^Fia374t{RwBq(x zS>Dry(9CZ?WGoJbSkWKB=p)Yc2Ze@1V<*Kb+M;i*j|?9eF}GuA%$~UdpC)Be?kclC zGRCdY1fMpmE_EhFlP!&yAHaJ~e@u`DepGq9!82qpI3485tsLcAn_QO@RHNT+w0`Ob zBZt%B;x%AS{qlSd%*t7__6p6W>i-~)4D5jTYp^9};L}hDd5*umu8m%eyIcQSeYJes z_nlhnr}xGb2MnbF8ThVdBsP-RWlvQ+}emyJxNQSBl%X}gOO}fqjOhwYl4c75w2m)VtlJorwf%`lL zQeCi`U`USn1Gc&|50Z_@N@QcBlk7dIFQ1vszD`>gBSD3dN1zVjnUU|dLcV%d`6LEe z3uYwXJEeentWroZM)8_vYAJWJor$iH7K_zZMwL6r=(~qra6h*Byjjt1q22kpQ#GHf zR%b&Jd!a(Sk?_rn=OTx0r6dpwxl-+X%y8wn_N+UuAQK``*AjwI%Nl zCTf_~IHIS;5RjxNsh8Tqq&40_h1`r!=sdI9ILufdC`Bl@0!2Rb%IYV$FpwPgXB*o6 z=gn7@G?DyjjL|b(er?$$c@y2y@A=L>QSmexup@`WkDsneD242?x-;5EY*IBf0VWQx zpl#a>^%Uir``oD&79C4jXNE_>`tdH(z3j);N-PdLaZkh$_GI_a!x-0F%QTsf0h5s} zevJK|d`P*xNp+7UzMI$JZRkd}eF-gYc3@udn#NvQK}Q9T6eOGCy?lE0vO%_2)lWO1 zcy+RRuwfC1Ocq2oZd1=uRXV^zE>r4ts6Zma0_9 zLpcCt4L+_9YSqv4NS2xUHfMOsGj3dkN<20VXLt-$zPyrsJ6#Ier5{Zpgha;h&&gN! zRe5exZc1?iA92$By6ozL(bHUryJQ2 zpB=V=$ni|}eScY{3$^4PQ%~F zZqrehPMX-b&u|V?R3>!dXgGk79L#Nlu#f={XzaE-DG@6JoKk~p{E7q5hdKEe zRj4eNLE5)nuCfwJJs7e3V6N6E{-=kH{0R07w?SGY3|>$NOr{fM>ZjW%qhE3%*h$JH zHjIyBFltnR19*QBwHz;!V|OCsd&0euWw$;kN^q~!jS0#GDinI%WV^;WFd=vS49b@l zr;ImW*@|@Yqae_J#`I(i`}t#0?-ba9IA(XKo&Rh6P0)cMt(DIG-+mlRgPXoV9q&a? zpj}jt@0iMM(_(pK3>hmV9(GUf7BHKHa+HOuK*wbaAVd*j$H8o$!S>hEiVN+G+hbhQ zjd9$xIPK*xk#4>qw;)JJfqa91vjQ7nan!8L+wz_ZQ9#0`G(z4?%lLZay_NysFwF87 zm0I{`a9pxP!&+W*O?T=9xqpI^>E0y4?nwPu&_!Z@Xo~naRx5tePT&6+`Tpbn3^Yx_TA|1g1L&e)bG%ygiBQ~Tdj{h!Hn>w z&&F)ukfcP5lU_EaYDL5Z)eQC_Iuuc_C`r^P;=yD9%{mh%r$XhB`IZR#FNn(XFbJ_O zVRBHB6ncSIDfKRDp(zNT==END z13b8wn;ws^r%2;Okt=aj(L-D}vY^+7Fc2`r_x{j-6H$94i*$>bq`t91F%DJ}ZzoKo zzdj<^O$`%VKGg$G6N!((fDgFbyPM@n0poRZV2q~9)N=l#4IK`8{W335)o5rm7I2%{ zM_iHSCQO{GpdU&y2BeE$y{i8V2AL{fJA>Ooc-a$foI{B!H0I^f7@x?Pg1gcsFMmh^ zxOmjSe>KnD==7s->FYN_aeNy?i1|E|3)NuV+6eYjWUGdXYI z$5&-koqQ$#DkIHR9=ry*-Bw*1xIE=C9Dn#ITMI=29+&C?F$V})1fT-m6jOjUx52Uu`8yc{W@~ch!5=KCYHlh*UnyBPA}kR=Itr6 z78{Vfa^E3J{dJbU+qN}L($AR4b_p`QU&cueVCMnKZP?T;hN7kUZ1T8rU)2Ms}iZa}* zno2V&li1I>u*M|EuJ$g-fjvI0+Hl!pLev_N3f6T7Do+W*s905KC2pjW9C4P*Ue3T9 zPdx!z9Aq<(66d$c72*X+n)tf?0py|(5f%s`lkGS6q1)#8#L-7Iqlb6>hLtYGvjaL% zpYK)7mGCUm1fG{}-SrU4XQ}R}X}2{jf9X?D?JbDOI8?+civwnyv&Iiw6X|$OcHsg| zFhGx^)XUg0DhnzC_f<25-tN8Omvggs&%fml%M$WX1QJ$G(*e(1DB`cL^J&Z0QZWAd zAWMgH+88i^fTO$~u&UvJ^g~a3$Dd1p7Xy68(J3dLfv5K!!7jKTcY)<14UvD{4}KIR z3;T$ZTt4;8=QcAK33%&mR92)-6F^&>mkSMZ{}naG7d^ge{h}D@$Go@Pb`>BjI0B~M z?!>7Ox#uaL#KvD}=4#=Y6x(fgT9%+m)PHrSSrORzAOeVf#gfgePliO8o*s%JVM)6w zcN6YUGt>hnhBCDeM-8J8O(BH*SM{{>hELLPqVm}vcTy-5vW4&r$O;*$O_wtw>#+h7 zw53xG>lgoc^^1AE+uD_K5;DoW%_m38v&$*jhD%uUe&i4kd?rC zYgC4gQJDq@O!ZZ)`aGUw(vyDS0AD~ox~eNu)2efm$X^%iE-885@zfLl2b6mCvAlSN zPnaGNje(nDbhxwk9Haogj^l}=<3du^43q>0c(u|rU?|YW1&Gnx8~_Kv=#H!w6ofbd zYSE&{SO6Vv-)V#zF%VWsskcL~07X_$p+tN>JA$xa;Ft_r6PN5r=(r-0Jn6W2?hdg1 zG%!x7o$CZQW8)qSMvx$D6MF24190Dgj zkwpGDHOP%qaAJ0P!iA_h<OBq0n&m&W14ZD? zL;ZDT6Pv=~!zg%JNFO&I5#j490%}TM8oBWJ7W1cWpeUfbQGtGoGN)psCR6gh%+g&g z4j`CS$0O%4K(PBdo5Y0iQOTfCoiI~aG$Ld79u)*0uOiaGn+rCCqaPKL4-1!dshSb? zK5@U-nBfqA6w=Sq10{(uS>w484q3l*Fkxzm@;_ddnxMPf2C)-k6?C{S%iSuGs!*gK zrh~cR`?(T2oT`ZrYck*79Z+E2IBtE(HK^dHRI7YVNmVjPm(A6=wIezwK+9jZsV)t~eXN~TRzyj%-Nf*Ir179Iv6 z9A*<1DjxlIO1%%SBmjZOy6?Cc0>FK%X@EaU8v`z@<;hukHdpvBPy|Xr1Z1bL#wM?y z>m7eJBjar2yaBx5)EK*`o##bWu>k3h<6UBPfah1#PeHi6=mTfGAyxu9@Ekj%G;aO& zRm-KL%9GCo8&Ap&bOnA?MzM*<|2T={en}UdMx?^IC_x`U1UUlXWDnni%3^0KE`Lx6 z&koL`$j;)=5ei_Gi&+pB{>cg4L<-NzU5cD7{Cwm*-7Y(eIci#xB>m_Us-ke9+Elq5 zIcpDY$1L`m-6Y9FIKtq(8t5+#buIL&1CQpTN>&=v_>Ty*wWsCY{!CD*g=l}116DV= zd?wUTVcRa!;;Nsr5cfa9?NTt z2bvq#ujf`&&>x>QW^Aq=+0x;bxf$Y*x6I3{Nun5^i4Q*TGP`{~;>XX0EQItsvgp~Q z(Uq0vy>D;jH{u1tZuT3dMM9dC;7H1Kb`%3<(MsI=Y1HE%OAT%-7f*_R;lXigmqtw+ z6t1J-*{bI6 z^siwlCw*_iYQD(}i>LL)F|O4IT78DR;w_pNT5LGz`T0i$U+m=1sQW8lW23A(9kDKd z_(Q`ND0+U72>F~I!T}-ovJVERQI?WVWZsD~vLe-A0$Lwq+Fv(OIK8_K?Zj>IpSaaT z$;g3JzgYQYS>_$gd9hL|;02Mo@}VlJjOl9EPJR-^LobN4>wu(vnk#cB2v|ry?OrpMa`c1SB(s}EUH^($sxIRrzIh4F#@%f z2_{AJBQw9u$2%zYdod4$senDO_Zn(~PQzRhp`vngToPer?3iaOvz07`6%ETNij8k; zK4`o;Y1`_aG79C_TICQEcim<2^3&dO7!QhkZnq{yW$`Rfo_Nc^$c8rYn|gC~Q@g>v zSOc2iHcgy_{}FUoJpdu8p zbDyED!LqSyGDN@U@_P(H$G$VIuU8SAoI#6-L%d_NA69o-M3qj&9_TT=?_+4BTi*3U|>s3`2y zq*t7Cg%y2{Y4{e2cGqa}wm2*?&zN2QDDPabL47kq%a@H%-SM>zGWk@jx}I8%uL#Tb z{To$BaD;QjO{#!}^<2BuFs-QZH;HRw$dM#9lHZ{~L{6`<4drIvhNGVwA;C7yGW6Q% zj+xJ>2VJwsM1dWX>Z`fiGu`8n5$`oLgE>RHLa32`{lQws<1>e&^LZsnVWhV+UeI#BGlXkD0!OoEr<1XP zX;!hjkYM$7zo1c=q(&wJ(*A*?d)D`8>4fRr6~>OB#v~wt&&Z}KkmAL9{N%&Ynl$yy zR};L^Zy}3el1OD|hN5pVMAwylEhd~+5=Rq75iEY-V~dyTi4qTOA20wXMYYc`IVt9+ zLZy~Z-0c2lM`|(0ZgtadryC$8vII!xC3|hNBNxTq&Y>BfI+b7om#he;^A|>AW`hLh zGu~Vu1GJWLnOMEx#SjAR3jJtAT>~q>>6ARjL~V9?r@>G?k6<6Pevf!Iem-3%*#YLIsfO{*E7uZTn1hhcjQZC#Eb&`RZ6r|n1gxmf zoN*d#*T#)%l|Fl=(~Eth_)u`Y4W`_*Nlm=eYdUz>jmBd;S|;QEt)-m7u4KN-x+bdc zVVvT@eXJan-}yK!<9MCkqYId}G*Fm8OQ->#gN@Ac$6HCuE7WQBi2;mKp<{j1ry%}n z4Hf4!>7zC?+O^L)1skb{w!&0%AHgnbg7q4Vx*Hko(omf*V}qsaG^2rhPrp9`uV;GA z2J`c1_F|*6)0+=wZWnk^so_|C*Pu7mIx5boy$iDuUWq{AdL`$A!i7%1(t&S=Ml;(8!knu%`-04>w(0lB_GoRJP>NZ`|oG$Wx!C5r8nM`8N+x)l; zv5b3<4EKIx&*$~*B`~u<0-KDTu2|cIs=(g=h|lxUoIyKiEq(mJg=~(ycm#-xdq6)& zmmnJs-l84O&xPSmzrP1y`21{Y6pOscs)xvCb<#9r^M`K?S|9Z+JBA~8%+sHlk{*`W z+W5{zwy@9jZHoy#jHDdvKY9ACrxKbbXjF8dc@I~@*cz%f3@QBg>Bj0_8}4Sw z^^X1kuW2oE7^9i}1I~~~R92rimvnd+m)7n2GKFjW=P%xP7+GUr+vvj1`R)0IoAi92 z*6rZ*f26+})sj(c{f;cG?;IHQA+)6WY8OeIL?w`RJ>aUkZDmXGBBbDJBpva3 zubucJLp)4(X()8>1lOvSeX$I9*Ss$**bK$+Rh#ND^4$Q`biTfWm5Nzd)7BL z2Mc<7t?=?gnFvQ%2(W&s-$5n_${6unLVSpM^YIpHsQ-R)Gt^Z*z&`o?Oa3EP0kc-$ zxrj*#-v{K-Co%p^&^?WCdpsniaPR$k%Ygk}fq|p%)QO^b{lfN5wh%TMn(9ruy~lW8 zfzz%2Ti^uNWBS@+dnMTY-4IC?k7xY&>Rmq3Z0^1QXKTP{4BrEH#wRPt{WLapZ?qf^H zQvCMAZiSdvt$nZt;)-F9>xU)vH;PqM!~{EH!eX@a@)=!^s7lEPu^;{LST!1LXfaKI z!0=&Z;_JOQNZ|>0>aci@_FJEF9LF~xhu@yK+}MQ7n_Vi$74RKiaZOvV{~SR&ovrJ* zW4qE3hg==`6p1n}7b{3jv8M{ATBR&GrS;fu#X&g!UTa)<^O{J}j~(W97`W|zo(Cb# zQICq+Ta+3Zl9EZf<+|QHX7|VcklB7`oD`%V-SsH6jcdC}9z3;gtS*!+B2G!eOQ-~Z zlFY*$!yb-%SfwIj!cQ&~9}y<^0)6NCBkHShJjYkvk1n4zB;7N*9VsOoAhV&h9`NhS z&lJlO8Fyrf*5UL4EN<(nS*x3OH}?g$CFbwCf>&nKgQUQhZrOHMc1W5ef3wCd>frWn zct=T{W_baP>|*1@WmxC3js2o2nL_rE12C+IqLX%SWuB4W&R_4`3-4i!d`+WiXW>yj zEL?K~F1;ooMe$i`V{MVut(ezmC;c|lJU<7uYy%@4ZkWV)iE=%^GC@hL2zxtN4qdC#V{Xt=!VYjZ$kCB5jbxi%3~zj#OY_x5@&@yEhqa06 z)B))vY0oIvQV06H`6|umEZl{{#Pp>s-k>}z2aKzo&cJs=f?1o`H*NKi$mZ-eBXvaxS(qXV_d>%^Pk=fMlx@pjSx$=v9qHy9M84Z$j%YI@RdV3Vt4)W4NT zdfazhpBsqJz||R@TzLPH)QmIEI%D=z#&RWwdYf`vCt505stsr7Ef zTw8A?_beh_4VhHDaHT#EjaQfW%$s%ACMpwJn_+QE<)-w_6$g}?rDJu<8c^xd4s-*3 zT&eloM^Fn`kSZ+_`Hhl~Dt?i_aM)o&1*S$RI9dhof|a>QK}rxEf^xi*Jd6HPHh!O3 zygo3(SF^H_VA^7pGqBIPZ6B_xz@f@bAn1HPWKsiKxVK-JAh1uY$lfoJ17DqQN_RB@ zEl{W4*O?VkyaKmsIAT9EO|`w{VD0MqKAebbRk%T%8WXnsq~dBHhzy^fBfb8kLW>u6 z{$nO?*x{w!(ODF$B`+b}6A^N9p25pEZ3Py!Y@x0@nYpu z9pQl91bMkxHAI1-2U!eNABAfoG)_>{ZU5R*5~_L;3+zF!#-NGp9oqctowYNkk!HR? zA1tX)mMY*`Y~9*bQntW{!D$-D!8^*-dkpccPS4cx4c1`YqFNu5UaKLhG!Ce3?=eN6 z_8ro9rJq4MmCs@87U*$oc^h~Pn8RY9Wx)MIW`6I$gT;M44saq!?3vq^4s+4!KawFzr*e z&=mP0!1U5|j2zL-j((Y{#s_g%g|$VpZE+6zLV*QL^?Wu#Hz_3n--I-UM3${{z(&t< z9<<~3sNdO{fyt~_9zvJl%N9;e5pE&_okrxli)WHJL#{^cfQhSb3eY4AYkBY<>~`*_ z4~$1UiKiPsWVu`6W5rVUMHOLv;0us4wBA4DMBO58AK7l$4xRbtC^EE=^c4ppvA6&2*I6L5OB_j{l3d-p#B=R14twbpM9 zd+oK)ISUjclDO^x?f}3|Ngg%|fPq5>a9r@_D5`&oH=8CsMVpe+A2>*$B*6j#N3;KPfAHs@FT*)MPXtI>Wd=8GEuZFLd*{r%OsI9sR*SB%PWs)q;U;B zV-aPpK0aQN5+Bbu78tbpTn#|cn&Rd1Ip+n0Q z19slYdie7Y-OtN5?umBa%62XB-P|ec^gh`h_c?a2`I{Ghx_;q`qRde`@9U)}pG80T zs3z&+?1ot-r!{4N_~z`&$oYNn6OUf(Jk6JP$J8b(y;FI?WMYud z7-ewWkBJovJiqEIZ;4-$`QFOmTiyL*d=;hcC;nO5cId%{RYy;_MfLlHWzNifrebmK zGrlX&E9rS@+FceWmN_otSmtDgc-_V*Sw;(|@sdl})LIx<}(d_TkC*f4z7sx)^pyHaoaRBWKa)p)(t z)?kr-Ou8vOZMaNj$O}`d4cVHoqC6wLU=TZ`$f#6J)|mL&njC$;JmkTT2SfOJwLD~; zG)svhX!D3MD)VGjj5=hKOiF%HUT%J&tVkZ>#FgQgo)(7i zog${m@{n|_qj*DshA#<|goy+RMfzzGA%ordu?1?aY}ByC4hW>=Av%-EC=&{&PoEw( zT^wd8$PtFe#KZ_i5yFTF0ZIr8XXKldMS}doUNl5I#xPBxsz7fv=?(dO8dI5Vm}-)T zgdm^)!oNIYTG~ta{KAebU_OLJN~175OeD<96TYrdXiAudARP|;$%xAl$vn0 zN}!I)ju1$qvsHpB9&S}cD7V25QU3XO8i%cN3=t!RkB1wL7ozqQ=g~I(Fl$CIZhjN!ew!a6nRKQ znCR7vB3EhBqJlhRxITYs(JRIneV%5tNl9ljJTfLCDk?fMJX{hkj);0q`vXluAyy)d z>Fk|Ob$VH37z`#>N!KX?IOj1IS$u&;X)+XyF&J{?Auqe`OLiJ=C$-X~9HumB5cFjq z9`m9P4-iRZ;&umUxHN-WubuI~Nzj298d3jZZ1u}*>4nhff-&tdbzUMPIo3_Eg0x1ImsuVXF#gBB3_ zosqZ7@4IxpOV?Xv;H`w;RoA<8y;TO@O88xM{lBHl{nhJ~CLf=IrsKK zotiYv`N{=P;(si`k()93!$JU$F7!pfsx|&N>1s+zOK`o#@#FBshx*T(1JEfsWmw#p zqKm&boc#QftP|T7GOo2vIH1~d)Qt1}-e*mDwD!@R`{{kC_~UyYU#CA6wEv=iZsJ(J zzq@a%K{`L&!QlaQpPA{8@9d)HGJ*$Cn#n_Aevg(p`1VgWH~BG0{P^H{kdI#=c!OKY z05xn^g)9nSZl{u9U;*FM>_PAWDr+-2sLBa?J{0ODat3T8;MeDQ1PS1Yg0hGBH6s^b zcgc8~^KXVM086L4QRm+)Zf&b}o56)h05nB^4Y7VyGqaRi)7G}h`$-U-$4UH{!T+lp z3R5`$f4Ti7-d|1{*Nt2X_TlHIepK?T?wEh==%D~QS>u%_58T*jnLF?Kptc_mqaQ+P z&?(00pq9gsY2KG)IWg-QPv3ph>K5@&-c0Rf9{27|w>GAAy`19YN*`CzYM ztz%9d2$sD%K7%Uk{Iqqml7LeQUA$q@5K~d9gwhCayQo0a$vvjHiA^0;RQEsp+VSHv&qJ8<4`5AVr%MEJ>OF9 z4IDuvm$mE8s5wCD;?Kky*B0lqpsTNCTreyfr3i36y*-BlYtqe`(#6dB2nKbHsQ)h2 zlR@>l_6KuP06|tlV;%?Gk5og>S@BR%_=7o!LCtBJ0J|20g$Gmbedz|F0CEM`m&ZS_ zPv%hpe$agy6nhiaVAtb!mzp<1Rx`8lGY)i;P-_=}ojS|0pQ^*EaZ}P!EX5yVkdL@Ff2^`so z(y3_96{7J3gDNfm+8x)GI{78oDI)Je`t36~$)+X>AX>2}?dq@Vb3C9^XE5&uJ6!cG z`@@3)6pu<>19rP^4Vd?W-3o^Xn)iX-qWi)=ycE5kyuzNl;UKQyGW()lEDXej&uaYB zydUhOuEJi^3;dt!%A4$ar$73$n80A_VJL;@x>*)q5%cUb$I%TJ;ui0-t=vXfn_Q)H zPFle3aqc|%T~;3s9MEyO7tbx)7YAe)=GAU1;|Z(ZmMOC{4lm-ttnC55RsDEyzG0)J zzaleiA%haubJ>c?+H$ZjtX~Gwc|awys^lw^P^*d{CfPi_Vb+uYFN?1?*o+{(9nlZ= zv`&^-S6&>mPFul+RUVw%%Y1PEO1mnmC!Ni8^MLY$iHxd`hDL#oPX$an;pqlP>+V9ryP>SKR7REOPN`c_ipOsf=%Cg7Mio9!L!?Wo)R; z>;?6MD+56Sq?fT9mqv5%Y4gBRJ;XH6N!8P6Uby{}pHi3Y1sCP$-vA@I)an9d+(w_U zzcIi)fSN{FpZ2tFI<#d6K?XC;t_@7;(m{rcgEt-mp=%h>^bqRgTmi)ecVFA+#vT}w zPk)N0A5p_|Q~T$|HWGFf+f{hi^}gknDSn&kh2J+t2XDKZe) z9EIRgvIS;wV@aVHU6F*<=; zjc(V*3}|AKaQW(Vs5?C>5atE812`2)uyZfBVGBS(n-H1@P@tIk^+f=BvDyKQUI$H& z1{(XYU|u)c7KyMdXsq2FTt}1kr607^Qa9a7lIav)OrAJ%BtwstFZtSI^A z>qB0VK%UQ%w!{G(cG+^(E9al?(1}Zoo#^J@!Uu?pv)boX&tL<0j`h>p=G$#U=1#~3 z%5U|JhVjJWFM>uqSuJFM;^|GtB(d}!f~=ay;IF)bal+djT1RW1KFD&V*JWj2jNVcN z{whywhm-0)z-4J)>W&mm{O$W{K;Nj;PhT17-UV8I0mAZV_%5Poe$QRd_}TAK|HF;1 zo=owedh|o3l3fqK|3_VyHe1Jf)ZYy9qb_4lrx(`7hvr~D)UT&<_U~)_6QGM&jt~ zjE7N$)z|0I^GmXNyEIP4B_-E^T?)9prP_^L>KeV^_-wL`4Yo@xYEW|!z`b>gBjJ+> zYONNx0tXfranVBE^ASR@bW?;|bL8A}S+X(sL1Zi(NSSSBDF+uTy?}mIkvEO=B zLi0mskzRCOYp;|!X&r;wcgzJ&f#N~fdfGQ~G@bWgP+SkQIO$TTk8BGc5|qyxAZj^r zcj-jJqNFnVG!;mS`{}w{%1@}6lnZ0hO6$U#jvJQc)T-VhTXYL2-O{%FTw4u;R1wk& zE;ZEJ2OP1T&1<<3z^zJQ2xEU)SzgYZwA^ak5Y5|38hU+ya0Z*|!@9G?dh(QFV5q;X z?)cptJZFYm{?4iS$+N8V8X;d)gQpj-g5wZ8G_M>7x(v$_PR$-qcG-Hyes_XYR&FDg z{=9(&N6Q$@{V9gd&^4ff>v*rVs_b@Z(gvn+ z?gaV%`p~#_XL49jw%{78HKD{Cy7qJTarnp+K(Qq>!_nE%nINyOH=Y?{i)TT?qL9QZ zP3*(hxQsBRn-mcdU8h;TL$w$5+jjIDH#biIMe;BDQgTYTzP9#67U${`Efhp=Oju9 zCkF`@KKs8UQ0!j`QHwXNQ`(b&IOrg1d(y>B6LYcn+KFawV9^gvuX8eii!D%Nj z5ER4UOWUJz5>~q_9ik_musqfaq8JI67X;05vD!Ms)_k}Wl;By+a!w|}OG4zpGeZgS zJ!y`Um<>#t;E0-#^OB&CmP1h613B)VX6#m1t;<}I@b#RAovY(_yos6k!v{|v_B~fe P&!i-b7`An2)|~$asL~%a literal 0 HcmV?d00001 diff --git a/modules/home/hyprland/conf/wlogout/icons/suspend_dark.png b/modules/home/hyprland/conf/wlogout/icons/suspend_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e307b6e6fd3e5b544f0a6ac15df53e07b19db7a8 GIT binary patch literal 16347 zcmeIYc{tQ<7dZZz#WJ#lWJ|;h*~d19Y$Y<*8oLT(%|6+cWu`gunp^*xJX0{G$zpzyKHs zjsZVhV0#~D|04il`2D;CwgvxcCxh+df8p#iRDeJMHt?AVeiXs>A@ErMemr9TFSCQ{r%iLyj=kxG&3Se)1c|>p&MrBb92kFHfP@)(+w&Wk^21H z^7yG6XQj($9G7~uFZCqmRAX6QGB8CQE@YSMdZk{?a*fV$v+(x4C%2PB9q^Ypzg+Lw z#x6W;idcv2x~1g1y~jTCOijX}Zd{18WPU9g4JkO@$fdNZcFwpdAY!zsb-fn;e(Cl4 zRGbvUJ%|=LH1&IoUfoHJdXMj!>$jYXWF+5Ay>Vt#G5Ga1XmC=s3l+Pgq2%VGwERZF z>G8*Af8Mgv$6RKdtvr@b!=t)fZ!8~nuds8U)7m^B#^B?6|A$4B0fE!#;4vM2As!3D zv6Hp>akp3>N@)JlO>jV_8NX!VQ#*Y2I!oKn>wAAJ3_fUXL#Rqp;8z^Hx1Hh4^UxPD zK2gHM!9U>48Zc|SRtGPrQg)82y4^44>0w5>mnR<7FeWZJR&B z{OEK8L!;OH$j}rv0w`53Twx;;neU_?zdHJ5^znSn&ec5424U7+|413HE*{VaLp>~P z0⪻)t&u(40UFw&M1r%IYoLgetGkD9cxiV50; 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 5.1 is required. + [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return + + # The list of segments shown on the left. Fill it with the most important segments. + typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + os_icon # os identifier + dir # current directory + vcs # git status + # =========================[ Line #2 ]========================= + newline # \n + prompt_char # prompt symbol + ) + + # The list of segments shown on the right. Fill it with less important segments. + # Right prompt on the last prompt line (where you are typing your commands) gets + # automatically hidden when the input line reaches it. Right prompt above the + # last prompt line gets hidden if it would overlap with left prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + status # exit code of the last command + command_execution_time # duration of the last command + background_jobs # presence of background jobs + direnv # direnv status (https://direnv.net/) + asdf # asdf version manager (https://github.com/asdf-vm/asdf) + virtualenv # python virtual environment (https://docs.python.org/3/library/venv.html) + anaconda # conda environment (https://conda.io/) + pyenv # python environment (https://github.com/pyenv/pyenv) + goenv # go environment (https://github.com/syndbg/goenv) + nodenv # node.js version from nodenv (https://github.com/nodenv/nodenv) + nvm # node.js version from nvm (https://github.com/nvm-sh/nvm) + nodeenv # node.js environment (https://github.com/ekalinin/nodeenv) + # node_version # node.js version + # go_version # go version (https://golang.org) + # rust_version # rustc version (https://www.rust-lang.org) + # dotnet_version # .NET version (https://dotnet.microsoft.com) + # php_version # php version (https://www.php.net/) + # laravel_version # laravel php framework version (https://laravel.com/) + # java_version # java version (https://www.java.com/) + # package # name@version from package.json (https://docs.npmjs.com/files/package.json) + rbenv # ruby version from rbenv (https://github.com/rbenv/rbenv) + rvm # ruby version from rvm (https://rvm.io) + fvm # flutter version management (https://github.com/leoafarias/fvm) + luaenv # lua version from luaenv (https://github.com/cehoffman/luaenv) + jenv # java version from jenv (https://github.com/jenv/jenv) + plenv # perl version from plenv (https://github.com/tokuhirom/plenv) + perlbrew # perl version from perlbrew (https://github.com/gugod/App-perlbrew) + phpenv # php version from phpenv (https://github.com/phpenv/phpenv) + scalaenv # scala version from scalaenv (https://github.com/scalaenv/scalaenv) + haskell_stack # haskell version from stack (https://haskellstack.org/) + kubecontext # current kubernetes context (https://kubernetes.io/) + terraform # terraform workspace (https://www.terraform.io) + # terraform_version # terraform version (https://www.terraform.io) + aws # aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) + aws_eb_env # aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) + azure # azure account name (https://docs.microsoft.com/en-us/cli/azure) + gcloud # google cloud cli account and project (https://cloud.google.com/) + google_app_cred # google application credentials (https://cloud.google.com/docs/authentication/production) + toolbox # toolbox name (https://github.com/containers/toolbox) + context # user@hostname + nordvpn # nordvpn connection status, linux only (https://nordvpn.com/) + ranger # ranger shell (https://github.com/ranger/ranger) + yazi # yazi shell (https://github.com/sxyazi/yazi) + nnn # nnn shell (https://github.com/jarun/nnn) + lf # lf shell (https://github.com/gokcehan/lf) + xplr # xplr shell (https://github.com/sayanarijit/xplr) + vim_shell # vim shell indicator (:sh) + midnight_commander # midnight commander shell (https://midnight-commander.org/) + nix_shell # nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) + chezmoi_shell # chezmoi shell (https://www.chezmoi.io/) + # vi_mode # vi mode (you don't need this if you've enabled prompt_char) + # vpn_ip # virtual private network indicator + # load # CPU load + # disk_usage # disk usage + # ram # free RAM + # swap # used swap + todo # todo items (https://github.com/todotxt/todo.txt-cli) + timewarrior # timewarrior tracking status (https://timewarrior.net/) + taskwarrior # taskwarrior task count (https://taskwarrior.org/) + per_directory_history # Oh My Zsh per-directory-history local/global indicator + # cpu_arch # CPU architecture + time # current time + # =========================[ Line #2 ]========================= + newline + # ip # ip address and bandwidth usage for a specified network interface + # public_ip # public IP address + # proxy # system-wide http/https/ftp proxy + # battery # internal battery + # wifi # wifi speed + # example # example user-defined segment (see prompt_example function below) + ) + + # Defines character set used by powerlevel10k. It's best to let `p10k configure` set it for you. + typeset -g POWERLEVEL9K_MODE=nerdfont-v3 + # When set to `moderate`, some icons will have an extra space after them. This is meant to avoid + # icon overlap when using non-monospace fonts. When set to `none`, spaces are not added. + typeset -g POWERLEVEL9K_ICON_PADDING=none + + # When set to true, icons appear before content on both sides of the prompt. When set + # to false, icons go after content. If empty or not set, icons go before content in the left + # prompt and after content in the right prompt. + # + # You can also override it for a specific segment: + # + # POWERLEVEL9K_STATUS_ICON_BEFORE_CONTENT=false + # + # Or for a specific segment in specific state: + # + # POWERLEVEL9K_DIR_NOT_WRITABLE_ICON_BEFORE_CONTENT=false + typeset -g POWERLEVEL9K_ICON_BEFORE_CONTENT= + + # Add an empty line before each prompt. + typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true + + # Connect left prompt lines with these symbols. You'll probably want to use the same color + # as POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND below. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX= + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX= + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX= + # Connect right prompt lines with these symbols. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX= + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX= + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX= + + # Filler between left and right prompt on the first prompt line. You can set it to ' ', '·' or + # '─'. The last two make it easier to see the alignment between left and right prompt and to + # separate prompt from command output. You might want to set POWERLEVEL9K_PROMPT_ADD_NEWLINE=false + # for more compact prompt if using this option. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR='·' + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_BACKGROUND= + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_GAP_BACKGROUND= + if [[ $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR != ' ' ]]; then + # The color of the filler. You'll probably want to match the color of POWERLEVEL9K_MULTILINE + # ornaments defined above. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND=244 + # Start filler from the edge of the screen if there are no left segments on the first line. + typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_FIRST_SEGMENT_END_SYMBOL='%{%}' + # End filler on the edge of the screen if there are no right segments on the first line. + typeset -g POWERLEVEL9K_EMPTY_LINE_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='%{%}' + fi + + # Separator between same-color segments on the left. + typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR='\u2571' + # Separator between same-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR='\u2571' + # Separator between different-color segments on the left. + typeset -g POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR='\uE0BC' + # Separator between different-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR='\uE0BA' + # To remove a separator between two segments, add "_joined" to the second segment name. + # For example: POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(os_icon context_joined) + + # The right end of left prompt. + typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='\uE0B0' + # The left end of right prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\uE0B2' + # The left end of left prompt. + typeset -g POWERLEVEL9K_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL='' + # The right end of right prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL='' + # Left prompt terminator for lines without any segments. + typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL= + + #################################[ os_icon: os identifier ]################################## + # OS identifier color. + typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND=232 + typeset -g POWERLEVEL9K_OS_ICON_BACKGROUND=7 + # Custom icon. + # typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='⭐' + + ################################[ prompt_char: prompt symbol ]################################ + # Transparent background. + typeset -g POWERLEVEL9K_PROMPT_CHAR_BACKGROUND= + # Green prompt symbol if the last command succeeded. + typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=76 + # Red prompt symbol if the last command failed. + typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=196 + # Default prompt symbol. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='❯' + # Prompt symbol in command vi mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='❮' + # Prompt symbol in visual vi mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='V' + # Prompt symbol in overwrite vi mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIOWR_CONTENT_EXPANSION='▶' + typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=true + # No line terminator if prompt_char is the last segment. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL= + # No line introducer if prompt_char is the first segment. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL= + # No surrounding whitespace. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_{LEFT,RIGHT}_WHITESPACE= + + ##################################[ dir: current directory ]################################## + # Current directory background color. + typeset -g POWERLEVEL9K_DIR_BACKGROUND=4 + # Default current directory foreground color. + typeset -g POWERLEVEL9K_DIR_FOREGROUND=254 + # If directory is too long, shorten some of its segments to the shortest possible unique + # prefix. The shortened directory can be tab-completed to the original. + typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique + # Replace removed segment suffixes with this symbol. + typeset -g POWERLEVEL9K_SHORTEN_DELIMITER= + # Color of the shortened directory segments. + typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND=250 + # Color of the anchor directory segments. Anchor segments are never shortened. The first + # segment is always an anchor. + typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=255 + # Display anchor directory segments in bold. + typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=true + # Don't shorten directories that contain any of these files. They are anchors. + local anchor_files=( + .bzr + .citc + .git + .hg + .node-version + .python-version + .go-version + .ruby-version + .lua-version + .java-version + .perl-version + .php-version + .tool-versions + .mise.toml + .shorten_folder_marker + .svn + .terraform + CVS + Cargo.toml + composer.json + go.mod + package.json + stack.yaml + ) + typeset -g POWERLEVEL9K_SHORTEN_FOLDER_MARKER="(${(j:|:)anchor_files})" + # If set to "first" ("last"), remove everything before the first (last) subdirectory that contains + # files matching $POWERLEVEL9K_SHORTEN_FOLDER_MARKER. For example, when the current directory is + # /foo/bar/git_repo/nested_git_repo/baz, prompt will display git_repo/nested_git_repo/baz (first) + # or nested_git_repo/baz (last). This assumes that git_repo and nested_git_repo contain markers + # and other directories don't. + # + # Optionally, "first" and "last" can be followed by ":" where is an integer. + # This moves the truncation point to the right (positive offset) or to the left (negative offset) + # relative to the marker. Plain "first" and "last" are equivalent to "first:0" and "last:0" + # respectively. + typeset -g POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER=false + # Don't shorten this many last directory segments. They are anchors. + typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=1 + # Shorten directory if it's longer than this even if there is space for it. The value can + # be either absolute (e.g., '80') or a percentage of terminal width (e.g, '50%'). If empty, + # directory will be shortened only when prompt doesn't fit or when other parameters demand it + # (see POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS and POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT below). + # If set to `0`, directory will always be shortened to its minimum length. + typeset -g POWERLEVEL9K_DIR_MAX_LENGTH=80 + # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least this + # many columns for typing commands. + typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS=40 + # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least + # COLUMNS * POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT * 0.01 columns for typing commands. + typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT=50 + # If set to true, embed a hyperlink into the directory. Useful for quickly + # opening a directory in the file manager simply by clicking the link. + # Can also be handy when the directory is shortened, as it allows you to see + # the full directory that was used in previous commands. + typeset -g POWERLEVEL9K_DIR_HYPERLINK=false + + # Enable special styling for non-writable and non-existent directories. See POWERLEVEL9K_LOCK_ICON + # and POWERLEVEL9K_DIR_CLASSES below. + typeset -g POWERLEVEL9K_DIR_SHOW_WRITABLE=v3 + + # The default icon shown next to non-writable and non-existent directories when + # POWERLEVEL9K_DIR_SHOW_WRITABLE is set to v3. + # typeset -g POWERLEVEL9K_LOCK_ICON='⭐' + + # POWERLEVEL9K_DIR_CLASSES allows you to specify custom icons and colors for different + # directories. It must be an array with 3 * N elements. Each triplet consists of: + # + # 1. A pattern against which the current directory ($PWD) is matched. Matching is done with + # extended_glob option enabled. + # 2. Directory class for the purpose of styling. + # 3. An empty string. + # + # Triplets are tried in order. The first triplet whose pattern matches $PWD wins. + # + # If POWERLEVEL9K_DIR_SHOW_WRITABLE is set to v3, non-writable and non-existent directories + # acquire class suffix _NOT_WRITABLE and NON_EXISTENT respectively. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_DIR_CLASSES=( + # '~/work(|/*)' WORK '' + # '~(|/*)' HOME '' + # '*' DEFAULT '') + # + # Whenever the current directory is ~/work or a subdirectory of ~/work, it gets styled with one + # of the following classes depending on its writability and existence: WORK, WORK_NOT_WRITABLE or + # WORK_NON_EXISTENT. + # + # Simply assigning classes to directories doesn't have any visible effects. It merely gives you an + # option to define custom colors and icons for different directory classes. + # + # # Styling for WORK. + # typeset -g POWERLEVEL9K_DIR_WORK_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_BACKGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_FOREGROUND=254 + # typeset -g POWERLEVEL9K_DIR_WORK_SHORTENED_FOREGROUND=250 + # typeset -g POWERLEVEL9K_DIR_WORK_ANCHOR_FOREGROUND=255 + # + # # Styling for WORK_NOT_WRITABLE. + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_BACKGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND=254 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_SHORTENED_FOREGROUND=250 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_ANCHOR_FOREGROUND=255 + # + # # Styling for WORK_NON_EXISTENT. + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_BACKGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_FOREGROUND=254 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_SHORTENED_FOREGROUND=250 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_ANCHOR_FOREGROUND=255 + # + # If a styling parameter isn't explicitly defined for some class, it falls back to the classless + # parameter. For example, if POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND is not set, it falls + # back to POWERLEVEL9K_DIR_FOREGROUND. + # + # typeset -g POWERLEVEL9K_DIR_CLASSES=() + + # Custom prefix. + # typeset -g POWERLEVEL9K_DIR_PREFIX='in ' + + #####################################[ vcs: git status ]###################################### + # Version control background colors. + typeset -g POWERLEVEL9K_VCS_CLEAN_BACKGROUND=2 + typeset -g POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=3 + typeset -g POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=2 + typeset -g POWERLEVEL9K_VCS_CONFLICTED_BACKGROUND=3 + typeset -g POWERLEVEL9K_VCS_LOADING_BACKGROUND=8 + + # Branch icon. Set this parameter to '\UE0A0 ' for the popular Powerline branch icon. + typeset -g POWERLEVEL9K_VCS_BRANCH_ICON='\uF126 ' + + # Untracked files icon. It's really a question mark, your font isn't broken. + # Change the value of this parameter to show a different icon. + typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?' + + # Formatter for Git status. + # + # Example output: master wip ⇣42⇡42 *42 merge ~42 +42 !42 ?42. + # + # You can edit the function to customize how Git status looks. + # + # VCS_STATUS_* parameters are set by gitstatus plugin. See reference: + # https://github.com/romkatv/gitstatus/blob/master/gitstatus.plugin.zsh. + function my_git_formatter() { + emulate -L zsh + + if [[ -n $P9K_CONTENT ]]; then + # If P9K_CONTENT is not empty, use it. It's either "loading" or from vcs_info (not from + # gitstatus plugin). VCS_STATUS_* parameters are not available in this case. + typeset -g my_git_format=$P9K_CONTENT + return + fi + + # Styling for different parts of Git status. + local meta='%7F' # white foreground + local clean='%0F' # black foreground + local modified='%0F' # black foreground + local untracked='%0F' # black foreground + local conflicted='%1F' # red foreground + + local res + + if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then + local branch=${(V)VCS_STATUS_LOCAL_BRANCH} + # If local branch name is at most 32 characters long, show it in full. + # Otherwise show the first 12 … the last 12. + # Tip: To always show local branch name in full without truncation, delete the next line. + (( $#branch > 32 )) && branch[13,-13]="…" # <-- this line + res+="${clean}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}" + fi + + if [[ -n $VCS_STATUS_TAG + # Show tag only if not on a branch. + # Tip: To always show tag, delete the next line. + && -z $VCS_STATUS_LOCAL_BRANCH # <-- this line + ]]; then + local tag=${(V)VCS_STATUS_TAG} + # If tag name is at most 32 characters long, show it in full. + # Otherwise show the first 12 … the last 12. + # Tip: To always show tag name in full without truncation, delete the next line. + (( $#tag > 32 )) && tag[13,-13]="…" # <-- this line + res+="${meta}#${clean}${tag//\%/%%}" + fi + + # Display the current Git commit if there is no branch and no tag. + # Tip: To always display the current Git commit, delete the next line. + [[ -z $VCS_STATUS_LOCAL_BRANCH && -z $VCS_STATUS_TAG ]] && # <-- this line + res+="${meta}@${clean}${VCS_STATUS_COMMIT[1,8]}" + + # Show tracking branch name if it differs from local branch. + if [[ -n ${VCS_STATUS_REMOTE_BRANCH:#$VCS_STATUS_LOCAL_BRANCH} ]]; then + res+="${meta}:${clean}${(V)VCS_STATUS_REMOTE_BRANCH//\%/%%}" + fi + + # Display "wip" if the latest commit's summary contains "wip" or "WIP". + if [[ $VCS_STATUS_COMMIT_SUMMARY == (|*[^[:alnum:]])(wip|WIP)(|[^[:alnum:]]*) ]]; then + res+=" ${modified}wip" + fi + + if (( VCS_STATUS_COMMITS_AHEAD || VCS_STATUS_COMMITS_BEHIND )); then + # ⇣42 if behind the remote. + (( VCS_STATUS_COMMITS_BEHIND )) && res+=" ${clean}⇣${VCS_STATUS_COMMITS_BEHIND}" + # ⇡42 if ahead of the remote; no leading space if also behind the remote: ⇣42⇡42. + (( VCS_STATUS_COMMITS_AHEAD && !VCS_STATUS_COMMITS_BEHIND )) && res+=" " + (( VCS_STATUS_COMMITS_AHEAD )) && res+="${clean}⇡${VCS_STATUS_COMMITS_AHEAD}" + elif [[ -n $VCS_STATUS_REMOTE_BRANCH ]]; then + # Tip: Uncomment the next line to display '=' if up to date with the remote. + # res+=" ${clean}=" + fi + + # ⇠42 if behind the push remote. + (( VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=" ${clean}⇠${VCS_STATUS_PUSH_COMMITS_BEHIND}" + (( VCS_STATUS_PUSH_COMMITS_AHEAD && !VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=" " + # ⇢42 if ahead of the push remote; no leading space if also behind: ⇠42⇢42. + (( VCS_STATUS_PUSH_COMMITS_AHEAD )) && res+="${clean}⇢${VCS_STATUS_PUSH_COMMITS_AHEAD}" + # *42 if have stashes. + (( VCS_STATUS_STASHES )) && res+=" ${clean}*${VCS_STATUS_STASHES}" + # 'merge' if the repo is in an unusual state. + [[ -n $VCS_STATUS_ACTION ]] && res+=" ${conflicted}${VCS_STATUS_ACTION}" + # ~42 if have merge conflicts. + (( VCS_STATUS_NUM_CONFLICTED )) && res+=" ${conflicted}~${VCS_STATUS_NUM_CONFLICTED}" + # +42 if have staged changes. + (( VCS_STATUS_NUM_STAGED )) && res+=" ${modified}+${VCS_STATUS_NUM_STAGED}" + # !42 if have unstaged changes. + (( VCS_STATUS_NUM_UNSTAGED )) && res+=" ${modified}!${VCS_STATUS_NUM_UNSTAGED}" + # ?42 if have untracked files. It's really a question mark, your font isn't broken. + # See POWERLEVEL9K_VCS_UNTRACKED_ICON above if you want to use a different icon. + # Remove the next line if you don't want to see untracked files at all. + (( VCS_STATUS_NUM_UNTRACKED )) && res+=" ${untracked}${(g::)POWERLEVEL9K_VCS_UNTRACKED_ICON}${VCS_STATUS_NUM_UNTRACKED}" + # "─" if the number of unstaged files is unknown. This can happen due to + # POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY (see below) being set to a non-negative number lower + # than the number of files in the Git index, or due to bash.showDirtyState being set to false + # in the repository config. The number of staged and untracked files may also be unknown + # in this case. + (( VCS_STATUS_HAS_UNSTAGED == -1 )) && res+=" ${modified}─" + + typeset -g my_git_format=$res + } + functions -M my_git_formatter 2>/dev/null + + # Don't count the number of unstaged, untracked and conflicted files in Git repositories with + # more than this many files in the index. Negative value means infinity. + # + # If you are working in Git repositories with tens of millions of files and seeing performance + # sagging, try setting POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY to a number lower than the output + # of `git ls-files | wc -l`. Alternatively, add `bash.showDirtyState = false` to the repository's + # config: `git config bash.showDirtyState false`. + typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=-1 + + # Don't show Git status in prompt for repositories whose workdir matches this pattern. + # For example, if set to '~', the Git repository at $HOME/.git will be ignored. + # Multiple patterns can be combined with '|': '~(|/foo)|/bar/baz/*'. + typeset -g POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN='~' + + # Disable the default Git status formatting. + typeset -g POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING=true + # Install our own Git status formatter. + typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${$((my_git_formatter()))+${my_git_format}}' + # Enable counters for staged, unstaged, etc. + typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED,COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=-1 + + # Custom icon. + # typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + # typeset -g POWERLEVEL9K_VCS_PREFIX='on ' + + # Show status of repositories of these types. You can add svn and/or hg if you are + # using them. If you do, your prompt may become slow even when your current directory + # isn't in an svn or hg repository. + typeset -g POWERLEVEL9K_VCS_BACKENDS=(git) + + ##########################[ status: exit code of the last command ]########################### + # Enable OK_PIPE, ERROR_PIPE and ERROR_SIGNAL status states to allow us to enable, disable and + # style them independently from the regular OK and ERROR state. + typeset -g POWERLEVEL9K_STATUS_EXTENDED_STATES=true + + # Status on success. No content, just an icon. No need to show it if prompt_char is enabled as + # it will signify success by turning green. + typeset -g POWERLEVEL9K_STATUS_OK=false + typeset -g POWERLEVEL9K_STATUS_OK_VISUAL_IDENTIFIER_EXPANSION='✔' + typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=2 + typeset -g POWERLEVEL9K_STATUS_OK_BACKGROUND=0 + + # Status when some part of a pipe command fails but the overall exit status is zero. It may look + # like this: 1|0. + typeset -g POWERLEVEL9K_STATUS_OK_PIPE=true + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_VISUAL_IDENTIFIER_EXPANSION='✔' + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND=2 + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_BACKGROUND=0 + + # Status when it's just an error code (e.g., '1'). No need to show it if prompt_char is enabled as + # it will signify error by turning red. + typeset -g POWERLEVEL9K_STATUS_ERROR=false + typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='✘' + typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=3 + typeset -g POWERLEVEL9K_STATUS_ERROR_BACKGROUND=1 + + # Status when the last command was terminated by a signal. + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL=true + # Use terse signal names: "INT" instead of "SIGINT(2)". + typeset -g POWERLEVEL9K_STATUS_VERBOSE_SIGNAME=false + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_VISUAL_IDENTIFIER_EXPANSION='✘' + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND=3 + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_BACKGROUND=1 + + # Status when some part of a pipe command fails and the overall exit status is also non-zero. + # It may look like this: 1|0. + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE=true + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_VISUAL_IDENTIFIER_EXPANSION='✘' + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND=3 + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_BACKGROUND=1 + + ###################[ command_execution_time: duration of the last command ]################### + # Execution time color. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=0 + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_BACKGROUND=3 + # Show duration of the last command if takes at least this many seconds. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3 + # Show this many fractional digits. Zero means round to seconds. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0 + # Duration format: 1d 2h 3m 4s. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s' + # Custom icon. + # typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + # typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PREFIX='took ' + + #######################[ background_jobs: presence of background jobs ]####################### + # Background jobs color. + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=6 + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_BACKGROUND=0 + # Don't show the number of background jobs. + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false + # Custom icon. + # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ direnv: direnv status (https://direnv.net/) ]######################## + # Direnv color. + typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=3 + typeset -g POWERLEVEL9K_DIRENV_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_DIRENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###############[ asdf: asdf version manager (https://github.com/asdf-vm/asdf) ]############### + # Default asdf color. Only used to display tools for which there is no color override (see below). + # Tip: Override these parameters for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_FOREGROUND and + # POWERLEVEL9K_ASDF_${TOOL}_BACKGROUND. + typeset -g POWERLEVEL9K_ASDF_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_BACKGROUND=7 + + # There are four parameters that can be used to hide asdf tools. Each parameter describes + # conditions under which a tool gets hidden. Parameters can hide tools but not unhide them. If at + # least one parameter decides to hide a tool, that tool gets hidden. If no parameter decides to + # hide a tool, it gets shown. + # + # Special note on the difference between POWERLEVEL9K_ASDF_SOURCES and + # POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW. Consider the effect of the following commands: + # + # asdf local python 3.8.1 + # asdf global python 3.8.1 + # + # After running both commands the current python version is 3.8.1 and its source is "local" as + # it takes precedence over "global". If POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW is set to false, + # it'll hide python version in this case because 3.8.1 is the same as the global version. + # POWERLEVEL9K_ASDF_SOURCES will hide python version only if the value of this parameter doesn't + # contain "local". + + # Hide tool versions that don't come from one of these sources. + # + # Available sources: + # + # - shell `asdf current` says "set by ASDF_${TOOL}_VERSION environment variable" + # - local `asdf current` says "set by /some/not/home/directory/file" + # - global `asdf current` says "set by /home/username/file" + # + # Note: If this parameter is set to (shell local global), it won't hide tools. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SOURCES. + typeset -g POWERLEVEL9K_ASDF_SOURCES=(shell local global) + + # If set to false, hide tool versions that are the same as global. + # + # Note: The name of this parameter doesn't reflect its meaning at all. + # Note: If this parameter is set to true, it won't hide tools. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_PROMPT_ALWAYS_SHOW. + typeset -g POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW=false + + # If set to false, hide tool versions that are equal to "system". + # + # Note: If this parameter is set to true, it won't hide tools. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SHOW_SYSTEM. + typeset -g POWERLEVEL9K_ASDF_SHOW_SYSTEM=true + + # If set to non-empty value, hide tools unless there is a file matching the specified file pattern + # in the current directory, or its parent directory, or its grandparent directory, and so on. + # + # Note: If this parameter is set to empty value, it won't hide tools. + # Note: SHOW_ON_UPGLOB isn't specific to asdf. It works with all prompt segments. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SHOW_ON_UPGLOB. + # + # Example: Hide nodejs version when there is no package.json and no *.js files in the current + # directory, in `..`, in `../..` and so on. + # + # typeset -g POWERLEVEL9K_ASDF_NODEJS_SHOW_ON_UPGLOB='*.js|package.json' + typeset -g POWERLEVEL9K_ASDF_SHOW_ON_UPGLOB= + + # Ruby version from asdf. + typeset -g POWERLEVEL9K_ASDF_RUBY_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_RUBY_BACKGROUND=1 + # typeset -g POWERLEVEL9K_ASDF_RUBY_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_RUBY_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Python version from asdf. + typeset -g POWERLEVEL9K_ASDF_PYTHON_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_PYTHON_BACKGROUND=4 + # typeset -g POWERLEVEL9K_ASDF_PYTHON_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_PYTHON_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Go version from asdf. + typeset -g POWERLEVEL9K_ASDF_GOLANG_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_GOLANG_BACKGROUND=4 + # typeset -g POWERLEVEL9K_ASDF_GOLANG_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_GOLANG_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Node.js version from asdf. + typeset -g POWERLEVEL9K_ASDF_NODEJS_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_NODEJS_BACKGROUND=2 + # typeset -g POWERLEVEL9K_ASDF_NODEJS_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_NODEJS_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Rust version from asdf. + typeset -g POWERLEVEL9K_ASDF_RUST_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_RUST_BACKGROUND=208 + # typeset -g POWERLEVEL9K_ASDF_RUST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_RUST_SHOW_ON_UPGLOB='*.foo|*.bar' + + # .NET Core version from asdf. + typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_BACKGROUND=5 + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Flutter version from asdf. + typeset -g POWERLEVEL9K_ASDF_FLUTTER_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_FLUTTER_BACKGROUND=4 + # typeset -g POWERLEVEL9K_ASDF_FLUTTER_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_FLUTTER_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Lua version from asdf. + typeset -g POWERLEVEL9K_ASDF_LUA_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_LUA_BACKGROUND=4 + # typeset -g POWERLEVEL9K_ASDF_LUA_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_LUA_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Java version from asdf. + typeset -g POWERLEVEL9K_ASDF_JAVA_FOREGROUND=1 + typeset -g POWERLEVEL9K_ASDF_JAVA_BACKGROUND=7 + # typeset -g POWERLEVEL9K_ASDF_JAVA_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_JAVA_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Perl version from asdf. + typeset -g POWERLEVEL9K_ASDF_PERL_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_PERL_BACKGROUND=4 + # typeset -g POWERLEVEL9K_ASDF_PERL_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_PERL_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Erlang version from asdf. + typeset -g POWERLEVEL9K_ASDF_ERLANG_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_ERLANG_BACKGROUND=1 + # typeset -g POWERLEVEL9K_ASDF_ERLANG_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_ERLANG_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Elixir version from asdf. + typeset -g POWERLEVEL9K_ASDF_ELIXIR_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_ELIXIR_BACKGROUND=5 + # typeset -g POWERLEVEL9K_ASDF_ELIXIR_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_ELIXIR_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Postgres version from asdf. + typeset -g POWERLEVEL9K_ASDF_POSTGRES_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_POSTGRES_BACKGROUND=6 + # typeset -g POWERLEVEL9K_ASDF_POSTGRES_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_POSTGRES_SHOW_ON_UPGLOB='*.foo|*.bar' + + # PHP version from asdf. + typeset -g POWERLEVEL9K_ASDF_PHP_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_PHP_BACKGROUND=5 + # typeset -g POWERLEVEL9K_ASDF_PHP_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_PHP_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Haskell version from asdf. + typeset -g POWERLEVEL9K_ASDF_HASKELL_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_HASKELL_BACKGROUND=3 + # typeset -g POWERLEVEL9K_ASDF_HASKELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_HASKELL_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Julia version from asdf. + typeset -g POWERLEVEL9K_ASDF_JULIA_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_JULIA_BACKGROUND=2 + # typeset -g POWERLEVEL9K_ASDF_JULIA_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_JULIA_SHOW_ON_UPGLOB='*.foo|*.bar' + + ##########[ nordvpn: nordvpn connection status, linux only (https://nordvpn.com/) ]########### + # NordVPN connection indicator color. + typeset -g POWERLEVEL9K_NORDVPN_FOREGROUND=7 + typeset -g POWERLEVEL9K_NORDVPN_BACKGROUND=4 + # Hide NordVPN connection indicator when not connected. + typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_CONTENT_EXPANSION= + typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_VISUAL_IDENTIFIER_EXPANSION= + # Custom icon. + # typeset -g POWERLEVEL9K_NORDVPN_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #################[ ranger: ranger shell (https://github.com/ranger/ranger) ]################## + # Ranger shell color. + typeset -g POWERLEVEL9K_RANGER_FOREGROUND=3 + typeset -g POWERLEVEL9K_RANGER_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_RANGER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ####################[ yazi: yazi shell (https://github.com/sxyazi/yazi) ]##################### + # Yazi shell color. + typeset -g POWERLEVEL9K_YAZI_FOREGROUND=3 + typeset -g POWERLEVEL9K_YAZI_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_YAZI_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################[ nnn: nnn shell (https://github.com/jarun/nnn) ]####################### + # Nnn shell color. + typeset -g POWERLEVEL9K_NNN_FOREGROUND=0 + typeset -g POWERLEVEL9K_NNN_BACKGROUND=6 + # Custom icon. + # typeset -g POWERLEVEL9K_NNN_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################[ lf: lf shell (https://github.com/gokcehan/lf) ]####################### + # lf shell color. + typeset -g POWERLEVEL9K_LF_FOREGROUND=0 + typeset -g POWERLEVEL9K_LF_BACKGROUND=6 + # Custom icon. + # typeset -g POWERLEVEL9K_LF_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################[ xplr: xplr shell (https://github.com/sayanarijit/xplr) ]################## + # xplr shell color. + typeset -g POWERLEVEL9K_XPLR_FOREGROUND=0 + typeset -g POWERLEVEL9K_XPLR_BACKGROUND=6 + # Custom icon. + # typeset -g POWERLEVEL9K_XPLR_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########################[ vim_shell: vim shell indicator (:sh) ]########################### + # Vim shell indicator color. + typeset -g POWERLEVEL9K_VIM_SHELL_FOREGROUND=0 + typeset -g POWERLEVEL9K_VIM_SHELL_BACKGROUND=2 + # Custom icon. + # typeset -g POWERLEVEL9K_VIM_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######[ midnight_commander: midnight commander shell (https://midnight-commander.org/) ]###### + # Midnight Commander shell color. + typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_FOREGROUND=3 + typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #[ nix_shell: nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) ]## + # Nix shell color. + typeset -g POWERLEVEL9K_NIX_SHELL_FOREGROUND=0 + typeset -g POWERLEVEL9K_NIX_SHELL_BACKGROUND=4 + + # Display the icon of nix_shell if PATH contains a subdirectory of /nix/store. + # typeset -g POWERLEVEL9K_NIX_SHELL_INFER_FROM_PATH=false + + # Tip: If you want to see just the icon without "pure" and "impure", uncomment the next line. + # typeset -g POWERLEVEL9K_NIX_SHELL_CONTENT_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_NIX_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################[ chezmoi_shell: chezmoi shell (https://www.chezmoi.io/) ]################## + # chezmoi shell color. + typeset -g POWERLEVEL9K_CHEZMOI_SHELL_FOREGROUND=0 + typeset -g POWERLEVEL9K_CHEZMOI_SHELL_BACKGROUND=4 + # Custom icon. + # typeset -g POWERLEVEL9K_CHEZMOI_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################################[ disk_usage: disk usage ]################################## + # Colors for different levels of disk usage. + typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_FOREGROUND=3 + typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_BACKGROUND=0 + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_FOREGROUND=0 + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_BACKGROUND=3 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_FOREGROUND=7 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_BACKGROUND=1 + # Thresholds for different levels of disk usage (percentage points). + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL=90 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL=95 + # If set to true, hide disk usage when below $POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL percent. + typeset -g POWERLEVEL9K_DISK_USAGE_ONLY_WARNING=false + # Custom icon. + # typeset -g POWERLEVEL9K_DISK_USAGE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ vi_mode: vi mode (you don't need this if you've enabled prompt_char) ]########### + # Foreground color. + typeset -g POWERLEVEL9K_VI_MODE_FOREGROUND=0 + # Text and color for normal (a.k.a. command) vi mode. + typeset -g POWERLEVEL9K_VI_COMMAND_MODE_STRING=NORMAL + typeset -g POWERLEVEL9K_VI_MODE_NORMAL_BACKGROUND=2 + # Text and color for visual vi mode. + typeset -g POWERLEVEL9K_VI_VISUAL_MODE_STRING=VISUAL + typeset -g POWERLEVEL9K_VI_MODE_VISUAL_BACKGROUND=4 + # Text and color for overtype (a.k.a. overwrite and replace) vi mode. + typeset -g POWERLEVEL9K_VI_OVERWRITE_MODE_STRING=OVERTYPE + typeset -g POWERLEVEL9K_VI_MODE_OVERWRITE_BACKGROUND=3 + # Text and color for insert vi mode. + typeset -g POWERLEVEL9K_VI_INSERT_MODE_STRING= + typeset -g POWERLEVEL9K_VI_MODE_INSERT_FOREGROUND=8 + # Custom icon. + # typeset -g POWERLEVEL9K_VI_MODE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################################[ ram: free RAM ]####################################### + # RAM color. + typeset -g POWERLEVEL9K_RAM_FOREGROUND=0 + typeset -g POWERLEVEL9K_RAM_BACKGROUND=3 + # Custom icon. + # typeset -g POWERLEVEL9K_RAM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################################[ swap: used swap ]###################################### + # Swap color. + typeset -g POWERLEVEL9K_SWAP_FOREGROUND=0 + typeset -g POWERLEVEL9K_SWAP_BACKGROUND=3 + # Custom icon. + # typeset -g POWERLEVEL9K_SWAP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################################[ load: CPU load ]###################################### + # Show average CPU load over this many last minutes. Valid values are 1, 5 and 15. + typeset -g POWERLEVEL9K_LOAD_WHICH=5 + # Load color when load is under 50%. + typeset -g POWERLEVEL9K_LOAD_NORMAL_FOREGROUND=0 + typeset -g POWERLEVEL9K_LOAD_NORMAL_BACKGROUND=2 + # Load color when load is between 50% and 70%. + typeset -g POWERLEVEL9K_LOAD_WARNING_FOREGROUND=0 + typeset -g POWERLEVEL9K_LOAD_WARNING_BACKGROUND=3 + # Load color when load is over 70%. + typeset -g POWERLEVEL9K_LOAD_CRITICAL_FOREGROUND=0 + typeset -g POWERLEVEL9K_LOAD_CRITICAL_BACKGROUND=1 + # Custom icon. + # typeset -g POWERLEVEL9K_LOAD_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ todo: todo items (https://github.com/todotxt/todo.txt-cli) ]################ + # Todo color. + typeset -g POWERLEVEL9K_TODO_FOREGROUND=0 + typeset -g POWERLEVEL9K_TODO_BACKGROUND=8 + # Hide todo when the total number of tasks is zero. + typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_TOTAL=true + # Hide todo when the number of tasks after filtering is zero. + typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_FILTERED=false + + # Todo format. The following parameters are available within the expansion. + # + # - P9K_TODO_TOTAL_TASK_COUNT The total number of tasks. + # - P9K_TODO_FILTERED_TASK_COUNT The number of tasks after filtering. + # + # These variables correspond to the last line of the output of `todo.sh -p ls`: + # + # TODO: 24 of 42 tasks shown + # + # Here 24 is P9K_TODO_FILTERED_TASK_COUNT and 42 is P9K_TODO_TOTAL_TASK_COUNT. + # + # typeset -g POWERLEVEL9K_TODO_CONTENT_EXPANSION='$P9K_TODO_FILTERED_TASK_COUNT' + + # Custom icon. + # typeset -g POWERLEVEL9K_TODO_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ timewarrior: timewarrior tracking status (https://timewarrior.net/) ]############ + # Timewarrior color. + typeset -g POWERLEVEL9K_TIMEWARRIOR_FOREGROUND=255 + typeset -g POWERLEVEL9K_TIMEWARRIOR_BACKGROUND=8 + + # If the tracked task is longer than 24 characters, truncate and append "…". + # Tip: To always display tasks without truncation, delete the following parameter. + # Tip: To hide task names and display just the icon when time tracking is enabled, set the + # value of the following parameter to "". + typeset -g POWERLEVEL9K_TIMEWARRIOR_CONTENT_EXPANSION='${P9K_CONTENT:0:24}${${P9K_CONTENT:24}:+…}' + + # Custom icon. + # typeset -g POWERLEVEL9K_TIMEWARRIOR_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##############[ taskwarrior: taskwarrior task count (https://taskwarrior.org/) ]############## + # Taskwarrior color. + typeset -g POWERLEVEL9K_TASKWARRIOR_FOREGROUND=0 + typeset -g POWERLEVEL9K_TASKWARRIOR_BACKGROUND=6 + + # Taskwarrior segment format. The following parameters are available within the expansion. + # + # - P9K_TASKWARRIOR_PENDING_COUNT The number of pending tasks: `task +PENDING count`. + # - P9K_TASKWARRIOR_OVERDUE_COUNT The number of overdue tasks: `task +OVERDUE count`. + # + # Zero values are represented as empty parameters. + # + # The default format: + # + # '${P9K_TASKWARRIOR_OVERDUE_COUNT:+"!$P9K_TASKWARRIOR_OVERDUE_COUNT/"}$P9K_TASKWARRIOR_PENDING_COUNT' + # + # typeset -g POWERLEVEL9K_TASKWARRIOR_CONTENT_EXPANSION='$P9K_TASKWARRIOR_PENDING_COUNT' + + # Custom icon. + # typeset -g POWERLEVEL9K_TASKWARRIOR_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######[ per_directory_history: Oh My Zsh per-directory-history local/global indicator ]####### + # Color when using local/global history. + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_FOREGROUND=0 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_BACKGROUND=5 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_FOREGROUND=0 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_BACKGROUND=3 + + # Tip: Uncomment the next two lines to hide "local"/"global" text and leave just the icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_CONTENT_EXPANSION='' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_CONTENT_EXPANSION='' + + # Custom icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################################[ cpu_arch: CPU architecture ]################################ + # CPU architecture color. + typeset -g POWERLEVEL9K_CPU_ARCH_FOREGROUND=0 + typeset -g POWERLEVEL9K_CPU_ARCH_BACKGROUND=3 + + # Hide the segment when on a specific CPU architecture. + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_CONTENT_EXPANSION= + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_VISUAL_IDENTIFIER_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_CPU_ARCH_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################################[ context: user@hostname ]################################## + # Context color when running with privileges. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_FOREGROUND=1 + typeset -g POWERLEVEL9K_CONTEXT_ROOT_BACKGROUND=0 + # Context color in SSH without privileges. + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_FOREGROUND=3 + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_BACKGROUND=0 + # Default context color (no privileges, no SSH). + typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=3 + typeset -g POWERLEVEL9K_CONTEXT_BACKGROUND=0 + + # Context format when running with privileges: user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE='%n@%m' + # Context format when in SSH without privileges: user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_TEMPLATE='%n@%m' + # Default context format (no privileges, no SSH): user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE='%n@%m' + + # Don't show context unless running with privileges or in SSH. + # Tip: Remove the next line to always show context. + typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_{CONTENT,VISUAL_IDENTIFIER}_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_CONTEXT_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + # typeset -g POWERLEVEL9K_CONTEXT_PREFIX='with ' + + ###[ virtualenv: python virtual environment (https://docs.python.org/3/library/venv.html) ]### + # Python virtual environment color. + typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_VIRTUALENV_BACKGROUND=4 + # Don't show Python version next to the virtual environment name. + typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false + # If set to "false", won't show virtualenv if pyenv is already shown. + # If set to "if-different", won't show virtualenv if it's the same as pyenv. + typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_WITH_PYENV=false + # Separate environment name from Python version only with a space. + typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER= + # Custom icon. + # typeset -g POWERLEVEL9K_VIRTUALENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################[ anaconda: conda environment (https://conda.io/) ]###################### + # Anaconda environment color. + typeset -g POWERLEVEL9K_ANACONDA_FOREGROUND=0 + typeset -g POWERLEVEL9K_ANACONDA_BACKGROUND=4 + + # Anaconda segment format. The following parameters are available within the expansion. + # + # - CONDA_PREFIX Absolute path to the active Anaconda/Miniconda environment. + # - CONDA_DEFAULT_ENV Name of the active Anaconda/Miniconda environment. + # - CONDA_PROMPT_MODIFIER Configurable prompt modifier (see below). + # - P9K_ANACONDA_PYTHON_VERSION Current python version (python --version). + # + # CONDA_PROMPT_MODIFIER can be configured with the following command: + # + # conda config --set env_prompt '({default_env}) ' + # + # The last argument is a Python format string that can use the following variables: + # + # - prefix The same as CONDA_PREFIX. + # - default_env The same as CONDA_DEFAULT_ENV. + # - name The last segment of CONDA_PREFIX. + # - stacked_env Comma-separated list of names in the environment stack. The first element is + # always the same as default_env. + # + # Note: '({default_env}) ' is the default value of env_prompt. + # + # The default value of POWERLEVEL9K_ANACONDA_CONTENT_EXPANSION expands to $CONDA_PROMPT_MODIFIER + # without the surrounding parentheses, or to the last path component of CONDA_PREFIX if the former + # is empty. + typeset -g POWERLEVEL9K_ANACONDA_CONTENT_EXPANSION='${${${${CONDA_PROMPT_MODIFIER#\(}% }%\)}:-${CONDA_PREFIX:t}}' + + # Custom icon. + # typeset -g POWERLEVEL9K_ANACONDA_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ pyenv: python environment (https://github.com/pyenv/pyenv) ]################ + # Pyenv color. + typeset -g POWERLEVEL9K_PYENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_PYENV_BACKGROUND=4 + # Hide python version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_PYENV_SOURCES=(shell local global) + # If set to false, hide python version if it's the same as global: + # $(pyenv version-name) == $(pyenv global). + typeset -g POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide python version if it's equal to "system". + typeset -g POWERLEVEL9K_PYENV_SHOW_SYSTEM=true + + # Pyenv segment format. The following parameters are available within the expansion. + # + # - P9K_CONTENT Current pyenv environment (pyenv version-name). + # - P9K_PYENV_PYTHON_VERSION Current python version (python --version). + # + # The default format has the following logic: + # + # 1. Display just "$P9K_CONTENT" if it's equal to "$P9K_PYENV_PYTHON_VERSION" or + # starts with "$P9K_PYENV_PYTHON_VERSION/". + # 2. Otherwise display "$P9K_CONTENT $P9K_PYENV_PYTHON_VERSION". + typeset -g POWERLEVEL9K_PYENV_CONTENT_EXPANSION='${P9K_CONTENT}${${P9K_CONTENT:#$P9K_PYENV_PYTHON_VERSION(|/*)}:+ $P9K_PYENV_PYTHON_VERSION}' + + # Custom icon. + # typeset -g POWERLEVEL9K_PYENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ goenv: go environment (https://github.com/syndbg/goenv) ]################ + # Goenv color. + typeset -g POWERLEVEL9K_GOENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_GOENV_BACKGROUND=4 + # Hide go version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_GOENV_SOURCES=(shell local global) + # If set to false, hide go version if it's the same as global: + # $(goenv version-name) == $(goenv global). + typeset -g POWERLEVEL9K_GOENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide go version if it's equal to "system". + typeset -g POWERLEVEL9K_GOENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_GOENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ nodenv: node.js version from nodenv (https://github.com/nodenv/nodenv) ]########## + # Nodenv color. + typeset -g POWERLEVEL9K_NODENV_FOREGROUND=2 + typeset -g POWERLEVEL9K_NODENV_BACKGROUND=0 + # Hide node version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_NODENV_SOURCES=(shell local global) + # If set to false, hide node version if it's the same as global: + # $(nodenv version-name) == $(nodenv global). + typeset -g POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide node version if it's equal to "system". + typeset -g POWERLEVEL9K_NODENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_NODENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##############[ nvm: node.js version from nvm (https://github.com/nvm-sh/nvm) ]############### + # Nvm color. + typeset -g POWERLEVEL9K_NVM_FOREGROUND=0 + typeset -g POWERLEVEL9K_NVM_BACKGROUND=5 + # If set to false, hide node version if it's the same as default: + # $(nvm version current) == $(nvm version default). + typeset -g POWERLEVEL9K_NVM_PROMPT_ALWAYS_SHOW=false + # If set to false, hide node version if it's equal to "system". + typeset -g POWERLEVEL9K_NVM_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_NVM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ############[ nodeenv: node.js environment (https://github.com/ekalinin/nodeenv) ]############ + # Nodeenv color. + typeset -g POWERLEVEL9K_NODEENV_FOREGROUND=2 + typeset -g POWERLEVEL9K_NODEENV_BACKGROUND=0 + # Don't show Node version next to the environment name. + typeset -g POWERLEVEL9K_NODEENV_SHOW_NODE_VERSION=false + # Separate environment name from Node version only with a space. + typeset -g POWERLEVEL9K_NODEENV_{LEFT,RIGHT}_DELIMITER= + # Custom icon. + # typeset -g POWERLEVEL9K_NODEENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##############################[ node_version: node.js version ]############################### + # Node version color. + typeset -g POWERLEVEL9K_NODE_VERSION_FOREGROUND=7 + typeset -g POWERLEVEL9K_NODE_VERSION_BACKGROUND=2 + # Show node version only when in a directory tree containing package.json. + typeset -g POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_NODE_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ go_version: go version (https://golang.org) ]######################## + # Go version color. + typeset -g POWERLEVEL9K_GO_VERSION_FOREGROUND=255 + typeset -g POWERLEVEL9K_GO_VERSION_BACKGROUND=2 + # Show go version only when in a go project subdirectory. + typeset -g POWERLEVEL9K_GO_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_GO_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #################[ rust_version: rustc version (https://www.rust-lang.org) ]################## + # Rust version color. + typeset -g POWERLEVEL9K_RUST_VERSION_FOREGROUND=0 + typeset -g POWERLEVEL9K_RUST_VERSION_BACKGROUND=208 + # Show rust version only when in a rust project subdirectory. + typeset -g POWERLEVEL9K_RUST_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_RUST_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###############[ dotnet_version: .NET version (https://dotnet.microsoft.com) ]################ + # .NET version color. + typeset -g POWERLEVEL9K_DOTNET_VERSION_FOREGROUND=7 + typeset -g POWERLEVEL9K_DOTNET_VERSION_BACKGROUND=5 + # Show .NET version only when in a .NET project subdirectory. + typeset -g POWERLEVEL9K_DOTNET_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_DOTNET_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################[ php_version: php version (https://www.php.net/) ]###################### + # PHP version color. + typeset -g POWERLEVEL9K_PHP_VERSION_FOREGROUND=0 + typeset -g POWERLEVEL9K_PHP_VERSION_BACKGROUND=5 + # Show PHP version only when in a PHP project subdirectory. + typeset -g POWERLEVEL9K_PHP_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_PHP_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ laravel_version: laravel php framework version (https://laravel.com/) ]########### + # Laravel version color. + typeset -g POWERLEVEL9K_LARAVEL_VERSION_FOREGROUND=1 + typeset -g POWERLEVEL9K_LARAVEL_VERSION_BACKGROUND=7 + # Custom icon. + # typeset -g POWERLEVEL9K_LARAVEL_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #############[ rbenv: ruby version from rbenv (https://github.com/rbenv/rbenv) ]############## + # Rbenv color. + typeset -g POWERLEVEL9K_RBENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_RBENV_BACKGROUND=1 + # Hide ruby version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_RBENV_SOURCES=(shell local global) + # If set to false, hide ruby version if it's the same as global: + # $(rbenv version-name) == $(rbenv global). + typeset -g POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide ruby version if it's equal to "system". + typeset -g POWERLEVEL9K_RBENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_RBENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ####################[ java_version: java version (https://www.java.com/) ]#################### + # Java version color. + typeset -g POWERLEVEL9K_JAVA_VERSION_FOREGROUND=1 + typeset -g POWERLEVEL9K_JAVA_VERSION_BACKGROUND=7 + # Show java version only when in a java project subdirectory. + typeset -g POWERLEVEL9K_JAVA_VERSION_PROJECT_ONLY=true + # Show brief version. + typeset -g POWERLEVEL9K_JAVA_VERSION_FULL=false + # Custom icon. + # typeset -g POWERLEVEL9K_JAVA_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###[ package: name@version from package.json (https://docs.npmjs.com/files/package.json) ]#### + # Package color. + typeset -g POWERLEVEL9K_PACKAGE_FOREGROUND=0 + typeset -g POWERLEVEL9K_PACKAGE_BACKGROUND=6 + + # Package format. The following parameters are available within the expansion. + # + # - P9K_PACKAGE_NAME The value of `name` field in package.json. + # - P9K_PACKAGE_VERSION The value of `version` field in package.json. + # + # typeset -g POWERLEVEL9K_PACKAGE_CONTENT_EXPANSION='${P9K_PACKAGE_NAME//\%/%%}@${P9K_PACKAGE_VERSION//\%/%%}' + + # Custom icon. + # typeset -g POWERLEVEL9K_PACKAGE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ rvm: ruby version from rvm (https://rvm.io) ]######################## + # Rvm color. + typeset -g POWERLEVEL9K_RVM_FOREGROUND=0 + typeset -g POWERLEVEL9K_RVM_BACKGROUND=240 + # Don't show @gemset at the end. + typeset -g POWERLEVEL9K_RVM_SHOW_GEMSET=false + # Don't show ruby- at the front. + typeset -g POWERLEVEL9K_RVM_SHOW_PREFIX=false + # Custom icon. + # typeset -g POWERLEVEL9K_RVM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ fvm: flutter version management (https://github.com/leoafarias/fvm) ]############ + # Fvm color. + typeset -g POWERLEVEL9K_FVM_FOREGROUND=0 + typeset -g POWERLEVEL9K_FVM_BACKGROUND=4 + # Custom icon. + # typeset -g POWERLEVEL9K_FVM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ luaenv: lua version from luaenv (https://github.com/cehoffman/luaenv) ]########### + # Lua color. + typeset -g POWERLEVEL9K_LUAENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_LUAENV_BACKGROUND=4 + # Hide lua version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_LUAENV_SOURCES=(shell local global) + # If set to false, hide lua version if it's the same as global: + # $(luaenv version-name) == $(luaenv global). + typeset -g POWERLEVEL9K_LUAENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide lua version if it's equal to "system". + typeset -g POWERLEVEL9K_LUAENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_LUAENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###############[ jenv: java version from jenv (https://github.com/jenv/jenv) ]################ + # Java color. + typeset -g POWERLEVEL9K_JENV_FOREGROUND=1 + typeset -g POWERLEVEL9K_JENV_BACKGROUND=7 + # Hide java version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_JENV_SOURCES=(shell local global) + # If set to false, hide java version if it's the same as global: + # $(jenv version-name) == $(jenv global). + typeset -g POWERLEVEL9K_JENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide java version if it's equal to "system". + typeset -g POWERLEVEL9K_JENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_JENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ plenv: perl version from plenv (https://github.com/tokuhirom/plenv) ]############ + # Perl color. + typeset -g POWERLEVEL9K_PLENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_PLENV_BACKGROUND=4 + # Hide perl version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_PLENV_SOURCES=(shell local global) + # If set to false, hide perl version if it's the same as global: + # $(plenv version-name) == $(plenv global). + typeset -g POWERLEVEL9K_PLENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide perl version if it's equal to "system". + typeset -g POWERLEVEL9K_PLENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_PLENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ perlbrew: perl version from perlbrew (https://github.com/gugod/App-perlbrew) ]############ + # Perlbrew color. + typeset -g POWERLEVEL9K_PERLBREW_FOREGROUND=67 + # Show perlbrew version only when in a perl project subdirectory. + typeset -g POWERLEVEL9K_PERLBREW_PROJECT_ONLY=true + # Don't show "perl-" at the front. + typeset -g POWERLEVEL9K_PERLBREW_SHOW_PREFIX=false + # Custom icon. + # typeset -g POWERLEVEL9K_PERLBREW_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ############[ phpenv: php version from phpenv (https://github.com/phpenv/phpenv) ]############ + # PHP color. + typeset -g POWERLEVEL9K_PHPENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_PHPENV_BACKGROUND=5 + # Hide php version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_PHPENV_SOURCES=(shell local global) + # If set to false, hide php version if it's the same as global: + # $(phpenv version-name) == $(phpenv global). + typeset -g POWERLEVEL9K_PHPENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide PHP version if it's equal to "system". + typeset -g POWERLEVEL9K_PHPENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_PHPENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######[ scalaenv: scala version from scalaenv (https://github.com/scalaenv/scalaenv) ]####### + # Scala color. + typeset -g POWERLEVEL9K_SCALAENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_SCALAENV_BACKGROUND=1 + # Hide scala version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_SCALAENV_SOURCES=(shell local global) + # If set to false, hide scala version if it's the same as global: + # $(scalaenv version-name) == $(scalaenv global). + typeset -g POWERLEVEL9K_SCALAENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide scala version if it's equal to "system". + typeset -g POWERLEVEL9K_SCALAENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_SCALAENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ haskell_stack: haskell version from stack (https://haskellstack.org/) ]########### + # Haskell color. + typeset -g POWERLEVEL9K_HASKELL_STACK_FOREGROUND=0 + typeset -g POWERLEVEL9K_HASKELL_STACK_BACKGROUND=3 + + # Hide haskell version if it doesn't come from one of these sources. + # + # shell: version is set by STACK_YAML + # local: version is set by stack.yaml up the directory tree + # global: version is set by the implicit global project (~/.stack/global-project/stack.yaml) + typeset -g POWERLEVEL9K_HASKELL_STACK_SOURCES=(shell local) + # If set to false, hide haskell version if it's the same as in the implicit global project. + typeset -g POWERLEVEL9K_HASKELL_STACK_ALWAYS_SHOW=true + # Custom icon. + # typeset -g POWERLEVEL9K_HASKELL_STACK_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ terraform: terraform workspace (https://www.terraform.io) ]################# + # Don't show terraform workspace if it's literally "default". + typeset -g POWERLEVEL9K_TERRAFORM_SHOW_DEFAULT=false + # POWERLEVEL9K_TERRAFORM_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current terraform workspace gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_TERRAFORM_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_TERRAFORM_CLASSES defines the workspace class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_TERRAFORM_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' OTHER) + # + # If your current terraform workspace is "project_test", its class is TEST because "project_test" + # doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_FOREGROUND=2 + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_BACKGROUND=0 + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_TERRAFORM_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' OTHER) + typeset -g POWERLEVEL9K_TERRAFORM_OTHER_FOREGROUND=4 + typeset -g POWERLEVEL9K_TERRAFORM_OTHER_BACKGROUND=0 + # typeset -g POWERLEVEL9K_TERRAFORM_OTHER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #############[ terraform_version: terraform version (https://www.terraform.io) ]############## + # Terraform version color. + typeset -g POWERLEVEL9K_TERRAFORM_VERSION_FOREGROUND=4 + typeset -g POWERLEVEL9K_TERRAFORM_VERSION_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_TERRAFORM_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ terraform_version: It shows active terraform version (https://www.terraform.io) ]################# + typeset -g POWERLEVEL9K_TERRAFORM_VERSION_SHOW_ON_COMMAND='terraform|tf' + + #############[ kubecontext: current kubernetes context (https://kubernetes.io/) ]############# + # Show kubecontext only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show kubecontext. + typeset -g POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens|kubectx|oc|istioctl|kogito|k9s|helmfile|flux|fluxctl|stern|kubeseal|skaffold|kubent|kubecolor|cmctl|sparkctl' + + # Kubernetes context classes for the purpose of using different colors, icons and expansions with + # different contexts. + # + # POWERLEVEL9K_KUBECONTEXT_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current kubernetes context gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_KUBECONTEXT_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_KUBECONTEXT_CLASSES defines the context class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' DEFAULT) + # + # If your current kubernetes context is "deathray-testing/default", its class is TEST + # because "deathray-testing/default" doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_FOREGROUND=0 + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_BACKGROUND=2 + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' DEFAULT) + typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_FOREGROUND=7 + typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_BACKGROUND=5 + # typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Use POWERLEVEL9K_KUBECONTEXT_CONTENT_EXPANSION to specify the content displayed by kubecontext + # segment. Parameter expansions are very flexible and fast, too. See reference: + # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion. + # + # Within the expansion the following parameters are always available: + # + # - P9K_CONTENT The content that would've been displayed if there was no content + # expansion defined. + # - P9K_KUBECONTEXT_NAME The current context's name. Corresponds to column NAME in the + # output of `kubectl config get-contexts`. + # - P9K_KUBECONTEXT_CLUSTER The current context's cluster. Corresponds to column CLUSTER in the + # output of `kubectl config get-contexts`. + # - P9K_KUBECONTEXT_NAMESPACE The current context's namespace. Corresponds to column NAMESPACE + # in the output of `kubectl config get-contexts`. If there is no + # namespace, the parameter is set to "default". + # - P9K_KUBECONTEXT_USER The current context's user. Corresponds to column AUTHINFO in the + # output of `kubectl config get-contexts`. + # + # If the context points to Google Kubernetes Engine (GKE) or Elastic Kubernetes Service (EKS), + # the following extra parameters are available: + # + # - P9K_KUBECONTEXT_CLOUD_NAME Either "gke" or "eks". + # - P9K_KUBECONTEXT_CLOUD_ACCOUNT Account/project ID. + # - P9K_KUBECONTEXT_CLOUD_ZONE Availability zone. + # - P9K_KUBECONTEXT_CLOUD_CLUSTER Cluster. + # + # P9K_KUBECONTEXT_CLOUD_* parameters are derived from P9K_KUBECONTEXT_CLUSTER. For example, + # if P9K_KUBECONTEXT_CLUSTER is "gke_my-account_us-east1-a_my-cluster-01": + # + # - P9K_KUBECONTEXT_CLOUD_NAME=gke + # - P9K_KUBECONTEXT_CLOUD_ACCOUNT=my-account + # - P9K_KUBECONTEXT_CLOUD_ZONE=us-east1-a + # - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01 + # + # If P9K_KUBECONTEXT_CLUSTER is "arn:aws:eks:us-east-1:123456789012:cluster/my-cluster-01": + # + # - P9K_KUBECONTEXT_CLOUD_NAME=eks + # - P9K_KUBECONTEXT_CLOUD_ACCOUNT=123456789012 + # - P9K_KUBECONTEXT_CLOUD_ZONE=us-east-1 + # - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01 + typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION= + # Show P9K_KUBECONTEXT_CLOUD_CLUSTER if it's not empty and fall back to P9K_KUBECONTEXT_NAME. + POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${P9K_KUBECONTEXT_CLOUD_CLUSTER:-${P9K_KUBECONTEXT_NAME}}' + # Append the current context's namespace if it's not "default". + POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${${:-/$P9K_KUBECONTEXT_NAMESPACE}:#/default}' + + # Custom prefix. + # typeset -g POWERLEVEL9K_KUBECONTEXT_PREFIX='at ' + + #[ aws: aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) ]# + # Show aws only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show aws. + typeset -g POWERLEVEL9K_AWS_SHOW_ON_COMMAND='aws|awless|cdk|terraform|pulumi|terragrunt' + + # POWERLEVEL9K_AWS_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current AWS profile gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_AWS_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_AWS_CLASSES defines the profile class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_AWS_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' DEFAULT) + # + # If your current AWS profile is "company_test", its class is TEST + # because "company_test" doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_AWS_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_AWS_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_AWS_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_AWS_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' DEFAULT) + typeset -g POWERLEVEL9K_AWS_DEFAULT_FOREGROUND=7 + typeset -g POWERLEVEL9K_AWS_DEFAULT_BACKGROUND=1 + # typeset -g POWERLEVEL9K_AWS_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # AWS segment format. The following parameters are available within the expansion. + # + # - P9K_AWS_PROFILE The name of the current AWS profile. + # - P9K_AWS_REGION The region associated with the current AWS profile. + typeset -g POWERLEVEL9K_AWS_CONTENT_EXPANSION='${P9K_AWS_PROFILE//\%/%%}${P9K_AWS_REGION:+ ${P9K_AWS_REGION//\%/%%}}' + + #[ aws_eb_env: aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) ]# + # AWS Elastic Beanstalk environment color. + typeset -g POWERLEVEL9K_AWS_EB_ENV_FOREGROUND=2 + typeset -g POWERLEVEL9K_AWS_EB_ENV_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_AWS_EB_ENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ azure: azure account name (https://docs.microsoft.com/en-us/cli/azure) ]########## + # Show azure only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show azure. + typeset -g POWERLEVEL9K_AZURE_SHOW_ON_COMMAND='az|terraform|pulumi|terragrunt' + + # POWERLEVEL9K_AZURE_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current azure account name gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_AZURE_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_AZURE_CLASSES defines the account class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' OTHER) + # + # If your current azure account is "company_test", its class is TEST because "company_test" + # doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_AZURE_TEST_FOREGROUND=2 + # typeset -g POWERLEVEL9K_AZURE_TEST_BACKGROUND=0 + # typeset -g POWERLEVEL9K_AZURE_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_AZURE_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' OTHER) + + # Azure account name color. + typeset -g POWERLEVEL9K_AZURE_OTHER_FOREGROUND=7 + typeset -g POWERLEVEL9K_AZURE_OTHER_BACKGROUND=4 + # Custom icon. + # typeset -g POWERLEVEL9K_AZURE_OTHER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ gcloud: google cloud account and project (https://cloud.google.com/) ]########### + # Show gcloud only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show gcloud. + typeset -g POWERLEVEL9K_GCLOUD_SHOW_ON_COMMAND='gcloud|gcs|gsutil' + # Google cloud color. + typeset -g POWERLEVEL9K_GCLOUD_FOREGROUND=7 + typeset -g POWERLEVEL9K_GCLOUD_BACKGROUND=4 + + # Google cloud format. Change the value of POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION and/or + # POWERLEVEL9K_GCLOUD_COMPLETE_CONTENT_EXPANSION if the default is too verbose or not informative + # enough. You can use the following parameters in the expansions. Each of them corresponds to the + # output of `gcloud` tool. + # + # Parameter | Source + # -------------------------|-------------------------------------------------------------------- + # P9K_GCLOUD_CONFIGURATION | gcloud config configurations list --format='value(name)' + # P9K_GCLOUD_ACCOUNT | gcloud config get-value account + # P9K_GCLOUD_PROJECT_ID | gcloud config get-value project + # P9K_GCLOUD_PROJECT_NAME | gcloud projects describe $P9K_GCLOUD_PROJECT_ID --format='value(name)' + # + # Note: ${VARIABLE//\%/%%} expands to ${VARIABLE} with all occurrences of '%' replaced with '%%'. + # + # Obtaining project name requires sending a request to Google servers. This can take a long time + # and even fail. When project name is unknown, P9K_GCLOUD_PROJECT_NAME is not set and gcloud + # prompt segment is in state PARTIAL. When project name gets known, P9K_GCLOUD_PROJECT_NAME gets + # set and gcloud prompt segment transitions to state COMPLETE. + # + # You can customize the format, icon and colors of gcloud segment separately for states PARTIAL + # and COMPLETE. You can also hide gcloud in state PARTIAL by setting + # POWERLEVEL9K_GCLOUD_PARTIAL_VISUAL_IDENTIFIER_EXPANSION and + # POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION to empty. + typeset -g POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION='${P9K_GCLOUD_PROJECT_ID//\%/%%}' + typeset -g POWERLEVEL9K_GCLOUD_COMPLETE_CONTENT_EXPANSION='${P9K_GCLOUD_PROJECT_NAME//\%/%%}' + + # Send a request to Google (by means of `gcloud projects describe ...`) to obtain project name + # this often. Negative value disables periodic polling. In this mode project name is retrieved + # only when the current configuration, account or project id changes. + typeset -g POWERLEVEL9K_GCLOUD_REFRESH_PROJECT_NAME_SECONDS=60 + + # Custom icon. + # typeset -g POWERLEVEL9K_GCLOUD_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #[ google_app_cred: google application credentials (https://cloud.google.com/docs/authentication/production) ]# + # Show google_app_cred only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show google_app_cred. + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_SHOW_ON_COMMAND='terraform|pulumi|terragrunt' + + # Google application credentials classes for the purpose of using different colors, icons and + # expansions with different credentials. + # + # POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES is an array with even number of elements. The first + # element in each pair defines a pattern against which the current kubernetes context gets + # matched. More specifically, it's P9K_CONTENT prior to the application of context expansion + # (see below) that gets matched. If you unset all POWERLEVEL9K_GOOGLE_APP_CRED_*CONTENT_EXPANSION + # parameters, you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES defines the context class. Patterns are tried in order. + # The first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=( + # '*:*prod*:*' PROD + # '*:*test*:*' TEST + # '*' DEFAULT) + # + # If your current Google application credentials is "service_account deathray-testing x@y.com", + # its class is TEST because it doesn't match the pattern '* *prod* *' but does match '* *test* *'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_CONTENT_EXPANSION='$P9K_GOOGLE_APP_CRED_PROJECT_ID' + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=( + # '*:*prod*:*' PROD # These values are examples that are unlikely + # '*:*test*:*' TEST # to match your needs. Customize them as needed. + '*' DEFAULT) + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_FOREGROUND=7 + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_BACKGROUND=4 + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Use POWERLEVEL9K_GOOGLE_APP_CRED_CONTENT_EXPANSION to specify the content displayed by + # google_app_cred segment. Parameter expansions are very flexible and fast, too. See reference: + # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion. + # + # You can use the following parameters in the expansion. Each of them corresponds to one of the + # fields in the JSON file pointed to by GOOGLE_APPLICATION_CREDENTIALS. + # + # Parameter | JSON key file field + # ---------------------------------+--------------- + # P9K_GOOGLE_APP_CRED_TYPE | type + # P9K_GOOGLE_APP_CRED_PROJECT_ID | project_id + # P9K_GOOGLE_APP_CRED_CLIENT_EMAIL | client_email + # + # Note: ${VARIABLE//\%/%%} expands to ${VARIABLE} with all occurrences of '%' replaced by '%%'. + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_CONTENT_EXPANSION='${P9K_GOOGLE_APP_CRED_PROJECT_ID//\%/%%}' + + ##############[ toolbox: toolbox name (https://github.com/containers/toolbox) ]############### + # Toolbox color. + typeset -g POWERLEVEL9K_TOOLBOX_FOREGROUND=0 + typeset -g POWERLEVEL9K_TOOLBOX_BACKGROUND=3 + # Don't display the name of the toolbox if it matches fedora-toolbox-*. + typeset -g POWERLEVEL9K_TOOLBOX_CONTENT_EXPANSION='${P9K_TOOLBOX_NAME:#fedora-toolbox-*}' + # Custom icon. + # typeset -g POWERLEVEL9K_TOOLBOX_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + # typeset -g POWERLEVEL9K_TOOLBOX_PREFIX='in ' + + ###############################[ public_ip: public IP address ]############################### + # Public IP color. + typeset -g POWERLEVEL9K_PUBLIC_IP_FOREGROUND=7 + typeset -g POWERLEVEL9K_PUBLIC_IP_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_PUBLIC_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ########################[ vpn_ip: virtual private network indicator ]######################### + # VPN IP color. + typeset -g POWERLEVEL9K_VPN_IP_FOREGROUND=0 + typeset -g POWERLEVEL9K_VPN_IP_BACKGROUND=6 + # When on VPN, show just an icon without the IP address. + # Tip: To display the private IP address when on VPN, remove the next line. + typeset -g POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION= + # Regular expression for the VPN network interface. Run `ifconfig` or `ip -4 a show` while on VPN + # to see the name of the interface. + typeset -g POWERLEVEL9K_VPN_IP_INTERFACE='(gpd|wg|(.*tun)|tailscale)[0-9]*|(zt.*)' + # If set to true, show one segment per matching network interface. If set to false, show only + # one segment corresponding to the first matching network interface. + # Tip: If you set it to true, you'll probably want to unset POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION. + typeset -g POWERLEVEL9K_VPN_IP_SHOW_ALL=false + # Custom icon. + # typeset -g POWERLEVEL9K_VPN_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ ip: ip address and bandwidth usage for a specified network interface ]########### + # IP color. + typeset -g POWERLEVEL9K_IP_BACKGROUND=4 + typeset -g POWERLEVEL9K_IP_FOREGROUND=0 + # The following parameters are accessible within the expansion: + # + # Parameter | Meaning + # ----------------------+------------------------------------------- + # P9K_IP_IP | IP address + # P9K_IP_INTERFACE | network interface + # P9K_IP_RX_BYTES | total number of bytes received + # P9K_IP_TX_BYTES | total number of bytes sent + # P9K_IP_RX_BYTES_DELTA | number of bytes received since last prompt + # P9K_IP_TX_BYTES_DELTA | number of bytes sent since last prompt + # P9K_IP_RX_RATE | receive rate (since last prompt) + # P9K_IP_TX_RATE | send rate (since last prompt) + typeset -g POWERLEVEL9K_IP_CONTENT_EXPANSION='${P9K_IP_RX_RATE:+⇣$P9K_IP_RX_RATE }${P9K_IP_TX_RATE:+⇡$P9K_IP_TX_RATE }$P9K_IP_IP' + # Show information for the first network interface whose name matches this regular expression. + # Run `ifconfig` or `ip -4 a show` to see the names of all network interfaces. + typeset -g POWERLEVEL9K_IP_INTERFACE='[ew].*' + # Custom icon. + # typeset -g POWERLEVEL9K_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #########################[ proxy: system-wide http/https/ftp proxy ]########################## + # Proxy color. + typeset -g POWERLEVEL9K_PROXY_FOREGROUND=4 + typeset -g POWERLEVEL9K_PROXY_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_PROXY_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################################[ battery: internal battery ]################################# + # Show battery in red when it's below this level and not connected to power supply. + typeset -g POWERLEVEL9K_BATTERY_LOW_THRESHOLD=20 + typeset -g POWERLEVEL9K_BATTERY_LOW_FOREGROUND=1 + # Show battery in green when it's charging or fully charged. + typeset -g POWERLEVEL9K_BATTERY_{CHARGING,CHARGED}_FOREGROUND=2 + # Show battery in yellow when it's discharging. + typeset -g POWERLEVEL9K_BATTERY_DISCONNECTED_FOREGROUND=3 + # Battery pictograms going from low to high level of charge. + typeset -g POWERLEVEL9K_BATTERY_STAGES='\UF008E\UF007A\UF007B\UF007C\UF007D\UF007E\UF007F\UF0080\UF0081\UF0082\UF0079' + # Don't show the remaining time to charge/discharge. + typeset -g POWERLEVEL9K_BATTERY_VERBOSE=false + typeset -g POWERLEVEL9K_BATTERY_BACKGROUND=0 + + #####################################[ wifi: wifi speed ]##################################### + # WiFi color. + typeset -g POWERLEVEL9K_WIFI_FOREGROUND=0 + typeset -g POWERLEVEL9K_WIFI_BACKGROUND=4 + # Custom icon. + # typeset -g POWERLEVEL9K_WIFI_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Use different colors and icons depending on signal strength ($P9K_WIFI_BARS). + # + # # Wifi colors and icons for different signal strength levels (low to high). + # typeset -g my_wifi_fg=(0 0 0 0 0) # <-- change these values + # typeset -g my_wifi_icon=('WiFi' 'WiFi' 'WiFi' 'WiFi' 'WiFi') # <-- change these values + # + # typeset -g POWERLEVEL9K_WIFI_CONTENT_EXPANSION='%F{${my_wifi_fg[P9K_WIFI_BARS+1]}}$P9K_WIFI_LAST_TX_RATE Mbps' + # typeset -g POWERLEVEL9K_WIFI_VISUAL_IDENTIFIER_EXPANSION='%F{${my_wifi_fg[P9K_WIFI_BARS+1]}}${my_wifi_icon[P9K_WIFI_BARS+1]}' + # + # The following parameters are accessible within the expansions: + # + # Parameter | Meaning + # ----------------------+--------------- + # P9K_WIFI_SSID | service set identifier, a.k.a. network name + # P9K_WIFI_LINK_AUTH | authentication protocol such as "wpa2-psk" or "none"; empty if unknown + # P9K_WIFI_LAST_TX_RATE | wireless transmit rate in megabits per second + # P9K_WIFI_RSSI | signal strength in dBm, from -120 to 0 + # P9K_WIFI_NOISE | noise in dBm, from -120 to 0 + # P9K_WIFI_BARS | signal strength in bars, from 0 to 4 (derived from P9K_WIFI_RSSI and P9K_WIFI_NOISE) + + ####################################[ time: current time ]#################################### + # Current time color. + typeset -g POWERLEVEL9K_TIME_FOREGROUND=0 + typeset -g POWERLEVEL9K_TIME_BACKGROUND=7 + # Format for the current time: 09:51:02. See `man 3 strftime`. + typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}' + # If set to true, time will update when you hit enter. This way prompts for the past + # commands will contain the start times of their commands as opposed to the default + # behavior where they contain the end times of their preceding commands. + typeset -g POWERLEVEL9K_TIME_UPDATE_ON_COMMAND=false + # Custom icon. + # typeset -g POWERLEVEL9K_TIME_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + # typeset -g POWERLEVEL9K_TIME_PREFIX='at ' + + # Example of a user-defined prompt segment. Function prompt_example will be called on every + # prompt if `example` prompt segment is added to POWERLEVEL9K_LEFT_PROMPT_ELEMENTS or + # POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS. It displays an icon and yellow text on red background + # greeting the user. + # + # Type `p10k help segment` for documentation and a more sophisticated example. + function prompt_example() { + p10k segment -b 1 -f 3 -i '⭐' -t 'hello, %n' + } + + # User-defined prompt segments may optionally provide an instant_prompt_* function. Its job + # is to generate the prompt segment for display in instant prompt. See + # https://github.com/romkatv/powerlevel10k#instant-prompt. + # + # Powerlevel10k will call instant_prompt_* at the same time as the regular prompt_* function + # and will record all `p10k segment` calls it makes. When displaying instant prompt, Powerlevel10k + # will replay these calls without actually calling instant_prompt_*. It is imperative that + # instant_prompt_* always makes the same `p10k segment` calls regardless of environment. If this + # rule is not observed, the content of instant prompt will be incorrect. + # + # Usually, you should either not define instant_prompt_* or simply call prompt_* from it. If + # instant_prompt_* is not defined for a segment, the segment won't be shown in instant prompt. + function instant_prompt_example() { + # Since prompt_example always makes the same `p10k segment` calls, we can call it from + # instant_prompt_example. This will give us the same `example` prompt segment in the instant + # and regular prompts. + prompt_example + } + + # User-defined prompt segments can be customized the same way as built-in segments. + typeset -g POWERLEVEL9K_EXAMPLE_FOREGROUND=3 + typeset -g POWERLEVEL9K_EXAMPLE_BACKGROUND=1 + # typeset -g POWERLEVEL9K_EXAMPLE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Transient prompt works similarly to the builtin transient_rprompt option. It trims down prompt + # when accepting a command line. Supported values: + # + # - off: Don't change prompt when accepting a command line. + # - always: Trim down prompt when accepting a command line. + # - same-dir: Trim down prompt when accepting a command line unless this is the first command + # typed after changing current working directory. + typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=always + + # Instant prompt mode. + # + # - off: Disable instant prompt. Choose this if you've tried instant prompt and found + # it incompatible with your zsh configuration files. + # - quiet: Enable instant prompt and don't print warnings when detecting console output + # during zsh initialization. Choose this if you've read and understood + # https://github.com/romkatv/powerlevel10k#instant-prompt. + # - verbose: Enable instant prompt and print a warning when detecting console output during + # zsh initialization. Choose this if you've never tried instant prompt, haven't + # seen the warning, or if you are unsure what this all means. + typeset -g POWERLEVEL9K_INSTANT_PROMPT=verbose + + # Hot reload allows you to change POWERLEVEL9K options after Powerlevel10k has been initialized. + # For example, you can type POWERLEVEL9K_BACKGROUND=red and see your prompt turn red. Hot reload + # can slow down prompt by 1-2 milliseconds, so it's better to keep it turned off unless you + # really need it. + typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true + + # If p10k is already loaded, reload configuration. + # This works even with POWERLEVEL9K_DISABLE_HOT_RELOAD=true. + (( ! $+functions[p10k] )) || p10k reload +} + +# Tell `p10k configure` which file it should overwrite. +typeset -g POWERLEVEL9K_CONFIG_FILE=${${(%):-%x}:a} + +(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]} +'builtin' 'unset' 'p10k_config_opts' diff --git a/modules/nixos/adb.nix b/modules/nixos/adb.nix new file mode 100644 index 0000000..94a773b --- /dev/null +++ b/modules/nixos/adb.nix @@ -0,0 +1,5 @@ +{ username, ... }: +{ + programs.adb.enable = true; + users.users.${username}.extraGroups = [ "adbusers" ]; +} diff --git a/modules/nixos/audio.nix b/modules/nixos/audio.nix new file mode 100644 index 0000000..9141e14 --- /dev/null +++ b/modules/nixos/audio.nix @@ -0,0 +1,26 @@ +{ pkgs, ... }: { + services = { + pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + # If you want to use JACK applications, uncomment this + #jack.enable = true; + + wireplumber.extraConfig.bluetoothEnhancements = { + "monitor.bluez.properties" = { + "bluez5.enable-sbc-xq" = true; + "bluez5.enable-msbc" = true; + "bluez5.enable-hw-volume" = true; + "bluez5.roles" = [ "hsp_hs" "hsp_ag" "hfp_hf" "hfp_ag" ]; + }; + }; + }; + }; + + environment.systemPackages = with pkgs;[ + # audio control software + pamixer + ]; +} diff --git a/modules/nixos/core/boot.nix b/modules/nixos/core/boot.nix new file mode 100644 index 0000000..f061f4e --- /dev/null +++ b/modules/nixos/core/boot.nix @@ -0,0 +1,22 @@ +# 引导配置 +{ config, lib, pkgs, ... }: + +{ + boot = { + loader = { + efi = { + canTouchEfiVariables = true; + efiSysMountPoint = "/boot"; + }; + + grub = { + enable = true; + efiSupport = true; + device = "nodev"; + }; + }; + + # Allow to modify store. It's dangerous!! + readOnlyNixStore = lib.mkDefault true; + }; +} \ No newline at end of file diff --git a/modules/nixos/core/default.nix b/modules/nixos/core/default.nix new file mode 100644 index 0000000..48525c0 --- /dev/null +++ b/modules/nixos/core/default.nix @@ -0,0 +1,41 @@ +{ lib, ... }: +{ + imports = [ + ./boot.nix + ./system.nix + ]; + + programs = { + git.enable = true; + dconf.enable = true; + nix-ld.enable = true; + }; + + # Configure firewall + networking.firewall = lib.mkDefault { + enable = true; + allowedTCPPorts = [ 22 80 443 ]; # 根据需要调整 + allowedUDPPorts = [ 53 ]; # 根据需要调整 + # 如果需要,可以添加特定服务的规则 + allowedTCPPortRanges = [ + { from = 1714; to = 1764; } # KDE Connect + ]; + }; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + + i18n.extraLocaleSettings = { + LC_ADDRESS = "zh_CN.UTF-8"; + LC_IDENTIFICATION = "zh_CN.UTF-8"; + LC_MEASUREMENT = "zh_CN.UTF-8"; + LC_MONETARY = "zh_CN.UTF-8"; + LC_NAME = "zh_CN.UTF-8"; + LC_NUMERIC = "zh_CN.UTF-8"; + LC_PAPER = "zh_CN.UTF-8"; + LC_TELEPHONE = "zh_CN.UTF-8"; + LC_TIME = "zh_CN.UTF-8"; + }; + + time.timeZone = "Asia/Shanghai"; +} diff --git a/modules/nixos/core/system.nix b/modules/nixos/core/system.nix new file mode 100644 index 0000000..e108a45 --- /dev/null +++ b/modules/nixos/core/system.nix @@ -0,0 +1,104 @@ +{ outputs, config, lib, ... }: + +{ + security = { + sudo.enable = true; + polkit.enable = true; + }; + + services = { + printing.enable = true; + acpid.enable = true; + upower.enable = true; + + openssh = { + enable = true; + # Forbid root login through SSH. + # Use keys only. Remove if you want to SSH using password (not recommended) + settings = { + # permitRootLogin = "no"; + # passwordAuthentication = false; + KbdInteractiveAuthentication = false; + X11Forwarding = false; + }; + }; + + avahi = { + enable = true; + nssmdns4 = true; # 非常重要,允许系统解析 .local 地址 + openFirewall = true; + }; + + journald.extraConfig = '' + SystemMaxUse=500M + MaxFileSec=7day + ''; + }; + + nix = { + settings = { + # Enable flakes and new 'nix' command + experimental-features = "nix-command flakes"; + substituters = [ + "https://mirrors.ustc.edu.cn/nix-channels/store" + "https://nix-community.cachix.org" + "https://cache.nixos.org/" + ]; + trusted-public-keys = [ + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + ]; + trusted-users = [ "root" ]; + + # Enable local binary cache + keep-outputs = true; + keep-derivations = true; + + max-jobs = "auto"; + cores = 0; # Use all available cores + + # Deduplicate and optimize nix store during build + # auto-optimise-store = true; + }; + + gc = { + automatic = true; # Enable automatic garbage collection + dates = "weekly"; # Execute garbage collection weekly + persistent = true; # Keep settings after reboot + randomizedDelaySec = "15min"; # Add up to 15 minutes of random delay + options = "--delete-older-than 30d"; # Delete files older than 30 days + }; + + # Automatically run garbage collection whenever there is not enough space left + # Free up to 5GiB whenever there is less than 1GiB left: + extraOptions = '' + min-free = ${toString (1 * 1024 * 1024 * 1024)} + max-free = ${toString (5 * 1024 * 1024 * 1024)} + ''; + }; + + nixpkgs = { + # You can add overlays here + overlays = [ + # Add overlays your own flake exports (from overlays and pkgs dir): + outputs.overlays.additions + outputs.overlays.modifications + outputs.overlays.unstable-packages + + # You can also add overlays exported from other flakes: + # neovim-nightly-overlay.overlays.default + + # Or define it inline, for example: + # (final: prev: { + # hi = final.hello.overrideAttrs (oldAttrs: { + # patches = [ ./change-hello-to-hi.patch ]; + # }); + # }) + ]; + # Configure your nixpkgs instance + # 只有在没有使用外部创建的nixpkgs实例时才设置config + config = { + # Disable if you don't want unfree packages + allowUnfree = true; + }; + }; +} diff --git a/modules/nixos/fonts/default.nix b/modules/nixos/fonts/default.nix new file mode 100644 index 0000000..14e2d1c --- /dev/null +++ b/modules/nixos/fonts/default.nix @@ -0,0 +1,43 @@ +{ config, lib, pkgs, ... }: + +{ + imports = [ + ./fhs-fonts.nix + ]; + + environment.systemPackages = with pkgs; [ + ]; + + # all fonts are linked to /nix/var/nix/profiles/system/sw/share/X11/fonts + fonts = { + # use fonts specified by user rather than default ones + enableDefaultPackages = false; + fontDir.enable = true; + + packages = with pkgs; [ + # Noto 系列字体是 Google 主导的,名字的含义是「没有豆腐」q(no tofu),因为缺字时显示的方框或者方框被叫作 tofu + # Noto 系列字族名只支持英文,命名规则是 Noto + Sans 或 Serif + 文字名称。 + # 其中汉字部分叫 Noto Sans/Serif CJK SC/TC/HK/JP/KR,最后一个词是地区变种。 + noto-fonts # 大部分文字的常见样式,不包含汉字 + noto-fonts-cjk-sans # 汉字部分 + noto-fonts-color-emoji # 彩色的表情符号字体 + + # 思源系列字体是 Adobe 主导的。其中汉字部分被称为「思源黑体」和「思源宋体」,是由 Adobe + Google 共同开发的 + source-sans # 无衬线字体,不含汉字。字族名叫 Source Sans 3 和 Source Sans Pro,以及带字重的变体,加上 Source Sans 3 VF + source-serif # 衬线字体,不含汉字。字族名叫 Source Code Pro,以及带字重的变体 + source-han-sans # 思源黑体 + source-han-serif # 思源宋体 + + # nerdfonts + nerd-fonts.jetbrains-mono + # (nerdfonts.override { + # fonts = [ + # # "FiraCode" + # "JetBrainsMono" + # # "Iosevka" + # ]; + # }) + + ]; + }; +} diff --git a/modules/nixos/fonts/fhs-fonts.nix b/modules/nixos/fonts/fhs-fonts.nix new file mode 100644 index 0000000..813ec53 --- /dev/null +++ b/modules/nixos/fonts/fhs-fonts.nix @@ -0,0 +1,25 @@ +{ config, lib, pkgs, ... }: + +{ + system.fsPackages = [ pkgs.bindfs ]; + fileSystems = let + mkRoSymBind = path: { + device = path; + fsType = "fuse.bindfs"; + options = [ "ro" "resolve-symlinks" "x-gvfs-hide" ]; + }; + aggregatedIcons = pkgs.buildEnv { + name = "system-icons"; + paths = config.fonts.packages; + pathsToLink = [ "/share/icons" ]; + }; + aggregatedFonts = pkgs.buildEnv { + name = "system-fonts"; + paths = config.fonts.packages; + pathsToLink = [ "/share/fonts" ]; + }; + in { + "/usr/share/icons" = mkRoSymBind "${aggregatedIcons}/share/icons"; + "/usr/local/share/fonts" = mkRoSymBind "${aggregatedFonts}/share/fonts"; + }; +} diff --git a/modules/nixos/gnome.nix b/modules/nixos/gnome.nix new file mode 100644 index 0000000..95662b7 --- /dev/null +++ b/modules/nixos/gnome.nix @@ -0,0 +1,47 @@ +{ config, pkgs, ... }: +{ + services.xserver = { + enable = true; + displayManager.gdm.enable = true; + desktopManager.gnome.enable = true; + }; + + environment = { + systemPackages = (with pkgs;[ + gnome.gnome-tweaks + ]) ++ (with pkgs.gnomeExtensions;[ + dash-to-dock + captivate # cap button indicator + appindicator # tray icon + ]); + + gnome.excludePackages = (with pkgs; [ + gnome-photos + gnome-tour + gnome-text-editor + ]) ++ (with pkgs.gnome; [ + atomix # puzzle game + cheese # webcam tool + epiphany # web browser + # geary # email reader + evince # document viewer + gedit # text editor + gnome-contacts + gnome-maps + gnome-weather + gnome-music + gnome-characters + # gnome-terminal + hitori # sudoku game + iagno # go game + simple-scan + totem # video player + tali # poker game + yelp # help viewer + ]); + }; +} + + + + diff --git a/modules/nixos/nvidia.nix b/modules/nixos/nvidia.nix new file mode 100644 index 0000000..d54404a --- /dev/null +++ b/modules/nixos/nvidia.nix @@ -0,0 +1,28 @@ +{ config, ... }: +{ + # Tell Xorg to use the nvidia driver (also valid for Wayland) + services.xserver.videoDrivers = [ "nvidia" ]; + + hardware = { + # Make sure opengl is enabled + graphics.enable = true; + nvidia = { + + # Modesetting is needed for most Wayland compositors + modesetting.enable = true; + + # Use the open source version of the kernel module + # Only available on driver 515.43.04+ + open = false; + + # Enable the nvidia settings menu + nvidiaSettings = true; + + powerManagement.enable = true; + + # Optionally, you may need to select the appropriate driver version for your specific GPU. + package = config.boot.kernelPackages.nvidiaPackages.stable; + }; + }; + +} diff --git a/modules/nixos/samba.nix b/modules/nixos/samba.nix new file mode 100644 index 0000000..8f94ed8 --- /dev/null +++ b/modules/nixos/samba.nix @@ -0,0 +1,39 @@ +{ username, pkgs, ... }: +{ + + services.samba-wsdd.enable = true; # make shares visible for windows 10 clients + networking.firewall.allowedTCPPorts = [ + 5357 # wsdd + ]; + networking.firewall.allowedUDPPorts = [ + 3702 # wsdd + ]; + services.samba = { + enable = true; + settings = { + global = { + "workgroup" = "WORKGROUP"; + "server string" = "smbnix"; + "netbios name" = "smbnix"; + "security" = "user"; + #use sendfile = "yes" + #max protocol = "smb2" + # note: localhost is the ipv6 localhost ::1 + "hosts allow" = "10.7.43. 127.0.0.1 localhost"; + "hosts deny" = "0.0.0.0/0"; + "guest account" = "nobody"; + "map to guest" = "bad user"; + }; + tmp = { + path = "/home/${username}/tmp"; + browseable = "yes"; + "read only" = "no"; + "guest ok" = "yes"; + "create mask" = "0644"; + "directory mask" = "0755"; + "force user" = "${username}"; + "force group" = "users"; + }; + }; + }; +} diff --git a/modules/nixos/sysatomic.nix b/modules/nixos/sysatomic.nix new file mode 100644 index 0000000..59ab175 --- /dev/null +++ b/modules/nixos/sysatomic.nix @@ -0,0 +1,61 @@ +# 配置原子系统, 使用 tmpfs 作为根文件系统, 并配置持久化存储 +{ inputs, config, pkgs, username, lib, ... }: +{ + imports = [ + inputs.impermanence.nixosModules.impermanence + ]; + + # 启用 tmpfs 作为根文件系统 + fileSystems."/" = lib.mkForce { + device = "tmpfs"; + fsType = "tmpfs"; + options = [ "relatime" "mode=755" ]; + }; + + # 将 /nix 目录绑定到持久化存储 + fileSystems."/nix" = lib.mkForce { + device = "/dev/disk/by-label/nixos"; # 需要根据实际情况修改 + fsType = "btrfs"; + options = [ "compress-force=zstd" ]; + + }; + + # 配置持久化存储 + environment.persistence."/nix/persistent" = { + hideMounts = true; + directories = [ + "/etc/nixos" + "/etc/NetworkManager/system-connections" + "/var/log" + "/var/lib" + "/root" + ]; + + files = [ + "/etc/machine-id" + "/etc/ssh/ssh_host_ed25519_key" + "/etc/ssh/ssh_host_ed25519_key.pub" + "/etc/ssh/ssh_host_rsa_key" + "/etc/ssh/ssh_host_rsa_key.pub" + ]; + + users.${username} = { + directories = [ + ".config" + ".cache" + ".local" + ".ssh" + ".vscode" + ".npm" + ".nix" + "data" + "doc" + ]; + + files = [ + ".zsh_history" + ".gitconfig" + ]; + }; + }; +} diff --git a/modules/nixos/user.nix b/modules/nixos/user.nix new file mode 100644 index 0000000..26fa278 --- /dev/null +++ b/modules/nixos/user.nix @@ -0,0 +1,70 @@ +{ pkgs, username, ... }: + +let + binPath = "/run/current-system/sw/bin/"; +in +{ + nix.settings.trusted-users = [ username ]; + + # Define a user account. Don't forget to set a password with ‘passwd’. + users = { + users."${username}" = { + # the hashed password with salt is generated by run `mkpasswd`. + hashedPassword = "$y$j9T$inkrp6FuM46uoPFVrOlbz1$igJed6pECf4AENVaLT4mk.Q4z02MmxjWnGo.OVvCyC."; + home = "/home/${username}"; + isNormalUser = true; + description = username; + extraGroups = [ + "users" + "wheel" + "networkmanager" + "audio" + ]; + openssh.authorizedKeys.keys = [ + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCc62MxAVqX8LDFAiDiXlc8d3JU1S3xYVO8WpfgoVYPyrd2fkK2Dr1tSedJyGWc3ADOxzUbsTic8b1BOdmbx4ZPwI+a3nJrVVkmIRSAs5haEZqG8NXDv1kl4xL+J9tVA2jwScl6MRzqyVMgtIAvnsVW9+DrL2Y2b20NvuWz3XndZ8vEUFZLLCQJQRpGrY2ZnTvNXZo12GrD5daiMii52ZuhfNBx17oFnf70sj+phZbp5m2mKL9jfKaDSG+E7Pa/IbB/iivD/QSm0SueYXbsdtMBhtsxvH/i0pJogUlVpa42CRIDUVoHOvfk0Hk83xyIIl2b78xfGEyCQBBU6sSk726xXpqzfxJJ7FiYqhLMKKDFmD28EOs4BUveyZudWNcP0a1+uBBcrefNAwU6EOSg65BOxxvZFbNG1I7YDTiKvYFy965+WkN5QKbBVSy08ziS1MQt224ZooAdxCKESGRr9IqKvq9ONnb0MtmC4ht/n8U9VaeLVq3XDXZZHEUq0cw748k= alex@gaea" + ]; + }; + }; + + # DO NOT promote the specified user to input password for `nix-store` and `nix-copy-closure` + security.sudo = { + # wheelNeedsPassword = false; + extraRules = [ + { + users = [ username ]; + commands = + [ + { + command = "${pkgs.systemd}/systemctl"; + options = [ "NOPASSWD" ]; + } + { + command = "${binPath}/nix-store"; + options = [ "NOPASSWD" ]; + } + { + command = "${binPath}/nixos-rebuild"; + options = [ "NOPASSWD" "SETENV" ]; + } + { + command = "${binPath}/reboot"; + options = [ "NOPASSWD" ]; + } + { + command = "${binPath}/poweroff"; + options = [ "NOPASSWD" ]; + } + { + command = "/run/wrappers/bin/mount"; + options = [ "NOPASSWD" ]; + } + { + command = "/run/wrappers/bin/umount"; + options = [ "NOPASSWD" ]; + } + ]; + } + ]; + }; +} + diff --git a/modules/nixos/virtualize/android.nix b/modules/nixos/virtualize/android.nix new file mode 100644 index 0000000..04bc6be --- /dev/null +++ b/modules/nixos/virtualize/android.nix @@ -0,0 +1,7 @@ +{ config, pkgs, lib, ... }: +{ + virtualisation.waydroid.enable = true; # need dns port + environment.systemPackages = [ + pkgs.waydroid-script + ]; +} diff --git a/modules/nixos/virtualize/appimage.nix b/modules/nixos/virtualize/appimage.nix new file mode 100644 index 0000000..887e689 --- /dev/null +++ b/modules/nixos/virtualize/appimage.nix @@ -0,0 +1,9 @@ +{ config, pkgs, lib, ... }: +{ + config = { + environment.systemPackages = with pkgs; [ + appimage-run + ]; + + }; +} diff --git a/modules/nixos/virtualize/docker.nix b/modules/nixos/virtualize/docker.nix new file mode 100644 index 0000000..56cc2d9 --- /dev/null +++ b/modules/nixos/virtualize/docker.nix @@ -0,0 +1,14 @@ +{ config, pkgs, lib, username, ... }: +{ + # Enable Docker + virtualisation.docker = { + enable = true; + storageDriver = "btrfs"; + }; + + # Enable Podman + # virtualisation.podman.enable = true; + #virtualisation.podman.dockerCompat = true; # Create a `docker` alias for podman, to use it as a drop-in replacement + + users.users.${username}.extraGroups = lib.mkIf config.virtualisation.docker.enable [ "docker" ]; +} diff --git a/modules/nixos/virtualize/libvirtd/default.nix b/modules/nixos/virtualize/libvirtd/default.nix new file mode 100644 index 0000000..9a37d23 --- /dev/null +++ b/modules/nixos/virtualize/libvirtd/default.nix @@ -0,0 +1,45 @@ +{ config, pkgs, lib, username, ... }: +{ + + imports = [ + ./hooks.nix + ]; + + config = { + + # Ref: https://nixos.wiki/wiki/NixOps/Virtualization + + boot = { + kernelModules = [ "kvm-amd" "kvm-intel" "vfio" "vfio_iommu_type1" "vfio_pci" "vfio_virqfd" ]; + kernelParams = [ "amd_iommu=on" "intel_iommu=on" "iommu=pt" ]; + # extraModprobeConfig = "options vfio-pci ids=8086:1901,10de:1b81,10de:10f0"; + }; + virtualisation.libvirtd = { + enable = true; + qemu = { + package = pkgs.qemu_kvm; + ovmf.enable = true; + ovmf.packages = [ pkgs.OVMFFull.fd ]; + swtpm.enable = true; + runAsRoot = false; + }; + }; + + # tpm + security.tpm2 = { + pkcs11.enable = true; # expose /run/current-system/sw/lib/libtpm2_pkcs11.so + enable = true; + tctiEnvironment.enable = true; # TPM2TOOLS_TCTI and TPM2_PKCS11_TCTI env variables + }; + + # Ref: https://nixos.wiki/wiki/Virt-manager + + environment.systemPackages = with pkgs; [ + virt-manager + virglrenderer + #virt-manager-qt + ]; + + users.users.${username}.extraGroups = lib.mkIf config.virtualisation.libvirtd.enable [ "libvirtd" "tss" ]; + }; +} diff --git a/modules/nixos/virtualize/libvirtd/hooks.nix b/modules/nixos/virtualize/libvirtd/hooks.nix new file mode 100644 index 0000000..6659502 --- /dev/null +++ b/modules/nixos/virtualize/libvirtd/hooks.nix @@ -0,0 +1,37 @@ +{ pkgs, ... }: +{ + # Load Hooks for Libvirt + systemd.services.libvirtd.preStart = let + qemuHook = pkgs.writeScript "qemu-hook" '' + #!${pkgs.stdenv.shell} + + GUEST_NAME="$1" + HOOK_NAME="$2" + STATE_NAME="$3" + MISC="$\{@:4}" + + BASEDIR="$(dirname $0)" + + HOOKPATH="$BASEDIR/qemu.d/$GUEST_NAME/$HOOK_NAME/$STATE_NAME" + set -e # If a script exits with an error, we should as well. + + if [ -f "$HOOKPATH" ]; then + eval \""$HOOKPATH"\" "$@" + elif [ -d "$HOOKPATH" ]; then + while read file; do + eval \""$file"\" "$@" + done <<< "$(find -L "$HOOKPATH" -maxdepth 1 -type f -executable -print;)" + fi + ''; + in '' + mkdir -p /var/lib/libvirt/hooks + chmod 755 /var/lib/libvirt/hooks + + # Copy hook files + ln -sf ${qemuHook} /var/lib/libvirt/hooks/qemu + cp -rfT ${./qemu.d} /var/lib/libvirt/hooks/qemu.d + + # Make executable + chmod -R +x /var/lib/libvirt/hooks/qemu.d/ + ''; +} \ No newline at end of file diff --git a/modules/nixos/virtualize/libvirtd/qemu.d/win11/prepare/begin/start.sh b/modules/nixos/virtualize/libvirtd/qemu.d/win11/prepare/begin/start.sh new file mode 100644 index 0000000..febc9fb --- /dev/null +++ b/modules/nixos/virtualize/libvirtd/qemu.d/win11/prepare/begin/start.sh @@ -0,0 +1,44 @@ +#!/run/current-system/sw/bin/bash +set -x + +# Xpad affects the work of the xbox controller and its wireless adapter +# The xpad will shake hands with the handle/wireless adapter when it is plugged in. At this time, +# if you pass the usb device directly to the virtual machine, the xbox handle will not re-handshake with the root of windows, +# which will eventually cause it to fail to work. +# I can't find a way to make the usb device passthrough into the virtual machine from before/when it is plugged in, +# so I suggest you disable this driver if you need to use the gamepad in virtual machine +modprobe -r xpad + +# dGPU PCI slots +pci_slot="01:00" + +# Determine whether the graphics card has been used by VFIO kernel modules +if [ -z "$(lspci -k -s $pci_slot | grep vfio_pci)" ]; then + # Determine whether nvidia kernel modules has been loaded + lsmod_result=$(lsmod | grep nvidia) + if [ -n "$lsmod_result" ]; then + # Stop display manager + systemctl stop display-manager + + sleep 2 + + # Unload NVIDIA kernel modules + modprobe -r nvidia_drm nvidia_modeset nvidia_uvm nvidia + + # Unload AMD kernel module + # modprobe -r amdgpu + fi + + # Detach GPU devices from host + # Use your GPU and HDMI Audio PCI host device + virsh nodedev-detach pci_0000_01_00_0 + virsh nodedev-detach pci_0000_01_00_1 + + # Load vfio module + modprobe vfio_pci + + if [ -n "$lsmod_result" ]; then + # Restart Display Manager + systemctl start display-manager + fi +fi \ No newline at end of file diff --git a/modules/nixos/virtualize/libvirtd/qemu.d/win11/release/end/stop.sh b/modules/nixos/virtualize/libvirtd/qemu.d/win11/release/end/stop.sh new file mode 100644 index 0000000..f3dbbb0 --- /dev/null +++ b/modules/nixos/virtualize/libvirtd/qemu.d/win11/release/end/stop.sh @@ -0,0 +1,13 @@ +#!/run/current-system/sw/bin/bash +set -x + +# Load Xpad +modprobe nvidia_drm nvidia_modeset nvidia_uvm nvidia xpad + +# Attach GPU devices to host +# Use your GPU and HDMI Audio PCI host device +virsh nodedev-reattach pci_0000_01_00_0 +virsh nodedev-reattach pci_0000_01_00_1 + +# Unload vfio module +modprobe -r vfio_pci \ No newline at end of file diff --git a/modules/nixos/virtualize/nixos-generators.nix b/modules/nixos/virtualize/nixos-generators.nix new file mode 100644 index 0000000..4d902d7 --- /dev/null +++ b/modules/nixos/virtualize/nixos-generators.nix @@ -0,0 +1,6 @@ +{ config, pkgs, lib, ... }: +{ + environment.systemPackages = with pkgs; [ + nixos-generators + ]; +} diff --git a/modules/nixos/virtualize/virtualbox.nix b/modules/nixos/virtualize/virtualbox.nix new file mode 100644 index 0000000..c9130c2 --- /dev/null +++ b/modules/nixos/virtualize/virtualbox.nix @@ -0,0 +1,15 @@ +{ config, pkgs, lib, ... }: +{ + config = { + # Enable virtualbox + # Ref: https://nixos.wiki/wiki/Virtualbox + #virtualisation.virtualbox.host.enable = true; + #virtualisation.virtualbox.host.enableExtensionPack = true; //NOTE: this is unfree + #users.extraGroups.vboxusers.members = [ config.owner ]; + + environment.systemPackages = with pkgs; [ + #linuxPackages_latest.virtualboxGuestAdditions + ]; + + }; +} diff --git a/modules/nixos/virtualize/wine.nix b/modules/nixos/virtualize/wine.nix new file mode 100644 index 0000000..a29bb01 --- /dev/null +++ b/modules/nixos/virtualize/wine.nix @@ -0,0 +1,12 @@ +{ config, pkgs, lib, ... }: +{ + config = { + environment.systemPackages = with pkgs; [ + ## [wine] see: https://nixos.wiki/wiki/Wine + #wineWowPackages.staging + #wineWowPackages.fonts + #winetricks + ]; + + }; +} diff --git a/modules/nixos/zfs.nix b/modules/nixos/zfs.nix new file mode 100644 index 0000000..cad2373 --- /dev/null +++ b/modules/nixos/zfs.nix @@ -0,0 +1,7 @@ +{ config, pkgs, ... }: +{ + boot = { + supportedFilesystems = [ "zfs" ]; + kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages; + }; +} diff --git a/nixos-install.sh b/nixos-install.sh new file mode 100755 index 0000000..8d21818 --- /dev/null +++ b/nixos-install.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +nixos-install \ +--option substituters https://mirrors.ustc.edu.cn/nix-channels/store \ +--no-root-passwd --flake .#$1 \ No newline at end of file diff --git a/nixos-switch.sh b/nixos-switch.sh new file mode 100755 index 0000000..0122ed5 --- /dev/null +++ b/nixos-switch.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +sudo nixos-rebuild switch --flake . $@ \ No newline at end of file diff --git a/nixpkgs.nix b/nixpkgs.nix new file mode 100644 index 0000000..041de40 --- /dev/null +++ b/nixpkgs.nix @@ -0,0 +1,8 @@ +# A nixpkgs instance that is grabbed from the pinned nixpkgs commit in the lock file +# This is useful to avoid using channels when using legacy nix commands +let lock = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.nixpkgs.locked; +in +import (fetchTarball { + url = "https://github.com/nixos/nixpkgs/archive/${lock.rev}.tar.gz"; + sha256 = lock.narHash; +}) diff --git a/non-nixos-install.sh b/non-nixos-install.sh new file mode 100644 index 0000000..6495bda --- /dev/null +++ b/non-nixos-install.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +nix build .#homeConfigurations.alex.activationPackage + +# active home manager config +./result/activate \ No newline at end of file diff --git a/overlays/default.nix b/overlays/default.nix new file mode 100644 index 0000000..acb5b68 --- /dev/null +++ b/overlays/default.nix @@ -0,0 +1,41 @@ +# This file defines overlays +{ inputs, ... }: +{ + # This one brings our custom packages from the 'pkgs' directory + additions = final: _prev: import ../pkgs { pkgs = final; }; + + # This one contains whatever you want to overlay + # You can change versions, add patches, set compilation flags, anything really. + # https://nixos.wiki/wiki/Overlays + modifications = final: prev: { + # example = prev.example.overrideAttrs (oldAttrs: rec { + # ... + # }); + waybar = prev.waybar.overrideAttrs (oldAttrs: { + mesonFlags = oldAttrs.mesonFlags ++ [ "-Dexperimental=true" ]; + }); + }; + + # When applied, the unstable nixpkgs set (declared in the flake inputs) will + # be accessible through 'pkgs.unstable' + unstable-packages = final: _prev: { + unstable = import inputs.nixpkgs-unstable { + system = final.system; + config.allowUnfree = true; + }; + }; + + home-manager-unstable = final: _prev: { + hmunstable = import inputs.home-manager-unstable { + system = final.system; + config.allowUnfree = true; + }; + }; + + nur-packages = final: _prev: { + nur = import inputs.nur { + nurpkgs = final; + pkgs = final; + }; + }; +} diff --git a/pkgs/default.nix b/pkgs/default.nix new file mode 100644 index 0000000..1833712 --- /dev/null +++ b/pkgs/default.nix @@ -0,0 +1,5 @@ +# Custom packages, that can be defined similarly to ones from nixpkgs +# You can build them using 'nix build .#example' or (legacy) 'nix-build -A example' +{ pkgs ? (import ../nixpkgs.nix) { } }: with pkgs; { + # waydroid-script = callPackage ./waydroid-script { }; +} diff --git a/pkgs/waydroid-script/default.nix b/pkgs/waydroid-script/default.nix new file mode 100644 index 0000000..6ea789a --- /dev/null +++ b/pkgs/waydroid-script/default.nix @@ -0,0 +1,67 @@ +{ stdenv +, lib +, python3Packages +, fetchFromGitHub +, substituteAll +, lzip +, util-linux +, nix-update-script +}: +let + pname = "waydroid-script"; + version = "unstable-2023-08-25"; + src = fetchFromGitHub { + repo = "waydroid_script"; + owner = "casualsnek"; + rev = "77e222fb166c645a18c6a65aba8547631ff17704"; + hash = "sha256-FstkA6SKqrX0bD4NfyFbPQCLyfHfvWakmiRPmTGo78g="; + }; + + resetprop = stdenv.mkDerivation { + pname = "resetprop"; + inherit version src; + dontBuild = true; + installPhase = '' + mkdir -p $out/share + cp -r bin/* $out/share/ + ''; + }; +in python3Packages.buildPythonApplication rec { + inherit pname version src; + + propagatedBuildInputs = with python3Packages; [ + inquirerpy + requests + tqdm + + lzip + util-linux + ]; + + postPatch = let + setup = substituteAll { + src = ./setup.py; + inherit pname; + desc = meta.description; + version = builtins.replaceStrings [ "-" ] [ "." ] + (lib.strings.removePrefix "unstable-" version); + }; + in '' + ln -s ${setup} setup.py + + substituteInPlace stuff/general.py \ + --replace "os.path.dirname(__file__), \"..\", \"bin\"," "\"${resetprop}/share\"," + ''; + + passthru.updateScript = nix-update-script { + extraArgs = [ "--version=branch" ]; + }; + + meta = with lib; { + description = "Python Script to add libraries to waydroid"; + homepage = "https://github.com/casualsnek/waydroid_script"; + license = licenses.gpl3; + platforms = platforms.linux; + maintainers = with maintainers; [ ataraxiasjel ]; + }; +} \ No newline at end of file diff --git a/pkgs/waydroid-script/setup.py b/pkgs/waydroid-script/setup.py new file mode 100644 index 0000000..5f30afe --- /dev/null +++ b/pkgs/waydroid-script/setup.py @@ -0,0 +1,16 @@ +from setuptools import setup + +setup( + name='@pname@', + version='@version@', + description='@desc@', + packages=["main", "stuff", "tools"], + python_requires='>=3.8', + install_requires = ['tqdm', 'requests', 'InquirerPy'], + package_dir = { + 'main': '.', + }, + entry_points = { + 'console_scripts': ['waydroid-script=main.main:main'], + } +) \ No newline at end of file diff --git a/profiles/apollo/configuration.nix b/profiles/apollo/configuration.nix new file mode 100644 index 0000000..d2ee4c9 --- /dev/null +++ b/profiles/apollo/configuration.nix @@ -0,0 +1,67 @@ +args@{ inputs, outputs, lib, pkgs, home-manager, self, username, useremail, hostname, sysversion, ... }: { + + # You can import other NixOS modules here + imports = [ + # If you want to use modules your own flake exports (from modules/nixos): + # outputs.nixosModules.example + + # Or modules from other flakes (such as nixos-hardware): + # inputs.hardware.nixosModules.common-cpu-amd + # inputs.hardware.nixosModules.common-ssd + + # You can also split up your configuration and import pieces of it here: + # ./users.nix + + # Import your generated (nixos-generate-config) hardware configuration + ./mount.nix + ./network.nix + ./hardware-configuration.nix + + "${self}/modules/nixos/core" + "${self}/modules/nixos/fonts" + "${self}/modules/nixos/user.nix" + "${self}/modules/nixos/audio.nix" + "${self}/modules/nixos/samba.nix" + "${self}/modules/nixos/virtualize/appimage.nix" + "${self}/modules/nixos/virtualize/docker.nix" + + home-manager.nixosModules.home-manager + { + # home-manager.useGlobalPkgs = true; + # home-manager.useUserPackages = true; + home-manager.extraSpecialArgs = { + inherit inputs outputs hostname username useremail sysversion; + }; + home-manager.users."${username}" = { ... }: { + imports = [ + ./hm + "${self}/home/desktop.nix" + "${self}/modules/home/develop.nix" + ]; + }; + } + ]; + + hardware.graphics = { + enable = true; + extraPackages = with pkgs; [ + vaapiIntel + intel-media-driver + ]; + }; + + services = { + gnome.gnome-keyring.enable = true; + }; + + security.pam.services.swaylock = { }; + + programs.zsh = { + enable = true; + }; + + users.users."${username}".shell = pkgs.zsh; + + # https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion + system.stateVersion = sysversion; +} diff --git a/profiles/apollo/default.nix b/profiles/apollo/default.nix new file mode 100644 index 0000000..f040d02 --- /dev/null +++ b/profiles/apollo/default.nix @@ -0,0 +1,14 @@ +args@{ libs, inputs, ... }: +let + # 这里可以选择使用稳定版或不稳定版的nixpkgs + # nixpkgs = inputs.nixpkgs; + nixpkgs = inputs.nixpkgs-unstable; # 如果需要使用unstable版本,取消这行注释并注释上一行 + home-manager = inputs.home-manager-unstable; + sysArgs = args // { inherit home-manager; }; +in +# 使用libs.mkNixosSystem创建nixosSystem +libs.mkNixosSystem { + inherit nixpkgs; + args = sysArgs; + path = ./.; +} diff --git a/profiles/apollo/hardware-configuration.nix b/profiles/apollo/hardware-configuration.nix new file mode 100644 index 0000000..ec90096 --- /dev/null +++ b/profiles/apollo/hardware-configuration.nix @@ -0,0 +1,58 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usb_storage" "usbhid" "sd_mod" ]; + boot.initrd.kernelModules = [ "dm-snapshot" ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/9d79b1dc-da5a-456c-a691-9bda5aebcea3"; + fsType = "btrfs"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/FE53-DFFA"; + fsType = "vfat"; + options = [ "fmask=0022" "dmask=0022" ]; + }; + + fileSystems."/nix" = + { device = "/dev/disk/by-uuid/9d79b1dc-da5a-456c-a691-9bda5aebcea3"; + fsType = "btrfs"; + options = [ "subvol=nix" ]; + }; + + fileSystems."/swap" = + { device = "/dev/disk/by-uuid/9d79b1dc-da5a-456c-a691-9bda5aebcea3"; + fsType = "btrfs"; + options = [ "subvol=swap" ]; + }; + + fileSystems."/home" = + { device = "/dev/disk/by-uuid/9d79b1dc-da5a-456c-a691-9bda5aebcea3"; + fsType = "btrfs"; + options = [ "subvol=home" ]; + }; + + swapDevices = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.eno1.useDHCP = lib.mkDefault true; + # networking.interfaces.enp2s0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp3s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/profiles/apollo/hm/default.nix b/profiles/apollo/hm/default.nix new file mode 100644 index 0000000..2af7fe8 --- /dev/null +++ b/profiles/apollo/hm/default.nix @@ -0,0 +1,6 @@ +{ ... }: { + imports = [ + ./ssh + ./hyprland.nix + ]; +} diff --git a/profiles/apollo/hm/hyprland.nix b/profiles/apollo/hm/hyprland.nix new file mode 100644 index 0000000..4da7a2b --- /dev/null +++ b/profiles/apollo/hm/hyprland.nix @@ -0,0 +1,11 @@ +{ ... }: + +{ + home = { + sessionVariables = { + # for hyprland with nvidia gpu, ref https://wiki.hyprland.org/Nvidia/ + # 启用注释部分会导致NVIDIA下无法启动hyprland + WLR_DRM_DEVICES = "/dev/dri/card1:/dev/dri/card0"; + }; + }; +} diff --git a/profiles/apollo/hm/ssh/config b/profiles/apollo/hm/ssh/config new file mode 100644 index 0000000..872786c --- /dev/null +++ b/profiles/apollo/hm/ssh/config @@ -0,0 +1,66 @@ + + +Host * + ForwardAgent no + AddKeysToAgent no + Compression no + ServerAliveInterval 0 + ServerAliveCountMax 3 + HashKnownHosts no + UserKnownHostsFile ~/.ssh/known_hosts + ControlMaster no + ControlPath ~/.ssh/master-%r@%n:%p + ControlPersist no + + Host gaea + HostName 10.7.43.20 + + Host zion + HostName 10.7.43.1 + User root + + Host themis + HostName 10.7.43.30 + + Host armor + HostName armor.synebula.com + + Host server.company + HostName file.xzdcbj.com.cn + User xzdc + Port 57982 + + Host server.info + HostName info.xzdcbj.com.cn + User info + + Host server.file + HostName file.xzdcbj.com.cn + User file + + Host server.armor + HostName armor.synebula.com + + Host ems.hc + Port 57991 + User root + + Host ems.cx + Port 57996 + + Host ems.ph + Port 57996 + + Host ems.yt + Port 57996 + User xzdc + + Host ems.* + HostName file.xzdcbj.com.cn + User ems + + Host * + Port 22 + User alex + IdentityFile ~/.ssh/id_rsa + diff --git a/profiles/apollo/hm/ssh/default.nix b/profiles/apollo/hm/ssh/default.nix new file mode 100644 index 0000000..7a1e40e --- /dev/null +++ b/profiles/apollo/hm/ssh/default.nix @@ -0,0 +1,10 @@ +{ config, ... }: +{ + programs.ssh = { + enable = true; + }; + + home.file.".ssh/config" = { + source = ./config; + }; +} diff --git a/profiles/apollo/mount.nix b/profiles/apollo/mount.nix new file mode 100644 index 0000000..9abc36d --- /dev/null +++ b/profiles/apollo/mount.nix @@ -0,0 +1,91 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ lib, username, ... }: { + swapDevices = [{ + device = "/swap/swapfile"; + size = 16 * 1024; + }]; + + fileSystems = { + "/" = { + options = lib.mkOptionDefault [ "compress=zstd" ]; + }; + + "/nix" = { + options = lib.mkOptionDefault [ "compress=zstd" "noatime" ]; + }; + + "/home" = { + options = lib.mkOptionDefault [ "compress=zstd" ]; + }; + + "/swap" = { + options = lib.mkOptionDefault [ "compress=no" ]; + }; + + "/tmp" = + { + device = "tmpfs"; + fsType = "tmpfs"; + }; + + + # data目录 + "/data/cache" = + { + device = "/dev/mapper/vcache-data"; + fsType = "ext4"; + }; + "/data/arch" = + { + device = "/dev/mapper/varch-data"; + fsType = "ext4"; + }; + + # 用户目录 + "/home/${username}/tmp" = + { + device = "tmpfs"; + fsType = "tmpfs"; + options = [ "uid=1000" "gid=100" "defaults" "size=16G" "mode=755" ]; + }; + + "/home/${username}/data" = + { + device = "/dev/disk/by-uuid/c52805e6-7d25-4930-806d-585f303b5572"; + fsType = "btrfs"; + options = [ "compress=zstd" "subvol=data" ]; + }; + + "/home/${username}/srv" = + { + device = "/dev/disk/by-uuid/c52805e6-7d25-4930-806d-585f303b5572"; + fsType = "btrfs"; + options = [ "compress=zstd" "subvol=srv" ]; + }; + + "/home/${username}/priv" = + { + device = "/dev/disk/by-uuid/c52805e6-7d25-4930-806d-585f303b5572"; + fsType = "btrfs"; + options = [ "compress=zstd" "subvol=priv" ]; + }; + + + # 微信相关 + "/home/${username}/.local/WeChat/xwechat_files/zerociqher_516a/temp/ImageUtils" = + { + device = "tmpfs"; + fsType = "tmpfs"; + options = [ "uid=1000" "gid=100" "defaults" "size=4G" "mode=755" ]; + }; + + "/home/${username}/.local/WeChat/xwechat_files/zerociqher_516a/temp/InputTemp" = + { + device = "tmpfs"; + fsType = "tmpfs"; + options = [ "uid=1000" "gid=100" "defaults" "size=4G" "mode=755" ]; + }; + }; +} diff --git a/profiles/apollo/network.nix b/profiles/apollo/network.nix new file mode 100644 index 0000000..34405d6 --- /dev/null +++ b/profiles/apollo/network.nix @@ -0,0 +1,42 @@ +{ config, pkgs, hostname, ... }: { + networking = { + hostId = "6fa8b74d"; + hostName = "${hostname}"; + + wireless.enable = false; # Enables wireless support via wpa_supplicant. + + # Configure network proxy if necessary + # proxy.default = "http://user:password@proxy:port/"; + # proxy.noProxy = "127.0.0.1,localhost,internal.domain"; + + networkmanager = { + enable = true; + }; + + enableIPv6 = true; + + # Set up bridge network + interfaces.eno1 = { + useDHCP = false; + }; + + bridges = { + br0 = { interfaces = [ "eno1" ]; }; + }; + + interfaces.br0 = { + useDHCP = false; + ipv4.addresses = [ + { + address = "10.7.43.10"; + prefixLength = 24; + } + ]; + }; + defaultGateway = { + address = "10.7.43.30"; + interface = "br0"; + }; + nameservers = [ "10.7.43.1" ]; + }; +} diff --git a/profiles/gaea/configuration.nix b/profiles/gaea/configuration.nix new file mode 100644 index 0000000..780af7b --- /dev/null +++ b/profiles/gaea/configuration.nix @@ -0,0 +1,52 @@ +args@{ inputs, outputs, lib, pkgs, home-manager, self, username, useremail, hostname, sysversion, ... }: { + # You can import other NixOS modules here + imports = [ + # If you want to use modules your own flake exports (from modules/nixos): + # outputs.nixosModules.example + + # Or modules from other flakes (such as nixos-hardware): + # inputs.hardware.nixosModules.common-cpu-amd + # inputs.hardware.nixosModules.common-ssd + + # You can also split up your configuration and import pieces of it here: + # ./users + + # Import your generated (nixos-generate-config) hardware configuration + ./mount.nix + ./network.nix + ./hardware-configuration.nix + + "${self}/modules/nixos/core" + "${self}/modules/nixos/fonts" + "${self}/modules/nixos/user.nix" + "${self}/modules/nixos/audio.nix" + "${self}/modules/nixos/nvidia.nix" + "${self}/modules/nixos/samba.nix" + "${self}/modules/nixos/zfs.nix" + "${self}/modules/nixos/sysatomic.nix" + + "${self}/modules/nixos/virtualize/libvirtd" + "${self}/modules/nixos/virtualize/docker.nix" + + home-manager.nixosModules.home-manager + { + # home-manager.useGlobalPkgs = true; + # home-manager.useUserPackages = true; + home-manager = { + extraSpecialArgs = { + inherit inputs outputs hostname username useremail sysversion; + }; + users."${username}" = { ... }: { + imports = [ + ./hm + "${self}/home/desktop.nix" + "${self}/modules/home/develop.nix" + ]; + }; + }; + } + ]; + + # https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion + system.stateVersion = sysversion; +} diff --git a/profiles/gaea/default.nix b/profiles/gaea/default.nix new file mode 100644 index 0000000..f040d02 --- /dev/null +++ b/profiles/gaea/default.nix @@ -0,0 +1,14 @@ +args@{ libs, inputs, ... }: +let + # 这里可以选择使用稳定版或不稳定版的nixpkgs + # nixpkgs = inputs.nixpkgs; + nixpkgs = inputs.nixpkgs-unstable; # 如果需要使用unstable版本,取消这行注释并注释上一行 + home-manager = inputs.home-manager-unstable; + sysArgs = args // { inherit home-manager; }; +in +# 使用libs.mkNixosSystem创建nixosSystem +libs.mkNixosSystem { + inherit nixpkgs; + args = sysArgs; + path = ./.; +} diff --git a/profiles/gaea/hardware-configuration.nix b/profiles/gaea/hardware-configuration.nix new file mode 100644 index 0000000..ec90096 --- /dev/null +++ b/profiles/gaea/hardware-configuration.nix @@ -0,0 +1,58 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usb_storage" "usbhid" "sd_mod" ]; + boot.initrd.kernelModules = [ "dm-snapshot" ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/9d79b1dc-da5a-456c-a691-9bda5aebcea3"; + fsType = "btrfs"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/FE53-DFFA"; + fsType = "vfat"; + options = [ "fmask=0022" "dmask=0022" ]; + }; + + fileSystems."/nix" = + { device = "/dev/disk/by-uuid/9d79b1dc-da5a-456c-a691-9bda5aebcea3"; + fsType = "btrfs"; + options = [ "subvol=nix" ]; + }; + + fileSystems."/swap" = + { device = "/dev/disk/by-uuid/9d79b1dc-da5a-456c-a691-9bda5aebcea3"; + fsType = "btrfs"; + options = [ "subvol=swap" ]; + }; + + fileSystems."/home" = + { device = "/dev/disk/by-uuid/9d79b1dc-da5a-456c-a691-9bda5aebcea3"; + fsType = "btrfs"; + options = [ "subvol=home" ]; + }; + + swapDevices = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.eno1.useDHCP = lib.mkDefault true; + # networking.interfaces.enp2s0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp3s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/profiles/gaea/hm/default.nix b/profiles/gaea/hm/default.nix new file mode 100644 index 0000000..6e2ed2b --- /dev/null +++ b/profiles/gaea/hm/default.nix @@ -0,0 +1,6 @@ +{ ... }: { + imports = [ + ./ssh.nix + ./hyprland.nix + ]; +} diff --git a/profiles/gaea/hm/hyprland.nix b/profiles/gaea/hm/hyprland.nix new file mode 100644 index 0000000..19fa642 --- /dev/null +++ b/profiles/gaea/hm/hyprland.nix @@ -0,0 +1,15 @@ +{ ... }: + +{ + home = { + sessionVariables = { + # for hyprland with nvidia gpu, ref https://wiki.hyprland.org/Nvidia/ + # 启用注释部分会导致NVIDIA下无法启动hyprland + LIBVA_DRIVER_NAME = "nvidia"; + __GLX_VENDOR_LIBRARY_NAME = "nvidia"; + + # WLR_RENDERER = "vulkan"; + # GBM_BACKEND = "nvidia-drm"; + }; + }; +} diff --git a/profiles/gaea/hm/ssh.nix b/profiles/gaea/hm/ssh.nix new file mode 100644 index 0000000..1e706a8 --- /dev/null +++ b/profiles/gaea/hm/ssh.nix @@ -0,0 +1,61 @@ +{ config, ... }: +{ + programs.ssh = { + enable = true; + + # 全局 SSH 配置 + extraConfig = '' + Host apollo + HostName 10.7.43.10 + + Host zion + HostName 10.7.43.1 + User root + + Host themis + HostName 10.7.43.30 + + Host armor + HostName armor.synebula.com + + Host server.company + HostName file.xzdcbj.com.cn + User xzdc + Port 57982 + + Host server.info + HostName info.xzdcbj.com.cn + User info + + Host server.file + HostName file.xzdcbj.com.cn + User file + + Host server.armor + HostName armor.synebula.com + + Host ems.hc + Port 57991 + User root + + Host ems.cx + Port 57996 + + Host ems.ph + Port 57996 + + Host ems.yt + Port 57996 + User xzdc + + Host ems.* + HostName file.xzdcbj.com.cn + User ems + + Host * + Port 22 + User alex + IdentityFile ~/.ssh/id_rsa + ''; + }; +} diff --git a/profiles/gaea/mount.nix b/profiles/gaea/mount.nix new file mode 100644 index 0000000..3e5abf6 --- /dev/null +++ b/profiles/gaea/mount.nix @@ -0,0 +1,26 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, username, ... }: + +{ + + + fileSystems."/home/${username}/tmp" = + { + device = "none"; + fsType = "tmpfs"; + options = [ "uid=1000" "gid=100" "defaults" "size=8G" "mode=755" ]; + }; + + fileSystems."/tmp" = + { + device = "tmpfs"; + fsType = "tmpfs"; + }; + + swapDevices = [{ + device = "/var/swapfile"; + size = 16 * 1024; + }]; +} diff --git a/profiles/gaea/network.nix b/profiles/gaea/network.nix new file mode 100644 index 0000000..c29ecee --- /dev/null +++ b/profiles/gaea/network.nix @@ -0,0 +1,42 @@ +{ config, pkgs, hostname, ... }: { + networking = { + hostId = "5def12be"; + hostName = "${hostname}"; + + wireless.enable = false; # Enables wireless support via wpa_supplicant. + + # Configure network proxy if necessary + # proxy.default = "http://user:password@proxy:port/"; + # proxy.noProxy = "127.0.0.1,localhost,internal.domain"; + + networkmanager = { + enable = true; + }; + + enableIPv6 = true; + + # Set up bridge network + interfaces.eno1 = { + useDHCP = false; + }; + + bridges = { + br0 = { interfaces = [ "eno1" ]; }; + }; + + interfaces.br0 = { + useDHCP = false; + ipv4.addresses = [ + { + address = "10.7.43.20"; + prefixLength = 24; + } + ]; + }; + defaultGateway = { + address = "10.7.43.1"; + interface = "br0"; + }; + nameservers = [ "119.29.29.29" "223.5.5.5" ]; + }; +} diff --git a/profiles/luna/configuration.nix b/profiles/luna/configuration.nix new file mode 100644 index 0000000..90fc85c --- /dev/null +++ b/profiles/luna/configuration.nix @@ -0,0 +1,42 @@ +args@{ inputs, outputs, lib, pkgs, home-manager, self, username, useremail, hostname, sysversion, ... }: { + + # You can import other NixOS modules here + imports = [ + # If you want to use modules your own flake exports (from modules/nixos): + # outputs.nixosModules.example + + # Or modules from other flakes (such as nixos-hardware): + # inputs.hardware.nixosModules.common-cpu-amd + # inputs.hardware.nixosModules.common-ssd + + # You can also split up your configuration and import pieces of it here: + # ./users.nix + + # Import your generated (nixos-generate-config) hardware configuration + ./network.nix + ./hardware-configuration.nix + + "${self}/modules/nixos/core" + "${self}/modules/nixos/user.nix" + "${self}/modules/nixos/sysatomic.nix" + + home-manager.nixosModules.home-manager + { + # home-manager.useGlobalPkgs = true; + # home-manager.useUserPackages = true; + home-manager = { + extraSpecialArgs = { + inherit inputs outputs hostname username useremail sysversion; + }; + users."${username}" = { ... }: { + imports = [ + "${self}/home/desktop.nix" + ]; + }; + }; + } + ]; + + # https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion + system.stateVersion = sysversion; +} diff --git a/profiles/luna/default.nix b/profiles/luna/default.nix new file mode 100644 index 0000000..f040d02 --- /dev/null +++ b/profiles/luna/default.nix @@ -0,0 +1,14 @@ +args@{ libs, inputs, ... }: +let + # 这里可以选择使用稳定版或不稳定版的nixpkgs + # nixpkgs = inputs.nixpkgs; + nixpkgs = inputs.nixpkgs-unstable; # 如果需要使用unstable版本,取消这行注释并注释上一行 + home-manager = inputs.home-manager-unstable; + sysArgs = args // { inherit home-manager; }; +in +# 使用libs.mkNixosSystem创建nixosSystem +libs.mkNixosSystem { + inherit nixpkgs; + args = sysArgs; + path = ./.; +} diff --git a/profiles/luna/hardware-configuration.nix b/profiles/luna/hardware-configuration.nix new file mode 100644 index 0000000..ec90096 --- /dev/null +++ b/profiles/luna/hardware-configuration.nix @@ -0,0 +1,58 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usb_storage" "usbhid" "sd_mod" ]; + boot.initrd.kernelModules = [ "dm-snapshot" ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/9d79b1dc-da5a-456c-a691-9bda5aebcea3"; + fsType = "btrfs"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/FE53-DFFA"; + fsType = "vfat"; + options = [ "fmask=0022" "dmask=0022" ]; + }; + + fileSystems."/nix" = + { device = "/dev/disk/by-uuid/9d79b1dc-da5a-456c-a691-9bda5aebcea3"; + fsType = "btrfs"; + options = [ "subvol=nix" ]; + }; + + fileSystems."/swap" = + { device = "/dev/disk/by-uuid/9d79b1dc-da5a-456c-a691-9bda5aebcea3"; + fsType = "btrfs"; + options = [ "subvol=swap" ]; + }; + + fileSystems."/home" = + { device = "/dev/disk/by-uuid/9d79b1dc-da5a-456c-a691-9bda5aebcea3"; + fsType = "btrfs"; + options = [ "subvol=home" ]; + }; + + swapDevices = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.eno1.useDHCP = lib.mkDefault true; + # networking.interfaces.enp2s0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp3s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/profiles/luna/network.nix b/profiles/luna/network.nix new file mode 100644 index 0000000..9018628 --- /dev/null +++ b/profiles/luna/network.nix @@ -0,0 +1,30 @@ +# 网络配置 +{ config, lib, pkgs, ... }: + +{ + networking = { + wireless.enable = false; # Enables wireless support via wpa_supplicant. + + # Configure network proxy if necessary + # proxy.default = "http://user:password@proxy:port/"; + # proxy.noProxy = "127.0.0.1,localhost,internal.domain"; + + networkmanager.enable = true; + + enableIPv6 = false; # disable ipv6 + interfaces.enp0s3 = { + useDHCP = false; + ipv4.addresses = [ + { + address = "10.7.45.130"; + prefixLength = 24; + } + ]; + }; + defaultGateway = "10.7.45.1"; + nameservers = [ + "119.29.29.29" # DNSPod + "223.5.5.5" # AliDNS + ]; + }; +}