This commit is contained in:
2025-04-25 23:10:55 +08:00
commit ccf46b865e
114 changed files with 6419 additions and 0 deletions

172
README.md Normal file
View File

@@ -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/<profile>/hardware-configuration.nix` 其中`<profile>`指需要的 profile。
```bash
cp /mnt/etc/nixos/hardware-configuration.nix /mnt/.nix/profiles/<profile>/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.<name>.hashedPassword` 值替换掉。
9. 安装
```bash
./nixos-install.sh <profile>
# 或者
nixos-install --option substituters "https://mirrors.ustc.edu.cn/nix-channels/store https://cache.nixos.org" --no-root-passwd --flake .#<profile>
```
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** - 包含实际的配置内容,如系统模块、服务、用户设置等。

103
flake.lock generated Normal file
View File

@@ -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
}

82
flake.nix Normal file
View File

@@ -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.<username>.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";
};
}

112
home/core.nix Normal file
View File

@@ -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;
}

56
home/desktop.nix Normal file
View File

@@ -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;
};
}

26
home/server.nix Normal file
View File

@@ -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 = { };
}

8
libs/default.nix Normal file
View File

@@ -0,0 +1,8 @@
let
# 导入mkNixosSystem函数
mkNixosSystemLib = import ./mkNixosSystem.nix;
in
{
# 导出mkNixosSystem函数
inherit (mkNixosSystemLib) mkNixosSystem;
}

22
libs/mkNixosSystem.nix Normal file
View File

@@ -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"
];
};
}

18
modules/home/develop.nix Normal file
View File

@@ -0,0 +1,18 @@
{ pkgs, ... }:
{
imports = [
];
home = {
packages = with pkgs.unstable; [
dbeaver-bin
go
nodejs
yarn
steam-run
jetbrains.idea-community
];
};
}

26
modules/home/fcitx.nix Normal file
View File

@@ -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";
};
};
}

View File

@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# 创建截图目录
mkdir -p $HOME/tmp/Screenshots

View File

@@ -0,0 +1,5 @@
if [[ $(hyprctl activewindow -j | jq -r ".class") == "Steam" ]]; then
xdotool windowunmap $(xdotool getactivewindow)
else
hyprctl dispatch killactive ""
fi

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 &

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,76 @@
#!/usr/bin/env sh
# define functions
function print_error
{
cat << "EOF"
./volumecontrol.sh -[device] <action>
...valid device are...
i -- [i]nput decive
o -- [o]utput device
...valid actions are...
i -- <i>ncrease volume [+5]
d -- <d>ecrease volume [-5]
m -- <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

View File

@@ -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

View File

@@ -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
}

View File

@@ -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)$

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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": "<tt><big>{calendar}</big></tt>",
"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
}
}

View File

@@ -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;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -0,0 +1,41 @@
{
"label" : "lock",
"action" : "swaylock",
"text" : "Lock",
"keybind" : "l"
}
{
"label" : "logout",
"action" : "hyprctl dispatch exit 0",
"text" : "Logout",
"keybind" : "e"
}
{
"label" : "suspend",
"action" : "systemctl suspend",
"text" : "Suspend",
"keybind" : "u"
}
{
"label" : "shutdown",
"action" : "systemctl poweroff",
"text" : "Shutdown",
"keybind" : "s"
}
{
"label" : "hibernate",
"action" : "systemctl hibernate",
"text" : "Hibernate",
"keybind" : "h"
}
{
"label" : "reboot",
"action" : "systemctl reboot",
"text" : "Reboot",
"keybind" : "r"
}

View File

@@ -0,0 +1,27 @@
{
"label" : "lock",
"action" : "swaylock",
"text" : "Lock",
"keybind" : "l"
}
{
"label" : "logout",
"action" : "hyprctl dispatch exit 0",
"text" : "Logout",
"keybind" : "e"
}
{
"label" : "shutdown",
"action" : "systemctl poweroff",
"text" : "Shutdown",
"keybind" : "s"
}
{
"label" : "reboot",
"action" : "systemctl reboot",
"text" : "Reboot",
"keybind" : "r"
}

View File

@@ -0,0 +1,104 @@
* {
background-image: none;
font-size: ${fntSize}px;
}
@import "${wbarTheme}";
window {
background-color: ${WindBg};
}
button {
color: ${BtnCol};
background-color: @main-${BtnBkg};
outline-style: none;
border: none;
border-width: 0px;
background-repeat: no-repeat;
background-position: center;
background-size: 20%;
border-radius: 0px;
box-shadow: none;
text-shadow: none;
animation: gradient_f 20s ease-in infinite;
}
button:focus {
background-color: @wb-act-bg;
background-size: 30%;
}
button:hover {
background-color: @wb-hvr-bg;
background-size: 40%;
border-radius: ${active_rad}px;
animation: gradient_f 20s ease-in infinite;
transition: all 0.3s cubic-bezier(.55,0.0,.28,1.682);
}
button:hover#lock {
border-radius: ${active_rad}px;
margin : ${hvr}px 0px ${hvr}px ${mgn}px;
}
button:hover#logout {
border-radius: ${active_rad}px;
margin : ${hvr}px 0px ${hvr}px 0px;
}
button:hover#suspend {
border-radius: ${active_rad}px;
margin : ${hvr}px 0px ${hvr}px 0px;
}
button:hover#shutdown {
border-radius: ${active_rad}px;
margin : ${hvr}px 0px ${hvr}px 0px;
}
button:hover#hibernate {
border-radius: ${active_rad}px;
margin : ${hvr}px 0px ${hvr}px 0px;
}
button:hover#reboot {
border-radius: ${active_rad}px;
margin : ${hvr}px ${mgn}px ${hvr}px 0px;
}
#lock {
background-image: image(url("$HOME/.config/wlogout/icons/lock_${csMode}.png"), url("/usr/share/wlogout/icons/lock.png"), url("/usr/local/share/wlogout/icons/lock.png"));
border-radius: ${button_rad}px 0px 0px ${button_rad}px;
margin : ${mgn}px 0px ${mgn}px ${mgn}px;
}
#logout {
background-image: image(url("$HOME/.config/wlogout/icons/logout_${csMode}.png"), url("/usr/share/wlogout/icons/logout.png"), url("/usr/local/share/wlogout/icons/logout.png"));
border-radius: 0px 0px 0px 0px;
margin : ${mgn}px 0px ${mgn}px 0px;
}
#suspend {
background-image: image(url("$HOME/.config/wlogout/icons/suspend_${csMode}.png"), url("/usr/share/wlogout/icons/suspend.png"), url("/usr/local/share/wlogout/icons/suspend.png"));
border-radius: 0px 0px 0px 0px;
margin : ${mgn}px 0px ${mgn}px 0px;
}
#shutdown {
background-image: image(url("$HOME/.config/wlogout/icons/shutdown_${csMode}.png"), url("/usr/share/wlogout/icons/shutdown.png"), url("/usr/local/share/wlogout/icons/shutdown.png"));
border-radius: 0px 0px 0px 0px;
margin : ${mgn}px 0px ${mgn}px 0px;
}
#hibernate {
background-image: image(url("$HOME/.config/wlogout/icons/hibernate_${csMode}.png"), url("/usr/share/wlogout/icons/hibernate.png"), url("/usr/local/share/wlogout/icons/hibernate.png"));
border-radius: 0px 0px 0px 0px;
margin : ${mgn}px 0px ${mgn}px 0px;
}
#reboot {
background-image: image(url("$HOME/.config/wlogout/icons/reboot_${csMode}.png"), url("/usr/share/wlogout/icons/reboot.png"), url("/usr/local/share/wlogout/icons/reboot.png"));
border-radius: 0px ${button_rad}px ${button_rad}px 0px;
margin : ${mgn}px ${mgn}px ${mgn}px 0px;
}

View File

@@ -0,0 +1,82 @@
* {
background-image: none;
font-size: ${fntSize}px;
}
@import "${wbarTheme}";
window {
background-color: ${WindBg};
}
button {
color: ${BtnCol};
background-color: @main-${BtnBkg};
outline-style: none;
border: none;
border-width: 0px;
background-repeat: no-repeat;
background-position: center;
background-size: 10%;
border-radius: 0px;
box-shadow: none;
text-shadow: none;
animation: gradient_f 20s ease-in infinite;
}
button:focus {
background-color: @wb-act-bg;
background-size: 20%;
}
button:hover {
background-color: @wb-hvr-bg;
background-size: 25%;
border-radius: ${active_rad}px;
animation: gradient_f 20s ease-in infinite;
transition: all 0.3s cubic-bezier(.55,0.0,.28,1.682);
}
button:hover#lock {
border-radius: ${active_rad}px ${active_rad}px 0px ${active_rad}px;
margin : ${hvr}px 0px 0px ${hvr2}px;
}
button:hover#logout {
border-radius: ${active_rad}px 0px ${active_rad}px ${active_rad}px;
margin : 0px 0px ${hvr}px ${hvr2}px;
}
button:hover#shutdown {
border-radius: ${active_rad}px ${active_rad}px ${active_rad}px 0px;
margin : ${hvr}px ${hvr2}px 0px 0px;
}
button:hover#reboot {
border-radius: 0px ${active_rad}px ${active_rad}px ${active_rad}px;
margin : 0px ${hvr2}px ${hvr}px 0px;
}
#lock {
background-image: image(url("$HOME/.config/wlogout/icons/lock_${csMode}.png"), url("/usr/share/wlogout/icons/lock.png"), url("/usr/local/share/wlogout/icons/lock.png"));
border-radius: ${button_rad}px 0px 0px 0px;
margin : ${mgn}px 0px 0px ${mgn2}px;
}
#logout {
background-image: image(url("$HOME/.config/wlogout/icons/logout_${csMode}.png"), url("/usr/share/wlogout/icons/logout.png"), url("/usr/local/share/wlogout/icons/logout.png"));
border-radius: 0px 0px 0px ${button_rad}px;
margin : 0px 0px ${mgn}px ${mgn2}px;
}
#shutdown {
background-image: image(url("$HOME/.config/wlogout/icons/shutdown_${csMode}.png"), url("/usr/share/wlogout/icons/shutdown.png"), url("/usr/local/share/wlogout/icons/shutdown.png"));
border-radius: 0px ${button_rad}px 0px 0px;
margin : ${mgn}px ${mgn2}px 0px 0px;
}
#reboot {
background-image: image(url("$HOME/.config/wlogout/icons/reboot_${csMode}.png"), url("/usr/share/wlogout/icons/reboot.png"), url("/usr/local/share/wlogout/icons/reboot.png"));
border-radius: 0px 0px ${button_rad}px 0px;
margin : 0px ${mgn2}px ${mgn}px 0px;
}

View File

@@ -0,0 +1,93 @@
{ config, lib, pkgs, ... }:
{
imports = [
./env.nix
];
wayland.windowManager.hyprland = {
# Whether to enable Hyprland wayland compositor
enable = true;
# The hyprland package to use
package = pkgs.hyprland;
# Whether to enable XWayland
xwayland.enable = true;
# Optional
# Whether to enable hyprland-session.target on hyprland startup
# systemd.enable = true;
settings = lib.mkDefault {
decoration = {
shadow_offset = "0 5";
"col.shadow" = "rgba(00000099)";
};
};
};
home.packages = with pkgs; [
waybar # the status bar
swww # wallpaper
libnotify # for notify-send command
mako # notify daemon
hyprshot #screenshot
rofi # app launcher
kitty # terminal
wlogout # logout menu
killall
pavucontrol # audio control
nautilus #file manager for GNOME
];
programs = {
bash = {
initExtra = ''
if [ -z $DISPLAY ] && [ "$(tty)" = "/dev/tty1" ];
then
echo 'Welcome! '
fi
'';
};
swaylock.enable = true;
};
# hyprland configs, based on https://github.com/notwidow/hyprland
home.file.".config/hypr" = {
source = ./conf/hypr;
# copy the scripts directory recursively
recursive = true;
};
home.file.".config/rofi" = {
source = ./conf/rofi;
recursive = true;
};
home.file.".config/kitty" = {
source = ./conf/kitty;
recursive = true;
};
home.file.".config/mako" = {
source = ./conf/mako;
recursive = true;
};
# home.file.".config/swww" = {
# source = ./conf/swww;
# recursive = true;
# };
home.file.".config/waybar" = {
source = ./conf/waybar;
recursive = true;
};
home.file.".config/wlogout" = {
source = ./conf/wlogout;
recursive = true;
};
}

View File

@@ -0,0 +1,39 @@
{ ... }:
{
home = {
sessionVariables = {
EDITOR = "vim";
BROWSER = "microsoft-edge";
TERMINAL = "kitty";
QT_QPA_PLATFORMTHEME = "gtk4";
QT_SCALE_FACTOR = "1";
MOZ_ENABLE_WAYLAND = "1";
NIXOS_OZONE_WL = "1"; # for any ozone-based browser & electron apps to run on wayland
_JAVA_AWT_WM_NONREPARENTING = "1";
SDL_VIDEODRIVER = "wayland";
QT_QPA_PLATFORM = "wayland";
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
QT_AUTO_SCREEN_SCALE_FACTOR = "1";
# for hyprland with nvidia gpu, ref https://wiki.hyprland.org/Nvidia/
# 启用注释部分会导致NVIDIA下无法启动hyprland
WLR_EGL_NO_MODIFIRES = "1";
WLR_NO_HARDWARE_CURSORS = "1"; # if no cursor,uncomment this line
WLR_RENDERER_ALLOW_SOFTWARE = "1";
CLUTTER_BACKEND = "wayland";
XDG_CURRENT_DESKTOP = "Hyprland";
XDG_SESSION_DESKTOP = "Hyprland";
XDG_SESSION_TYPE = "wayland";
XDG_BIN_HOME = "\${HOME}/.local/bin";
XDG_PICTURES_DIR = "\${HOME}/tmp";
};
sessionPath = [
"$HOME/.npm-global/bin"
"$HOME/.local/bin"
];
};
}

47
modules/home/theme.nix Normal file
View File

@@ -0,0 +1,47 @@
{ pkgs, ... }:
{
imports = [
];
home = {
pointerCursor = {
package = pkgs.capitaine-cursors;
name = "capitaine-cursors";
size = 16;
gtk.enable = true;
x11.enable = true;
x11.defaultCursor = "capitaine-cursors";
};
};
# gtk's theme settings, generate files:
# 1. ~/.gtkrc-2.0
# 2. ~/.config/gtk-3.0/settings.ini
# 3. ~/.config/gtk-4.0/settings.ini
gtk = {
enable = true;
# cursorTheme = {
# package = pkgs.capitaine-cursors;
# name = "capitaine-cursors";
# size = 16;
# };
iconTheme = {
package = pkgs.papirus-icon-theme;
name = "Papirus-Dark";
};
gtk3.extraConfig = {
gtk-application-prefer-dark-theme = "0";
gtk-theme-name = "Adwaita-dark";
gtk-icon-theme-name = "Papirus-Dark";
gtk-cursor-theme-name = "capitaine-cursors";
};
gtk4.extraConfig = {
gtk-application-prefer-dark-theme = "0";
gtk-theme-name = "Adwaita-dark";
gtk-icon-theme-name = "Papirus-Dark";
gtk-cursor-theme-name = "capitaine-cursors";
};
};
}

View File

@@ -0,0 +1,11 @@
{ config, lib, pkgs, ... }:
{
imports = [
];
home.packages = with pkgs; [
v2ray
v2raya
];
}

View File

@@ -0,0 +1,31 @@
{ pkgs, ... }:
{
imports = [
];
programs = {
vscode = {
enable = true;
profiles.default = {
extensions = with pkgs.vscode-extensions; [
bierner.markdown-mermaid
esbenp.prettier-vscode
foxundermoon.shell-format
github.copilot
github.copilot-chat
golang.go
jnoortheen.nix-ide
pkief.material-icon-theme
] ++ pkgs.vscode-utils.extensionsFromVscodeMarketplace [
];
userSettings = builtins.fromJSON (builtins.readFile ./settings.json);
};
};
};
home = {
file.".config/Code/User/keybindings.json" = {
source = ./keybindings.json;
};
};
}

View File

@@ -0,0 +1,69 @@
// Place your key bindings in this file to override the defaultsauto[]
[
{
"key": "shift+alt+f",
"command": "workbench.action.findInFiles"
},
{
"key": "ctrl+shift+f",
"command": "-workbench.action.findInFiles"
},
{
"key": "shift+alt+f",
"command": "workbench.action.terminal.searchWorkspace",
"when": "terminalFocus && terminalProcessSupported && terminalProcessSupported && terminalTextSelected"
},
{
"key": "ctrl+shift+f",
"command": "-workbench.action.terminal.searchWorkspace",
"when": "terminalFocus && terminalProcessSupported && terminalProcessSupported && terminalTextSelected"
},
{
"key": "shift+alt+f",
"command": "workbench.view.search",
"when": "!searchViewletVisible && config.search.mode == 'view'"
},
{
"key": "ctrl+shift+f",
"command": "-workbench.view.search",
"when": "!searchViewletVisible && config.search.mode == 'view'"
},
{
"key": "ctrl+shift+f",
"command": "editor.action.formatDocument",
"when": "editorHasDocumentFormattingProvider && editorTextFocus && !editorReadonly && !inCompositeEditor"
},
{
"key": "ctrl+shift+i",
"command": "-editor.action.formatDocument",
"when": "editorHasDocumentFormattingProvider && editorTextFocus && !editorReadonly && !inCompositeEditor"
},
{
"key": "ctrl+shift+f",
"command": "editor.action.formatDocument.none",
"when": "editorTextFocus && !editorHasDocumentFormattingProvider && !editorReadonly"
},
{
"key": "ctrl+shift+i",
"command": "-editor.action.formatDocument.none",
"when": "editorTextFocus && !editorHasDocumentFormattingProvider && !editorReadonly"
},
{
"key": "shift+alt+o",
"command": "workbench.action.gotoSymbol"
},
{
"key": "ctrl+shift+o",
"command": "-workbench.action.gotoSymbol"
},
{
"key": "ctrl+shift+o",
"command": "editor.action.organizeImports",
"when": "editorTextFocus && !editorReadonly && supportedCodeAction =~ /(\\s|^)source\\.organizeImports\\b/"
},
{
"key": "shift+alt+o",
"command": "-editor.action.organizeImports",
"when": "editorTextFocus && !editorReadonly && supportedCodeAction =~ /(\\s|^)source\\.organizeImports\\b/"
}
]

View File

@@ -0,0 +1,52 @@
{
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[less]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[nix]": {
"editor.defaultFormatter": "jnoortheen.nix-ide"
},
"editor.formatOnPaste": false,
"editor.largeFileOptimizations": false,
"editor.tabSize": 4,
"editor.unicodeHighlight.allowedLocales": {
"zh-hans": true
},
"editor.unicodeHighlight.nonBasicASCII": false,
"explorer.confirmDelete": false,
"git.enableSmartCommit": true,
"javascript.updateImportsOnFileMove.enabled": "always",
"nix.formatterPath": "nixpkgs-fmt",
"security.workspace.trust.untrustedFiles": "open",
"terminal.integrated.fontFamily": "'Source Code Pro', 'JetBrainsMono Nerd Font'",
"terminal.integrated.tabs.location": "left",
"typescript.updateImportsOnFileMove.enabled": "always",
"workbench.iconTheme": "material-icon-theme",
"workbench.colorTheme": "Default Light Modern",
"augment.chat.userGuidelines": "Always response in 中文",
"augment.completions.enableAutomaticCompletions": true,
"editor.fontFamily": "'Droid Sans Mono', 'monospace', monospace, 'JetBrainsMono Nerd Font'"
}

11
modules/home/wechat.nix Normal file
View File

@@ -0,0 +1,11 @@
{ pkgs, ... }: {
home = {
packages = with pkgs.unstable; [
wechat-uos
];
sessionVariables = {
WECHAT_DATA_DIR = "~/.local/WeChat";
};
};
}

84
modules/home/xdg.nix Normal file
View File

@@ -0,0 +1,84 @@
# XDG stands for "Cross-Desktop Group", with X used to mean "cross".
# It's a bunch of specifications from freedesktop.org intended to standardize desktops and
# other GUI applications on various systems (primarily Unix-like) to be interoperable:
# https://www.freedesktop.org/wiki/Specifications/
{ config, pkgs, ... }: {
home.packages = with pkgs; [
xdg-utils # provides cli tools such as `xdg-mime` `xdg-open`
xdg-user-dirs
];
xdg = {
enable = true;
cacheHome = config.home.homeDirectory + "/.cache";
# manage $XDG_CONFIG_HOME/mimeapps.list
# xdg search all desktop entries from $XDG_DATA_DIRS, check it by command:
# echo $XDG_DATA_DIRS
# the system-level desktop entries can be list by command:
# ls -l /run/current-system/sw/share/applications/
# the user-level desktop entries can be list by command(user ryan):
# ls /etc/profiles/per-user/ryan/share/applications/
mimeApps = {
enable = true;
defaultApplications =
let
browser = [ "microsoft-edge.desktop" ];
in
{
"application/json" = browser;
"application/pdf" = browser; # TODO: pdf viewer
"text/html" = browser;
"text/xml" = browser;
"application/xml" = browser;
"application/xhtml+xml" = browser;
"application/xhtml_xml" = browser;
"application/rdf+xml" = browser;
"application/rss+xml" = browser;
"application/x-extension-htm" = browser;
"application/x-extension-html" = browser;
"application/x-extension-shtml" = browser;
"application/x-extension-xht" = browser;
"application/x-extension-xhtml" = browser;
"x-scheme-handler/about" = browser;
"x-scheme-handler/ftp" = browser;
"x-scheme-handler/http" = browser;
"x-scheme-handler/https" = browser;
"x-scheme-handler/unknown" = browser;
"x-scheme-handler/discord" = [ "discord.desktop" ];
"x-scheme-handler/tg" = [ "telegramdesktop.desktop" ];
"audio/*" = [ "vlc.desktop" ];
"video/*" = [ "vlc.dekstop" ];
"image/*" = [ "imv.desktop" ];
"image/gif" = [ "imv.desktop" ];
"image/jpeg" = [ "imv.desktop" ];
"image/png" = [ "imv.desktop" ];
"image/webp" = [ "imv.desktop" ];
};
associations.removed =
{
# ......
};
};
userDirs = {
enable = false;
createDirectories = false;
documents = config.home.homeDirectory + "/doc";
music = config.home.homeDirectory + "/doc/music";
desktop = config.home.homeDirectory + "/tmp";
download = config.home.homeDirectory + "/tmp";
videos = config.home.homeDirectory + "/tmp";
pictures = config.home.homeDirectory + "/tmp";
templates = config.home.homeDirectory + "/tmp";
extraConfig = {
XDG_SCREENSHOTS_DIR = config.home.homeDirectory + "/tmp/Screenshots";
};
};
};
}

View File

@@ -0,0 +1,46 @@
{ username, pkgs, ... }:
{
programs = {
zsh = {
enable = true;
enableCompletion = true;
autosuggestion.enable = true;
syntaxHighlighting.enable = true;
shellAliases = {
la = "ls -la";
ll = "ls -l";
"nixos-switch" = "sudo nixos-rebuild switch --flake /home/${username}/.nix";
f = "fuck";
};
history.size = 10000;
history.ignoreAllDups = true;
history.path = "$HOME/.zsh_history";
history.ignorePatterns = [ "rm *" "pkill *" "cp *" ];
oh-my-zsh = {
enable = true;
plugins = [ "git" "sudo" "docker" "docker-compose" ];
};
plugins = [
{
name = "powerlevel10k";
src = pkgs.zsh-powerlevel10k;
file = "share/zsh-powerlevel10k/powerlevel10k.zsh-theme";
}
{
name = "powerlevel10k-config";
src = ./powerlevel10k;
file = "p10k.zsh";
}
];
};
thefuck = {
enable = true;
enableZshIntegration = true; # 自动为 Zsh 设置别名 (通常是 'fuck')
};
};
}

File diff suppressed because it is too large Load Diff

5
modules/nixos/adb.nix Normal file
View File

@@ -0,0 +1,5 @@
{ username, ... }:
{
programs.adb.enable = true;
users.users.${username}.extraGroups = [ "adbusers" ];
}

26
modules/nixos/audio.nix Normal file
View File

@@ -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
];
}

View File

@@ -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;
};
}

View File

@@ -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";
}

View File

@@ -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;
};
};
}

View File

@@ -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 主导的名字的含义是「没有豆腐」qno 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"
# ];
# })
];
};
}

View File

@@ -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";
};
}

47
modules/nixos/gnome.nix Normal file
View File

@@ -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
]);
};
}

28
modules/nixos/nvidia.nix Normal file
View File

@@ -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;
};
};
}

39
modules/nixos/samba.nix Normal file
View File

@@ -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";
};
};
};
}

View File

@@ -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"
];
};
};
}

70
modules/nixos/user.nix Normal file
View File

@@ -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" ];
}
];
}
];
};
}

View File

@@ -0,0 +1,7 @@
{ config, pkgs, lib, ... }:
{
virtualisation.waydroid.enable = true; # need dns port
environment.systemPackages = [
pkgs.waydroid-script
];
}

View File

@@ -0,0 +1,9 @@
{ config, pkgs, lib, ... }:
{
config = {
environment.systemPackages = with pkgs; [
appimage-run
];
};
}

View File

@@ -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" ];
}

View File

@@ -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" ];
};
}

View File

@@ -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/
'';
}

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,6 @@
{ config, pkgs, lib, ... }:
{
environment.systemPackages = with pkgs; [
nixos-generators
];
}

View File

@@ -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
];
};
}

View File

@@ -0,0 +1,12 @@
{ config, pkgs, lib, ... }:
{
config = {
environment.systemPackages = with pkgs; [
## [wine] see: https://nixos.wiki/wiki/Wine
#wineWowPackages.staging
#wineWowPackages.fonts
#winetricks
];
};
}

7
modules/nixos/zfs.nix Normal file
View File

@@ -0,0 +1,7 @@
{ config, pkgs, ... }:
{
boot = {
supportedFilesystems = [ "zfs" ];
kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
};
}

5
nixos-install.sh Executable file
View File

@@ -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

3
nixos-switch.sh Executable file
View File

@@ -0,0 +1,3 @@
#!/usr/bin/env bash
sudo nixos-rebuild switch --flake . $@

8
nixpkgs.nix Normal file
View File

@@ -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;
})

6
non-nixos-install.sh Normal file
View File

@@ -0,0 +1,6 @@
#!/usr/bin/env bash
nix build .#homeConfigurations.alex.activationPackage
# active home manager config
./result/activate

41
overlays/default.nix Normal file
View File

@@ -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;
};
};
}

5
pkgs/default.nix Normal file
View File

@@ -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 { };
}

View File

@@ -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 ];
};
}

View File

@@ -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'],
}
)

View File

@@ -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;
}

View File

@@ -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 = ./.;
}

View File

@@ -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.<interface>.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;
}

View File

@@ -0,0 +1,6 @@
{ ... }: {
imports = [
./ssh
./hyprland.nix
];
}

View File

@@ -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";
};
};
}

View File

@@ -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

View File

@@ -0,0 +1,10 @@
{ config, ... }:
{
programs.ssh = {
enable = true;
};
home.file.".ssh/config" = {
source = ./config;
};
}

Some files were not shown because too many files have changed in this diff Show More