My dotfiles
A complete list of everything the configurations in this repo expect, grouped by
the stow package that needs it. Install commands are given for Debian/Ubuntu
(apt) and macOS (brew); items installed through a language toolchain or a
vendor script show that instead.
| Dependency | Used for | Install |
|---|---|---|
| GNU Stow | bootstrap.sh symlinks the packages into $HOME |
sudo apt install stow / brew install stow |
| git | cloning this repo, LSP project-root detection, Oh My Zsh git plugin |
sudo apt install git / brew install git |
| curl | fetching the installers and plugins below | sudo apt install curl / preinstalled on macOS |
| Dependency | Used for | Install |
|---|---|---|
| zsh | the shell itself | sudo apt install zsh / brew install zsh |
| Oh My Zsh | framework (robbyrussell theme, git plugin) |
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" |
| Starship | the prompt (starship init zsh) |
curl -sS https://starship.rs/install.sh | sh / brew install starship |
| tmux | the t alias (tmux new-session -A -s main) |
see the tmux package |
| Neovim | the vim alias points at nvim (see below) |
see the nvim package |
| pyenv (optional) | Python version management (pyenv init, skipped if not installed) |
curl -fsSL https://pyenv.run | bash / brew install pyenv |
| pixi (optional) | package and environment manager; ~/.pixi/bin is added to PATH |
curl -fsSL https://pixi.sh/install.sh | sh / brew install pixi |
| Dependency | Used for | Install |
|---|---|---|
| Neovim 0.11+ | the editor; native LSP API (vim.lsp.config/vim.lsp.enable) |
sudo apt install neovim / brew install neovim |
The Neovim config uses no plugins. It only needs the language-server binaries below.
| Server | Language | Install |
|---|---|---|
| pyrefly | Python | uv tool install pyrefly (needs uv) |
| clangd | C / C++ | sudo apt install clangd / brew install llvm |
| rust-analyzer | Rust | rustup component add rust-analyzer (see Rust) |
haskell-language-server (haskell-language-server-wrapper) |
Haskell | ghcup install hls (see Haskell) |
| fortls | Fortran | uv tool install fortls (needs uv) |
| texlab | LaTeX / BibTeX | cargo install --locked texlab (see Rust) / brew install texlab |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shcurl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | shuv installs each tool into its own isolated environment using its own managed Python, so it is unaffected by system Python changes:
curl -LsSf https://astral.sh/uv/install.sh | sh # install uv
uv tool install pyrefly # install the Python server
uv tool install fortls # install the Fortran serverNeeded to build native toolchains such as GHC/HLS:
sudo apt update && sudo apt-get upgrade -y
sudo apt install -y curl git build-essential libffi-dev libgmp-dev \
libncurses-dev libncurses5 libtinfo5 pkg-configOn macOS install the Command Line Tools and Homebrew instead:
xcode-select --install
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"| Dependency | Used for | Install |
|---|---|---|
| tmux 3.1+ | the multiplexer itself; 3.1 is the first version that reads ~/.config/tmux/tmux.conf |
sudo apt install tmux / brew install tmux |
| ncurses-term | supplies the tmux-256color terminfo entry used by default-terminal |
sudo apt install ncurses-term / provided by brew install ncurses |
| wl-clipboard (Wayland) or xclip (X11) | what Neovim's clipboard provider shells out to on Linux; not needed on macOS, which uses pbcopy |
sudo apt install wl-clipboard or sudo apt install xclip |
The tmux config uses no plugins and no TPM — it is a plain tmux.conf only.
These dotfiles are managed with GNU Stow.
Each top-level directory in this repo is a Stow package whose contents are
mirrored into $HOME (e.g. zsh/.zshrc is symlinked to ~/.zshrc). Add new
dotfiles by following the same package/.dotfile layout.
- Install GNU Stow:
sudo apt install stow # Debian/Ubuntu
brew install stow # macOS- Clone this repo into any directory that you would like:
gh repo clone Kai-Striega/dot-files ~/dot-files- Symlink the dotfiles into your home directory with the bootstrap script:
cd ~/dot-files
./bootstrap.sh -n # dry run: preview the changes without applying them
./bootstrap.sh # create the symlinks
./bootstrap.sh -R # restow after adding new files to a packageSee the Dependencies section above for the tools each package needs, then see Neovim for the editor's language servers.
A minimal Neovim configuration for the same languages, built entirely on
Neovim's built-ins: native LSP, built-in completion, default LSP keymaps, and a
bundled colorscheme. There is no plugin manager and no external Neovim plugins.
Requires Neovim 0.11+ (the native vim.lsp.config/vim.lsp.enable API).
- Stow the
nvimpackage (symlinks~/.config/nvim/init.lua):
cd ~/dot-files
./bootstrap.sh nvim- Install the language servers you need so the LSP can attach.
rust-analyzer,haskell-language-server-wrapper, andfortlsusually come with their toolchains;pyreflyandclangdare installed separately:
uv tool install pyrefly # Python
sudo apt install clangd # C/C++LSP navigation uses Neovim's built-in defaults: K (hover), gd (definition),
grr (references), gri (implementation), grn (rename), gra (code action),
and [d / ]d (previous/next diagnostic). <leader>e toggles the built-in
netrw file explorer.
A minimal tmux configuration in the same spirit as the Neovim config: a single
plain tmux.conf with no TPM and no plugins. It sets tmux-256color with true
colour passthrough, turns on set-clipboard so copy-mode yanks reach the
desktop clipboard over OSC 52, keeps <Esc> responsive and focus events on for
Neovim, and switches to 1-based, auto-renumbering windows with the mouse
enabled. Requires tmux 3.1+ for the ~/.config/tmux/tmux.conf path.
Stow the tmux package (symlinks ~/.config/tmux/tmux.conf):
cd ~/dot-files
./bootstrap.sh tmuxdefault-terminal "tmux-256color" needs that terminfo entry, which ships
separately on Ubuntu; see Dependencies
above.
The prefix is the default C-b. prefix r re-sources ~/.config/tmux/tmux.conf
and flashes a confirmation. Copy mode uses vi keys (setw -g mode-keys vi): v
begins a selection and y yanks it and leaves copy mode.