Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

230 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

my::dotfiles

In the constant quest to remake every machine in your image, you need *nix config files. This repo is the "must have" set, packaged to install in one command.

Install

Run rake (or rake install) from inside the repository. Install works against your ~/ paths. It backs up anything it's about to clobber to a .bak file, but whatever questionable decisions you made before installing these are on you.

Keep the repository somewhere stable and permanent. Once installed, moving or deleting it breaks every symlink pointing back at it. Run rake uninstall before you relocate or remove it.

How it works

Everything installs through a small set of installer classes in lib/, each sharing the Installable concern (install / uninstall). The Rakefile is just a manifest listing what to install and how:

  • Dotfile — symlinks a repo file or directory into ~ with a dot prefix (git/gitignore_global~/.gitignore_global). from: names the source folder; as: overrides the target (the whole nvim/ dir → ~/.config/nvim).
  • AppConfig — symlinks into ~/.config/<app>/; sources mirror the target (config/alacritty/alacritty.toml~/.config/alacritty/alacritty.toml).
  • ShellConfig — the loader pattern (see below) for zshenv / zshrc.
  • GitConfig — the loader pattern via git's native [include] for gitconfig.
  • ClaudeConfig — symlinks into ~/.claude/ (CLAUDE.md, commands/, skills/) so Claude Code instructions and skills live in version control.
  • bin/ installs as a whole-dir symlink (~/.bin), like nvim/ — executables keep their mode via git, no per-file class needed.

Backups: if a real file already lives at the target, it's renamed to <file>.bak on install and restored on uninstall.

The loader pattern (.default + .local)

Files that other tools also write to — ~/.zshenv, ~/.zshrc, ~/.gitconfig — are not symlinked to the repo. Homebrew, mise, rustup and friends append to those files, and we don't want that landing in version control.

Instead, the repo owns a .default and each of these becomes a thin loader that pulls in two files in order:

~/.zshrc      (loader, tool-writable)
  ├── ~/.zshrc.default   → repo (shared config, version-controlled)
  └── ~/.zshrc.local     → this machine only (never in the repo)

.default holds shared logic. .local holds anything machine-specific — work credentials, $PATH tweaks, mise activate, SSL cert paths. Later wins, so .local overrides .default, and anything a tool appends to the loader itself overrides both.

The installer only creates a loader if one doesn't already exist, so it never stomps tool-managed lines on reinstall.

Shell config loading (zsh)

  (system) → ~/.zshenv          loader → .zshenv.default → .zshenv.local
  (system) → ~/.zshrc           loader → .zshrc.default  → .zshrc.local
    (.zshrc.default) → .git_prompt          (git status in the prompt)
    (.zshrc.default) → .aliases_shared      + .aliases_shared.local
    (.zshrc.default) → .zsh_aliases.local

.zshenv loads first (every shell), then .zshrc (interactive shells). Helper functions safepathappend, safepathprepend, and safesource are defined in .zshenv.default and used throughout.

Neovim

The nvim config is the bulk of the repo and lives in nvim/, symlinked wholesale as ~/.config/nvim. That means lazy-lock.json is version controlled: rake install restores plugins to the locked versions, and plugin upgrades are a deliberate act (rake plugins:update) with a reviewable diff. Two things about the config are deliberate enough to document:

Keybindings follow a semantic grammar — five input layers (\ do, g go, [/] step, C- system, bare keys), five leader domain words (test, find, search, explain, refactor), and which-key as the recall net. The grammar is shared with two sibling editors (lore, vimoire); the full spec, philosophy, and rulings live in KEYBINDINGS.md. The shell aliases the editor family accordingly: rune (this config), alongside lore and vimoire.

Colorschemes are a homegrown family in lua/palette/nightshade (dark, default), daybreak (light), wisp (nightshade with washes behind data) — one palette table each, mapped onto highlight groups by a shared apply.lua. Switching is native :colorscheme <Tab>. The alacritty background matches nightshade's, so terminal and editor share one black.

tmux

tmux.conf sources a static tmuxline.conf — a frozen statusbar snapshot originally generated by tmuxline.vim. The generator plugin is no longer active, so tmuxline.conf is now just a standalone styling file. To regenerate it, re-enable the plugin in the nvim config and re-snapshot.

Uninstall

Run rake uninstall from inside the repository. Also handy if an install fails partway through — it removes the symlinks and restores any .bak backups.

Releases

Packages

Contributors

Languages