My Linux setup in one Git repo: shell, terminal, editor, themes, and a go-task Taskfile that builds a fresh machine from zero.
The repo is a Git bare repository whose work-tree is $HOME. Files
live at their real paths (.zshrc is ~/.zshrc). No symlinks, no stow.
| Program | Setup |
|---|---|
| Zsh | Prezto + Powerlevel10k, plus zsh-z, zsh-you-should-use, zsh-bat, fzf-tab |
| Alacritty | Catppuccin (Mocha, Latte) |
| Tmux | TPM with Catppuccin (Mocha, Latte), tmux-sensible, tmux-resurrect and tmux-yank |
| Neovim | vim-plug with Catppuccin (Mocha, Latte), coc.nvim, ALE, fzf, and more goodies |
Themes:
- Catppuccin color theme for Alacritty, Tmux and Neovim
- Qogir GTK theme and
Papirus icons, dark/light mode
switch by
toggle-system-themescript
Third-party plugin frameworks are Git submodules, not copies.
Neovim loads both coc.nvim and ALE, and they do different jobs.
coc.nvim is the language server client. For every filetype it owns completion, go-to-definition, hover, rename, signature help, snippets and inlay hints.
ALE draws every diagnostic. coc hands its own diagnostics to ALE (diagnostic.displayByAle), so the sign column,
the location list and the lightline counters are always ALE's, whoever found the problem.
Who finds the problems depends on the filetype. By default ALE runs external linters. For some filetypes the
language server is better, so g:ale_linters is empty there and coc's diagnostics are switched back on for exactly
those filetypes.
Formatting is ALE's job, through its fixers, and only on save while g:ale_fix_on_save is on. It starts off;
<M-a> toggles it.
The two lists live in .config/nvim/plugins.vim (g:ale_linters, g:ale_fixers) and must stay in sync with the
diagnostic.enable section of .config/nvim/coc-settings.json.
Note
Ubuntu and Ubuntu-based distros only.
-
Fork the repo. Copy your fork's clone URL.
-
Clone it to a throwaway folder and install
task.git clone <your-fork-clone-url> /tmp/dotfiles-setup cd /tmp/dotfiles-setup bash .config/dotfiles/bootstrap.sh export PATH="$HOME/.local/bin:$PATH" # if `task` isn't found yet
-
Turn
$HOMEinto the checkout.task utility:bare-install
If files in
$HOMEwould be overwritten, it asks first. Say yes and they move to~/.dotfiles-backup/<timestamp>/. -
Set up the machine.
cd "$HOME" rm -rf /tmp/dotfiles-setup task setup GIT_NAME="Your Name" GIT_EMAIL=you@example.com SSH_KEY_PASSPHRASE=...
Put a space before
task setupso the passphrase stays out of your shell history.
setup installs apt packages, language runtimes (nvm/node, pyenv/python, pipx, go), an SSH key, Git identity and
signing, shell plugins, fonts, fzf, npm/pipx/cargo apps, and AppImages. It prints your new public key at the end. Add it
to GitHub as both an authentication key and a signing key.
Tip
Log out and back in after setup, then run task doctor to check everything.
Use the config alias in place of git:
config status
config add ~/.zshrc
config commit -m "Modify zsh config"
config push origin mainconfig status only lists tracked files. Untracked files are hidden, or it would list all of $HOME. So a new file
won't show up until you config add it.
-
config-editopens your editor with the right Git env vars, so plugins likevim-fugitivesee the dotfiles repo. -
config-fzfis an fzf picker over tracked files:nvim -O $(config-fzf)
Run task --list for the full list. The main ones:
| Task | What it does |
|---|---|
task setup |
Fresh machine. Everything in update, plus one-time installs |
task update |
Update submodules, apt, runtimes, CLI tools, and AppImages |
task self-update |
Update task itself |
task doctor |
Show tool versions. Exit non-zero if anything is missing |
Namespaces: apt, lang, cli, appimage, theme, utility. Package lists are plain vars: at the top of each
taskfile in .config/dotfiles/taskfiles/. Add software there, not in the task logic.
Warning
Tasks change a running system. Read a task before you run it.
AppImage-only apps are listed in appimage.yml and pulled from GitHub releases into ~/Applications, where
AppImageLauncher adds menu entries.
Standalone bash tools in scripts/. Run them directly or bind them to a shortcut.
| Script | Purpose |
|---|---|
any-term-dropdown |
Drop-down terminal toggle |
appimage-get |
Fetch the newest AppImage from a GitHub repo |
config-fzf |
fzf picker over dotfiles-tracked files |
config-sync |
Mirror a checkout into $HOME to test edits live |
print-term-colors |
Print the terminal color palette |
setup-ip-forwarding |
Set up IP forwarding |
sub-to-utf8 |
Convert subtitle files to UTF-8 |
task-note |
Print a highlighted note from tasks |
toggle-system-theme |
Flip Qogir/Papirus between dark and light |
