From e237c5dd4b96cd336a96afd94b158f25803fecc1 Mon Sep 17 00:00:00 2001 From: Spotlight Date: Tue, 4 Jul 2023 03:35:37 -0500 Subject: [PATCH] Migrate to nix flakes --- README.md | 23 +++--- flake.lock | 48 ++++++++++++ flake.nix | 51 +++++++++++++ home.nix | 192 ----------------------------------------------- home/desktop.nix | 51 +++++++++++++ home/editor.nix | 37 +++++++++ home/home.nix | 60 +++++++++++++++ home/prompt.nix | 65 ++++++++++++++++ 8 files changed, 326 insertions(+), 201 deletions(-) create mode 100644 flake.lock create mode 100644 flake.nix delete mode 100644 home.nix create mode 100644 home/desktop.nix create mode 100644 home/editor.nix create mode 100644 home/home.nix create mode 100644 home/prompt.nix diff --git a/README.md b/README.md index ecffe98..98f1b1e 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,19 @@ # Spotlight's dotfiles -On devices I consider personal, I like having a similar style within zsh. I heavily utilize macOS, BSD and various Linux, so it's important that these dotfiles work consistently across them all. +I heavily utilize macOS, BSD and various Linux distributions, so it's important that these dotfiles work consistently across them all. -I make heavy usage of Git submodules. Occasionally, these are updated. Please ensure when pulling my dotfiles that you also `git submodule update`. +As such, I utilize [Nix](https://nixos.org) with [home-manager](https://github.com/nix-community/home-manager). + + +## Expectations +Please don't consider this a great basis for your own configuration - it works well for me! +As such, some things may make assumptions you would not as well :) ## Installation -``` -git clone --recursive https://git.joscomputing.space/spotlight/dotfiles ~/.dotfiles -cp ~/.dotfiles/dotfilesrc ~/.dotfilesrc -pip3 install dotfiles -dotfiles --sync --force -``` +This may require things to be adapted based on the platform. -This creates a symbolic link from any file or directory within `~/.dotfiles/` to their respective place in `~/`. I prefer the `.dotfilesrc` to be managed as well. +``` +git clone https://git.joscomputing.space/spotlight/dotfiles ~/.config/home-manager +# Or as otherwise described for flake usage within the Home Manager manual: +# https://nix-community.github.io/home-manager/index.html#sec-flakes-standalone +nix run home-manager/master -- init --switch +``` diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..dfad212 --- /dev/null +++ b/flake.lock @@ -0,0 +1,48 @@ +{ + "nodes": { + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1688409282, + "narHash": "sha256-nnVCN5QiZ5+DEc70PRQLEcxqlxtsmeBU1BnpsRPUJlA=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "c24deeca64538dcbc589ed8da9146e4ca9eb85b7", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1688231357, + "narHash": "sha256-ZOn16X5jZ6X5ror58gOJAxPfFLAQhZJ6nOUeS4tfFwo=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "645ff62e09d294a30de823cb568e9c6d68e92606", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..8ca3ab0 --- /dev/null +++ b/flake.nix @@ -0,0 +1,51 @@ +{ + description = "Spotlight's dotfiles"; + + inputs = { + # Specify the source of Home Manager and Nixpkgs. + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = { nixpkgs, home-manager, ... }: + let + homeManager = { system, specialArgs ? { + dotfilesOnly = false; + } }: + home-manager.lib.homeManagerConfiguration { + modules = [ + ./home/home.nix + ]; + pkgs = nixpkgs.legacyPackages.${system}; + extraSpecialArgs = specialArgs; + }; + in { + packages = { + # We currently assume that all x86_64-linux devices only + # require dotfiles. For now, this is mostly true :) + x86_64-linux.homeConfigurations.spotlight = homeManager { + system = "x86_64-linux"; + specialArgs.dotfilesOnly = true; + }; + + # Similarly (as of writing), all aarch64 Linux devices are headless + # and primarily managed by other distro package managers. + # This should likely be dealt with in the future! + aarch64-linux.homeConfigurations.spotlight = homeManager { + system = "aarch64-linux"; + specialArgs.dotfilesOnly = true; + }; + + # For all architecture variants of Darwin, we don't want only dotfiles. + aarch64-darwin.homeConfigurations.spot = homeManager { + system = "aarch64-darwin"; + }; + x86_64-darwin.homeConfigurations.spot = homeManager { + system = "x86_64-darwin"; + }; + }; + }; +} diff --git a/home.nix b/home.nix deleted file mode 100644 index 80eb3e9..0000000 --- a/home.nix +++ /dev/null @@ -1,192 +0,0 @@ -{ config, lib, pkgs, ... }: - -# In order to allow reuse of the iTerm2 shell integrations repo -# for both its utility symlinks and zsh initialization plugin, -# we define how to fetch it here. -let - iterm2_shell_integration = pkgs.fetchFromGitHub { - owner = "gnachman"; - repo = "iTerm2-shell-integration"; - rev = "6554045b1184b213fdc9d731a45e8a75858291de"; - sha256 = "yhgowvJfxVdJE1yVYPWnJYvzhMsPc+HgkmDa++CcTDo="; - }; -in { - # Home Manager needs a bit of information about you and the - # paths it should manage. - # TODO(spotlightishere): Is there a cleaner approach? - home.username = if pkgs.stdenv.isDarwin then - "spot" - else - "spotlight"; - - home.homeDirectory = if pkgs.stdenv.isDarwin then - "/Users/spot" - else - "/home/spotlight"; - - home.packages = with pkgs; [ - cloc - croc - exiftool - ffmpeg - go - google-cloud-sdk - gradle - htop - imagemagick - jadx - jdk - jq - mtr - ncdu - nixopsUnstable - p7zip - pngcrush - pry - protobuf - pwgen - rustup - tmux - unar - virt-manager - watch - wget - yt-dlp - ]; - - # Git - programs.git = { - enable = true; - lfs.enable = true; - - userName = "Spotlight"; - userEmail = "spotlight@joscomputing.space"; - signing = { - key = "6EF6CBB6420B81DA3CCACFEA874AA355B3209BDC"; - signByDefault = true; - }; - extraConfig = { - color.ui = "auto"; - pull.rebase = true; - init.defaultBranch = "main"; - }; - }; - - # GPG - programs.gpg.enable = true; - home.file.".gnupg/gpg-agent.conf" = lib.mkIf pkgs.stdenv.isDarwin { - text = '' - pinentry-program "${pkgs.pinentry_mac}/Applications/pinentry-mac.app/Contents/MacOS/pinentry-mac" - ''; - }; - - # password-store - programs.password-store = { - enable = true; - package = pkgs.pass.withExtensions (exts: [exts.pass-otp]); - settings = { - PASSWORD_STORE_DIR = "${config.home.homeDirectory}/.password-store"; - }; - }; - - # Very opinionated :) - programs.zsh = { - enable = true; - - # We want several options: - autocd = true; - history = { - ignoreDups = true; - ignoreSpace = true; - }; - - # Common plugins. - enableAutosuggestions = true; - enableCompletion = true; - syntaxHighlighting.enable = true; - plugins = with pkgs; [ - { - name = "expand-multiple-dots"; - src = ./zsh/expand-multiple-dots; - file = "expand-multiple-dots.zsh"; - } - { - name = "iterm2-shell-integration"; - src = iterm2_shell_integration; - file = "shell_integration/zsh"; - } - { - # Our zsh-powerlevel10k configuration file. - name = "p10k"; - src = ./zsh/p10k; - file = "p10k.zsh"; - } - ]; - - # We use powerlevel10k as our ZSH theme. - # By using the derivation in nixpkgs, we also get gitstatusd. - # The .p10k.zsh config is beneath. - initExtraBeforeCompInit = "source ${pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k/powerlevel10k.zsh-theme"; - }; - - programs.vim = { - enable = true; - # Let's not grab _all_ of Vim. - packageConfigurable = pkgs.vim; - plugins = with pkgs; [ - pkgs.vimPlugins.vim-airline - pkgs.vimPlugins.vim-airline-themes - pkgs.vimPlugins.vim-go - ]; - - settings = { - number = true; - - # Two-spaced tabs - shiftwidth = 2; - tabstop = 2; - expandtab = true; - }; - extraConfig = '' - syntax on - filetype plugin indent on - set backspace=indent,eol,start - - " assistance with space-oriented tabs - set softtabstop=2 - set smarttab - - " custom filetypes - autocmd BufNewFile,BufRead *.plist set syntax=xml - - " vim-airline - let g:airline_powerline_fonts = 1 - ''; - }; - - # We'd like to have the iTerm2 shell integration utilities in ~/.iterm2. - home.file.".iterm2".source = "${iterm2_shell_integration}/utilities"; - - programs.zsh.initExtra = '' - # pushd - setopt AUTO_PUSHD - - # History search, but from beginning - bindkey "^[[A" history-beginning-search-backward - bindkey "^[[B" history-beginning-search-forward - ''; - - # This value determines the Home Manager release that your - # configuration is compatible with. This helps avoid breakage - # when a new Home Manager release introduces backwards - # incompatible changes. - # - # You can update Home Manager without changing this value. See - # the Home Manager release notes for a list of state version - # changes in each release. - home.stateVersion = "22.11"; - - # Let Home Manager install and manage itself. - programs.home-manager.enable = true; -} - diff --git a/home/desktop.nix b/home/desktop.nix new file mode 100644 index 0000000..5077425 --- /dev/null +++ b/home/desktop.nix @@ -0,0 +1,51 @@ +{ config, lib, pkgs, ... }: + +{ + # Commonly used packages. + home.packages = with pkgs; [ + cloc + croc + exiftool + ffmpeg + go + google-cloud-sdk + gradle + htop + imagemagick + jadx + jdk + jq + mtr + ncdu + nixopsUnstable + p7zip + pngcrush + pry + protobuf + pwgen + rustup + tmux + unar + virt-manager + watch + wget + yt-dlp + ]; + + # GPG + programs.gpg.enable = true; + home.file.".gnupg/gpg-agent.conf" = lib.mkIf pkgs.stdenv.isDarwin { + text = '' + pinentry-program "${pkgs.pinentry_mac}/Applications/pinentry-mac.app/Contents/MacOS/pinentry-mac" + ''; + }; + + # password-store + programs.password-store = { + enable = true; + package = pkgs.pass.withExtensions (exts: [exts.pass-otp]); + settings = { + PASSWORD_STORE_DIR = "${config.home.homeDirectory}/.password-store"; + }; + }; +} \ No newline at end of file diff --git a/home/editor.nix b/home/editor.nix new file mode 100644 index 0000000..8d708a3 --- /dev/null +++ b/home/editor.nix @@ -0,0 +1,37 @@ +{ config, lib, pkgs, ... }: + +{ + programs.vim = { + enable = true; + # Let's not grab _all_ of Vim. + packageConfigurable = pkgs.vim; + plugins = with pkgs; [ + pkgs.vimPlugins.vim-airline + pkgs.vimPlugins.vim-airline-themes + ]; + + settings = { + number = true; + + # Two-spaced tabs + shiftwidth = 2; + tabstop = 2; + expandtab = true; + }; + extraConfig = '' + syntax on + filetype plugin indent on + set backspace=indent,eol,start + + " assistance with space-oriented tabs + set softtabstop=2 + set smarttab + + " custom filetypes + autocmd BufNewFile,BufRead *.plist set syntax=xml + + " vim-airline + let g:airline_powerline_fonts = 1 + ''; + }; +} \ No newline at end of file diff --git a/home/home.nix b/home/home.nix new file mode 100644 index 0000000..78c7d35 --- /dev/null +++ b/home/home.nix @@ -0,0 +1,60 @@ +{ config, lib, pkgs, specialArgs, ... }: + +let + dotfilesOnly = specialArgs.dotfilesOnly; +in { + # It's standard convention that Darwin has the username + # "spot" - "spotlight" was reserved by the system at some point. + # (Sigh... the downsides of sharing a namesake.) + home.username = if pkgs.stdenv.isDarwin then + "spot" + else + "spotlight"; + + home.homeDirectory = if pkgs.stdenv.isDarwin then + "/Users/spot" + else + "/home/spotlight"; + + # Git + programs.git = { + enable = true; + lfs.enable = true; + + userName = "Spotlight"; + userEmail = "spotlight@joscomputing.space"; + # Only specify signing if GPG is otherwise being pulled in; + # i.e. not in a dotfiles only configuration. + signing = lib.mkIf dotfilesOnly { + key = "6EF6CBB6420B81DA3CCACFEA874AA355B3209BDC"; + signByDefault = true; + }; + extraConfig = { + color.ui = "auto"; + pull.rebase = true; + init.defaultBranch = "main"; + }; + }; + + # Only include the desktop configuration if not dotfiles only. + imports = [ + # zsh, etc + ./editor.nix + # vim, etc + ./prompt.nix + ] ++ (lib.optional (!dotfilesOnly) ./desktop.nix); + + # This value determines the Home Manager release that your + # configuration is compatible with. This helps avoid breakage + # when a new Home Manager release introduces backwards + # incompatible changes. + # + # You can update Home Manager without changing this value. See + # the Home Manager release notes for a list of state version + # changes in each release. + home.stateVersion = "22.11"; + + # Let Home Manager install and manage itself. + programs.home-manager.enable = true; +} + diff --git a/home/prompt.nix b/home/prompt.nix new file mode 100644 index 0000000..c372824 --- /dev/null +++ b/home/prompt.nix @@ -0,0 +1,65 @@ +{ config, lib, pkgs, ... }: +let + # In order to allow reuse of the iTerm2 shell integrations repo + # for both its utility symlinks and zsh initialization plugin, + # we define how to fetch it here. + iterm2_shell_integration = pkgs.fetchFromGitHub { + owner = "gnachman"; + repo = "iTerm2-shell-integration"; + rev = "6554045b1184b213fdc9d731a45e8a75858291de"; + sha256 = "yhgowvJfxVdJE1yVYPWnJYvzhMsPc+HgkmDa++CcTDo="; + }; +in { + # Very opinionated :) + programs.zsh = { + enable = true; + + # We want several options: + autocd = true; + history = { + ignoreDups = true; + ignoreSpace = true; + }; + + # Common plugins. + enableAutosuggestions = true; + enableCompletion = true; + syntaxHighlighting.enable = true; + plugins = with pkgs; [ + { + name = "expand-multiple-dots"; + src = ../zsh/expand-multiple-dots; + file = "expand-multiple-dots.zsh"; + } + { + name = "iterm2-shell-integration"; + src = iterm2_shell_integration; + file = "shell_integration/zsh"; + } + { + # Our zsh-powerlevel10k configuration file. + name = "p10k"; + src = ../zsh/p10k; + file = "p10k.zsh"; + } + ]; + + # We use powerlevel10k as our ZSH theme. + # By using the derivation in nixpkgs, we also get gitstatusd. + # The .p10k.zsh config is beneath. + initExtraBeforeCompInit = "source ${pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k/powerlevel10k.zsh-theme"; + + # Some custom configurations: + initExtra = '' + # pushd + setopt AUTO_PUSHD + + # History search, but from beginning + bindkey "^[[A" history-beginning-search-backward + bindkey "^[[B" history-beginning-search-forward + ''; + }; + + # We'd like to have the iTerm2 shell integration utilities in ~/.iterm2. + home.file.".iterm2".source = "${iterm2_shell_integration}/utilities"; +} \ No newline at end of file