# dotfiles Bare-git managed dotfiles for zsh/vim/tmux on Linux and macOS. ## How it works This repo uses a **bare git repository** at `~/.dotgit` with the work tree set to `$HOME`. This avoids symlinks and lets dotfiles live at their native paths. The alias that drives everything: ```bash alias .g='git --git-dir=$HOME/.dotgit/ --work-tree=$HOME' ``` `.g status`, `.g add`, `.g diff`, `.g commit`, `.g push` — same as git, just scoped to the dotfiles repo. Untracked files are hidden by default (`showUntrackedFiles = no` in config). ## Bootstrap on a new machine ```bash git clone --bare https://gitea.abra.me/svxf/dotfiles.git $HOME/.dotgit alias .g='git --git-dir=$HOME/.dotgit/ --work-tree=$HOME' .g checkout .g config status.showUntrackedFiles no ``` If checkout conflicts with existing files, back them up first: ```bash .g checkout 2>&1 | grep "^\t" | xargs -I{} mv {} {}.bak .g checkout ``` On next shell start, zinit will bootstrap itself and install all plugins automatically. ## Tracked files | File | What it does | |---|---| | `.zshrc` | Shell config — plugins, aliases, functions, keybindings, PATH | | `.vimrc` | Vim config — space-leader, persistent undo, arrow keys disabled | | `.tmux.conf` | tmux config — mouse, green accent, fzf window switcher, auto-rename | | `.starship.toml` | Prompt — two-line, git status, docker indicators, command duration | | `.gitignore_global` | Global ignores — `*~`, `.DS_Store`, `__pycache__`, `.idea`, `.ipynb_checkpoints` | ## Key features ### Zinit plugin stack (`.zshrc`) - **zsh-autosuggestions** — inline fish-style suggestions - **zsh-syntax-highlighting** — live command coloring - **zsh-completions** — extra completion definitions - **zsh-history-substring-search** — up/down searches from prefix - **starship** — installed via zinit from GitHub releases ### Async dotfiles pull On shell start, a background job pulls `--ff-only` from origin once per day (marker at `~/.cache/.dotfiles-pull`). Silent, non-blocking. ### Starship prompt (`.starship.toml`) Two-line layout: - **Line 1**: docker container indicator → docker-compose status → git branch/status → (fill) → directory - **Line 2**: `➤` character (green=ok, red=error) - **Right**: command duration (>5s) → user@host → time Custom modules detect `/.dockerenv` for container awareness and parse `docker compose ps` for service status. ### fzf integration (`.zshrc`) Sources fzf keybindings and completion when available. Default opts: `--height 40% --reverse`. ### Project switcher — `pj` (`.zshrc`) Fuzzy-finds directories under `/projects` or `~/projects` using fzf. `pj foo` pre-fills the query. ### Yazi wrapper — `y` (`.zshrc`) Wraps the yazi file manager so the shell `cd`s to wherever you navigated on exit. ### Docker compose aliases (`.zshrc`) | Alias | Expands to | |---|---| | `,dcdu` | `docker compose --profile dev up service_dev --force-recreate --detach` | | `,dcdd` | `docker compose --profile dev down --remove-orphans` | | `,dcdl` | `docker compose --profile dev logs -f service_dev` | | `dcu` | `docker compose up --force-recreate --detach` | | `dcd` | `docker compose down --remove-orphans` | | `dcl` | `docker compose logs -f` | ### Tmux aliases (`.zshrc`) | Alias | What it does | |---|---| | `tmuxr` | Attach-or-create session named "auto" | | `tmuxn` | Same + opens a new window | | `tmuxa NAME` | Attach-or-create a named session | ### Tmux keybindings (`.tmux.conf`) - **Shift+Left/Right** — switch windows (no wrap) - **PgUp/PgDn** — swap window position left/right - **prefix+f** — fzf fuzzy window switcher - **prefix+R** — rename window - Splits retain current path. 1-indexed windows, auto-rename shows `command@directory`. ### Vim (`.vimrc`) Space as leader. `jk` exits insert mode. Persistent undo in `~/.vim/undo/`. Arrow keys disabled (hjkl only). Mouse enabled. Smart case search. 8-line scroll margin. ### Utility functions (`.zshrc`) | Function | Purpose | |---|---| | `clip` | Pipe stdin to system clipboard via OSC 52 (works over SSH/tmux) | | `mkcd DIR` | mkdir + cd in one step | | `cdtmp [label]` | Create and cd into a timestamped temp dir under `~/tmp/` | ### Other aliases (`.zshrc`) - `c` → `claude` - `,cd` → `claude --dangerously-skip-permissions` (with sandbox flag) - `zshreload` → `exec zsh` - `LATEST` — global alias expanding to `*(om[1])` (most recently modified file) ### Shell options (`.zshrc`) Extended history (100k lines, shared, deduped). Case-insensitive globbing. Auto-pushd on cd. No flow control (Ctrl-S disabled). Emacs keybindings with Ctrl+X,E / Alt+E for `$EDITOR`. ### Machine-local overrides `~/.zshrc-extra` is sourced at the end if it exists — for per-machine config that doesn't belong in version control.