refactor: 重构为多平台多用户架构,全面提升终端体验

- 新增 lib/ 辅助函数(mkNixos/mkDarwin/mkHome),消除硬编码
- 拆分 modules/ 为 nixos/darwin/shared 三层,支持跨平台共享
- 重构 home/ 为 shell/dev/theme 子模块,工具全部迁入用户级
- 深度配置 Tmux/FZF/Atuin/Bat/Eza/Btop/Lazygit/Starship
- 添加 Catppuccin Mocha 统一主题、Nerd Fonts 声明式管理
- 新增 homeConfigurations 输出,支持非 NixOS 系统直装
- 新增 nix-darwin 输入,预留 macOS 扩展路径
- 新增 overlays/ 和 pkgs/ 自定义包基础设施
- 修正 nix-darwin URL(LnL7 → nix-darwin org)
This commit is contained in:
2026-04-03 19:54:17 +08:00
parent 92c6535945
commit e92c7aee31
31 changed files with 827 additions and 391 deletions
+49 -9
View File
@@ -1,16 +1,56 @@
{ config, pkgs, ... }:
{
inputs,
username,
pkgs,
lib,
...
}:
{
imports = [
./shell.nix
./git.nix
inputs.catppuccin.homeManagerModules.catppuccin
./shell
./dev
./theme.nix
];
home.stateVersion = "24.11";
home = {
username = username;
homeDirectory =
if pkgs.stdenv.isDarwin then "/Users/${username}" else "/home/${username}";
stateVersion = "24.11";
};
# ── mise 配置 ──
xdg.configFile."mise/config.toml".text = ''
[settings]
trusted_config_paths = ["/"]
'';
# ── User-level packages ────────────────────────────
home.packages = with pkgs; [
# Modern CLI replacements
dust # du
duf # df
procs # ps
sd # sed
xh # curl/httpie
jq # JSON
yq # YAML
# System info
fastfetch
tealdeer # tldr
# File management
trash-cli
# Terminal multiplexer (alternative)
zellij
# Nix tools
nix-output-monitor # nom — better nix build output
nvd # nix version diff
nh # nix helper (nixos-rebuild wrapper)
# Misc
micro # simple editor fallback
];
# XDG directories
xdg.enable = true;
}
+7
View File
@@ -0,0 +1,7 @@
{
imports = [
./git.nix
./languages.nix
./neovim.nix
];
}
+59
View File
@@ -0,0 +1,59 @@
{ ... }:
{
programs.git = {
enable = true;
# user.name / user.email: set per-user via git config or ~/.zshrc.local
# git config --global user.name "Your Name"
# git config --global user.email "your@email.com"
delta = {
enable = true;
options = {
navigate = true;
side-by-side = true;
line-numbers = true;
hyperlinks = true;
};
};
extraConfig = {
# Internal Git server (skip SSL verification)
http."https://202.127.0.42:32443".sslVerify = false;
credential.helper = "store";
merge.conflictstyle = "zdiff3";
pull.rebase = true;
push.autoSetupRemote = true;
init.defaultBranch = "main";
rerere.enabled = true;
diff.algorithm = "histogram";
core.autocrlf = "input";
};
};
# ── Lazygit ──────────────────────────────────────────
programs.lazygit = {
enable = true;
settings = {
gui = {
nerdFontsVersion = "3";
showBottomLine = false;
};
git.paging = {
pager = "delta --paging=never";
};
update.method = "never";
disableStartupPopups = true;
};
};
# ── GitHub CLI ───────────────────────────────────────
programs.gh = {
enable = true;
settings = {
git_protocol = "ssh";
};
};
}
+41
View File
@@ -0,0 +1,41 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
# ── Language runtimes ──
nodejs
go
bun
# ── Package management / version management ──
mise
uv
# ── LSP servers ──
bash-language-server
gopls
typescript-language-server
yaml-language-server
vue-language-server
dockerfile-language-server-nodejs
lua-language-server
nil # Nix LSP
# ── Linter / Formatter ──
biome
ruff
shellcheck
shfmt
nixfmt-rfc-style # nix formatter
stylua
# ── Code intelligence ──
ast-grep
];
# ── mise config ──────────────────────────────────────
xdg.configFile."mise/config.toml".text = ''
[settings]
trusted_config_paths = ["/"]
'';
}
+24
View File
@@ -0,0 +1,24 @@
{ pkgs, ... }:
{
programs.neovim = {
enable = true;
defaultEditor = true;
viAlias = true;
vimAlias = true;
withNodeJs = true;
withPython3 = true;
};
# ── Neovim distro configuration ──
# Option A: LazyVim / NvChad / AstroNvim via xdg.configFile
# xdg.configFile."nvim" = {
# source = ./nvim-config;
# recursive = true;
# };
#
# Option B: NixVim (fully declarative)
# Add to flake.nix inputs:
# nixvim.url = "github:nix-community/nixvim";
# Then configure here.
}
-36
View File
@@ -1,36 +0,0 @@
{ config, ... }:
{
programs.git = {
enable = true;
# user.name 和 user.email 需要每人自行设置:
# git config --global user.name "你的名字"
# git config --global user.email "你的邮箱"
delta = {
enable = true;
options = {
navigate = true;
side-by-side = true;
line-numbers = true;
};
};
extraConfig = {
# 内部 Git 服务器(跳过 SSL 验证)
http = {
"https://202.127.0.42:32443" = {
sslVerify = false;
};
};
credential.helper = "store";
merge.conflictstyle = "zdiff3";
pull.rebase = true;
push.autoSetupRemote = true;
init.defaultBranch = "main";
rerere.enabled = true;
};
};
}
-137
View File
@@ -1,137 +0,0 @@
{ config, pkgs, ... }:
{
# ── Zsh ──────────────────────────────────────────────
programs.zsh = {
enable = true;
autocd = true; # setopt AUTO_CD
oh-my-zsh = {
enable = true;
plugins = [
"git" # git 别名 (gst, gco, gp...)
"sudo" # 双击 ESC 自动加 sudo
"extract" # x file.tar.gz 一键解压
"direnv" # direnv hook
];
};
autosuggestion.enable = true;
syntaxHighlighting.enable = true;
shellAliases = {
# 导航
cd = "z";
cdi = "zi";
".." = "cd ..";
"..." = "cd ../..";
# 文件列表
ls = "eza --icons --group-directories-first";
ll = "eza -la --icons --git --group-directories-first";
la = "eza -a --icons --group-directories-first";
lt = "eza --tree --level=2 --icons";
# 工具
cat = "bat --paging=never";
rm = "trash-put";
lg = "lazygit";
vi = "nvim";
# 网络
http = "xh";
};
initExtra = ''
# Shell
setopt INTERACTIVE_COMMENTS
setopt NO_BEEP
# PATH go/bun
export PATH="$HOME/go/bin:$HOME/.bun/bin:$PATH"
# fzf-tab
# : ls $(nix eval --raw nixpkgs#zsh-fzf-tab)/share/
source ${pkgs.zsh-fzf-tab}/share/fzf-tab/fzf-tab.plugin.zsh
# mise
eval "$(mise activate zsh)"
# WSL
if [[ -n "$WSL_DISTRO_NAME" ]]; then
alias pbcopy="clip.exe"
alias pbpaste="powershell.exe -noprofile -c Get-Clipboard"
fi
#
[[ -f ~/.zshrc.local ]] && source ~/.zshrc.local
'';
};
# ── Starship 提示符 ──────────────────────────────────
programs.starship = {
enable = true;
enableZshIntegration = true;
settings = {
format = "$username$hostname$directory$git_branch$git_status$nodejs$python$go$rust$cmd_duration$line_break$character";
character = {
success_symbol = "[](bold green)";
error_symbol = "[](bold red)";
};
directory = {
truncation_length = 3;
truncation_symbol = "/";
};
git_branch.symbol = " ";
git_status.format = "([\\[$all_status$ahead_behind\\]]($style) )";
cmd_duration = {
min_time = 2000;
format = "[$duration]($style) ";
};
nodejs = {
format = "[$symbol($version)]($style) ";
detect_extensions = [ ];
};
python.format = "[$symbol($version)]($style) ";
go.format = "[$symbol($version)]($style) ";
};
};
# ── FZF ──────────────────────────────────────────────
programs.fzf = {
enable = true;
enableZshIntegration = true;
};
# ── Atuin(历史搜索,接管 Ctrl+R)──────────────────
programs.atuin = {
enable = true;
enableZshIntegration = true;
};
# ── Zoxide(智能 cd)─────────────────────────────────
programs.zoxide = {
enable = true;
enableZshIntegration = true;
};
# ── Direnv ───────────────────────────────────────────
programs.direnv = {
enable = true;
enableZshIntegration = true;
nix-direnv.enable = true; # 更好的 Nix devShell 集成
};
# ── Bat ──────────────────────────────────────────────
programs.bat.enable = true;
# ── Yazi ─────────────────────────────────────────────
programs.yazi.enable = true;
}
+8
View File
@@ -0,0 +1,8 @@
{
imports = [
./zsh.nix
./starship.nix
./tools.nix
./tmux.nix
];
}
+85
View File
@@ -0,0 +1,85 @@
{ lib, ... }:
{
programs.starship = {
enable = true;
enableZshIntegration = true;
settings = {
add_newline = false;
format = lib.concatStrings [
"$os"
"$username"
"$hostname"
"$directory"
"$git_branch"
"$git_status"
"$nix_shell"
"$nodejs"
"$python"
"$go"
"$rust"
"$docker_context"
"$cmd_duration"
"$line_break"
"$character"
];
character = {
success_symbol = "[](bold green)";
error_symbol = "[](bold red)";
};
os = {
disabled = false;
symbols = {
NixOS = " ";
Linux = " ";
Macos = " ";
Windows = "󰖳 ";
};
};
directory = {
truncation_length = 3;
truncation_symbol = "/";
substitutions = {
Developer = " ";
Documents = "󰈙 ";
Downloads = " ";
};
};
git_branch.symbol = " ";
git_status = {
format = "([\\[$all_status$ahead_behind\\]]($style) )";
};
nix_shell = {
symbol = " ";
format = "[$symbol$state( \\($name\\))]($style) ";
};
docker_context = {
symbol = " ";
format = "[$symbol$context]($style) ";
};
cmd_duration = {
min_time = 2000;
format = "[$duration]($style) ";
};
nodejs = {
format = "[$symbol($version)]($style) ";
detect_extensions = [ ];
};
python.format = "[$symbol($version)]($style) ";
go.format = "[$symbol($version)]($style) ";
rust.format = "[$symbol($version)]($style) ";
};
};
}
+51
View File
@@ -0,0 +1,51 @@
{ pkgs, ... }:
{
programs.tmux = {
enable = true;
baseIndex = 1;
escapeTime = 10;
historyLimit = 50000;
keyMode = "vi";
mouse = true;
terminal = "tmux-256color";
prefix = "C-a";
plugins = with pkgs.tmuxPlugins; [
sensible
vim-tmux-navigator
yank
];
extraConfig = ''
# True color support
set -ag terminal-overrides ",xterm-256color:RGB"
# Split panes
bind v split-window -h -c "#{pane_current_path}"
bind s split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %
# New window in current path
bind c new-window -c "#{pane_current_path}"
# Reload config
bind r source-file ~/.config/tmux/tmux.conf \; display "Config reloaded!"
# Resize panes
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
# Status bar
set -g status-position top
set -g renumber-windows on
# Copy mode vim bindings
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel
'';
};
}
+92
View File
@@ -0,0 +1,92 @@
{ pkgs, ... }:
{
# ── FZF ──────────────────────────────────────────────
programs.fzf = {
enable = true;
enableZshIntegration = true;
defaultCommand = "fd --type f --hidden --follow --exclude .git";
defaultOptions = [
"--height=40%"
"--layout=reverse"
"--border"
"--info=inline"
];
changeDirWidgetCommand = "fd --type d --hidden --follow --exclude .git";
fileWidgetCommand = "fd --type f --hidden --follow --exclude .git";
fileWidgetOptions = [
"--preview 'bat --color=always --style=numbers --line-range=:200 {} 2>/dev/null || eza -la {}'"
];
};
# ── Atuin (shell history) ────────────────────────────
programs.atuin = {
enable = true;
enableZshIntegration = true;
settings = {
enter_accept = true;
filter_mode = "host";
filter_mode_shell_up_key_binding = "session";
style = "compact";
inline_height = 20;
show_help = false;
};
};
# ── Zoxide (smart cd) ───────────────────────────────
programs.zoxide = {
enable = true;
enableZshIntegration = true;
};
# ── Direnv + nix-direnv ─────────────────────────────
programs.direnv = {
enable = true;
enableZshIntegration = true;
nix-direnv.enable = true;
config.global = {
warn_timeout = "120s";
};
};
# ── Bat (cat replacement) ───────────────────────────
programs.bat = {
enable = true;
extraPackages = with pkgs.bat-extras; [
batgrep
batwatch
];
};
# ── Eza (ls replacement) ────────────────────────────
programs.eza = {
enable = true;
enableZshIntegration = false; # we use custom aliases in zsh.nix
git = true;
icons = "auto";
extraOptions = [
"--color=always"
"--group-directories-first"
];
};
# ── Yazi (file manager) ─────────────────────────────
programs.yazi = {
enable = true;
enableZshIntegration = true;
};
# ── Btop (system monitor) ───────────────────────────
programs.btop = {
enable = true;
settings = {
vim_keys = true;
};
};
# ── Ripgrep / FD ────────────────────────────────────
home.packages = with pkgs; [
ripgrep
fd
];
}
+72
View File
@@ -0,0 +1,72 @@
{ pkgs, ... }:
{
programs.zsh = {
enable = true;
autocd = true;
oh-my-zsh = {
enable = true;
plugins = [
"git" # git aliases (gst, gco, gp...)
"sudo" # double ESC → prepend sudo
"extract" # x file.tar.gz → auto extract
"direnv" # direnv hook
];
};
autosuggestion.enable = true;
syntaxHighlighting.enable = true;
shellAliases = {
# Navigation
cd = "z";
cdi = "zi";
".." = "cd ..";
"..." = "cd ../..";
# File listing (eza)
ls = "eza --icons --group-directories-first";
ll = "eza -la --icons --git --group-directories-first";
la = "eza -a --icons --group-directories-first";
lt = "eza --tree --level=2 --icons";
# Tools
cat = "bat --paging=never";
rm = "trash-put";
lg = "lazygit";
vi = "nvim";
# Network
http = "xh";
# Nix shortcuts
rebuild = "sudo nixos-rebuild switch --flake ~/.config/nix-config";
update = "nix flake update --flake ~/.config/nix-config";
};
initExtra = ''
# Shell options
setopt INTERACTIVE_COMMENTS
setopt NO_BEEP
# PATH (manual go/bun global tools)
export PATH="$HOME/go/bin:$HOME/.bun/bin:$PATH"
# fzf-tab plugin
source ${pkgs.zsh-fzf-tab}/share/fzf-tab/fzf-tab.plugin.zsh
# mise
eval "$(mise activate zsh)"
# WSL clipboard
if [[ -n "$WSL_DISTRO_NAME" ]]; then
alias pbcopy="clip.exe"
alias pbpaste="powershell.exe -noprofile -c Get-Clipboard"
fi
# User-local overrides
[[ -f ~/.zshrc.local ]] && source ~/.zshrc.local
'';
};
}
+10
View File
@@ -0,0 +1,10 @@
{ ... }:
{
catppuccin = {
enable = true;
flavor = "mocha";
# Automatically themes all supported programs that are enabled:
# bat, btop, delta, fzf, lazygit, starship, tmux, zsh-syntax-highlighting, etc.
};
}