Nick's dotfiles — configuration for fish, tmux, Neovim, Ghostty, and more.
New machine:
# Clone somewhere sensible
git clone https://github.com/nickbutler/dots.git ~/.config/dotfiles
# Run the installer
~/.config/dotfiles/bin/dotsChecks for required programs, offers to install missing ones, symlinks configs and bin scripts, and prompts for optional extras. After that dots is on your $PATH.
Updates — run dots at any time to check for new commits and apply them:
$ dots
3 new commits on main:
abc1234 Fish: Add new abbreviation
def5678 Nvim: Update LSP config
ghi9012 Tmux: Tweak status line
Pull updates? [y/N]
Pulling re-runs the link steps automatically so any new configs or scripts are wired up.
Auto-start tmux — interactive shells outside tmux attach to (or create) a main session automatically. SSH sessions skip this.
Smart window launch — when a new tmux window is created, fish runs its name as a command or jumps to the matching directory via z.
Key bindings (inside tmux):
| Key | Action |
|---|---|
Ctrl+T |
fzf file picker |
Ctrl+R |
fzf history search |
Tab |
fzf directory jump (uses z frecency) |
Alt+K / Alt+J |
history token search backward/forward |
Ctrl+X Ctrl+E |
edit current command in $EDITOR |
Abbreviations — common shortcuts including:
v/nvimg/gits/git statusr/rangert/tig --all./cd -../cd ...../cd ../..(and so on up to.......)
Notable functions:
| Function | Description |
|---|---|
mux <cmd> <var1,var2,...> |
Run a command against multiple args in a tiled tmux layout with panes synced |
biome |
Per-directory environment loader — sources a .biome file on cd, restores on exit; masks secrets in list output |
z |
Frecency-based directory jumping |
mkcd |
mkdir -p + cd |
pssh <proxy> <opts> |
SSH via a proxy host |
ai |
Quick Claude Haiku query from the shell |
reload |
Restart fish shell (exec fish) |
| tmuxnew | fzf-style tmux window picker based on z history |
| tmuxpasskey | Toggle key pass-through to vim/fzf vs tmux (used for shared C-j/k/l bindings) |
Prefix: C-Space
Pane navigation — shared with Neovim via tmuxpasskey:
| Key | Action |
|---|---|
C-j / C-k / C-l |
Move between panes (or Neovim splits) |
C-z |
Zoom/unzoom current pane |
h/j/k/l (with prefix) |
Resize pane (large, can be repeated without prefix) |
H/J/K/L (with prefix) |
Resize pane (small, can be repeated without prefix) |
C-1 – C-5 |
Select pane 1–5 |
Window management:
| Key | Action |
|---|---|
Alt+N |
New window (tmuxnew picker) |
Alt+R |
Rename window |
Alt+1–5 |
Go to window 1–5 |
F10 |
choose-tree session/window switcher |
s (with prefix) |
Split horizontal |
v (with prefix) |
Split vertical, main-vertical layout |
Space (with prefix) |
Reset to main-vertical layout |
Copy mode (vi keys):
| Key | Action |
|---|---|
C-q |
Enter copy mode |
C-[ |
Enter copy mode |
/ (with prefix) |
Search in copy mode |
Enter / MouseDragEnd |
Copy selection to system clipboard |
K/J |
Select line up/down |
. (with prefix) |
Copy previous line and paste |
Plugin manager: vim.pack (Neovim native, 0.11+). Update with :Install.
Theme: Nordfox with transparent background (inherits pane background from tmux).
Leader: Space
Command line mode: ; - swaps with : to reduce key presses
| Key | Action |
|---|---|
<Leader><Leader> |
open ranger file picker |
C-f |
fzf file picker |
C-s |
fzf ripgrep search |
C-b |
fzf buffer picker |
C-h |
fzf recent file history |
C-g |
tig (git browser) |
C-j/k/l |
Move between splits / tmux panes |
Tab |
Alternate buffer |
C-n / C-p |
Next/previous buffer (barbar) |
1–5 Tab |
Jump to buffer 1–5 |
F6 |
Symbols outline |
| Key | Action |
|---|---|
S |
Start global substitution :%s:: |
C-_ |
Toggle comment (line) |
C-\ |
Toggle comment (paragraph) |
Leader+q |
Reflow paragraph |
Leader+w |
Strip trailing whitespace |
Leader+p/P |
Paste from system clipboard |
Leader+y (visual) |
Yank to system clipboard |
Enter (visual) |
Yank to system clipboard + trim |
| Key | Action |
|---|---|
gs / gr |
Stage / reset hunk |
go |
Preview hunk |
]c / [c |
Next/previous hunk |
Leader+gd/gD |
Diff this / against HEAD~ |
C-g |
Open tig |
Leader+g |
:Git command prompt |
| Command | Description |
|---|---|
:Reload |
Re-source init.lua |
:Install |
Reload + update plugins |
:PwdHistory |
fzf history scoped to current directory |
:Password [n] |
Generate a password with pwgen |
:TabFix |
Convert tabs to spaces |
:Copy |
Trim whitespace from clipboard register |
Cmd+a/b/c/f/j/k/n/p/r/w send the corresponding Esc+<key> sequence, enabling readline-style word movements and other alt-bindings in the terminal.
| Plugin | Purpose |
|---|---|
| barbar | Buffer tabs |
| fzf / fzf.vim | Fuzzy finding |
| gitsigns | Inline git hunks |
| vim-fugitive | Git commands |
| vim-tig | tig integration |
| vim-ranger | ranger file manager |
| lualine | Status line |
| nightfox | Colour scheme |
| vim-surround / vim-abolish | Text objects |
| vim-commentary | Commenting |
| vim-table-mode | Markdown table formatting |
| symbols-outline | Code symbol tree |
| vim-dadbod | Database client |
| auto-pairs | Bracket completion |
| vim-tmux-navigator | Shared pane navigation |