My personal development environment—a terminal descent through aesthetics and scientific computing workflows. After all, what you do is almost as important as how you look doing it. Built for quick setup on new machines and tested across macOS and Linux (no root required).
This is an opinionated environment for R/Quarto data science work with excellent Python support. Where possible, the tools try to integrate well with each other: Neovim sends code to tmux panes running radian, vim keybindings work seamlessly across splits and panes, and macOS software integrates with terminal/CLI tools.
| Component | Purpose | Highlights |
|---|---|---|
| Neovim | Primary editor | LSP, Quarto, R integration, AI completion |
| Zsh | Shell | Oh-My-Zsh, Powerlevel10k, custom functions |
| Tmux | Terminal multiplexer | Vim-tmux navigation, sensible defaults |
| Ghostty | Terminal emulator | 30+ custom shaders, because why not |
| direnv + uv | Python environment | Automatic venv activation, fast dependency management |
| R + radian | R development | Per-project radian, reticulate-compatible Python |
| Docker | Containerized R dev | Reproducible environment for the commitment-phobic |
| Component | Purpose |
|---|---|
| AeroSpace | i3-like tiling window manager |
| SketchyBar | Custom status bar with workspace indicators |
| Karabiner | Advanced keyboard remapping |
| Borders | Window border highlighting (JankyBorders) |
- Git
- Zsh
- A Nerd Font (for icons—I recommend Fira Code)
Everything else installs automatically. No root access required on Linux.
git clone https://github.com/warneford/dotfiles.git ~/dotfiles
cd ~/dotfiles
./install.shRestart your terminal, then:
p10k configure # Set up your prompt
nvim # Plugins install automaticallymacOS (via Homebrew):
- node, python, ripgrep, neovim, lazygit, tmux, quarto, and friends
Linux (no root needed):
- Rust toolchain → ripgrep (cargo)
- nvm → Node.js LTS
- bob-nvim → Neovim stable
- Quarto CLI (latest)
- lazygit
Both platforms:
- Oh-My-Zsh + Powerlevel10k + plugins
- Python packages (pynvim, cairosvg, pillow)
- R languageserver (if R is available)
Based on ThePrimeagen's init.lua, heavily customized for scientific computing.
LSP Support: Pyright (Python), R Language Server, TypeScript, Lua, Bash
Key Plugins:
- Quarto/R: quarto-nvim, nvim-r, slime (REPL integration via tmux)
- Navigation: Harpoon, Telescope, Leap
- Code: Treesitter, LSP, Conform (formatting), Trouble (diagnostics)
- Quality of Life: Supermaven (AI completion), Undotree, Zenmode
- Extras: img-clip (paste images), nabla (LaTeX preview), DAP (debugging)
- Framework: Oh-My-Zsh
- Theme: Powerlevel10k (fast, beautiful, highly configurable)
- Plugins: git, zsh-autosuggestions, zsh-syntax-highlighting
Custom additions:
uvinit- Initialize a project with direnv + uvquarto-preview- Preview with proper browser handling- Dynamic ASCII art MOTD (because terminals should spark joy)
Prefix: Ctrl+Space (ergonomic, doesn't conflict with vim)
Features:
- Vim-tmux-navigator:
Ctrl+hjklmoves between vim splits AND tmux panes seamlessly - Sensible window switching:
Alt+1-5for windows,Alt+n/pfor next/prev - True color: 24-bit RGB, undercurl, italics
- Smart navigation: Avoids interfering with radian/Claude Code processes
- Mouse support: Because sometimes you just want to click
See TMUX_GUIDE.md for the full reference.
The terminal of choice. Config includes:
- 30+ custom GLSL shaders: Bloom, starfield, matrix, CRT, galaxy, dither effects
- Shaders range from "subtle and readable" to "I am become terminal, destroyer of eyestrain"
- Background images for extra atmosphere
direnv + uv for automatic, fast virtual environments:
cd my-project
uvinit # Creates .envrc + pyproject.toml, syncs deps
# direnv auto-activates venv whenever you cd into the directoryThe use_uv function in direnvrc handles everything—respects .python-version, syncs from pyproject.toml or requirements.txt.
radian (enhanced R console) and ipython (enhanced Python REPL) are intentionally installed per-project rather than globally. This ensures reticulate uses the same Python environment as your project dependencies—critical for reproducible R↔Python workflows in polyglot Quarto notebooks.
mkdir my-analysis && cd my-analysis
uvinit # Creates .envrc + pyproject.toml (includes radian + ipython!)
# Opens pyproject.toml in nvim
# Edit dependencies, :wq to save and sync
r # Alias for radian - now available in this directoryThe default pyproject.toml template includes both radian and ipython, so every project gets them automatically.
Once installed in your project:
- Vi mode editing (matching nvim muscle memory)
Alt+-inserts<-(assignment)Alt+minserts|>(pipe)- Syntax highlighting, multiline editing, 20k line history
For Python chunks in Quarto notebooks:
- Syntax highlighting, tab completion,
?for help %magiccommands, better tracebacks- Handles multi-line code blocks from nvim seamlessly
- Same Python environment as your R/reticulate code
Global R configuration includes:
- Posit Package Manager (fast binary packages) with CRAN fallback
- Google auth for gargle/googledrive packages
Escape hatch: For quick one-off R sessions where reticulate compatibility doesn't matter, you can run
uv tool install radianto get a global radian. Just understand it won't see your project's Python packages.
A containerized R development environment for when you want reproducibility without commitment:
# Coming soon: ./install.sh --dockerr-dev container includes:
- rocker/r-ver base (minimal R, no RStudio overhead)
- Neovim (latest), Node.js, deno, ripgrep, fzf, direnv
- Your dotfiles mounted and ready
- Quarto preview (port 9142), SSH (9143)
AeroSpace: i3-like tiling for macOS
- Workspaces 1-9 with keyboard navigation
- Accordion and tile layouts
- Focus-follows-mouse on monitor change
SketchyBar: Status bar with:
- Workspace indicators
- System monitoring (CPU, calendar)
- GitHub notifications
- Zen mode toggle
Karabiner: Complex key remapping (separate config)
Borders: Subtle window highlighting via JankyBorders
- KEYBINDINGS.md - Comprehensive keybinding reference (TODO: some conflicts to resolve)
- TMUX_GUIDE.md - Tmux quick reference and workflows
Create a file in nvim/.config/nvim/lua/theprimeagen/lazy/:
return {
"author/plugin-name",
config = function()
-- your config here
end,
}- Aliases:
zsh/aliases.zsh - Functions:
zsh/functions.zsh - Main config:
zsh/.zshrc
This repo uses GNU Stow for symlink management. Each directory contains the config structure as it should appear from $HOME:
dotfiles/
├── nvim/.config/nvim/ → ~/.config/nvim/
├── tmux/.tmux.conf → ~/.tmux.conf
├── zsh/.zshrc → ~/.zshrc
└── ...
cd ~/dotfiles
git pull
source ~/.zshrc # or restart terminalFor Neovim plugins: :Lazy sync