this repo has no description

use programs.zsh, programs.git, programs.neovim instead of raw symlinks

- shellAliases + initContent replace config/zsh/{zshrc,aliases}
- programs.git.settings replaces config/git/config
- programs.neovim with vimAlias
- mkOutOfStoreSymlink for nvim (lazy-lock.json stays writable)
- platform conditionals: zed alias (darwin), credential.helper (darwin)
- ghistory, pid2port, mern moved to utils as proper functions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

+198 -219
+19 -8
README.md
··· 8 # 1. install nix (if not present) 9 curl -L https://nixos.org/nix/install | sh 10 11 - # 2. clone 12 - git clone https://tangled.sh/@zzstoatzz/dotfiles ~/dotfiles 13 - cd ~/dotfiles 14 15 # 3. apply (detects system automatically) 16 SYSTEM=$(nix eval --raw nixpkgs#system) ··· 29 **terminal**: wezterm (linux only — on mac install via .dmg) 30 **fonts**: fira code nerd font 31 32 ## layout 33 34 ``` 35 flake.nix — nix entry point 36 - home.nix — packages + config symlinks 37 config/ 38 - zsh/ — zshrc, aliases, utils 39 - nvim/ — kickstart.nvim config 40 tmux/ — tmux.conf (prefix: ctrl-a) 41 wezterm/ — wezterm.lua 42 ohmyposh/ — zen.toml prompt theme 43 atuin/ — shell history config 44 - git/ — portable gitconfig 45 bin/ 46 disk-breakdown — disk usage visualizer (macOS) 47 ``` 48 49 ## updating 50 51 - edit files in this repo, then: 52 53 ```bash 54 home-manager switch --flake . 55 ```
··· 8 # 1. install nix (if not present) 9 curl -L https://nixos.org/nix/install | sh 10 11 + # 2. clone (the repo path matters — nvim config uses mkOutOfStoreSymlink) 12 + git clone https://tangled.sh/@zzstoatzz/dotfiles ~/tangled.sh/@zzstoatzz/dotfiles 13 + cd ~/tangled.sh/@zzstoatzz/dotfiles 14 15 # 3. apply (detects system automatically) 16 SYSTEM=$(nix eval --raw nixpkgs#system) ··· 29 **terminal**: wezterm (linux only — on mac install via .dmg) 30 **fonts**: fira code nerd font 31 32 + ## how it works 33 + 34 + home-manager generates `~/.zshrc` and `~/.gitconfig` from nix declarations in 35 + `home.nix` — aliases, history, completions, git user/editor are all configured 36 + there. shell functions live in `config/zsh/utils` and get symlinked to `~/.utils`. 37 + 38 + neovim config uses `mkOutOfStoreSymlink` so `~/.config/nvim` points directly at 39 + this repo's `config/nvim/` — edits take effect immediately and lazy-lock.json 40 + stays writable. 41 + 42 ## layout 43 44 ``` 45 flake.nix — nix entry point 46 + home.nix — programs.zsh, programs.git, packages, file symlinks 47 config/ 48 + zsh/utils — shell functions (gbre, git_exclude, ghistory, etc.) 49 + nvim/ — kickstart.nvim config (mutable symlink) 50 tmux/ — tmux.conf (prefix: ctrl-a) 51 wezterm/ — wezterm.lua 52 ohmyposh/ — zen.toml prompt theme 53 atuin/ — shell history config 54 bin/ 55 disk-breakdown — disk usage visualizer (macOS) 56 ``` 57 58 ## updating 59 60 + edit config in this repo, then: 61 62 ```bash 63 home-manager switch --flake . 64 ``` 65 + 66 + for changes to `config/nvim/` — no rebuild needed, it's a direct symlink.
-11
config/git/config
··· 1 - [user] 2 - email = thrast36@gmail.com 3 - name = zzstoatzz 4 - [http] 5 - postBuffer = 524288000 6 - [push] 7 - autoSetupRemote = true 8 - [core] 9 - editor = nvim 10 - [sequence] 11 - editor = nvim
···
-81
config/zsh/aliases
··· 1 - # --- editor ---------------------------------------------------------------- 2 - alias vim='nvim' 3 - 4 - # --- git ------------------------------------------------------------------- 5 - alias gp='git push' 6 - alias gpl='git pull' 7 - alias gst='git status' 8 - alias gsw='git switch' 9 - alias gco='git checkout' 10 - alias ga='git add' 11 - alias gcmsg='git commit -m' 12 - alias grm='git rebase main' 13 - alias gpfl='git push --force-with-lease' 14 - alias gwta='git worktree add' 15 - alias ghistory="git log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%an%C(reset)%C(bold yellow)%d%C(reset) %C(dim white)- %s%C(reset)' --all" 16 - 17 - # --- navigation ------------------------------------------------------------ 18 - alias ..='cd ..' 19 - alias ...='cd ../..' 20 - alias ....='cd ../../..' 21 - alias .....='cd ../../../..' 22 - 23 - # --- listing / files ------------------------------------------------------- 24 - alias l='ls -lah' 25 - alias rgf="rg --files | rg" 26 - alias ffile='l -R | ag' 27 - 28 - # --- tmux / tools ---------------------------------------------------------- 29 - alias t='tmux' 30 - alias m='mitmproxy' 31 - alias k='kubectl' 32 - alias konfig='kubectl config' 33 - alias tf='terraform' 34 - alias ipy='ipython' 35 - alias murder='kill -9' 36 - 37 - # --- docker ---------------------------------------------------------------- 38 - alias composeupf="docker compose up --build -d --remove-orphans && docker compose logs -f" 39 - 40 - # --- network --------------------------------------------------------------- 41 - alias whosthere='lsof -iTCP -sTCP:LISTEN' 42 - alias hosts="cat ~/.ssh/config | ag Host --nocolor" 43 - alias pid2port='f() { lsof -nP -iTCP -sTCP:LISTEN | rg "$(ps aux | rg "$1" | awk '"'"'{print $2}'"'"' | paste -sd '"'"'|'"'"' -)"; }; f' 44 - 45 - # --- python ---------------------------------------------------------------- 46 - alias cpc='uvx copychat' 47 - alias psw="uvx prefect cloud workspace set" 48 - 49 - # --- info ------------------------------------------------------------------ 50 - alias mern="echo 'User: $(whoami), Host: $(hostname), IP: '$(ifconfig | rg -o 'inet (\d{1,3}\.){3}\d{1,3}' | rg -v '127.0.0.1' | rg -v '255$' | rg -o '(\d{1,3}\.){3}\d{1,3}')" 51 - 52 - # --- custom scripts -------------------------------------------------------- 53 - alias lights='~/tangled.sh/@zzstoatzz.io/scripts/update-lights' 54 - 55 - # --- typo fixes ------------------------------------------------------------ 56 - alias clera='clear' 57 - alias claer='clear' 58 - alias cleara='clear' 59 - alias cleawr='clear' 60 - alias celar='clear' 61 - alias dlear='clear' 62 - alias vlear='clear' 63 - alias xlear='clear' 64 - alias cpear='clear' 65 - alias cmear='clear' 66 - alias ckear='clear' 67 - alias clesr='clear' 68 - alias clezr='clear' 69 - alias cleqr='clear' 70 - alias cleae='clear' 71 - alias cleat='clear' 72 - alias cleag='clear' 73 - alias cleaf='clear' 74 - alias claew='clear' 75 - alias clea='clear' 76 - alias clae='clear' 77 - 78 - # --- platform-conditional -------------------------------------------------- 79 - if [[ "$OSTYPE" == darwin* ]]; then 80 - alias zed="open -a /Applications/Zed.app -n" 81 - fi
···
+19 -13
config/zsh/utils
··· 1 - function gbre() { 2 local count=${1:-10} 3 local email=${2:-"thrast36@gmail.com"} 4 ··· 11 git_exclude() { 12 echo "$1" >> .git/info/exclude 13 } 14 - 15 16 mv_ext() { 17 if [ "$#" -ne 3 ]; then ··· 33 echo "Renamed all .$from_ext files to .$to_ext in $dir" 34 } 35 36 - 37 - 38 git_rebase_main() { 39 current_branch=$(git branch --show-current) 40 git checkout main ··· 43 git rebase main 44 } 45 46 - 47 - 48 find_err() { 49 local package=$1 50 local command=$2 51 local start_version=$3 52 local reverse=$4 53 54 - # Get and sort versions, using sort -u to remove duplicates 55 versions=($(pip index versions "$package" | rg -o '\d+\.\d+\.\d+' | sort -V -u)) 56 if [[ "$reverse" == "reverse" ]]; then 57 versions=($(echo "${versions[@]}" | tr ' ' '\n' | sort -rV -u)) 58 fi 59 60 - # Print header 61 - echo "📦 Testing $package versions starting from $start_version" 62 - echo "🔍 Command: $command" 63 echo "-------------------------------------------" 64 65 local start=false ··· 70 start=true 71 printf "Testing v%-10s" "$version" 72 73 - # Run the command silently 74 if output=$(uv run --with "$package==$version" python -c "$command" 2>&1); then 75 - echo " ✅" 76 last_working_version=$version 77 else 78 - echo " ❌" 79 echo -e "\nFirst failing version: $version" 80 echo "Last working version: $last_working_version" 81 echo -e "\nError:" ··· 85 fi 86 done 87 }
··· 1 + gbre() { 2 local count=${1:-10} 3 local email=${2:-"thrast36@gmail.com"} 4 ··· 11 git_exclude() { 12 echo "$1" >> .git/info/exclude 13 } 14 15 mv_ext() { 16 if [ "$#" -ne 3 ]; then ··· 32 echo "Renamed all .$from_ext files to .$to_ext in $dir" 33 } 34 35 git_rebase_main() { 36 current_branch=$(git branch --show-current) 37 git checkout main ··· 40 git rebase main 41 } 42 43 find_err() { 44 local package=$1 45 local command=$2 46 local start_version=$3 47 local reverse=$4 48 49 versions=($(pip index versions "$package" | rg -o '\d+\.\d+\.\d+' | sort -V -u)) 50 if [[ "$reverse" == "reverse" ]]; then 51 versions=($(echo "${versions[@]}" | tr ' ' '\n' | sort -rV -u)) 52 fi 53 54 + echo "Testing $package versions starting from $start_version" 55 + echo "Command: $command" 56 echo "-------------------------------------------" 57 58 local start=false ··· 63 start=true 64 printf "Testing v%-10s" "$version" 65 66 if output=$(uv run --with "$package==$version" python -c "$command" 2>&1); then 67 + echo " ok" 68 last_working_version=$version 69 else 70 + echo " FAIL" 71 echo -e "\nFirst failing version: $version" 72 echo "Last working version: $last_working_version" 73 echo -e "\nError:" ··· 77 fi 78 done 79 } 80 + 81 + # --- moved from aliases (complex quoting) --- 82 + 83 + ghistory() { 84 + git log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%an%C(reset)%C(bold yellow)%d%C(reset) %C(dim white)- %s%C(reset)' --all 85 + } 86 + 87 + pid2port() { 88 + lsof -nP -iTCP -sTCP:LISTEN | rg "$(ps aux | rg "$1" | awk '{print $2}' | paste -sd '|' -)" 89 + } 90 + 91 + mern() { 92 + echo "User: $(whoami), Host: $(hostname), IP: $(ifconfig | rg -o 'inet (\d{1,3}\.){3}\d{1,3}' | rg -v '127.0.0.1' | rg -v '255$' | rg -o '(\d{1,3}\.){3}\d{1,3}')" 93 + }
-81
config/zsh/zshrc
··· 1 - # --- personal config ------------------------------------------------------- 2 - source ~/.aliases 3 - source ~/.utils 4 - 5 - # --- general settings ------------------------------------------------------ 6 - CASE_SENSITIVE="true" 7 - COMPLETION_WAITING_DOTS="true" 8 - 9 - WORDCHARS="*?_-.[]~=/&<>' " 10 - 11 - autoload -Uz select-word-style 12 - select-word-style normal 13 - zstyle ':zle:*' word-style unspecified 14 - 15 - # --- prompt ---------------------------------------------------------------- 16 - eval "$(oh-my-posh init zsh --config $HOME/.config/ohmyposh/zen.toml)" 17 - 18 - # --- plugins (nix-managed) ------------------------------------------------- 19 - if [ -d "$HOME/.nix-profile/share/zsh-autosuggestions" ]; then 20 - source "$HOME/.nix-profile/share/zsh-autosuggestions/zsh-autosuggestions.zsh" 21 - elif [ -d "/run/current-system/sw/share/zsh-autosuggestions" ]; then 22 - source "/run/current-system/sw/share/zsh-autosuggestions/zsh-autosuggestions.zsh" 23 - elif [ -f "${HOMEBREW_PREFIX:-/opt/homebrew}/share/zsh-autosuggestions/zsh-autosuggestions.zsh" ]; then 24 - source "${HOMEBREW_PREFIX:-/opt/homebrew}/share/zsh-autosuggestions/zsh-autosuggestions.zsh" 25 - fi 26 - 27 - if [ -d "$HOME/.nix-profile/share/zsh-syntax-highlighting" ]; then 28 - source "$HOME/.nix-profile/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" 29 - elif [ -d "/run/current-system/sw/share/zsh-syntax-highlighting" ]; then 30 - source "/run/current-system/sw/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" 31 - elif [ -f "${HOMEBREW_PREFIX:-/opt/homebrew}/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" ]; then 32 - source "${HOMEBREW_PREFIX:-/opt/homebrew}/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" 33 - fi 34 - 35 - # autojump 36 - [ -f "$HOME/.nix-profile/share/autojump/autojump.zsh" ] && source "$HOME/.nix-profile/share/autojump/autojump.zsh" 37 - [ -f "${HOMEBREW_PREFIX:-/opt/homebrew}/etc/profile.d/autojump.sh" ] && source "${HOMEBREW_PREFIX:-/opt/homebrew}/etc/profile.d/autojump.sh" 38 - 39 - # --- completions ----------------------------------------------------------- 40 - autoload -Uz compinit 41 - zstyle ':completion:*' menu select 42 - compinit 43 - fpath+=~/.zfunc 44 - 45 - # --- history --------------------------------------------------------------- 46 - HISTFILE=~/.zsh_history 47 - HISTSIZE=100000 48 - SAVEHIST=100000 49 - 50 - setopt APPEND_HISTORY 51 - setopt INC_APPEND_HISTORY 52 - setopt HIST_IGNORE_DUPS 53 - setopt HIST_IGNORE_SPACE 54 - setopt SHARE_HISTORY 55 - 56 - # --- limits ---------------------------------------------------------------- 57 - ulimit -n 4096 58 - 59 - # --- tool completions ------------------------------------------------------ 60 - command -v uv &>/dev/null && eval "$(uv generate-shell-completion zsh)" 61 - command -v uvx &>/dev/null && eval "$(uvx --generate-shell-completion zsh)" 62 - 63 - _uv_run_mod() { 64 - if [[ "$words[2]" == "run" && "$words[CURRENT]" != -* ]]; then 65 - _arguments '*:filename:_files' 66 - else 67 - _uv "$@" 68 - fi 69 - } 70 - compdef _uv_run_mod uv 71 - 72 - _uvx_run_mod() { 73 - if [[ $CURRENT -gt 2 ]]; then 74 - _arguments '*:filename:_files' 75 - fi 76 - } 77 - compdef _uvx_run_mod uvx 78 - 79 - # --- path additions (non-nix tools) ---------------------------------------- 80 - [ -d "$HOME/bin" ] && export PATH="$HOME/bin:$PATH" 81 - [ -d "$HOME/.local/bin" ] && export PATH="$HOME/.local/bin:$PATH"
···
+160 -25
home.nix
··· 1 - { pkgs, isDarwin, ... }: 2 3 { 4 home.username = "nate"; 5 home.homeDirectory = if isDarwin then "/Users/nate" else "/home/nate"; ··· 11 12 home.packages = with pkgs; [ 13 # core shell 14 - zsh 15 oh-my-posh 16 tmux 17 - neovim 18 19 # search / nav 20 ripgrep ··· 26 autojump 27 28 # dev basics 29 - git 30 gh 31 curl 32 wget ··· 40 nodejs_22 41 deno 42 bun 43 - 44 - # zsh plugins (sourced in zshrc) 45 - zsh-autosuggestions 46 - zsh-syntax-highlighting 47 48 # fonts 49 nerd-fonts.fira-code 50 - ] ++ pkgs.lib.optionals (!isDarwin) [ 51 wezterm 52 ]; 53 ··· 59 CARGO_NEW_EDITION = "2024"; 60 }; 61 62 # --- file symlinks ------------------------------------------------------- 63 64 home.file = { 65 - # zsh 66 - ".zshrc".source = ./config/zsh/zshrc; 67 - ".aliases".source = ./config/zsh/aliases; 68 ".utils".source = ./config/zsh/utils; 69 70 # oh-my-posh ··· 76 # wezterm 77 ".wezterm.lua".source = ./config/wezterm/wezterm.lua; 78 79 - # neovim 80 - ".config/nvim/init.lua".source = ./config/nvim/init.lua; 81 - ".config/nvim/lazy-lock.json".source = ./config/nvim/lazy-lock.json; 82 - ".config/nvim/.stylua.toml".source = ./config/nvim/.stylua.toml; 83 - ".config/nvim/doc/kickstart.txt".source = ./config/nvim/doc/kickstart.txt; 84 - ".config/nvim/lua/custom/plugins/init.lua".source = ./config/nvim/lua/custom/plugins/init.lua; 85 - ".config/nvim/lua/kickstart/health.lua".source = ./config/nvim/lua/kickstart/health.lua; 86 - ".config/nvim/lua/kickstart/plugins/debug.lua".source = ./config/nvim/lua/kickstart/plugins/debug.lua; 87 - ".config/nvim/lua/kickstart/plugins/indent_line.lua".source = ./config/nvim/lua/kickstart/plugins/indent_line.lua; 88 - 89 # atuin 90 ".config/atuin/config.toml".source = ./config/atuin/config.toml; 91 - 92 - # git 93 - ".gitconfig".source = ./config/git/config; 94 95 # bin 96 "bin/disk-breakdown" = {
··· 1 + { pkgs, lib, isDarwin, config, ... }: 2 3 + let 4 + dotfilesDir = "${config.home.homeDirectory}/tangled.sh/@zzstoatzz/dotfiles"; 5 + in 6 { 7 home.username = "nate"; 8 home.homeDirectory = if isDarwin then "/Users/nate" else "/home/nate"; ··· 14 15 home.packages = with pkgs; [ 16 # core shell 17 oh-my-posh 18 tmux 19 20 # search / nav 21 ripgrep ··· 27 autojump 28 29 # dev basics 30 gh 31 curl 32 wget ··· 40 nodejs_22 41 deno 42 bun 43 44 # fonts 45 nerd-fonts.fira-code 46 + ] ++ lib.optionals (!isDarwin) [ 47 wezterm 48 ]; 49 ··· 55 CARGO_NEW_EDITION = "2024"; 56 }; 57 58 + # --- zsh ----------------------------------------------------------------- 59 + 60 + programs.zsh = { 61 + enable = true; 62 + enableCompletion = true; 63 + autosuggestion.enable = true; 64 + syntaxHighlighting.enable = true; 65 + 66 + history = { 67 + size = 100000; 68 + save = 100000; 69 + path = "$HOME/.zsh_history"; 70 + ignoreDups = true; 71 + ignoreSpace = true; 72 + share = true; 73 + append = true; 74 + }; 75 + 76 + shellAliases = { 77 + # git 78 + gp = "git push"; 79 + gpl = "git pull"; 80 + gst = "git status"; 81 + gsw = "git switch"; 82 + gco = "git checkout"; 83 + ga = "git add"; 84 + gcmsg = "git commit -m"; 85 + grm = "git rebase main"; 86 + gpfl = "git push --force-with-lease"; 87 + gwta = "git worktree add"; 88 + 89 + # navigation 90 + ".." = "cd .."; 91 + "..." = "cd ../.."; 92 + "...." = "cd ../../.."; 93 + "....." = "cd ../../../.."; 94 + 95 + # listing 96 + l = "ls -lah"; 97 + rgf = "rg --files | rg"; 98 + 99 + # tools 100 + t = "tmux"; 101 + m = "mitmproxy"; 102 + k = "kubectl"; 103 + konfig = "kubectl config"; 104 + tf = "terraform"; 105 + ipy = "ipython"; 106 + murder = "kill -9"; 107 + 108 + # docker 109 + composeupf = "docker compose up --build -d --remove-orphans && docker compose logs -f"; 110 + 111 + # network 112 + whosthere = "lsof -iTCP -sTCP:LISTEN"; 113 + hosts = "cat ~/.ssh/config | rg Host"; 114 + 115 + # python 116 + cpc = "uvx copychat"; 117 + psw = "uvx prefect cloud workspace set"; 118 + 119 + # custom scripts 120 + lights = "~/tangled.sh/@zzstoatzz.io/scripts/update-lights"; 121 + 122 + # typo fixes 123 + clera = "clear"; claer = "clear"; cleara = "clear"; cleawr = "clear"; 124 + celar = "clear"; dlear = "clear"; vlear = "clear"; xlear = "clear"; 125 + cpear = "clear"; cmear = "clear"; ckear = "clear"; clesr = "clear"; 126 + clezr = "clear"; cleqr = "clear"; cleae = "clear"; cleat = "clear"; 127 + cleag = "clear"; cleaf = "clear"; claew = "clear"; clea = "clear"; 128 + clae = "clear"; 129 + } // lib.optionalAttrs isDarwin { 130 + zed = "open -a /Applications/Zed.app -n"; 131 + }; 132 + 133 + initContent = '' 134 + # word style 135 + WORDCHARS="*?_-.[]~=/&<>' " 136 + autoload -Uz select-word-style 137 + select-word-style normal 138 + zstyle ':zle:*' word-style unspecified 139 + zstyle ':completion:*' menu select 140 + 141 + # prompt 142 + eval "$(oh-my-posh init zsh --config $HOME/.config/ohmyposh/zen.toml)" 143 + 144 + # autojump 145 + [ -f "$HOME/.nix-profile/share/autojump/autojump.zsh" ] && source "$HOME/.nix-profile/share/autojump/autojump.zsh" 146 + [ -f "''${HOMEBREW_PREFIX:-/opt/homebrew}/etc/profile.d/autojump.sh" ] && source "''${HOMEBREW_PREFIX:-/opt/homebrew}/etc/profile.d/autojump.sh" 147 + 148 + # limits 149 + ulimit -n 4096 150 + 151 + # tool completions 152 + command -v uv &>/dev/null && eval "$(uv generate-shell-completion zsh)" 153 + command -v uvx &>/dev/null && eval "$(uvx --generate-shell-completion zsh)" 154 + 155 + _uv_run_mod() { 156 + if [[ "$words[2]" == "run" && "$words[CURRENT]" != -* ]]; then 157 + _arguments '*:filename:_files' 158 + else 159 + _uv "$@" 160 + fi 161 + } 162 + compdef _uv_run_mod uv 163 + 164 + _uvx_run_mod() { 165 + if [[ $CURRENT -gt 2 ]]; then 166 + _arguments '*:filename:_files' 167 + fi 168 + } 169 + compdef _uvx_run_mod uvx 170 + 171 + # shell functions 172 + source ~/.utils 173 + 174 + # optional machine-local env 175 + [ -f ~/.env ] && source ~/.env 176 + 177 + # path additions (non-nix tools) 178 + [ -d "$HOME/bin" ] && export PATH="$HOME/bin:$PATH" 179 + [ -d "$HOME/.local/bin" ] && export PATH="$HOME/.local/bin:$PATH" 180 + ''; 181 + }; 182 + 183 + # --- git ----------------------------------------------------------------- 184 + 185 + programs.git = { 186 + enable = true; 187 + settings = { 188 + user = { 189 + name = "zzstoatzz"; 190 + email = "thrast36@gmail.com"; 191 + }; 192 + push.autoSetupRemote = true; 193 + http.postBuffer = 524288000; 194 + core.editor = "nvim"; 195 + sequence.editor = "nvim"; 196 + } // lib.optionalAttrs isDarwin { 197 + credential.helper = "osxkeychain"; 198 + }; 199 + }; 200 + 201 + # --- neovim -------------------------------------------------------------- 202 + 203 + programs.neovim = { 204 + enable = true; 205 + vimAlias = true; 206 + }; 207 + 208 + # neovim config — mutable symlink so lazy-lock.json stays writable 209 + xdg.configFile."nvim".source = 210 + config.lib.file.mkOutOfStoreSymlink "${dotfilesDir}/config/nvim"; 211 + 212 # --- file symlinks ------------------------------------------------------- 213 214 home.file = { 215 + # shell functions 216 ".utils".source = ./config/zsh/utils; 217 218 # oh-my-posh ··· 224 # wezterm 225 ".wezterm.lua".source = ./config/wezterm/wezterm.lua; 226 227 # atuin 228 ".config/atuin/config.toml".source = ./config/atuin/config.toml; 229 230 # bin 231 "bin/disk-breakdown" = {