Compare commits

...

105 Commits

Author SHA1 Message Date
1da87ebdb8 chore(server): drop grafana 2026-02-24 16:27:28 +08:00
24d72349b2 chore(zen): xdg migration 2026-02-20 17:16:44 +08:00
5630df0be7 chore(hmcl): remove hack 2026-02-20 17:16:44 +08:00
abeca5f52e chore: update flake.lock; update noctalia-shell 2026-02-20 17:12:14 +08:00
211b4bef15 feat(cli): add dust & dysk 2026-02-20 16:18:44 +08:00
3417ee5618 feat: update niri config 2026-02-20 16:18:25 +08:00
a4ed789ae9 feat: update neovim config 2026-02-20 16:18:00 +08:00
2f6c5feda7 fix: rename patched electron packages 2026-02-20 16:17:15 +08:00
e4087c9da8 feat(nvim): add taplo lsp (TOML) 2026-02-15 19:50:29 +08:00
291563bba3 feat(cli/misc): add jq 2026-02-15 19:50:12 +08:00
993b77d5d0 chore: update secrets 2026-02-13 11:37:26 +08:00
8c635dc3ad chore: update flack.lock 2026-02-13 11:37:26 +08:00
cffae80d70 chore(efl): update tuwunel 2026-02-13 11:37:26 +08:00
491a1ebb40 feat(browser): default to zen 2026-02-12 09:05:54 +08:00
25533605d3 feat(niri): update config 2026-02-12 09:05:45 +08:00
502920af58 feat(nvim): add vscode-json-languageserver 2026-02-11 12:34:13 +08:00
149397f16a chore: update secrets 2026-02-11 12:34:01 +08:00
3435e99cb1 chore(nvim): remove unused files 2026-02-08 22:50:32 +08:00
9faf6cdfe4 feat(nvim/blink.cmp): always use lua implementation 2026-02-08 01:52:43 +08:00
3d116fe3a7 chore: fmt 2026-02-08 01:51:27 +08:00
97761a3af5 feat(nvim/indent-blankline): use rainbow-delimiters integration 2026-02-08 01:40:38 +08:00
92ee55e82a feat(niri): noctalia windows keybind 2026-02-08 01:40:17 +08:00
2d324de58a feat(starship): tmux & shpool indicator 2026-02-08 01:39:54 +08:00
42fbf5cee6 feat(nvim): use mini.nvim & neo-tree 2026-02-07 12:09:21 +08:00
a1d873cc30 feat(nvim): use blink.cmp 2026-02-07 11:03:28 +08:00
e327d6acaf chore: use easytier 2.4.5 2026-02-06 22:19:47 +08:00
a9149d86c7 chore(pkgs): drop jj-starship 2026-02-06 21:37:23 +08:00
bdddabcd52 feat: shpool 2026-02-06 21:37:14 +08:00
b2860d63c5 chore: update flake.lock; update noctalia-shell 2026-02-06 16:23:43 +08:00
dc15d79266 feat: use ouch 2026-02-06 16:23:43 +08:00
b6992f554a chore: update secrets 2026-01-30 21:43:28 +08:00
06c0a24d98 fix: update environment for noctalia-shell 2026-01-30 21:35:16 +08:00
9aa25642ee fmt: disable typos 2026-01-30 21:35:16 +08:00
b6a6f966dc chore: update flake.lock; update noctalia-shell 2026-01-30 21:35:16 +08:00
754caf00d4 feat: shotwell -> loupe 2026-01-30 21:35:16 +08:00
ce8d76886a chore: update secrets 2026-01-23 20:32:48 +08:00
b3c173f0fa chore: update flake.lock; update noctalia-shell 2026-01-23 18:45:46 +08:00
d6850b86dc chore: update lazy-lock.json 2026-01-23 17:36:29 +08:00
9e38cb0712 feat: drop sched-ext 2026-01-17 21:44:51 +08:00
75b4d87dfa feat: drop playerctl 2026-01-17 14:41:31 +08:00
35358cf01c feat: system76-scheduler 2026-01-17 13:33:15 +08:00
5a1880587f chore: update lazy-lock.json 2026-01-16 20:59:43 +08:00
9c22723970 chore: update flake.lock 2026-01-16 20:26:33 +08:00
cb3578bb0d feat(jj): add jj tug 2026-01-16 20:26:15 +08:00
3313dfc89b feat(nvim): biome 2026-01-10 21:35:19 +08:00
29734f85ba fix: remove noctalia-shell entry from spawn-at-startup 2026-01-10 10:17:07 +08:00
afe06213de chore(nvim): update lazy-lock.json 2026-01-09 23:54:34 +08:00
69d6588c30 feat: add splayer 2026-01-09 23:54:23 +08:00
aee0fb44d5 feat(server): use xanmod_stable and zfs_unstable 2026-01-09 15:49:33 +08:00
602f599823 chore: update flake.lock
* updated noctalia-shell to v3.8.2
* removed television fish integration workaround
* removed `~/.config/fish/fish_variables` entry in my.persist.homeFiles
  since [fish v4.3.0](https://github.com/fish-shell/fish-shell/releases/tag/4.3.0)
  no longer sets universal variables by default
2026-01-09 15:07:37 +08:00
df0a21913e feat: tidy shell config 2026-01-03 10:09:43 +08:00
a56e9bdaf2 chore(nvim): update lazy-lock.json 2026-01-01 17:41:40 +08:00
e574a70020 feat(nvim): enable inlay hints for rust-analyzer 2026-01-01 15:39:04 +08:00
c6a3fde1bd feat(nix): warn-dirty = false 2026-01-01 11:37:41 +08:00
b3cd3fe209 feat(nvim): tidy old config; track lazy-lock.json 2025-12-31 22:06:51 +08:00
ad2aca84f0 chore: tidy Justfile 2025-12-31 22:04:21 +08:00
a07bcd9bab chore: update flake.lock; update noctalia-shell 2025-12-31 22:03:53 +08:00
7eb32cfabc feat: impure symlink 2025-12-28 11:07:50 +08:00
f9308dda9e refactor: config/hosts => hosts 2025-12-28 09:22:15 +08:00
99aea69128 chore(server): remove unnecessary pkgs.stable usage 2025-12-27 16:46:59 +08:00
d0cffe4f1c refactor: keys & emails 2025-12-27 16:46:24 +08:00
b8597104b3 fmt: tidy 2025-12-27 16:28:39 +08:00
3bd682e800 fix: television fish integration 2025-12-27 16:28:23 +08:00
296f250eba feat(nixd): suppress sema-primop-overridden 2025-12-27 16:28:00 +08:00
4ab322f08d refactor: pkgs 2025-12-27 16:27:30 +08:00
e112f5f21d chore: update flake.lock; update noctalia-shell 2025-12-27 16:25:42 +08:00
5bfd7bf857 chore(flake.nix): treefmt.inputs.nixpkgs.follows = "nixpkgs" 2025-12-21 15:29:41 +08:00
7a8e7ca9d7 feat(pkgs): jj-starship 2025-12-21 15:29:32 +08:00
91c539ad99 feat(tmux): set terminal-features 2025-12-21 12:58:36 +08:00
4c63836d35 fix(fish): async starship 2025-12-21 12:27:14 +08:00
a2eaa6f72d chore: fmt 2025-12-21 11:03:54 +08:00
c9edeca311 feat(fish): persist fish_variables 2025-12-21 10:58:42 +08:00
6482506cc3 fix(nvim): nixd nixpkgs 2025-12-21 10:58:24 +08:00
7f250e19ef fix: build 2025-12-21 10:51:54 +08:00
5feb543129 fix: stylix warning 2025-12-20 23:21:46 +08:00
454ad5885d feat: massive refactor 2025-12-20 23:05:28 +08:00
f4c1b313ce fix(server): nixpkgs config; migrate to new frp module 2025-12-20 20:45:33 +08:00
4509f9edf5 feat(niri): update config 2025-12-20 20:10:46 +08:00
bc197eb3ca refactor: massive refactor using flake-parts; use typos-cli and
keep-sorted
2025-12-20 18:12:03 +08:00
d5f027f586 feat: upgrade noctalia-shell 2025-12-19 23:41:19 +08:00
3d6620a308 chore: update flake.lock 2025-12-19 19:27:34 +08:00
3196ebd920 feat(niri): update config 2025-12-19 19:27:34 +08:00
9c920b2cdf feat(server): sshwifty 2025-12-16 18:26:17 +08:00
7b705fad80 chore: remove redundant default.nix 2025-12-14 13:58:21 +08:00
f3f00c14ad chore: update secrets 2025-12-14 10:43:32 +08:00
9ae37ea439 feat(fish): some changes 2025-12-14 10:43:17 +08:00
99103ff9d2 feat(niri): change column width 2025-12-14 10:42:58 +08:00
4c74679f85 build: add offline 2025-12-14 10:40:44 +08:00
90b85963cd feat(sops-nix): use restartUnits 2025-12-14 10:40:11 +08:00
010789965a chore: fmt 2025-12-13 17:00:21 +08:00
5988a98a09 feat: upgrade noctalia-shell 2025-12-13 16:59:08 +08:00
814511c939 feat(server): coding.langs.js.enable = true 2025-12-12 22:32:33 +08:00
b96a93b1bf fix: sudoedit -> doasedit 2025-12-12 22:32:14 +08:00
b92ada78e5 feat(server): rsshub 2025-12-12 22:31:51 +08:00
eb5ca52004 feat: drop config/hosts/${host}/default.nix 2025-12-12 22:31:27 +08:00
7952d72048 feat: add my-templates 2025-12-12 22:30:48 +08:00
cb5c3eff2e feat: drop chaotic-nyx; drop proton-ge-custom; linux-cachyos -> linux-xanmod
R.I.P. chaotic-nyx 😢
2025-12-12 19:59:50 +08:00
17c5344666 build: Makefile 2025-12-07 16:34:31 +08:00
8d7a4aed01 feat(direnv): configure 2025-12-07 12:46:43 +08:00
475837cd66 feat: use angrr (gc roots cleaner) 2025-12-07 12:45:49 +08:00
4f043b6ad1 chore: update secrets 2025-12-07 12:07:39 +08:00
5d3fc65be5 feat: set fish as user shell 2025-12-07 12:06:57 +08:00
3a82f9b652 feat(noctalia): enable OSD for all available events 2025-12-07 10:55:12 +08:00
cbdf26d69f feat: update nixpkgs-stable to 25.11 2025-12-07 00:17:32 +08:00
80792c399c feat(ayugram): use latest 2025-12-07 00:16:26 +08:00
182 changed files with 3211 additions and 2652 deletions

1
.envrc Normal file
View File

@@ -0,0 +1 @@
export IMPURE_ROOT=$(pwd)

View File

@@ -1,9 +1,6 @@
vim.lsp.config("nixd", {
settings = {
nixd = {
nixpkgs = {
expr = "import <nixpkgs> { }",
},
options = {
nixos = {
expr = '(builtins.getFlake ("git+file://" + toString ./.)).nixosConfigurations.'
@@ -11,28 +8,13 @@ vim.lsp.config("nixd", {
.. ".options",
},
},
diagnostic = {
suppress = {
"sema-primop-overridden",
},
},
},
},
})
return {
{
"folke/lazydev.nvim",
ft = "lua",
opts = {
library = {
{ path = "${3rd}/luv/library", words = { "vim%.uv" } },
},
},
},
{
"hrsh7th/nvim-cmp",
opts = function(_, opts)
opts.sources = opts.sources or {}
table.insert(opts.sources, {
name = "lazydev",
group_index = 0,
})
end,
},
}
return {}

51
Justfile Normal file
View File

@@ -0,0 +1,51 @@
set export
IMPURE_ROOT := `pwd`
all: fmt switch
@switch:
echo "Rebuilding NixOS..."
nh os switch . --impure
@switch-offline:
echo "Rebuilding NixOS without net..."
nh os switch . --impure --no-net
alias offline := switch-offline
@boot:
echo "Rebuilding NixOS..."
nh os boot . --impure
@test:
echo "Rebuilding NixOS..."
nh os test . --impure
@vm:
echo "Building NixOS VM..."
nh os build-vm . --impure
@update:
echo "Updating flakes..."
nix flake update
@repl:
nixos-rebuild repl --flake .
@cleandry:
echo "Listing all generations older than 15 days..."
sudo nix profile wipe-history --profile /nix/var/nix/profiles/system --dry-run --older-than 15d
nix profile wipe-history --profile ~/.local/state/nix/profiles/profile --dry-run --older-than 15d
@clean:
echo "Removing all generations older than 15 days..."
sudo nix profile wipe-history --profile /nix/var/nix/profiles/system --older-than 15d
nix profile wipe-history --profile ~/.local/state/nix/profiles/profile --older-than 15d
@gc:
nix store gc --debug
@fmt:
echo "Formatting files..."
nix fmt

View File

@@ -1,49 +0,0 @@
all: fmt switch
switch:
@echo "Rebuilding NixOS..."
@nh os switch .
boot:
@echo "Rebuilding NixOS..."
@nh os boot .
test:
@echo "Rebuilding NixOS..."
@nh os test .
vm:
@echo "Building NixOS VM..."
@nh os build-vm .
update:
@echo "Updating flakes..."
@nix flake update
history:
@nix profile history --profile /nix/var/nix/profiles/system
replpkgs:
@nix repl -f flake:nixpkgs
repl:
@nh os repl .
cleandry:
@echo "Listing all generations older than 15 days..."
@sudo nix profile wipe-history --profile /nix/var/nix/profiles/system --dry-run --older-than 15d
@nix profile wipe-history --profile ~/.local/state/nix/profiles/home-manager --dry-run --older-than 15d
clean:
@echo "Removing all generations older than 15 days..."
@sudo nix profile wipe-history --profile /nix/var/nix/profiles/system --older-than 15d
@nix profile wipe-history --profile ~/.local/state/nix/profiles/home-manager --older-than 15d
gc:
@nix store gc --debug
fmt:
@echo "Formatting nix files..."
@nix fmt
.PHONY: os home news update history repl clean gc fmt

View File

@@ -10,7 +10,7 @@ Currently, this repository contains the nix code that builds:
2. NixOS home server
3. NixOS WSL
See [./config/hosts](./config/hosts) for details of each host.
See [./hosts](./hosts) for details of each host.
## Why NixOS & Flakes?
@@ -22,31 +22,28 @@ forever. If someone else shares their configuration, anyone else can just use it
As for Flakes, refer to
[Introduction to Flakes - NixOS & Nix Flakes Book](https://nixos-and-flakes.thiscute.world/nixos-with-flakes/introduction-to-flakes)
## Components
| | NixOS(Wayland) |
| ----------------------------- | :------------------------------------------- |
| **Window Manager** | Niri |
| **Desktop Shell** | Noctalia Shell |
| **Terminal Emulator** | Kitty |
| **Input method framework** | Fcitx5 |
| **Shell** | Zsh |
| **Netease Cloudmusic Player** | go-musicfox |
| **Media Player** | mpv |
| **Text Editor** | Neovim |
| **Fonts** | Noto Sans CJK & Jetbrains Mono & Nerd Font |
| **Filesystem** | Btrfs |
And more...
This configuration uses [flake-parts](https://flake.parts/) for better flake organization and modularity,
enabling declarative host definitions and cleaner separation of concerns.
## Folder Structure
- `modules/` - custom NixOS modules
- `config/base.nix` - generic configs
- `config/hosts/<name>/` - hosts-specific configs
- `modules/core/` - core system modules (nix, persistence, time, user, xdg)
- `modules/cli/` - command-line tools and utilities
- `modules/coding/` - development environments and editors
- `modules/desktop/` - desktop applications and window managers
- `modules/virt/` - virtualization configurations
- `profiles/` - system configuration profiles
- `profiles/base.nix` - base configuration for all hosts
- `profiles/desktop.nix` - desktop environment configuration
- `profiles/server.nix` - server-specific configuration
- `profiles/wsl.nix` - WSL-specific configuration
- `hosts/<name>/` - host-specific configs
- `flake/` - flake-parts modules
- `flake/hosts.nix` - declarative host definitions
- `lib/` - custom nix library
- `pkgs/` - custom packages
- `overlays/` - nixpkgs overlays
- `vars.nix` - my variables
- `secrets/` - secrets managed by sops-nix. see [./secrets](./secrets) for details
- `flake.nix` - flake entry
- `flake.nix` - flake entry

View File

@@ -1,42 +0,0 @@
{
config,
hostname,
...
}:
{
# I prefer this to the default issue text
# ported from ArchLinux IIRC
environment.etc.issue.text = "\\e{lightcyan}\\S\\e{reset} Login (\\l)\n\n";
networking.hostName = hostname;
# don't change this unless you know what you are doing!
# for further information, see wiki.nixos.org
system.stateVersion = "24.11";
# disable this since we already have machine-id persisted
systemd.services."systemd-machine-id-commit".enable = !config.my.persist.enable;
my = {
hm = {
# nicely reload system units when changing configs
systemd.user.startServices = "sd-switch";
home.stateVersion = "24.11";
};
xdg.enable = true;
persist = {
nixosDirs = [
"/root"
"/var"
"/etc/ssh"
];
nixosFiles = [
"/etc/machine-id"
];
homeDirs = [
{
directory = ".ssh";
mode = "0700";
}
];
};
};
}

View File

@@ -1,28 +0,0 @@
{
imports = [
./nixos.nix
./hardware.nix
./home.nix
./virt.nix
./docker.nix
./minecraft.nix
./samba.nix
./net.nix
./caddy.nix
./nextcloud.nix
./mail.nix
./gitea.nix
./vault.nix
./homepage.nix
./code.nix
./grafana.nix
./note.nix
./matrix.nix
./minio.nix
./build.nix
./immich.nix
./efl.nix
./plant.nix
];
}

View File

@@ -1,45 +0,0 @@
{ pkgs, ... }:
{
services.grafana = {
enable = true;
settings = {
server = {
http_addr = "0.0.0.0";
http_port = 8090;
domain = "grafana.imxyy.top";
};
};
};
services.prometheus = {
enable = true;
package = pkgs.stable.prometheus;
port = 8091;
exporters = {
node = {
enable = true;
port = 8092;
enabledCollectors = [
"systemd"
"zfs"
];
};
};
scrapeConfigs = [
{
job_name = "node";
static_configs = [
{
targets = [ "127.0.0.1:8092" ];
}
];
}
];
};
services.caddy.virtualHosts."grafana.imxyy.top" = {
extraConfig = ''
reverse_proxy :8090 {
header_up X-Real-IP {remote_host}
}
'';
};
}

View File

@@ -1,542 +0,0 @@
{
config,
lib,
pkgs,
username,
secrets,
...
}:
{
boot.kernelParams = [
"biosdevname=0"
"net.ifnames=0"
];
networking = {
useDHCP = lib.mkForce false;
dhcpcd = {
wait = "background";
IPv6rs = true;
extraConfig = ''
interface mac0
noipv4
'';
};
interfaces = {
eth0.wakeOnLan.enable = true;
eth1.wakeOnLan.enable = true;
mac0 = {
useDHCP = true;
ipv4.addresses = [
{
address = "192.168.3.2";
prefixLength = 24;
}
];
};
};
macvlans."mac0" = {
interface = "eth0";
mode = "bridge";
};
defaultGateway = {
address = "192.168.3.1";
interface = "mac0";
};
nameservers = [
"192.168.3.2"
];
firewall.enable = false;
nftables = {
enable = true;
flushRuleset = true;
ruleset = ''
table inet firewall {
set LANv4 {
type ipv4_addr
flags interval
elements = { 10.0.0.0/8, 100.64.0.0/10, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16 }
}
set LANv6 {
type ipv6_addr
flags interval
elements = { fd00::/8, fe80::/10 }
}
set tcp_ports {
type inet_service
flags interval
elements = {
http,
https,
2222,
25565
}
}
chain prerouting {
type filter hook prerouting priority mangle; policy accept;
ip daddr @LANv4 accept
ip6 daddr @LANv6 accept
}
chain output {
type filter hook output priority 100; policy accept;
ip daddr @LANv4 accept
ip6 daddr @LANv6 accept
}
chain input {
type filter hook input priority 0; policy drop;
iif lo accept
ct state invalid drop
ct state established,related accept
ip protocol { icmp, igmp } accept
ip saddr @LANv4 accept
ip6 saddr @LANv6 accept
tcp dport 2222 ct state new limit rate 15/minute counter accept
tcp dport @tcp_ports counter accept
}
chain forward {
type filter hook forward priority 0; policy accept;
}
chain nat {
type nat hook postrouting priority 0; policy accept;
ip saddr 192.168.3.0/24 masquerade
}
}
'';
};
};
services.openssh = {
enable = true;
settings = {
# PermitRootLogin = "yes";
PermitRootLogin = "prohibit-password";
PasswordAuthentication = true;
};
};
users.users.root.openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBWOy0QmAyxENg/O5m3cus8U3c9jCLioivwcWsh5/a82 imxyy-hisense-pad"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK8pivvE8PMtsOxmccfNhH/4KehDKhBfUfJbQZxo/SZT imxyy-ace5"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/ imxyy@imxyy-nix-x16"
];
users.users.${username}.openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBWOy0QmAyxENg/O5m3cus8U3c9jCLioivwcWsh5/a82 imxyy-hisense-pad"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK8pivvE8PMtsOxmccfNhH/4KehDKhBfUfJbQZxo/SZT imxyy-ace5"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/ imxyy@imxyy-nix-x16"
];
sops.secrets.dae-imxyy-nix-server = {
sopsFile = secrets.dae-imxyy-nix-server;
format = "binary";
};
services.dae = {
enable = true;
configFile = config.sops.secrets.dae-imxyy-nix-server.path;
};
systemd.services.dae = {
after = [ "sops-nix.service" ];
serviceConfig.MemoryMax = "1G";
};
sops.secrets.mihomo = {
sopsFile = secrets.mihomo;
format = "yaml";
key = "";
};
systemd.services.mihomo.after = [ "sops-nix.service" ];
services.mihomo = {
enable = true;
configFile = config.sops.secrets.mihomo.path;
webui = pkgs.metacubexd;
};
sops.secrets.frp-env = {
sopsFile = secrets.frp;
format = "dotenv";
};
systemd.services.frp.serviceConfig.EnvironmentFile = [
config.sops.secrets.frp-env.path
];
services.frp = {
enable = true;
role = "client";
settings = {
serverAddr = "{{ .Envs.FRP_SERVER_ADDR }}";
serverPort = 7000;
auth.token = "{{ .Envs.FRP_AUTH_TOKEN }}";
proxies = [
{
name = "nextcloud-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "nextcloud.imxyy.top" ];
}
{
name = "nextcloud-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "nextcloud.imxyy.top" ];
}
{
name = "oidc-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "oidc.imxyy.top" ];
}
{
name = "oidc-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "oidc.imxyy.top" ];
}
{
name = "mail-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "mail.imxyy.top" ];
}
{
name = "mail-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "mail.imxyy.top" ];
}
{
name = "gitea-ssh";
type = "tcp";
localIP = "127.0.0.1";
localPort = 2222;
remotePort = 2222;
}
{
name = "gitea-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "git.imxyy.top" ];
}
{
name = "gitea-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "git.imxyy.top" ];
}
{
name = "vault-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "vault.imxyy.top" ];
}
{
name = "vault-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "vault.imxyy.top" ];
}
{
name = "home-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "home.imxyy.top" ];
}
{
name = "home-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "home.imxyy.top" ];
}
{
name = "coder-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "coder.imxyy.top" ];
}
{
name = "coder-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "coder.imxyy.top" ];
}
{
name = "ai-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "ai.imxyy.top" ];
}
{
name = "ai-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "ai.imxyy.top" ];
}
{
name = "grafana-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "grafana.imxyy.top" ];
}
{
name = "grafana-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "grafana.imxyy.top" ];
}
{
name = "siyuan-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "sy.imxyy.top" ];
}
{
name = "siyuan-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "sy.imxyy.top" ];
}
{
name = "matrix-root-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "imxyy.top" ];
}
{
name = "matrix-root-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "imxyy.top" ];
}
{
name = "matrix-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "matrix.imxyy.top" ];
}
{
name = "matrix-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "matrix.imxyy.top" ];
}
{
name = "immich-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "immich.imxyy.top" ];
}
{
name = "immich-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "immich.imxyy.top" ];
}
{
name = "memo-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "memo.imxyy.top" ];
}
{
name = "memo-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "memo.imxyy.top" ];
}
{
name = "efl-matrix-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "mtx.eflx.top" ];
}
{
name = "efl-matrix-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "mtx.eflx.top" ];
}
{
name = "efl-send-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "send.eflx.top" ];
}
{
name = "efl-send-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "send.eflx.top" ];
}
];
};
};
sops.secrets.et-imxyy-nix-server = {
sopsFile = secrets.et-imxyy-nix-server;
format = "binary";
};
environment.systemPackages = [ pkgs.easytier ];
systemd.services."easytier" = {
enable = true;
script = "${pkgs.easytier}/bin/easytier-core -c ${config.sops.secrets.et-imxyy-nix-server.path}";
serviceConfig = {
Restart = "always";
RestartSec = 30;
User = "root";
};
wantedBy = [ "multi-user.target" ];
after = [
"network.target"
"sops-nix.service"
];
};
virtualisation.oci-containers.containers.obligator = {
image = "anderspitman/obligator:latest";
volumes = [
"/var/lib/obligator:/data"
"/var/lib/obligator:/api"
];
ports = [ "8081:1616" ];
cmd = [
"-storage-dir"
"/data"
"-api-socket-dir"
"/api"
"-root-uri"
"https://oidc.imxyy.top"
"-port"
"1616"
];
};
services.caddy.virtualHosts."oidc.imxyy.top" = {
extraConfig = ''
reverse_proxy :8081 {
header_up X-Real-IP {remote_host}
}
'';
};
systemd.services.ddns-go =
let
version = "6.6.7";
ddns-go = pkgs.buildGoModule {
inherit version;
pname = "ddns-go";
src = pkgs.fetchFromGitHub {
owner = "jeessy2";
repo = "ddns-go";
rev = "v${version}";
hash = "sha256-Ejoe6e9GFhHxQ9oIBDgDRQW9Xx1XZK+qSAXiRXLdn+c=";
};
meta.mainProgram = "ddns-go";
vendorHash = "sha256-XZii7gV3DmTunYyGYzt5xXhv/VpTPIoYKbW4LnmlAgs=";
doCheck = false;
};
in
{
description = "Go Dynamic DNS";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
ExecStart = "${lib.getExe ddns-go} -l :9876 -f 10 -cacheTimes 180 -c /var/lib/ddns-go/config.yaml";
Restart = "always";
RestartSec = 120;
};
path = [
pkgs.bash
];
};
services.dnsmasq =
let
subDomains = [
"home"
"nextcloud"
"mail"
"git"
"vault"
"coder"
"grafana"
"matrix"
"note"
"oidc"
"mc"
"music"
"ai"
"sy"
"immich"
];
in
{
enable = true;
resolveLocalQueries = false;
settings = {
no-resolv = true;
server = [ "192.168.3.1" ];
address = map (sub: "/${sub}.imxyy.top/192.168.3.2") subDomains ++ [
"/imxyy-nix-server/192.168.3.2"
"/imxyy-cloudwin/192.168.3.4"
"/printer.home/192.168.3.53"
];
cache-size = 0;
log-queries = "extra";
};
};
}

View File

@@ -1,6 +0,0 @@
{
imports = [
./nixos.nix
./home.nix
];
}

View File

@@ -1,14 +0,0 @@
{ lib, username, ... }:
{
my.hm.programs.zsh.shellAliases = {
localproxy_on = "export http_proxy=http://192.168.128.1:7890 https_proxy=http://192.168.128.1:7890 all_proxy=socks://192.168.128.1:7890";
};
my = {
sops.sshKeyFile = "/home/${username}/.ssh/id_ed25519";
coding.all.enable = true;
coding.editor.vscode.enable = lib.mkForce false;
cli.misc.enable = true;
xdg.enable = true;
cli.media.all.enable = true;
};
}

View File

@@ -1,8 +0,0 @@
{
imports = [
./nixos.nix
./hardware.nix
./home.nix
./net.nix
];
}

View File

@@ -1,10 +0,0 @@
{
imports = [
./nixos.nix
./hardware.nix
./home.nix
./virt.nix
./net.nix
./podman.nix
];
}

547
flake.lock generated

File diff suppressed because it is too large Load Diff

316
flake.nix
View File

@@ -4,248 +4,144 @@
inputs = {
# Nixpkgs
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
nixpkgs-stable.url = "github:nixos/nixpkgs/release-25.05";
nixpkgs-stable.url = "github:nixos/nixpkgs/release-25.11";
nixpkgs-master.url = "github:nixos/nixpkgs/master";
nixpkgs-working.url = "github:nixos/nixpkgs/9da7f1cf7f8a6e2a7cb3001b048546c92a8258b4";
# nixpkgs.follows = "nixpkgs-stable";
nixpkgs.follows = "nixpkgs-unstable";
# nixpkgs.follows = "nixpkgs-master";
# Nyxpkgs
chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
# TODO: sops-nix: remove pr patch once merged
# https://github.com/Mic92/sops-nix/pull/779
sops-nix = {
url = "github:Mic92/sops-nix/pull/779/merge";
inputs.nixpkgs.follows = "nixpkgs";
};
# Home manager
home-manager = {
url = "github:nix-community/home-manager/master";
inputs.nixpkgs.follows = "nixpkgs";
};
# Impermanence
impermanence.url = "github:nix-community/impermanence";
# Niri
niri.url = "github:sodiboo/niri-flake";
darkly = {
url = "github:Bali10050/Darkly";
inputs.nixpkgs.follows = "nixpkgs";
};
stylix = {
url = "github:danth/stylix";
inputs.nixpkgs.follows = "nixpkgs";
};
# go-musicfox
go-musicfox = {
url = "github:imxyy1soope1/go-musicfox";
inputs.nixpkgs.follows = "nixpkgs";
};
# NixOS-WSL
nixos-wsl = {
url = "github:nix-community/NixOS-WSL";
inputs.nixpkgs.follows = "nixpkgs";
};
fenix = {
url = "github:nix-community/fenix";
inputs.nixpkgs.follows = "nixpkgs";
# Flake organization tools
# keep-sorted start block=yes
flake-parts = {
url = "github:hercules-ci/flake-parts";
inputs.nixpkgs-lib.follows = "nixpkgs";
};
zen.url = "github:0xc000022070/zen-browser-flake";
zen.inputs.nixpkgs.follows = "nixpkgs";
noctalia = {
url = "github:noctalia-dev/noctalia-shell/v3.5.0";
inputs.nixpkgs.follows = "nixpkgs";
};
plant = {
url = "git+ssh://git@git.imxyy.top:2222/imxyy1soope1/HF-plant.git?rev=08dc0b3889797eb3618c7475c3c367ec0e5fdf40";
flake = false;
};
catppuccin = {
url = "github:catppuccin/nix";
inputs.nixpkgs.follows = "nixpkgs";
};
infuse = {
url = "git+https://codeberg.org/amjoseph/infuse.nix";
flake = false;
};
haumea = {
url = "github:nix-community/haumea/v0.2.2";
inputs.nixpkgs.follows = "nixpkgs";
};
infuse = {
url = "git+https://codeberg.org/amjoseph/infuse.nix";
flake = false;
};
# keep-sorted end
treefmt.url = "github:numtide/treefmt-nix";
# Useful modules
# keep-sorted start block=yes
catppuccin = {
url = "github:catppuccin/nix";
inputs.nixpkgs.follows = "nixpkgs";
};
impermanence.url = "github:nix-community/impermanence";
# TODO: sops-nix: remove pr patch once merged
# https://github.com/Mic92/sops-nix/pull/779
sops-nix = {
url = "github:Mic92/sops-nix/pull/779/merge";
inputs.nixpkgs.follows = "nixpkgs";
};
stylix = {
url = "github:danth/stylix";
inputs.nixpkgs.follows = "nixpkgs";
};
system76-scheduler-niri = {
url = "github:Kirottu/system76-scheduler-niri";
inputs.nixpkgs.follows = "nixpkgs";
};
# keep-sorted end
# Useful software
# keep-sorted start block=yes
angrr = {
url = "github:linyinfeng/angrr";
inputs.nixpkgs.follows = "nixpkgs";
};
darkly = {
url = "github:Bali10050/Darkly";
inputs.nixpkgs.follows = "nixpkgs";
};
fenix = {
url = "github:nix-community/fenix";
inputs.nixpkgs.follows = "nixpkgs";
};
go-musicfox = {
url = "github:imxyy1soope1/go-musicfox";
inputs.nixpkgs.follows = "nixpkgs";
};
niri.url = "github:sodiboo/niri-flake";
noctalia = {
url = "github:noctalia-dev/noctalia-shell/v4.5.0";
inputs.nixpkgs.follows = "nixpkgs";
};
zen.inputs.nixpkgs.follows = "nixpkgs";
zen.url = "github:0xc000022070/zen-browser-flake";
# keep-sorted end
# Misc
treefmt = {
url = "github:numtide/treefmt-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
plant = {
url = "git+ssh://git@git.imxyy.top:2222/imxyy1soope1/HF-plant.git?rev=08dc0b3889797eb3618c7475c3c367ec0e5fdf40";
flake = false;
};
my-templates.url = "git+https://git.imxyy.top/imxyy1soope1/flake-templates";
};
outputs =
{
self,
nixpkgs,
flake-parts,
...
}@inputs:
let
inherit (self) outputs;
vars = import ./vars.nix;
forAllSystems = lib.genAttrs lib.systems.flakeExposed;
forAllHosts =
mkSystem:
lib.mergeAttrsList (
builtins.map (hostname: {
${hostname} = mkSystem hostname;
}) (builtins.attrNames (builtins.readDir ./config/hosts))
);
flake-parts.lib.mkFlake
{
inherit inputs;
specialArgs.lib = import ./lib {
inherit (inputs.nixpkgs) lib;
inherit inputs;
};
}
{
systems = [ "x86_64-linux" ];
lib = (import ./lib/stdlib-extended.nix nixpkgs.lib).extend (
final: prev: {
inherit (inputs.home-manager.lib) hm;
inherit infuse;
haumea = inputs.haumea.lib;
}
);
infuse = (import inputs.infuse { inherit (nixpkgs) lib; }).v1.infuse;
in
{
packages = forAllSystems (
system:
lib.haumea.load {
src = ./pkgs;
loader = [
{
matches = str: builtins.match ".*\\.nix" str != null;
loader = _: path: nixpkgs.legacyPackages.${system}.callPackage path { };
}
];
transformer = lib.haumea.transformers.liftDefault;
}
);
imports = [
./flake/hosts.nix
./flake/pkgs.nix
./treefmt.nix
./overlays
];
formatter = forAllSystems (
system:
let
pkgs = nixpkgs.legacyPackages.${system};
treefmtEval = inputs.treefmt.lib.evalModule pkgs ./treefmt.nix;
in
treefmtEval.config.build.wrapper
);
check = forAllSystems (
system:
let
pkgs = nixpkgs.legacyPackages.${system};
treefmtEval = inputs.treefmt.lib.evalModule pkgs ./treefmt.nix;
in
{
formatting = treefmtEval.config.build.check self;
}
);
overlays = import ./overlays {
inherit inputs lib;
};
nixosConfigurations = forAllHosts (
hostname:
let
overlays = builtins.attrValues self.overlays ++ [
inputs.go-musicfox.overlays.default
inputs.niri.overlays.niri
inputs.fenix.overlays.default
(final: prev: {
darkly-qt5 = inputs.darkly.packages.${final.stdenv.hostPlatform.system}.darkly-qt5;
darkly-qt6 = inputs.darkly.packages.${final.stdenv.hostPlatform.system}.darkly-qt6;
noctalia-shell = inputs.noctalia.packages.${final.stdenv.hostPlatform.system}.default;
})
(final: prev: {
inherit lib;
})
];
home = {
home-manager = {
sharedModules = [
inputs.sops-nix.homeManagerModules.sops
inputs.impermanence.nixosModules.home-manager.impermanence
inputs.stylix.homeModules.stylix
inputs.noctalia.homeModules.default
inputs.zen.homeModules.beta
# workaround for annoying stylix
(
{ lib, ... }:
{
nixpkgs.overlays = lib.mkForce null;
}
)
];
useGlobalPkgs = true;
};
nixosHosts = {
imxyy-nix = {
profiles = [ "desktop" ];
};
pkgsConf.nixpkgs = {
inherit overlays;
config.allowUnfree = true;
flake.setNixPath = false;
imxyy-nix-server = {
profiles = [ "server" ];
};
in
lib.nixosSystem {
specialArgs = {
inherit
inputs
outputs
hostname
;
assets =
with lib.haumea;
load {
src = ./assets;
loader = [
(matchers.always loaders.path)
];
};
secrets =
with lib.haumea;
load {
src = ./secrets;
loader = [
(matchers.always loaders.path)
];
};
}
// vars;
modules =
(lib.umport {
paths = [ ./modules ];
exclude = [
./modules/virt/types
./modules/desktop/wm/niri/waybar
];
recursive = true;
})
++ [
(lib.mkAliasOptionModule [ "my" "hm" ] [ "home-manager" "users" vars.username ])
./config/base.nix
./config/hosts/${hostname}
inputs.chaotic.nixosModules.default
inputs.sops-nix.nixosModules.sops
inputs.impermanence.nixosModules.impermanence
inputs.home-manager.nixosModules.default
inputs.niri.nixosModules.niri
inputs.catppuccin.nixosModules.catppuccin
home
pkgsConf
imxyy-nix-wsl = {
profiles = [ "wsl" ];
modules = [
inputs.nixos-wsl.nixosModules.default
];
}
);
};
};
imxyy-nix-x16 = {
profiles = [ "desktop" ];
};
};
};
}

144
flake/hosts.nix Normal file
View File

@@ -0,0 +1,144 @@
{
self,
lib,
inputs,
withSystem,
config,
pkgsParams,
...
}:
let
vars = import ../vars.nix;
pkgsModule = {
nixpkgs = pkgsParams;
};
hmModule = {
home-manager = {
sharedModules = [
# keep-sorted start
inputs.noctalia.homeModules.default
inputs.sops-nix.homeManagerModules.sops
inputs.stylix.homeModules.stylix
inputs.system76-scheduler-niri.homeModules.default
inputs.zen.homeModules.beta
# keep-sorted end
{
stylix.overlays.enable = lib.mkForce false;
}
];
useGlobalPkgs = true;
};
};
in
{
options.nixosHosts = lib.mkOption {
type = lib.types.attrsOf (
lib.types.submodule (
{ name, ... }:
{
options = {
system = lib.mkOption {
type = lib.types.str;
default = "x86_64-linux";
description = "System architecture";
};
profiles = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
description = "List of profile names (e.g., 'desktop', 'server', 'wsl')";
};
modules = lib.mkOption {
type = lib.types.listOf lib.types.deferredModule;
default = (
lib.umport {
paths = [ ../hosts/${name} ];
extraExcludePredicate = path: lib.hasInfix "/_" (toString path);
recursive = true;
}
);
description = "Additional NixOS modules specific to this host";
};
extraSpecialArgs = lib.mkOption {
type = lib.types.attrs;
default = { };
description = "Extra special arguments to pass to modules";
};
};
}
)
);
default = { };
description = "Declarative host definitions";
};
config = {
# Generate nixosConfigurations from declarative host definitions
flake.nixosConfigurations = lib.mapAttrs (
hostname: hostConfig:
withSystem hostConfig.system (
{ ... }:
lib.nixosSystem {
inherit (hostConfig) system;
specialArgs = {
inherit
inputs
self
hostname
;
assets =
with lib.haumea;
load {
src = ../assets;
loader = [ (matchers.always loaders.path) ];
};
secrets =
with lib.haumea;
load {
src = ../secrets;
loader = [ (matchers.always loaders.path) ];
};
}
// vars
// hostConfig.extraSpecialArgs;
modules =
# Automatically import all feature modules
(lib.umport {
paths = [ ../modules ];
extraExcludePredicate = path: lib.hasInfix "/_" (toString path);
recursive = true;
})
++ [
# Base profile (always included)
../profiles/base.nix
]
# Add requested profiles
++ (map (profile: ../profiles/${profile}.nix) hostConfig.profiles)
# Add host-specific modules
++ hostConfig.modules
++ [
(lib.mkAliasOptionModule [ "my" "hm" ] [ "home-manager" "users" vars.username ])
# Upstream modules
# keep-sorted start
inputs.angrr.nixosModules.angrr
inputs.catppuccin.nixosModules.catppuccin
inputs.home-manager.nixosModules.default
inputs.impermanence.nixosModules.impermanence
inputs.niri.nixosModules.niri
inputs.sops-nix.nixosModules.sops
# keep-sorted end
# pkgs and home-manager configuration
pkgsModule
hmModule
];
}
)
) config.nixosHosts;
};
}

55
flake/pkgs.nix Normal file
View File

@@ -0,0 +1,55 @@
{
inputs,
lib,
config,
pkgsParams,
...
}:
{
_module.args = {
pkgsParams = {
overlays = builtins.attrValues config.flake.overlays ++ [
inputs.go-musicfox.overlays.default
inputs.niri.overlays.niri
inputs.fenix.overlays.default
inputs.angrr.overlays.default
(final: prev: {
darkly-qt5 = inputs.darkly.packages.${final.stdenv.hostPlatform.system}.darkly-qt5;
darkly-qt6 = inputs.darkly.packages.${final.stdenv.hostPlatform.system}.darkly-qt6;
noctalia-shell = inputs.noctalia.packages.${final.stdenv.hostPlatform.system}.default;
})
];
config.allowUnfree = true;
flake.setNixPath = false;
};
};
perSystem =
{
system,
pkgs,
...
}:
{
_module.args.pkgs = import inputs.nixpkgs (pkgsParams // { inherit system; });
legacyPackages = pkgs;
packages = lib.genAttrs (builtins.attrNames (config.flake.overlays.additions pkgs pkgs)) (
pkg: pkgs.${pkg}
);
};
flake.overlays.additions =
final: prev:
with lib.haumea;
load {
src = ../pkgs;
loader = [
{
matches = str: builtins.match ".*\\.nix" str != null;
loader = _: path: final.callPackage path { };
}
];
transformer = transformers.liftDefault;
};
}

View File

@@ -1,12 +1,15 @@
{
lib,
config,
pkgs,
secrets,
hosts,
...
}:
{
sops.secrets.et-imxyy-nix-server-nixremote = {
sopsFile = secrets.et-imxyy-nix-server-nixremote;
restartUnits = [ "easytier-nixremote.service" ];
format = "binary";
};
environment.systemPackages = [ pkgs.easytier ];
@@ -29,13 +32,7 @@
isSystemUser = true;
description = "nix remote build user";
group = "nixremote";
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBWOy0QmAyxENg/O5m3cus8U3c9jCLioivwcWsh5/a82 imxyy-hisense-pad"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK8pivvE8PMtsOxmccfNhH/4KehDKhBfUfJbQZxo/SZT imxyy-ace5"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKALTBn/QSGcSPgMg0ViSazFcaA0+nEF05EJpjbsI6dE imxyy_soope_@imxyy-cloudwin"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/ imxyy@imxyy-nix-x16"
openssh.authorizedKeys.keys = (lib.mapAttrsToList (host: key: "${key} ${host}") hosts) ++ [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIENauvvhVMLsUwH9cPYsvnOg7VCL3a4yEiKm8I524TE efl@efl-nix"
];
};

View File

@@ -2,16 +2,18 @@
{
sops.secrets.efl-tuwunel-env = {
sopsFile = secrets.efl-tuwunel;
restartUnits = [ "podman-tuwunel.service" ];
format = "dotenv";
};
virtualisation.oci-containers.containers = {
tuwunel = {
image = "jevolk/tuwunel:latest";
image = "ghcr.io/matrix-construct/tuwunel:latest";
volumes = [
"tuwunel_db:/var/lib/tuwunel"
];
ports = [ "6167:6167" ];
networks = [ "podman" ];
extraOptions = [ "--pids-limit=-1" ];
environment = {
TUWUNEL_SERVER_NAME = "mtx.eflx.top";
TUWUNEL_PORT = "6167";

View File

@@ -18,15 +18,14 @@ in
];
boot.initrd.kernelModules = [ "amdgpu" ];
boot.kernelModules = [ "kvm-amd" ];
boot.kernelPackages = lib.mkForce pkgs.linuxPackages_cachyos;
services.scx.enable = true;
boot.kernelPackages = lib.mkForce pkgs.linuxPackages_xanmod_stable;
boot.extraModulePackages = [ ];
boot.tmp.useTmpfs = true;
boot.supportedFilesystems = [ "zfs" ];
boot.zfs = {
package = pkgs.zfs_unstable;
extraPools = [ "data" ];
forceImportRoot = false;
package = pkgs.zfs_cachyos;
};
services.zfs.autoScrub.enable = true;
services.btrfs.autoScrub.enable = true;

View File

@@ -7,6 +7,7 @@
coding.misc.enable = true;
coding.langs.lua.enable = true;
coding.langs.rust.enable = true;
coding.langs.js.enable = true;
fonts.enable = lib.mkForce false;
persist = {
enable = true;

View File

@@ -9,12 +9,14 @@
];
sops.secrets.tuwunel-reg-token = {
sopsFile = secrets.tuwunel-reg-token;
restartUnits = [ "tuwunel.service" ];
format = "binary";
owner = config.services.matrix-tuwunel.user;
group = config.services.matrix-tuwunel.group;
};
sops.secrets.tuwunel-turn-secret = {
sopsFile = secrets.tuwunel-turn-secret;
restartUnits = [ "tuwunel.service" ];
format = "binary";
owner = config.services.matrix-tuwunel.user;
group = config.services.matrix-tuwunel.group;
@@ -68,6 +70,7 @@
sops.secrets.mautrix-telegram = {
sopsFile = secrets.mautrix-telegram;
restartUnits = [ "mautrix-telegram.service" ];
format = "dotenv";
owner = "mautrix-telegram";
group = "mautrix-telegram";

View File

@@ -2,6 +2,7 @@
{
sops.secrets.minio-env = {
sopsFile = secrets.minio;
restartUnits = [ "minio.service" ];
format = "dotenv";
};
services.minio = {

View File

@@ -0,0 +1,511 @@
{
config,
lib,
pkgs,
username,
hosts,
secrets,
...
}:
{
boot.kernelParams = [
"biosdevname=0"
"net.ifnames=0"
];
networking = {
useDHCP = lib.mkForce false;
dhcpcd = {
wait = "background";
IPv6rs = true;
extraConfig = ''
interface mac0
noipv4
'';
};
interfaces = {
eth0.wakeOnLan.enable = true;
eth1.wakeOnLan.enable = true;
mac0 = {
useDHCP = true;
ipv4.addresses = [
{
address = "192.168.3.2";
prefixLength = 24;
}
];
};
};
macvlans."mac0" = {
interface = "eth0";
mode = "bridge";
};
defaultGateway = {
address = "192.168.3.1";
interface = "mac0";
};
nameservers = [
"192.168.3.2"
];
firewall.enable = false;
nftables = {
enable = true;
flushRuleset = true;
ruleset = ''
table inet firewall {
set LANv4 {
type ipv4_addr
flags interval
elements = { 10.0.0.0/8, 100.64.0.0/10, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16 }
}
set LANv6 {
type ipv6_addr
flags interval
elements = { fd00::/8, fe80::/10 }
}
set tcp_ports {
type inet_service
flags interval
elements = {
http,
https,
2222,
25565
}
}
chain prerouting {
type filter hook prerouting priority mangle; policy accept;
ip daddr @LANv4 accept
ip6 daddr @LANv6 accept
}
chain output {
type filter hook output priority 100; policy accept;
ip daddr @LANv4 accept
ip6 daddr @LANv6 accept
}
chain input {
type filter hook input priority 0; policy drop;
iif lo accept
ct state invalid drop
ct state established,related accept
ip protocol { icmp, igmp } accept
ip saddr @LANv4 accept
ip6 saddr @LANv6 accept
tcp dport 2222 ct state new limit rate 15/minute counter accept
tcp dport @tcp_ports counter accept
}
chain forward {
type filter hook forward priority 0; policy accept;
}
chain nat {
type nat hook postrouting priority 0; policy accept;
ip saddr 192.168.3.0/24 masquerade
}
}
'';
};
};
services.openssh = {
enable = true;
settings = {
# PermitRootLogin = "yes";
PermitRootLogin = "prohibit-password";
PasswordAuthentication = true;
};
};
users.users.root.openssh.authorizedKeys.keys = lib.mapAttrsToList (
host: key: "${key} ${host}"
) hosts;
users.users.${username}.openssh.authorizedKeys.keys = lib.mapAttrsToList (
host: key: "${key} ${host}"
) hosts;
sops.secrets.dae-imxyy-nix-server = {
sopsFile = secrets.dae-imxyy-nix-server;
restartUnits = [ "dae.service" ];
format = "binary";
};
services.dae = {
enable = true;
configFile = config.sops.secrets.dae-imxyy-nix-server.path;
};
systemd.services.dae = {
after = [ "sops-nix.service" ];
serviceConfig.MemoryMax = "1G";
};
sops.secrets.mihomo = {
sopsFile = secrets.mihomo;
restartUnits = [ "mihomo.service" ];
format = "yaml";
key = "";
};
systemd.services.mihomo.after = [ "sops-nix.service" ];
services.mihomo = {
enable = true;
configFile = config.sops.secrets.mihomo.path;
webui = pkgs.metacubexd;
};
sops.secrets.frp-env = {
sopsFile = secrets.frp;
restartUnits = [ "frp.service" ];
format = "dotenv";
};
systemd.services.frp.serviceConfig.EnvironmentFile = [
config.sops.secrets.frp-env.path
];
services.frp = {
instances."" = {
enable = true;
role = "client";
settings = {
serverAddr = "{{ .Envs.FRP_SERVER_ADDR }}";
serverPort = 7000;
auth.token = "{{ .Envs.FRP_AUTH_TOKEN }}";
proxies = [
{
name = "nextcloud-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "nextcloud.imxyy.top" ];
}
{
name = "nextcloud-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "nextcloud.imxyy.top" ];
}
{
name = "oidc-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "oidc.imxyy.top" ];
}
{
name = "oidc-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "oidc.imxyy.top" ];
}
{
name = "mail-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "mail.imxyy.top" ];
}
{
name = "mail-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "mail.imxyy.top" ];
}
{
name = "gitea-ssh";
type = "tcp";
localIP = "127.0.0.1";
localPort = 2222;
remotePort = 2222;
}
{
name = "gitea-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "git.imxyy.top" ];
}
{
name = "gitea-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "git.imxyy.top" ];
}
{
name = "vault-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "vault.imxyy.top" ];
}
{
name = "vault-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "vault.imxyy.top" ];
}
{
name = "home-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "home.imxyy.top" ];
}
{
name = "home-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "home.imxyy.top" ];
}
{
name = "coder-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "coder.imxyy.top" ];
}
{
name = "coder-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "coder.imxyy.top" ];
}
{
name = "siyuan-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "sy.imxyy.top" ];
}
{
name = "siyuan-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "sy.imxyy.top" ];
}
{
name = "matrix-root-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "imxyy.top" ];
}
{
name = "matrix-root-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "imxyy.top" ];
}
{
name = "matrix-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "matrix.imxyy.top" ];
}
{
name = "matrix-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "matrix.imxyy.top" ];
}
{
name = "immich-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "immich.imxyy.top" ];
}
{
name = "immich-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "immich.imxyy.top" ];
}
{
name = "memo-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "memo.imxyy.top" ];
}
{
name = "memo-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "memo.imxyy.top" ];
}
{
name = "efl-matrix-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "mtx.eflx.top" ];
}
{
name = "efl-matrix-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "mtx.eflx.top" ];
}
{
name = "efl-send-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "send.eflx.top" ];
}
{
name = "efl-send-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "send.eflx.top" ];
}
];
};
};
};
sops.secrets.et-imxyy-nix-server = {
sopsFile = secrets.et-imxyy-nix-server;
restartUnits = [ "easytier.service" ];
format = "binary";
};
environment.systemPackages = [ pkgs.easytier ];
systemd.services."easytier" = {
enable = true;
script = "${pkgs.easytier}/bin/easytier-core -c ${config.sops.secrets.et-imxyy-nix-server.path}";
serviceConfig = {
Restart = "always";
RestartSec = 30;
User = "root";
};
wantedBy = [ "multi-user.target" ];
after = [
"network.target"
"sops-nix.service"
];
};
virtualisation.oci-containers.containers.obligator = {
image = "anderspitman/obligator:latest";
volumes = [
"/var/lib/obligator:/data"
"/var/lib/obligator:/api"
];
ports = [ "8081:1616" ];
cmd = [
"-storage-dir"
"/data"
"-api-socket-dir"
"/api"
"-root-uri"
"https://oidc.imxyy.top"
"-port"
"1616"
];
};
services.caddy.virtualHosts."oidc.imxyy.top" = {
extraConfig = ''
reverse_proxy :8081 {
header_up X-Real-IP {remote_host}
}
'';
};
systemd.services.ddns-go =
let
version = "6.6.7";
ddns-go = pkgs.buildGoModule {
inherit version;
pname = "ddns-go";
src = pkgs.fetchFromGitHub {
owner = "jeessy2";
repo = "ddns-go";
rev = "v${version}";
hash = "sha256-Ejoe6e9GFhHxQ9oIBDgDRQW9Xx1XZK+qSAXiRXLdn+c=";
};
meta.mainProgram = "ddns-go";
vendorHash = "sha256-XZii7gV3DmTunYyGYzt5xXhv/VpTPIoYKbW4LnmlAgs=";
doCheck = false;
};
in
{
description = "Go Dynamic DNS";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
ExecStart = "${lib.getExe ddns-go} -l :9876 -f 10 -cacheTimes 180 -c /var/lib/ddns-go/config.yaml";
Restart = "always";
RestartSec = 120;
};
path = [
pkgs.bash
];
};
services.dnsmasq =
let
subDomains = [
"home"
"nextcloud"
"mail"
"git"
"vault"
"coder"
"matrix"
"note"
"oidc"
"mc"
"music"
"sy"
"immich"
];
in
{
enable = true;
resolveLocalQueries = false;
settings = {
no-resolv = true;
server = [ "192.168.3.1" ];
address = map (sub: "/${sub}.imxyy.top/192.168.3.2") subDomains ++ [
"/imxyy-nix-server/192.168.3.2"
"/imxyy-cloudwin/192.168.3.4"
"/printer.home/192.168.3.53"
];
cache-size = 0;
log-queries = "extra";
};
};
}

View File

@@ -6,24 +6,6 @@
...
}:
{
boot.loader = {
efi.canTouchEfiVariables = true;
systemd-boot = {
enable = true;
configurationLimit = 10;
};
grub.enable = false;
timeout = 0;
};
systemd.services.nix-daemon = {
environment.TMPDIR = "/var/cache/nix";
serviceConfig.CacheDirectory = "nix";
};
environment.variables.NIX_REMOTE = "daemon";
my.audio.enable = false;
sops.secrets.imxyy-nix-server-hashed-password = {
sopsFile = secrets.imxyy-nix-server-hashed-password;
format = "binary";

View File

@@ -4,11 +4,10 @@
...
}:
{
sops.secrets = {
siyuan-env = {
sopsFile = secrets.siyuan;
format = "dotenv";
};
sops.secrets.siyuan-env = {
sopsFile = secrets.siyuan;
restartUnits = [ "siyuan.service" ];
format = "dotenv";
};
virtualisation.oci-containers.containers = {
siyuan = {

View File

@@ -55,7 +55,7 @@ in
}
'';
};
services.frp.settings.proxies = [
services.frp.instances."".settings.proxies = [
{
name = "plant-http";
type = "http";

View File

@@ -0,0 +1,55 @@
{ config, secrets, ... }:
let
redisUrl = config.services.redis.servers.rsshub.unixSocket;
in
{
sops.secrets.rsshub-env = {
sopsFile = secrets.rsshub;
restartUnits = [ "podman-rsshub.service" ];
format = "dotenv";
};
users.users.rsshub = {
home = "/var/empty";
group = "rsshub";
isSystemUser = true;
};
users.groups.rsshub.members = [ "rsshub" ];
services.redis.servers.rsshub = {
enable = true;
user = "rsshub";
};
virtualisation.oci-containers.containers.rsshub = {
image = "diygod/rsshub";
volumes = [
"${redisUrl}:${redisUrl}"
];
ports = [ "8100:1200" ];
networks = [ "podman" ];
environment = {
CACHE_TYPE = "redis";
REDIS_URL = "${redisUrl}";
};
environmentFiles = [ config.sops.secrets.rsshub-env.path ];
};
services.caddy.virtualHosts."rss.imxyy.top" = {
extraConfig = ''
reverse_proxy :8100
'';
};
services.frp.instances."".settings.proxies = [
{
name = "rsshub-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "rss.imxyy.top" ];
}
{
name = "rsshub-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "rss.imxyy.top" ];
}
];
}

View File

@@ -9,7 +9,7 @@
};
share = {
path = "/mnt/nas/share";
browseable = "yes";
browsable = "yes";
"read only" = "no";
"guest ok" = "no";
"create mask" = "0664";

View File

@@ -0,0 +1,49 @@
{ config, secrets, ... }:
{
sops.secrets.sshwifty = {
sopsFile = secrets.sshwifty;
format = "binary";
};
services.sshwifty = {
enable = true;
sharedKeyFile = config.sops.secrets.sshwifty.path;
settings = {
Servers = [
{
ListenInterface = "0.0.0.0";
ListenPort = 8101;
InitialTimeout = 10;
ReadTimeout = 120;
WriteTimeout = 120;
HeartbeatTimeout = 10;
ReadDelay = 10;
WriteDelay = 10;
TLSCertificateFile = "";
TLSCertificateKeyFile = "";
ServerMessage = "";
}
];
};
};
services.caddy.virtualHosts."ssh.imxyy.top" = {
extraConfig = ''
reverse_proxy :8101
'';
};
services.frp.instances."".settings.proxies = [
{
name = "sshwifty-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "ssh.imxyy.top" ];
}
{
name = "sshwifty-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "ssh.imxyy.top" ];
}
];
}

View File

@@ -2,6 +2,7 @@
{
sops.secrets.vaultwarden-env = {
sopsFile = secrets.vaultwarden;
restartUnits = [ "vaultwarden.service" ];
format = "dotenv";
};
services.postgresql.ensureUsers = [

View File

@@ -0,0 +1,19 @@
{ lib, username, ... }:
{
my.hm = {
programs.zsh.shellAliases = {
localproxy_on = "export http_proxy=http://192.168.128.1:7890 https_proxy=http://192.168.128.1:7890 all_proxy=socks://192.168.128.1:7890";
};
programs.fish.shellAliases = {
localproxy_on = "export http_proxy=http://192.168.128.1:7890 https_proxy=http://192.168.128.1:7890 all_proxy=socks://192.168.128.1:7890";
};
};
my = {
sops.sshKeyFile = "/home/${username}/.ssh/id_ed25519";
coding.all.enable = true;
coding.editor.vscode.enable = lib.mkForce false;
cli.misc.enable = true;
xdg.enable = true;
cli.media.all.enable = true;
};
}

View File

@@ -2,7 +2,6 @@
config,
lib,
pkgs,
username,
...
}:
let
@@ -22,7 +21,7 @@ in
verbose = false;
};
kernelPackages = lib.mkForce pkgs.linuxPackages_cachyos;
kernelPackages = lib.mkForce pkgs.linuxPackages_xanmod_latest;
kernelModules = [ "kvm-amd" ];
tmp.useTmpfs = true;
@@ -30,7 +29,6 @@ in
"fs.file-max" = 9223372036854775807;
};
};
services.scx.enable = true;
fileSystems."/" = {
device = btrfs;

View File

@@ -17,10 +17,10 @@
anki
ayugram-desktop
signal-desktop
signal-desktop-wayland
element-desktop
fractal
qq
qq-wayland
wechat
gnome-clocks
@@ -30,6 +30,9 @@
PATH = "/home/${username}/bin:$PATH";
};
};
programs.fish.interactiveShellInit = ''
set -gp PATH $HOME/bin
'';
programs.niri.settings = {
environment.STEAM_FORCE_DESKTOPUI_SCALING = "1.25";
@@ -61,8 +64,8 @@
defaultApplications =
let
browser = [ config.my.desktop.browser.default.desktop ];
editor = [ "codium.desktop" ];
imageviewer = [ "org.gnome.Shotwell-Viewer.desktop" ];
editor = [ "nvim.desktop" ];
imageviewer = [ "org.gnome.Loupe.desktop" ];
in
{
"inode/directory" = [ "org.gnome.Nautilus.desktop" ];
@@ -71,7 +74,6 @@
"text/*" = editor;
"application/json" = editor;
"text/html" = editor;
"text/xml" = editor;
"application/xml" = editor;
"application/xhtml+xml" = editor;
@@ -84,6 +86,7 @@
"application/x-extension-xht" = editor;
"application/x-extension-xhtml" = editor;
"text/html" = browser;
"x-scheme-handler/about" = browser;
"x-scheme-handler/ftp" = browser;
"x-scheme-handler/http" = browser;

View File

@@ -9,6 +9,7 @@
"biosdevname=0"
"net.ifnames=0"
];
my.persist.nixosDirs = [ "/etc/NetworkManager/system-connections" ];
networking = {
networkmanager.enable = true;
firewall.enable = false;
@@ -54,6 +55,7 @@
sops.secrets.dae-imxyy-nix-x16 = {
sopsFile = secrets.dae-imxyy-nix-x16;
restartUnits = [ "dae.service" ];
format = "binary";
};
services.dae = {
@@ -63,6 +65,7 @@
systemd.services.dae.after = [ "sops-nix.service" ];
sops.secrets.mihomo = {
sopsFile = secrets.mihomo;
restartUnits = [ "mihomo.service" ];
format = "yaml";
key = "";
};
@@ -75,6 +78,7 @@
sops.secrets.et-imxyy-nix-x16 = {
sopsFile = secrets.et-imxyy-nix-x16;
restartUnits = [ "easytier.service" ];
format = "binary";
};
environment.systemPackages = with pkgs; [

View File

@@ -6,40 +6,10 @@
...
}:
{
security.pam.loginLimits = [
{
domain = "*";
type = "soft";
item = "nofile";
value = "524288";
}
];
boot.kernelParams = [
"usbcore.autosuspend=-1" # Avoid usb autosuspend (for usb bluetooth adapter)
];
boot.loader = {
efi.canTouchEfiVariables = true;
systemd-boot = {
enable = true;
configurationLimit = 10;
};
grub.enable = false;
timeout = 0;
};
hardware.graphics.enable = true;
hardware.graphics.enable32Bit = true;
systemd.services.nix-daemon = {
environment.TMPDIR = "/var/cache/nix";
serviceConfig.CacheDirectory = "nix";
};
environment.variables.NIX_REMOTE = "daemon";
services.printing.enable = true;
services.upower.enable = true;
services.power-profiles-daemon.enable = true;
@@ -59,8 +29,6 @@
};
};
services.gvfs.enable = true;
services.openssh = {
enable = true;
settings = {
@@ -96,6 +64,4 @@
];
};
};
my.persist.nixosDirs = [ "/etc/NetworkManager/system-connections" ];
}

View File

@@ -23,7 +23,7 @@ in
verbose = false;
};
kernelPackages = lib.mkForce pkgs.linuxPackages_cachyos;
kernelPackages = lib.mkForce pkgs.linuxPackages_xanmod_latest;
kernelModules = [ "kvm-amd" ];
tmp.useTmpfs = true;
@@ -36,7 +36,6 @@ in
"resume_offset=6444127"
];
};
services.scx.enable = true;
fileSystems."/" = {
device = btrfs;

View File

@@ -16,11 +16,11 @@
anki
working.ayugram-desktop
signal-desktop
ayugram-desktop
signal-desktop-wayland
element-desktop
fractal
qq
qq-wayland
wechat
gnome-clocks
@@ -35,10 +35,16 @@
no_proxy = "192.168.3.0/24";
PATH = "/home/${username}/bin:$PATH";
};
profileExtra = ''
if [ `tty` = "/dev/tty6" ]; then
clear
fi
};
programs.fish = {
shellAliases = {
cageterm = "cage -m DP-1 -s -- alacritty -o font.size=20";
cagefoot = "cage -m DP-1 -s -- foot --font=monospace:size=20";
cagekitty = "cage -m DP-1 -s -- kitty -o font_size=20";
};
interactiveShellInit = ''
set -g no_proxy "192.168.3.0/24"
set -gp PATH $HOME/bin
'';
};
@@ -90,8 +96,8 @@
defaultApplications =
let
browser = [ config.my.desktop.browser.default.desktop ];
editor = [ "codium.desktop" ];
imageviewer = [ "org.gnome.Shotwell-Viewer.desktop" ];
editor = [ "nvim.desktop" ];
imageviewer = [ "org.gnome.Loupe.desktop" ];
in
{
"inode/directory" = [ "org.gnome.Nautilus.desktop" ];
@@ -100,7 +106,6 @@
"text/*" = editor;
"application/json" = editor;
"text/html" = editor;
"text/xml" = editor;
"application/xml" = editor;
"application/xhtml+xml" = editor;
@@ -113,6 +118,7 @@
"application/x-extension-xht" = editor;
"application/x-extension-xhtml" = editor;
"text/html" = browser;
"x-scheme-handler/about" = browser;
"x-scheme-handler/ftp" = browser;
"x-scheme-handler/http" = browser;
@@ -160,6 +166,9 @@
".claude"
".claude-code-router"
];
homeFiles = [
".claude.json"
];
};
};
}

View File

@@ -90,6 +90,7 @@
sops.secrets.dae-imxyy-nix = {
sopsFile = secrets.dae-imxyy-nix;
restartUnits = [ "dae.service" ];
format = "binary";
};
services.dae = {
@@ -99,6 +100,7 @@
systemd.services.dae.after = [ "sops-nix.service" ];
sops.secrets.mihomo = {
sopsFile = secrets.mihomo;
restartUnits = [ "mihomo.service" ];
format = "yaml";
key = "";
};
@@ -111,6 +113,7 @@
sops.secrets.et-imxyy-nix = {
sopsFile = secrets.et-imxyy-nix;
restartUnits = [ "easytier.service" ];
format = "binary";
};
environment.systemPackages = [ pkgs.easytier ];

View File

@@ -25,46 +25,17 @@ let
'';
in
{
security.pam.loginLimits = [
{
domain = "*";
type = "soft";
item = "nofile";
value = "524288";
}
];
systemd.services.btreset = {
script = lib.getExe btreset;
wantedBy = [ "multi-user.target" ];
serviceConfig.Type = "oneshot";
};
boot.kernelParams = [
"usbcore.autosuspend=-1" # Avoid usb autosuspend (for usb bluetooth adapter)
"fsck.mode=skip"
];
boot.loader = {
efi.canTouchEfiVariables = true;
systemd-boot = {
enable = true;
configurationLimit = 10;
};
grub.enable = false;
timeout = 0;
};
hardware.graphics.enable = true;
hardware.graphics.enable32Bit = true;
systemd.services.nix-daemon = {
environment.TMPDIR = "/var/cache/nix";
serviceConfig.CacheDirectory = "nix";
};
environment.variables.NIX_REMOTE = "daemon";
services.printing.enable = true;
services.keyd = {
enable = true;
keyboards = {
@@ -87,8 +58,6 @@ in
};
};
services.gvfs.enable = true;
programs.wireshark.enable = true;
programs.wireshark.package = pkgs.wireshark;
users.users.${username}.extraGroups = [ "wireshark" ];

View File

@@ -1,102 +1,9 @@
{ lib }:
{
makeSwitch =
{
default ? false,
config,
optionPath,
optionName,
config',
}:
let
cfg = lib.getAttrFromPath optionPath config.my;
in
{
options.my = lib.setAttrByPath (optionPath) {
enable = (lib.mkEnableOption optionName) // {
inherit default;
};
};
config = lib.mkIf cfg.enable config';
};
makeHomePackageConfig =
{
config,
pkgs,
packageName,
packagePath,
optionPath,
extraConfig ? { },
}:
lib.my.makeSwitch {
inherit config optionPath;
optionName = packageName;
config' = lib.mkMerge [
{
my.hm.home.packages = [ (lib.getAttrFromPath packagePath pkgs) ];
}
extraConfig
];
};
makeHomeProgramConfig =
{
config,
programName,
optionPath,
extraConfig ? { },
}:
lib.my.makeSwitch {
inherit config optionPath;
optionName = programName;
config' = lib.mkMerge [
{
my.hm.programs = lib.setAttrByPath [ programName "enable" ] true;
}
extraConfig
];
};
makeNixosPackageConfig =
{
config,
pkgs,
packageName,
packagePath,
optionPath,
extraConfig ? { },
}:
lib.my.makeSwitch {
inherit config optionPath;
optionName = packageName;
config' = lib.mkMerge [
{
environment.systemPackages = [ (lib.getAttrFromPath packagePath pkgs) ];
}
extraConfig
];
};
makeNixosProgramConfig =
{
config,
programName,
optionPath,
extraConfig ? { },
}:
lib.my.makeSwitch {
inherit config optionPath;
optionName = programName;
config' = lib.mkMerge [
{
programs = lib.setAttrByPath [ programName "enable" ] true;
}
extraConfig
];
};
}
{ lib, inputs }:
lib.extend (
self: super: {
inherit (inputs.home-manager.lib) hm;
umport = import ./umport.nix { lib = self; };
haumea = inputs.haumea.lib;
infuse = (import inputs.infuse { inherit lib; }).v1.infuse;
}
)

View File

@@ -1,14 +0,0 @@
# Just a convenience function that returns the given Nixpkgs standard
# library extended with the imxyy library.
stdlib:
let
mkMyLib = import ./.;
in
stdlib.extend (
self: super: {
my = mkMyLib { lib = self; };
umport = import ./umport.nix { lib = self; };
}
)

View File

@@ -13,6 +13,7 @@ let
paths ? [ ],
include ? [ ],
exclude ? [ ],
extraExcludePredicate ? _: true,
recursive ? true,
}:
with lib;
@@ -22,26 +23,22 @@ let
excludedDirs = filter (path: pathIsDirectory path) exclude;
isExcluded =
path:
if elem path excludedFiles then
true
else
(filter (excludedDir: lib.path.hasPrefix excludedDir path) excludedDirs) != [ ];
(elem path excludedFiles)
|| ((filter (excludedDir: lib.path.hasPrefix excludedDir path) excludedDirs) != [ ])
|| extraExcludePredicate path;
in
unique (
(filter
(file: pathIsRegularFile file && hasSuffix ".nix" (builtins.toString file) && !isExcluded file)
(
concatMap (
_path:
if recursive then
toList _path
else
mapAttrsToList (
name: type: _path + (if type == "directory" then "/${name}/default.nix" else "/${name}")
) (builtins.readDir _path)
) (unique (if path == null then paths else [ path ] ++ paths))
)
)
(filter (file: pathIsRegularFile file && hasSuffix ".nix" (toString file) && !isExcluded file) (
concatMap (
path:
if recursive then
toList path
else
mapAttrsToList (
name: type: path + (if type == "directory" then "/${name}/default.nix" else "/${name}")
) (builtins.readDir path)
) (unique (if path == null then paths else [ path ] ++ paths))
))
++ (if recursive then concatMap (path: toList path) (unique include) else unique include)
);
in

View File

@@ -5,12 +5,15 @@
username,
...
}:
lib.my.makeSwitch {
inherit config;
default = true;
optionName = "default audio settings";
optionPath = [ "audio" ];
config' = {
let
cfg = config.my.audio;
in
{
options.my.audio = {
enable = lib.mkEnableOption "default audio settings";
};
config = lib.mkIf cfg.enable {
security.rtkit.enable = true;
services.pipewire = {
enable = true;

View File

@@ -1,10 +1,13 @@
{ config, lib, ... }:
lib.my.makeSwitch {
inherit config;
default = true;
optionName = "default bluetooth settings";
optionPath = [ "bluetooth" ];
config' = {
let
cfg = config.my.bluetooth;
in
{
options.my.bluetooth = {
enable = lib.mkEnableOption "default bluetooth settings";
};
config = lib.mkIf cfg.enable {
hardware.bluetooth = {
enable = true;
powerOnBoot = true;

View File

@@ -1,18 +1,22 @@
{ config, lib, ... }:
lib.my.makeSwitch {
inherit config;
optionName = "all command line tools";
optionPath = [
"cli"
"all"
];
config' = {
let
cfg = config.my.cli.all;
in
{
options.my.cli.all = {
enable = lib.mkEnableOption "all command line tools";
};
config = lib.mkIf cfg.enable {
my.cli = {
media.all.enable = true;
misc.enable = true;
monitor.all.enable = true;
shell.all.enable = true;
vcs.all.enable = true;
shpool.enable = true;
tmux.enable = true;
};
};
}

View File

@@ -1,13 +1,13 @@
{ config, lib, ... }:
lib.my.makeSwitch {
inherit config;
optionName = "all command line media tools";
optionPath = [
"cli"
"media"
"all"
];
config' = {
let
cfg = config.my.cli.media.all;
in
{
options.my.cli.media.all = {
enable = lib.mkEnableOption "all command line media tools";
};
config = lib.mkIf cfg.enable {
my.cli.media = {
go-musicfox.enable = true;
ffmpeg.enable = true;

View File

@@ -4,13 +4,15 @@
pkgs,
...
}:
lib.my.makeHomePackageConfig {
inherit config pkgs;
packageName = "ffmpeg";
packagePath = [ "ffmpeg" ];
optionPath = [
"cli"
"media"
"ffmpeg"
];
let
cfg = config.my.cli.media.ffmpeg;
in
{
options.my.cli.media.ffmpeg = {
enable = lib.mkEnableOption "ffmpeg";
};
config = lib.mkIf cfg.enable {
my.hm.home.packages = [ pkgs.ffmpeg ];
};
}

View File

@@ -5,20 +5,19 @@
secrets,
...
}:
lib.my.makeSwitch {
inherit config;
optionName = "go-musicfox";
optionPath = [
"cli"
"media"
"go-musicfox"
];
config' = {
let
cfg = config.my.cli.media.go-musicfox;
in
{
options.my.cli.media.go-musicfox = {
enable = lib.mkEnableOption "go-musicfox";
};
config = lib.mkIf cfg.enable {
my = {
hm = {
home.packages = with pkgs; [
playerctl
go-musicfox
home.packages = [
pkgs.go-musicfox
];
sops.secrets.go-musicfox = {
sopsFile = secrets.go-musicfox;

View File

@@ -4,19 +4,22 @@
pkgs,
...
}:
lib.my.makeSwitch {
inherit config;
default = true;
optionName = "misc command line tools";
optionPath = [
"cli"
"misc"
];
config' = {
let
cfg = config.my.cli.misc;
in
{
options.my.cli.misc = {
enable = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable misc command line tools";
};
};
config = lib.mkIf cfg.enable {
environment.systemPackages = with pkgs; [
vim
wget
git
file
gnused
@@ -27,10 +30,14 @@ lib.my.makeSwitch {
xz
p7zip
unrar-free
ouch
pciutils
usbutils
dust
dysk
lsof
nmap
@@ -39,8 +46,6 @@ lib.my.makeSwitch {
dnsutils
killall
comma
];
programs.dconf.enable = true;
@@ -50,35 +55,30 @@ lib.my.makeSwitch {
".config/television/cable"
];
my.hm = {
home.packages = with pkgs; [
lsd
fd
neofetch
fastfetch
fzf
bat
ripgrep
aria2
socat
];
programs.tmux = {
enable = true;
extraConfig = "set-option -g mouse on";
plugins = [
(pkgs.tmuxPlugins.mkTmuxPlugin {
pluginName = "tokyo-night-tmux";
rtpFilePath = "tokyo-night.tmux";
version = "legacy";
src = pkgs.fetchFromGitHub {
owner = "janoamaral";
repo = "tokyo-night-tmux";
rev = "16469dfad86846138f594ceec780db27039c06cd";
hash = "sha256-EKCgYan0WayXnkSb2fDJxookdBLW0XBKi2hf/YISwJE=";
};
})
];
programs.fish.shellAliases = {
x = "ouch d";
};
programs.zsh.shellAliases = {
x = "ouch d";
};
home.packages = with pkgs; [
# keep-sorted start
aria2
bat
comma
fastfetch
fd
fzf
jq
keep-sorted
lsd
neofetch
ripgrep
socat
typos
# keep-sorted end
];
programs.tealdeer = {
enable = true;
enableAutoUpdates = true;

View File

@@ -1,13 +1,13 @@
{ config, lib, ... }:
lib.my.makeSwitch {
inherit config;
optionName = "all command line monitor tools";
optionPath = [
"cli"
"monitor"
"all"
];
config' = {
let
cfg = config.my.cli.monitor.all;
in
{
options.my.cli.monitor.all = {
enable = lib.mkEnableOption "all command line monitor tools";
};
config = lib.mkIf cfg.enable {
my.cli.monitor = {
btop.enable = true;
};

View File

@@ -18,7 +18,7 @@ theme[main_fg]="#D8DEE9"
# Title color for boxes
theme[title]="#8FBCBB"
# Higlight color for keyboard shortcuts
# Highlight color for keyboard shortcuts
theme[hi_fg]="#5E81AC"
# Background color of selected item in processes box

View File

@@ -4,16 +4,16 @@
pkgs,
...
}:
lib.my.makeHomePackageConfig {
inherit config pkgs;
packageName = "btop";
packagePath = [ "btop" ];
optionPath = [
"cli"
"monitor"
"btop"
];
extraConfig = {
let
cfg = config.my.cli.monitor.btop;
in
{
options.my.cli.monitor.btop = {
enable = lib.mkEnableOption "btop";
};
config = lib.mkIf cfg.enable {
my.hm.home.packages = [ pkgs.btop ];
my.hm.xdg.configFile."btop" = {
source = ./config;
recursive = true;

View File

@@ -1,13 +1,13 @@
{ config, lib, ... }:
lib.my.makeSwitch {
inherit config;
optionName = "all shells";
optionPath = [
"cli"
"shell"
"all"
];
config' = {
let
cfg = config.my.cli.shell.all;
in
{
options.my.cli.shell.all = {
enable = lib.mkEnableOption "all shells";
};
config = lib.mkIf cfg.enable {
my.cli.shell = {
zsh.enable = true;
fish.enable = true;

View File

@@ -0,0 +1,34 @@
{
lib,
config,
username,
...
}:
let
cfg = config.my.cli.shell;
in
{
options.my.cli.shell.default = lib.mkOption {
type = lib.types.enum [
"fish"
"zsh"
];
default = "fish";
};
config = lib.mkMerge [
(lib.mkIf (cfg.default == "fish") {
my.cli.shell.fish.enable = true;
users.users.${username} = {
shell = config.my.hm.programs.fish.package;
# do not need `programs.fish.enable = true` since fish is managed by home-manager
ignoreShellProgramCheck = true;
};
})
(lib.mkIf (cfg.default == "zsh") {
my.cli.shell.zsh.enable = true;
users.users.${username}.shell = config.my.hm.programs.zsh.package;
})
];
}

View File

@@ -1,51 +1,44 @@
{
config,
lib,
pkgs,
...
}:
lib.my.makeSwitch {
inherit config;
default = true;
optionName = "default fish settings";
optionPath = [
"cli"
"shell"
"fish"
];
config' = {
my.persist.homeDirs = [
".local/share/fish"
];
let
cfg = config.my.cli.shell.fish;
in
{
options.my.cli.shell.fish = {
enable = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable default fish settings";
};
};
config = lib.mkIf cfg.enable {
my.persist = {
homeDirs = [
".local/share/fish"
];
};
my.hm = {
xdg.configFile."fish/themes/tokyonight_storm.theme".source = builtins.fetchurl {
url = "https://raw.githubusercontent.com/folke/tokyonight.nvim/refs/tags/v4.14.1/extras/fish_themes/tokyonight_storm.theme";
sha256 = "02n1w5x65683c8mlwg1rav06iqm3xk90zq45qmygpm7pzyn8dqh1";
};
programs.starship.enableFishIntegration = false;
programs.fish = {
enable = true;
plugins = [
{
name = "extract";
src = pkgs.fetchFromGitHub {
owner = "hexclover";
repo = "fish-extract-ng";
tag = "v0.1";
hash = "sha256-yef5NX4HdZ3ab/2AzNrvvhi0CbeTvXYKZmyH76gIpyk=";
};
}
];
shellAliases = {
la = "lsd -lah";
ls = "lsd";
svim = "sudoedit";
svim = "doasedit";
nf = "fastfetch";
tmux = "tmux -T RGB,focus,overline,mouse,clipboard,usstyle";
};
interactiveShellInit = ''
interactiveShellInit = lib.mkBefore ''
fish_vi_key_bindings
source ${
builtins.fetchurl {
url = "https://raw.githubusercontent.com/folke/tokyonight.nvim/refs/tags/v4.14.1/extras/fish/tokyonight_storm.fish";
sha256 = "0a2pg78k8cv0hx8p02lxnb7giblwn7z9hnb6i6mdx4w5lg4wfg40";
}
}
fish_config theme choose tokyonight_storm
${lib.optionalString config.my.cli.shell.starship.enable "source ${./starship.fish}"}
'';
functions = {
fish_greeting = "";
@@ -88,6 +81,14 @@ lib.my.makeSwitch {
bind -s p 'set -g fish_cursor_end_mode exclusive' forward-char 'set -g fish_cursor_end_mode inclusive' fish_clipboard_paste
bind -s P fish_clipboard_paste
'';
nix-closure-size = {
body = ''
nix path-info --recursive --size --closure-size \
--human-readable $(readlink -f $(which $program))
'';
argumentNames = [ "program" ];
};
};
};
};

View File

@@ -0,0 +1,143 @@
# This file is modified from:
# https://github.com/tyler-stefani/starship/blob/main/conf.d/starship.fish
# The MIT License can be found here:
# https://github.com/tyler-stefani/starship/blob/main/LICENSE
status is-interactive
or exit 0
# set temp file and signal for async prompts
if test -n "$XDG_RUNTIME_DIR"
set -g starship_temp_dir "$XDG_RUNTIME_DIR"/fish-async-prompt
else
set -g starship_temp_dir /tmp/fish-async-prompt
end
mkdir -p "$starship_temp_dir"
set -g starship_temp_file "$starship_temp_dir"/"$fish_pid"_last_prompt
set -g starship_async_signal SIGUSR1
function fish_prompt
if test "$TRANSIENT" = "1"
starship_transient_prompt_func
else if test -e $starship_temp_file
cat $starship_temp_file
else
starship_transient_prompt_func
end
end
function starship_transient_prompt_func
# Clear from cursor to end of screen as `commandline -f repaint` does not do this
# See https://github.com/fish-shell/fish-shell/issues/8418
printf \e\[0J
starship module character
end
function fish_right_prompt
switch "$fish_key_bindings"
case fish_hybrid_key_bindings fish_vi_key_bindings
set STARSHIP_KEYMAP "$fish_bind_mode"
case '*'
set STARSHIP_KEYMAP insert
end
set STARSHIP_CMD_PIPESTATUS $pipestatus
set STARSHIP_CMD_STATUS $status
# Account for changes in variable name between v2.7 and v3.0
set STARSHIP_DURATION "$CMD_DURATION$cmd_duration"
set STARSHIP_JOBS (count (jobs -p))
if test "$TRANSIENT" = "1"
if type -q starship_transient_rprompt_func
starship_transient_rprompt_func
else
printf ""
end
else
starship prompt --right --terminal-width="$COLUMNS" --status=$STARSHIP_CMD_STATUS --pipestatus="$STARSHIP_CMD_PIPESTATUS" --keymap=$STARSHIP_KEYMAP --cmd-duration=$STARSHIP_DURATION --jobs=$STARSHIP_JOBS
end
end
# Disable virtualenv prompt, it breaks starship
set -g VIRTUAL_ENV_DISABLE_PROMPT 1
# Remove default mode prompt
builtin functions -e fish_mode_prompt
set -gx STARSHIP_SHELL fish
# Transience related functions
function reset-transient --on-event fish_postexec
set -g TRANSIENT 0
end
function transient_execute
if commandline --is-valid
set -g TRANSIENT 1
commandline -f repaint
else
set -g TRANSIENT 0
end
commandline -f execute
end
function transient_cancel
if string length -q -- (commandline)
set -g TRANSIENT 1
commandline -f repaint
end
commandline -f cancel-commandline
end
# --user is the default, but listed anyway to make it explicit.
function enable_transience --description 'enable transient prompt keybindings'
bind --user \r transient_execute
bind --user -M insert \r transient_execute
bind --user \cc transient_cancel
end
# Erase the transient prompt related key bindings.
# --user is the default, but listed anyway to make it explicit.
# Erasing a user binding will revert to the preset.
function disable_transience --description 'remove transient prompt keybindings'
bind --user -e \r
bind --user -M insert -e \r
bind --user -e \cc
end
# Set up the session key that will be used to store logs
# We don't use `random [min] [max]` because it is unavailable in older versions of fish shell
set -gx STARSHIP_SESSION_KEY (string sub -s1 -l16 (random)(random)(random)(random)(random)0000000000000000)
# async related functions
function write_prompt_to_temp --on-event fish_prompt
switch "$fish_key_bindings"
case fish_hybrid_key_bindings fish_vi_key_bindings
set STARSHIP_KEYMAP "$fish_bind_mode"
case '*'
set STARSHIP_KEYMAP insert
end
set STARSHIP_CMD_PIPESTATUS $pipestatus
set STARSHIP_CMD_STATUS $status
# Account for changes in variable name between v2.7 and v3.0
set STARSHIP_DURATION "$CMD_DURATION$cmd_duration"
set STARSHIP_JOBS (count (jobs -p))
# MODIFIED: '"$STARSHIP_CMD_PIPESTATUS"' -> '$STARSHIP_CMD_PIPESTATUS'
fish -c 'starship prompt \
--terminal-width='"$COLUMNS"' \
--status='$STARSHIP_CMD_STATUS' \
--pipestatus='$STARSHIP_CMD_PIPESTATUS' \
--keymap='$STARSHIP_KEYMAP' \
--cmd-duration='$STARSHIP_DURATION' \
--jobs='$STARSHIP_JOBS' > '$starship_temp_file' \
&& kill -s '"$starship_async_signal"' '"$fish_pid"'' &
disown
end
function repaint_prompt_on_signal --on-signal "$starship_async_signal"
commandline -f repaint
end
function remove_temp_prompt_on_exit --on-event fish_exit
rm -f $starship_temp_file
end

View File

@@ -1,21 +1,57 @@
{ config, lib, ... }:
lib.my.makeSwitch {
inherit config;
optionName = "starship prompt";
optionPath = [
"cli"
"shell"
"starship"
];
config' = {
my.hm = {
programs.starship = {
enable = true;
settings = lib.recursiveUpdate (with builtins; fromTOML (readFile ./starship-preset.toml)) {
add_newline = false;
nix_shell.disabled = true;
};
};
let
cfg = config.my.cli.shell.starship;
in
{
options.my.cli.shell.starship = {
enable = lib.mkEnableOption "starship prompt";
format = lib.mkOption {
type = with lib.types; listOf singleLineStr;
};
};
config = lib.mkMerge [
(lib.mkIf cfg.enable {
my.hm = {
programs.starship = {
enable = true;
settings = lib.recursiveUpdate (with builtins; fromTOML (readFile ./starship-preset.toml)) {
add_newline = false;
command_timeout = 2000;
nix_shell.disabled = true;
format =
let
dedupDollar =
list:
let
result =
builtins.foldl'
(
acc: elem:
if lib.hasPrefix "$" elem then
if builtins.elem elem acc.seen then
acc
else
acc
// {
result = acc.result ++ [ elem ];
seen = acc.seen ++ [ elem ];
}
else
acc // { result = acc.result ++ [ elem ]; }
)
{
result = [ ];
seen = [ ];
}
(lib.reverseList list);
in
lib.reverseList result.result;
in
"$all" + lib.concatStrings (dedupDollar cfg.format);
};
};
};
})
];
}

View File

@@ -4,16 +4,19 @@
pkgs,
...
}:
lib.my.makeSwitch {
inherit config;
default = true;
optionName = "default zsh settings";
optionPath = [
"cli"
"shell"
"zsh"
];
config' = {
let
cfg = config.my.cli.shell.zsh;
in
{
options.my.cli.shell.zsh = {
enable = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable default zsh settings";
};
};
config = lib.mkIf cfg.enable {
my.hm = {
home.packages = with pkgs; [
fzf
@@ -47,20 +50,10 @@ lib.my.makeSwitch {
];
};
shellAliases = {
x = "extract";
ls = "lsd";
svim = "sudoedit";
svim = "doasedit";
nf = "fastfetch";
tmux = "tmux -T RGB,focus,overline,mouse,clipboard,usstyle";
};
# https://wiki.nixos.org/wiki/Fish#Setting_fish_as_default_shell
initContent = lib.mkBefore ''
if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" ]]
then
exec fish -l
fi
'';
};
};
};

43
modules/cli/shpool.nix Normal file
View File

@@ -0,0 +1,43 @@
{
config,
lib,
...
}:
let
cfg = config.my.cli.shpool;
in
{
options.my.cli.shpool = {
enable = lib.mkEnableOption "shpool";
};
config = lib.mkIf cfg.enable {
my.hm = {
services.shpool = {
enable = true;
systemd = true;
settings = {
motd = "never";
prompt_prefix = "";
forward_env = [ "PATH" ];
};
};
programs.starship = {
settings = {
custom.shpool = {
description = "Display current shpool session name";
when = ''test -n "$SHPOOL_SESSION_NAME"'';
command = "echo $SHPOOL_SESSION_NAME";
symbol = " ";
style = "fg:#dea584";
format = "[$symbol \\[$output\\] ]($style)";
};
};
};
};
my.cli.shell.starship.format = [
"\${custom.shpool}"
"$character"
];
};
}

55
modules/cli/tmux.nix Normal file
View File

@@ -0,0 +1,55 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.my.cli.tmux;
in
{
options.my.cli.tmux = {
enable = lib.mkEnableOption "tmux";
};
config = lib.mkIf cfg.enable {
my.hm = {
programs.tmux = {
enable = true;
extraConfig = ''
set-option -g mouse on
set-option -a terminal-features ",xterm-256color:RGB,focus,clipboard,usstyle"
'';
plugins = [
(pkgs.tmuxPlugins.mkTmuxPlugin {
pluginName = "tokyo-night-tmux";
rtpFilePath = "tokyo-night.tmux";
version = "legacy";
src = pkgs.fetchFromGitHub {
owner = "janoamaral";
repo = "tokyo-night-tmux";
rev = "16469dfad86846138f594ceec780db27039c06cd";
hash = "sha256-EKCgYan0WayXnkSb2fDJxookdBLW0XBKi2hf/YISwJE=";
};
})
];
};
programs.starship = {
settings = {
custom.tmux = {
description = "Display current tmux session name";
when = ''test -n "$TMUX"'';
command = "tmux display-message -p '#S'";
symbol = " ";
style = "bold green";
format = "[$symbol \\[$output\\] ]($style)";
};
};
};
};
my.cli.shell.starship.format = [
"\${custom.tmux}"
"$character"
];
};
}

View File

@@ -1,13 +1,13 @@
{ config, lib, ... }:
lib.my.makeSwitch {
inherit config;
optionName = "all command line tools";
optionPath = [
"cli"
"vcs"
"all"
];
config' = {
let
cfg = config.my.cli.vcs.all;
in
{
options.my.cli.vcs.all = {
enable = lib.mkEnableOption "all command line tools";
};
config = lib.mkIf cfg.enable {
my.cli.vcs = {
git.enable = true;
jj.enable = true;

View File

@@ -4,30 +4,36 @@
pkgs,
username,
userfullname,
useremail,
emails,
hosts,
...
}:
lib.my.makeHomeProgramConfig {
inherit config;
programName = "git";
optionPath = [
"cli"
"vcs"
"git"
];
extraConfig = {
let
cfg = config.my.cli.vcs.git;
in
{
options.my.cli.vcs.git = {
enable = lib.mkEnableOption "git";
};
config = lib.mkIf cfg.enable {
my.hm = {
programs.git = {
enable = true;
settings = {
gpg.ssh.allowedSignersFile =
(pkgs.writeText "allowed_signers" ''
imxyy1soope1@gmail.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix
imxyy@imxyy.top ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix
'').outPath;
hosts
|> lib.mapAttrsToList (
host: key: map (email: "${email} ${key} ${host}") (builtins.attrValues emails)
)
|> lib.flatten
|> lib.concatStringsSep "\n"
|> pkgs.writeText "allowed-signers"
|> toString;
push.autoSetupRemote = true;
user = {
name = userfullname;
email = useremail;
email = emails.default;
};
};
signing = {

View File

@@ -4,24 +4,36 @@
pkgs,
username,
userfullname,
useremail,
emails,
hosts,
...
}:
lib.my.makeHomeProgramConfig {
inherit config;
programName = "jujutsu";
optionPath = [
"cli"
"vcs"
"jj"
];
extraConfig = {
let
cfg = config.my.cli.vcs.jj;
in
{
options.my.cli.vcs.jj = {
enable = lib.mkEnableOption "jujutsu";
};
config = lib.mkIf cfg.enable {
my.hm = {
programs.jujutsu = {
enable = true;
settings = {
# take the closest ancestor bookmark and move them the current change.
# https://shaddy.dev/notes/jj-tug
aliases.tug = [
"bookmark"
"move"
"--from"
"heads(::@- & bookmarks())"
"--to"
"@-"
];
user = {
name = "${userfullname}";
email = "${useremail}";
name = userfullname;
email = emails.default;
};
ui = {
graph.style = "square";
@@ -33,17 +45,22 @@ lib.my.makeHomeProgramConfig {
behavior = "own";
key = "/home/${username}/.ssh/id_ed25519";
backends.backends.ssh.allowed-signers =
(pkgs.writeText "allowed_signers" ''
imxyy1soope1@gmail.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix
imxyy@imxyy.top ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix
'').outPath;
hosts
|> lib.mapAttrsToList (
host: key: map (email: "${email} ${key} ${host}") (builtins.attrValues emails)
)
|> lib.flatten
|> lib.concatStringsSep "\n"
|> pkgs.writeText "allowed-signers"
|> toString;
};
};
};
home.packages = [ pkgs.lazyjj ];
programs.jjui.enable = true;
programs.starship = {
settings = {
custom = {
# Borrowed from https://github.com/jj-vcs/jj/wiki/Starship/b18afc53417848f58333b24d446b8e2522b42bd2#alternative-prompt
jj = {
ignore_timeout = true;
description = "The current jj status";

View File

@@ -1,12 +1,13 @@
{ config, lib, ... }:
lib.my.makeSwitch {
inherit config;
optionName = "all coding tools";
optionPath = [
"coding"
"all"
];
config' = {
let
cfg = config.my.coding.all;
in
{
options.my.coding.all = {
enable = lib.mkEnableOption "all coding tools";
};
config = lib.mkIf cfg.enable {
my.coding = {
editor.all.enable = true;
langs.all.enable = true;

View File

@@ -1,13 +1,13 @@
{ config, lib, ... }:
lib.my.makeSwitch {
inherit config;
optionName = "all coding editors";
optionPath = [
"coding"
"editor"
"all"
];
config' = {
let
cfg = config.my.coding.editor.all;
in
{
options.my.coding.editor.all = {
enable = lib.mkEnableOption "all coding editors";
};
config = lib.mkIf cfg.enable {
my.coding.editor = {
neovim.enable = true;
vscode.enable = true;

View File

@@ -2,23 +2,20 @@
config,
lib,
pkgs,
impure,
...
}:
lib.my.makeHomeProgramConfig {
inherit config;
programName = "neovim";
optionPath = [
"coding"
"editor"
"neovim"
];
extraConfig = {
let
cfg = config.my.coding.editor.neovim;
in
{
options.my.coding.editor.neovim = {
enable = lib.mkEnableOption "neovim";
};
config = lib.mkIf cfg.enable {
my.hm = {
xdg.configFile."nvim/init.lua".source = ./nvim/init.lua;
xdg.configFile."nvim/lua" = {
source = ./nvim/lua;
recursive = true;
};
xdg.configFile."nvim".source = impure.mkImpureLink ./nvim;
programs.neovim = {
enable = true;
defaultEditor = true;
@@ -29,6 +26,11 @@ lib.my.makeHomeProgramConfig {
gcc # treesitter
ripgrep # telescope
vscode-json-languageserver
vscode-langservers-extracted
taplo
typos-lsp
];
};
};

View File

@@ -0,0 +1,44 @@
{
"Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" },
"LuaSnip": { "branch": "master", "commit": "de10d8414235b0a8cabfeba60d07c24304e71f5c" },
"blink.cmp": { "branch": "main", "commit": "f9e855c4d96e1264f7c818844f5a0166ad48c212" },
"bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
"friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" },
"gitsigns.nvim": { "branch": "main", "commit": "c7d37ca22b461f64e26f8f6701b2586128ed0bef" },
"glance.nvim": { "branch": "master", "commit": "bf86d8b79dce808e65fdb6e9269d0b4ed6d2eefc" },
"guess-indent.nvim": { "branch": "main", "commit": "84a4987ff36798c2fc1169cbaff67960aed9776f" },
"indent-blankline.nvim": { "branch": "master", "commit": "005b56001b2cb30bfa61b7986bc50657816ba4ba" },
"inlay-hints.nvim": { "branch": "master", "commit": "990e1f96699b8293b6665b9e73b16128c66684e6" },
"lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" },
"lazydev.nvim": { "branch": "main", "commit": "5231c62aa83c2f8dc8e7ba957aa77098cda1257d" },
"leap.nvim": { "branch": "main", "commit": "02bf52e49c72cc5dabb53ec9494d10d304f0b2c9" },
"lspkind.nvim": { "branch": "master", "commit": "d79a1c3299ad0ef94e255d045bed9fa26025dab6" },
"lualine.nvim": { "branch": "master", "commit": "a94fc68960665e54408fe37dcf573193c4ce82c9" },
"mini.nvim": { "branch": "main", "commit": "8c40d95931cbe6138391af9180e59439ed2e69df" },
"neo-tree.nvim": { "branch": "main", "commit": "f3df514fff2bdd4318127c40470984137f87b62e" },
"noice.nvim": { "branch": "main", "commit": "0427460c2d7f673ad60eb02b35f5e9926cf67c59" },
"nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
"nvim-autopairs": { "branch": "master", "commit": "23320e75953ac82e559c610bec5a90d9c6dfa743" },
"nvim-colorizer.lua": { "branch": "master", "commit": "a065833f35a3a7cc3ef137ac88b5381da2ba302e" },
"nvim-lspconfig": { "branch": "master", "commit": "276ce3bc878243dc63c32b75790c4296d11848f6" },
"nvim-notify": { "branch": "master", "commit": "397c7c1184745fca649e5104de659e6392ef5a4d" },
"nvim-osc52": { "branch": "main", "commit": "04cfaba1865ae5c53b6f887c3ca7304973824fb2" },
"nvim-tmux-navigation": { "branch": "main", "commit": "4898c98702954439233fdaf764c39636681e2861" },
"nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" },
"nvim-treesitter-textobjects": { "branch": "master", "commit": "71385f191ec06ffc60e80e6b0c9a9d5daed4824c" },
"nvim-web-devicons": { "branch": "master", "commit": "3362099de3368aa620a8105b19ed04c2053e38c0" },
"outline.nvim": { "branch": "main", "commit": "0eb9289ab39c91caf8b3ed0e3a17764809d69558" },
"pest.vim": { "branch": "master", "commit": "7cfcb43f824e74d13dfe631359fff2ec23836a77" },
"plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
"rainbow-delimiters.nvim": { "branch": "master", "commit": "97bf4b8ef9298644a29fcd9dd41a0210cf08cac7" },
"render-markdown.nvim": { "branch": "main", "commit": "3da7bb459f6cff03980dd1e106c46f3e62ff4d9f" },
"ripgrep": { "branch": "master", "commit": "119a58a400ea948c2d2b0cd4ec58361e74478641" },
"telescope.nvim": { "branch": "master", "commit": "b4da76be54691e854d3e0e02c36b0245f945c2c7" },
"todo-comments.nvim": { "branch": "main", "commit": "304a8d204ee787d2544d8bc23cd38d2f929e7cc5" },
"tokyonight.nvim": { "branch": "main", "commit": "057ef5d260c1931f1dffd0f052c685dcd14100a3" },
"tree-sitter-nu": { "branch": "main", "commit": "6544c4383643cf8608d50def2247a7af8314e148" },
"trouble.nvim": { "branch": "main", "commit": "85bedb7eb7fa331a2ccbecb9202d8abba64d37b3" },
"vim-floaterm": { "branch": "master", "commit": "fd4bdd66eca56c6cc59f2119e4447496d8cde2ea" },
"vim-repeat": { "branch": "master", "commit": "65846025c15494983dafe5e3b46c8f88ab2e9635" },
"workspace-diagnostics.nvim": { "branch": "main", "commit": "60f9175b2501ae3f8b1aba9719c0df8827610c8e" }
}

View File

@@ -63,7 +63,7 @@ function G.buf_kill(kill_command, bufnr, force)
else
return
end
elseif api.nvim_buf_get_option(bufnr, "buftype") == "terminal" then
elseif api.nvim_get_option_value("buftype", { buf = bufnr }) == "terminal" then
choice = fn.confirm(fmt([[Close "%s"?]], bufname), "&Yes\n&No\n&Cancel")
if choice == 1 then
force = true

View File

@@ -37,7 +37,7 @@ vim.g.autoread = true
vim.g.loaded_ruby_provider = 0
-- Hightlight on yank
-- Highlight on yank
local highlight_group = vim.api.nvim_create_augroup("YankHighlight", { clear = true })
vim.api.nvim_create_autocmd("TextYankPost", {
callback = function()
@@ -55,12 +55,12 @@ vim.cmd([[
\ endif
]])
-- Automaticly switch input method
-- Automatically switch input method
Last_input_method = 1
vim.api.nvim_create_augroup("AutoInputMethod", {})
vim.api.nvim_create_autocmd("InsertLeave", {
pattern = "*",
desc = "Automaticly switch input method",
desc = "Automatically switch input method",
callback = function()
Last_input_method = require("core.globals").switch_input_method(1)
end,
@@ -68,7 +68,7 @@ vim.api.nvim_create_autocmd("InsertLeave", {
})
vim.api.nvim_create_autocmd("CmdlineLeave", {
pattern = "*",
desc = "Automaticly switch input method",
desc = "Automatically switch input method",
callback = function()
require("core.globals").switch_input_method(1)
end,
@@ -76,7 +76,7 @@ vim.api.nvim_create_autocmd("CmdlineLeave", {
})
vim.api.nvim_create_autocmd("InsertEnter", {
pattern = "*",
desc = "Automaticly switch input method",
desc = "Automatically switch input method",
callback = function()
require("core.globals").switch_input_method(Last_input_method)
end,

View File

@@ -1,25 +0,0 @@
M = {
check_ts = true,
ts_config = {
lua = { "string", "source" },
javascript = { "string", "template_string" },
},
fast_wrap = {
map = "<M-e>",
chars = { "{", "[", "(", '"', "'" },
pattern = [=[[%'%"%)%>%]%)%}%,]]=],
end_key = "$",
keys = "qwertyuiopzxcvbnmasdfghjkl",
check_comma = true,
highlight = "Search",
highlight_grey = "Comment",
},
}
local cmp_autopairs = require("nvim-autopairs.completion.cmp")
local ok, cmp = pcall(require, "cmp")
if ok then
cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done({ map_char = { tex = "" } }))
end
return M

View File

@@ -1,5 +1,6 @@
local buf_kill = require("core.globals").buf_kill
--- @type bufferline.UserConfig
M = {
highlights = {
buffer_selected = {
@@ -10,7 +11,7 @@ M = {
diagnostics = "nvim_lsp",
offsets = {
{
filetype = "NvimTree",
filetype = "neo-tree",
text = "File Explorer",
highlight = "Directory",
text_align = "center",

View File

@@ -1,64 +1,32 @@
local cmp = require("cmp")
--- @type blink.cmp.Config
M = {
window = {
completion = {
border = "rounded",
scrollbar = "",
},
documentation = {
border = "rounded",
scrollbar = "",
keymap = {
-- <Tab> to accept
preset = "super-tab",
},
appearance = {
nerd_font_variant = "mono",
},
completion = {
-- By default, you may press `<c-space>` to show the documentation.
-- Optionally, set `auto_show = true` to show the documentation after a delay.
documentation = { auto_show = true, auto_show_delay_ms = 1000 },
},
sources = {
default = { "lsp", "path", "snippets", "lazydev" },
providers = {
lazydev = { module = "lazydev.integrations.blink", score_offset = 100 },
},
},
formatting = {
format = require("lspkind").cmp_format({
mode = "symbol",
maxwidth = 50,
ellipsis_char = "...",
}),
snippets = { preset = "luasnip" },
-- See :h blink-cmp-config-fuzzy for more information
fuzzy = {
implementation = "lua",
},
snippet = {
expand = function(args)
require("luasnip").lsp_expand(args.body)
end,
},
mapping = cmp.mapping.preset.insert({
["<C-b>"] = cmp.mapping.scroll_docs(-4),
["<C-f>"] = cmp.mapping.scroll_docs(4),
["<Escape>"] = cmp.mapping.abort(),
["<Tab>"] = cmp.mapping.confirm({ select = true }),
["<Up>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
else
fallback()
end
end, {
"i",
"s",
}),
["<Down>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
else
fallback()
end
end, {
"i",
"s",
}),
}),
sources = cmp.config.sources({
{ name = "nvim_lsp" },
{ name = "luasnip" },
{ name = "path" },
}, {
{ name = "buffer" },
}),
-- Shows a signature help window while you type arguments for a function
signature = { enabled = true },
}
vim.o.wildmenu = true
vim.o.pumheight = 10
return M

View File

@@ -1,3 +1,8 @@
-- rainbow-delimiters integration
local hooks = require("ibl.hooks")
hooks.register(hooks.type.SCOPE_HIGHLIGHT, hooks.builtin.scope_highlight_from_extmark)
--- @type ibl.config
M = {
enabled = true,
indent = {
@@ -6,6 +11,7 @@ M = {
scope = {
enabled = true,
show_start = false,
highlight = vim.g.rainbow_delimiters.highlight,
},
}

View File

@@ -1,3 +0,0 @@
M = {}
return M

View File

@@ -34,6 +34,9 @@ local servers = {
},
},
},
on_attach = function(client, bufnr)
require("inlay-hints").on_attach(client, bufnr)
end,
},
nixd = {
settings = {
@@ -42,7 +45,21 @@ local servers = {
command = { "nixfmt" },
},
nixpkgs = {
expr = "import <nixpkgs> { }",
-- language=nix
expr = [[
if builtins.pathExists ./flake.lock then
let
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
node = lock.nodes.root.inputs.nixpkgs;
nodeName = if builtins.isList node then builtins.elemAt node 0 else node;
in
import (fetchTarball {
url = lock.nodes.${nodeName}.locked.url or "https://github.com/NixOS/nixpkgs/archive/${lock.nodes.${nodeName}.locked.rev}.tar.gz";
sha256 = lock.nodes.${nodeName}.locked.narHash;
}) { }
else
import <nixpkgs> { }
]],
},
},
},
@@ -54,22 +71,31 @@ local servers = {
qmlls = {
cmd = { "qmlls", "-E" },
},
pyright = {},
gopls = {},
-- keep-sorted start
biome = {},
clangd = {},
ts_ls = {},
jsonls = {},
cssls = {},
eslint = {},
gopls = {},
html = {},
java_language_server = {},
jsonls = {},
pyright = {},
taplo = {},
ts_ls = {},
typos_lsp = {},
-- keep-sorted end
}
local capabilities = require("cmp_nvim_lsp").default_capabilities()
capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities.textDocument.foldingRange = {
dynamicRegistration = false,
lineFoldingOnly = true,
local capabilities = {
textDocument = {
foldingRange = {
dynamicRegistration = false,
lineFoldingOnly = true,
},
},
}
capabilities = require("blink.cmp").get_lsp_capabilities(capabilities)
for server, config in pairs(servers) do
config["capabilities"] = capabilities
vim.lsp.config(server, config)

View File

@@ -25,10 +25,6 @@ vim.diagnostic.config({
severity_sort = true,
})
vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, {
border = "single",
})
local diag_config1 = {
virtual_text = {
severity = {

View File

@@ -1,19 +0,0 @@
M = {
bind = true, -- This is mandatory, otherwise border config won't get registered.
handler_opts = {
border = "rounded",
},
hint_prefix = "^ ",
toggle_key = "<C-k>",
}
vim.keymap.set(
{ "n" },
"<leader>k",
require("lsp_signature").toggle_float_win,
{ silent = true, noremap = true, desc = "toggle signature" }
)
vim.keymap.set({ "n" }, "K", vim.lsp.buf.signature_help, { silent = true, noremap = true, desc = "toggle signature" })
return M

View File

@@ -1,32 +0,0 @@
M = {
sync_root_with_cwd = true,
diagnostics = {
enable = false,
debounce_delay = 50,
show_on_dirs = true,
},
filters = {
git_ignored = false,
},
}
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
local opt = require("core.globals").keymap_opt
vim.keymap.set("n", "<leader>e", ":NvimTreeToggle<CR>", opt)
vim.keymap.set("n", "<leader>te", ":NvimTreeFocus<CR>", opt)
vim.api.nvim_create_autocmd("BufEnter", {
group = vim.api.nvim_create_augroup("NvimTreeCloseOnLast", { clear = true }),
pattern = "NvimTree*",
callback = function()
if vim.api.nvim_call_function("winlayout", {})[1] == "leaf" and vim.bo.filetype == "NvimTree" then
vim.defer_fn(function()
vim.cmd("NvimTreeClose")
end, 10)
end
end,
})
return M

View File

@@ -14,7 +14,6 @@ package.path = package.path .. ";" .. vim.fn.stdpath("config") .. "/lua/"
local plugins = {
{
"folke/tokyonight.nvim",
lazy = false,
priority = 1000,
config = function()
vim.cmd.colorscheme("tokyonight-storm")
@@ -22,23 +21,66 @@ local plugins = {
},
{
"nvim-lualine/lualine.nvim",
lazy = false,
dependencies = { { "nvim-tree/nvim-web-devicons", lazy = true } },
config = function()
require("lualine").setup(require("plugins.lualine"))
end,
},
{
"nvim-tree/nvim-tree.lua",
dependencies = { { "nvim-tree/nvim-web-devicons", lazy = true } },
lazy = false,
"echasnovski/mini.nvim",
config = function()
require("nvim-tree").setup(require("plugins.nvim-tree"))
-- Better Around/Inside textobjects
--
-- Examples:
-- - va) - [V]isually select [A]round [)]paren
-- - yinq - [Y]ank [I]nside [N]ext [Q]uote
-- - ci' - [C]hange [I]nside [']quote
require("mini.ai").setup({ n_lines = 500 })
-- Add/delete/replace surroundings (brackets, quotes, etc.)
--
-- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren
-- - sd' - [S]urround [D]elete [']quotes
-- - sr)' - [S]urround [R]eplace [)] [']
require("mini.surround").setup()
-- ... and there is more!
-- Check out: https://github.com/echasnovski/mini.nvim
end,
},
{
"nvim-neo-tree/neo-tree.nvim",
version = "*",
dependencies = {
"nvim-lua/plenary.nvim",
"nvim-tree/nvim-web-devicons",
"MunifTanjim/nui.nvim",
},
cmd = "Neotree",
keys = {
{ "\\", ":Neotree reveal toggle<CR>", desc = "Toggle NeoTree", silent = true },
{ "<leader>e", ":Neotree reveal toggle<CR>", desc = "Toggle NeoTree", silent = true },
},
--- @type neotree.Config
opts = {
close_if_last_window = true,
filesystem = {
filtered_items = {
hide_dotfiles = false,
},
window = {
width = 30,
mappings = {
["\\"] = "close_window",
["<leader>e"] = "close_window",
["<c-]>"] = "set_root",
},
},
},
},
},
{
"nvim-treesitter/nvim-treesitter",
lazy = false,
dependencies = {
"nvim-treesitter/nvim-treesitter-textobjects",
"nushell/tree-sitter-nu",
@@ -58,6 +100,7 @@ local plugins = {
{
"lukas-reineke/indent-blankline.nvim",
event = "VeryLazy",
dependencies = { "https://gitlab.com/HiPhish/rainbow-delimiters.nvim" },
config = function()
require("ibl").setup(require("plugins.indent-blankline"))
end,
@@ -69,7 +112,7 @@ local plugins = {
},
{
"neovim/nvim-lspconfig",
dependencies = { "hrsh7th/cmp-nvim-lsp" },
dependencies = { "saghen/blink.cmp" },
event = "VeryLazy",
config = function()
require("plugins.lsp.lspconfig")
@@ -117,7 +160,10 @@ local plugins = {
{
"MysticalDevil/inlay-hints.nvim",
event = "LspAttach",
dependencies = { "neovim/nvim-lspconfig" },
dependencies = {
"neovim/nvim-lspconfig",
"onsails/lspkind.nvim",
},
opts = {},
},
{
@@ -128,27 +174,30 @@ local plugins = {
end,
},
{
"L3MON4D3/LuaSnip",
event = "InsertEnter",
dependencies = { { "rafamadriz/friendly-snippets", lazy = true } },
build = "make install_jsregexp",
config = function()
require("luasnip").setup(require("plugins.cmp.luasnip"))
end,
},
{
"hrsh7th/nvim-cmp",
"saghen/blink.cmp",
event = "VeryLazy",
dependencies = {
"hrsh7th/cmp-nvim-lsp",
"L3MON4D3/LuaSnip",
"saadparwaiz1/cmp_luasnip",
"rafamadriz/friendly-snippets",
"hrsh7th/cmp-path",
"onsails/lspkind.nvim",
{
"L3MON4D3/LuaSnip",
event = "InsertEnter",
dependencies = { { "rafamadriz/friendly-snippets", lazy = true } },
build = "make install_jsregexp",
config = function()
require("luasnip").setup(require("plugins.cmp.luasnip"))
end,
},
{
"folke/lazydev.nvim",
ft = "lua",
opts = {
library = {
{ path = "${3rd}/luv/library", words = { "vim%.uv" } },
},
},
},
},
event = "InsertEnter",
config = function()
require("cmp").setup(require("plugins.cmp.cmp"))
require("blink.cmp").setup(require("plugins.cmp.cmp"))
end,
},
{
@@ -159,10 +208,7 @@ local plugins = {
{
"windwp/nvim-autopairs",
event = "InsertEnter",
dependencies = { "hrsh7th/nvim-cmp" },
config = function()
require("nvim-autopairs").setup(require("plugins.autopairs"))
end,
opts = {},
},
{
"akinsho/bufferline.nvim",
@@ -207,7 +253,7 @@ local plugins = {
},
},
{
"ggandor/leap.nvim",
"https://codeberg.org/andyg/leap.nvim",
dependencies = { "tpope/vim-repeat" },
config = function()
vim.keymap.set({ "n", "x", "o" }, "s", "<Plug>(leap)")

View File

@@ -1,4 +1,5 @@
local rainbow_delimiters = require("rainbow-delimiters")
--- @type rainbow_delimiters.config
vim.g.rainbow_delimiters = {
strategy = {
[""] = rainbow_delimiters.strategy["global"],

View File

@@ -1,9 +1,11 @@
--- @type TSConfig
M = {
auto_install = true,
parser_install_dir = "$HOME/.local/share/nvim/lazy/nvim-treesitter",
sync_install = true,
modules = {},
ignore_install = {},
ensure_installed = {},
highlight = { enable = true },
indent = { enable = true },

View File

@@ -4,18 +4,19 @@
pkgs,
...
}:
lib.my.makeHomeProgramConfig {
inherit config;
programName = "vscode";
optionPath = [
"coding"
"editor"
"vscode"
];
extraConfig = {
let
cfg = config.my.coding.editor.vscode;
in
{
options.my.coding.editor.vscode = {
enable = lib.mkEnableOption "vscode";
};
config = lib.mkIf cfg.enable {
my.hm = {
programs.vscode = {
package = pkgs.vscodium;
enable = true;
package = pkgs.vscodium-wayland;
};
};
my.persist.homeDirs = [

View File

@@ -3,15 +3,16 @@
lib,
...
}:
lib.my.makeHomeProgramConfig {
inherit config;
programName = "zed-editor";
optionPath = [
"coding"
"editor"
"zed"
];
extraConfig = {
let
cfg = config.my.coding.editor.zed;
in
{
options.my.coding.editor.zed = {
enable = lib.mkEnableOption "zed-editor";
};
config = lib.mkIf cfg.enable {
my.hm.programs.zed-editor.enable = true;
my.persist.homeDirs = [
".config/zed"
".local/share/zed"

View File

@@ -1,13 +1,13 @@
{ config, lib, ... }:
lib.my.makeSwitch {
inherit config;
optionName = "all coding langs";
optionPath = [
"coding"
"langs"
"all"
];
config' = {
let
cfg = config.my.coding.langs.all;
in
{
options.my.coding.langs.all = {
enable = lib.mkEnableOption "all coding langs";
};
config = lib.mkIf cfg.enable {
my.coding.langs = {
c.enable = true;
go.enable = true;

View File

@@ -4,15 +4,15 @@
pkgs,
...
}:
lib.my.makeSwitch {
inherit config;
optionName = "c";
optionPath = [
"coding"
"langs"
"c"
];
config' = {
let
cfg = config.my.coding.langs.c;
in
{
options.my.coding.langs.c = {
enable = lib.mkEnableOption "c";
};
config = lib.mkIf cfg.enable {
my.hm.home.packages = with pkgs; [
gcc
(lib.hiPrio clang)

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