目前的终端美化效果

nixos_new

这篇文章将介绍 Flakes 和 Home Manager,并实现简单的终端美化。

flake介绍 @

Nix flakes 是 Nix 2.4 版本中首次引入的一项实验性功能,旨在解决 Nix 生态系统许多领域的改进问题:它们为 Nix 项目提供了一个统一结构、允许固定每个依赖项的特定版本并通过锁文件共享这些依赖项,同时总体上使编写可复现的 Nix 表达式变得更加方便。

启用flake特性 @

在 NixOS 中启用 Flakes 非常简单,只需在 configuration.nix 中添加一行配置:

# enable flakes
nix.settings.experimental-features = [ "nix-command" "flakes" ];

在启用了 Flakes 特性后,sudo nixos-rebuild switch 命令会优先读取 /etc/nixos/flake.nix 文件,如果找不到再尝试使用 /etc/nixos/configuration.nix。

flake结构简介 @

使用 nix flake init 命令来生成一个非常基础的 flake 文件,这将在当前目录下创建一个名为 flake.nix 的文件。

# nix flake init 
{
  description = "A very basic flake";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
  };

  outputs = { self, nixpkgs }: {

    packages.x86_64-linux.hello = nixpkgs.legacyPackages.x86_64-linux.hello;

    packages.x86_64-linux.default = self.packages.x86_64-linux.hello;

  };
}

一个最小化的 flake 文件包含该 flake 的描述(description),一组输入依赖项(inputs)和一个输出(outputs)。

生成 flake.lock @

首次创建 Flake 时,在其当前目录运行以下命令生成 flake.lock

nix flake update

flake.lock 会锁定所有依赖的精确版本,确保可重现性,如果你会golang语言,这个其实和go.sum类似。

使用 Flake 构建系统 @

这部分命令可以先简单熟悉下,后续会经常使用

# 查看可用的 NixOS 配置
nix flake show

# 构建并切换到配置
sudo nixos-rebuild switch --flake .#your-hostname

# 更新依赖
nix flake update

# 查看配置差异
nixos-rebuild dry-build --flake .#your-hostname

home-manager介绍 @

Home Manager 是一个用于管理用户级配置的工具,可以管理用户家目录中的文件、dotfiles、软件包、环境变量等。它与 NixOS 系统配置互补,专注于用户个性化的配置。

安装home-manager @

一般会将home manager作为NixOS模块安装,首先在 flake.nix 中添加 home-manager 输入,以下是我的一个示例:

{
  description = "NixOS Test";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";

    # 1. 引入 home-manager 模块
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { self, nixpkgs, home-manager, ... }@inputs:    # 2. outputs 引入 home-manager
  {
    # 我的主配置
    nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";

      modules = [
        ./configuration.nix
        ./hardware-configuration.nix

        # 3. 配置 Home Manager
        home-manager.nixosModules.home-manager
        {
          home-manager.useGlobalPkgs = true;
          home-manager.useUserPackages = true;
          home-manager.users.lznauy = import ./home.nix;        # lznauy需要替换成你的用户名
        }
      ];

      specialArgs = { inherit inputs; };
    };

    # 也可以添加其他配置,这个name是自定义的,比如test
    # nixosConfigurations.test = nixpkgs.lib.nixosSystem {
    #   system = "x86_64-linux";
    #   modules = [];
    # };

  };
}

然后执行命令sudo nixos-rebuild switch --flake .#nixos即可应用配置变更。

创建home.nix配置文件 @

创建 users/username/home.nix 文件,以下是我的一份配置示例:

{ config, pkgs, ... }:
{
  home.stateVersion = "26.05";

  # ====================== 用户软件包 ======================
  home.packages = with pkgs; [
    fastfetch
    tree
    fd
    ripgrep
    git
    gcc
    gnumake
    nodejs
    python3
  ];

  # ====================== Git 配置 ======================
  programs.git = {
    enable = true;
    settings.user.name = "lznauy";
    settings.user.email = "lznauyfine@gmail.com";
  };
}

使用home-manager配置Zsh以及powerlevel10k主题 @

Zsh 是我很喜欢的 Shell,配合 powerlevel10k 主题非常美观,首先在系统配置 configuration.nix 中启用zsh:

programs.zsh.enable = true;
users.users.lznauy.shell = pkgs.zsh;    # lznauy换成你自己的用户名

然后在home.nix中配置如下:


  # 添加zsh-powerlevel10k主题
  home.packages = with pkgs; [
    zsh-powerlevel10k
  ];
  
  # Zsh 配置
  home.shell.enableZshIntegration = true;
  programs.zsh = {
    enable = true;
    initContent = ''
      source ${pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k/powerlevel10k.zsh-theme

      # 将你的p10k.zsh配置文件也放到当前目录
      [[ -f ~/.p10k.zsh ]] && source ~/.p10k.zsh
    '';
    autosuggestion.enable = true;
    syntaxHighlighting.enable = true;
    oh-my-zsh = {
      enable = true;
      plugins = [ "git" ];
    };
  };
  home.file.".p10k.zsh".source = ./p10k.zsh;

这样即可完成Zsh的基础配置,并且使用powerlevel10k主题进行美化。

使用home-manager安装NvChad @

我折腾了挺久安装nvchad,目前还没玩明白,但github有一个现成的叫 nix4nvchad项目,可以直接使用flake引入安装. 根据其文档首先在flake.nix 引入:

{
  description = "Test";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";

    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    # 添加nix4nvchad输入
    nix4nvchad = {
      url = "github:nix-community/nix4nvchad";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { self, nixpkgs, home-manager, nix4nvchad, ... }@inputs:        # 添加nix4nvchad
  { 
    nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";

      modules = [
        ./configuration.nix
        ./hardware-configuration.nix

        home-manager.nixosModules.home-manager
        {
          home-manager.useGlobalPkgs = true;
          home-manager.useUserPackages = true;

          # 导入 nix4nvchad 模块
          home-manager.sharedModules = [
            inputs.nix4nvchad.homeManagerModules.default
          ];

          home-manager.users.lznauy = import ./home.nix;
        }
      ];

      specialArgs = { inherit inputs; };
    };
  };
}

然后在home.nix中配置如下:

  programs.nvchad = {
    enable = true;
    hm-activation = true;
    backup = false;

    extraConfig = ''
      vim.opt.number = true
      vim.opt.relativenumber = true
    '';
  };

最终效果如下 nvchad

内容总结 @

通过 Flake 和 Home Manager 的结合使用,我们可以实现:

  • 声明式配置:整个系统都可以通过配置文件来管理
  • 可重现性:相同的配置可以在任何机器上复现
  • 版本控制:所有配置都可以纳入 Git 版本控制
  • 模块化:不同模块可以独立管理,按需组合
  • 用户隔离:用户配置与系统配置分离