My dotfiles
  • Shell 89%
  • Lua 7.1%
  • Python 3.9%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Jonny Barnes f8d525b7eb
Add a quick named-session binding and fix theme reload in tmux
prefix S now prompts for a name and runs new-session directly, replacing
the `<prefix> :` then `new -s name` command-mode round trip.

Session numbering in choose-tree (prefix s) turned out to be
session_id, an internal per-server counter with no base-index
equivalent, so it can't be made to start at 1 the way windows do;
named sessions plus C-s search in the tree are the workaround.

Also fixed a bug found while testing: `<prefix> r` re-sources the
whole config, and the trailing `source-file ~/.tmux-dark.conf` at the
end always ran, clobbering a light-themed session on every manual
reload. It now checks the invoking client's theme like the
client-attached hook already does.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013t7aQbc4EyYtab1crvSFTd
2026-08-14 09:36:27 +01:00
bin Update cp-torrent command 2026-04-12 11:24:18 +01:00
claude Make the Claude Code statusline follow the terminal palette 2026-08-09 14:02:01 +01:00
ghostty Fox ghostty config 2026-04-02 10:59:23 +01:00
gnupg Move gpg config into dotfiles repo 2024-04-29 18:22:54 +01:00
neovim Show gitignored files in nvim-tree and follow the open buffer 2026-08-12 21:18:55 +01:00
zsh/plugins Remove dark-mode-notify, document the native approach 2026-08-09 11:37:24 +01:00
bootstrap.sh Follow light/dark appearance in the tmux status bar 2026-08-09 12:38:16 +01:00
brew.sh Add which-key and nvim-web-devicons, tidy brew casks 2026-08-08 14:26:59 +01:00
delta-themes.gitconfig Improvements to lazygit/tmux/ghossty configs 2026-01-30 14:42:51 +00:00
gitconfig Move git identity to an included ~/.gitconfig.local 2026-08-09 09:57:19 +01:00
gitconfig.local.template Move git identity to an included ~/.gitconfig.local 2026-08-09 09:57:19 +01:00
gitignore Add a global gitignore 2016-04-08 03:42:12 +01:00
hushlogin Hush login details 2016-04-08 03:37:25 +01:00
LICENSE Initial commit 2016-03-06 12:50:00 +00:00
macos.sh Update defaults script 2024-06-25 19:12:04 +01:00
README.md Record verified light-mode results for the theme hooks 2026-08-09 12:53:03 +01:00
sheldon.toml Only load fnm sheldon plugin on macOS 2026-08-04 22:30:41 +01:00
tmux Add a quick named-session binding and fix theme reload in tmux 2026-08-14 09:36:27 +01:00
tmux-dark.conf Follow light/dark appearance in the tmux status bar 2026-08-09 12:38:16 +01:00
tmux-light.conf Follow light/dark appearance in the tmux status bar 2026-08-09 12:38:16 +01:00
zshrc.zsh Stop shadowing BSD coreutils with GNU versions on PATH 2026-08-08 11:53:40 +01:00

dotfiles

Heres my dotfiles, inspired by people like Mathias. See his dotfiles at https://github.com/mathias/dotfiles.

The idea Im currently going down is to create a symlink from $HOME to this directory. There is one exception to this, the .gitconfig file. I dont want actual commiter details committed into this repo, and they differ per machine anyway — this Mac signs with my work address, the iMac with my personal one.

So identity and signing live in an untracked $HOME/.gitconfig.local, which the tracked gitconfig pulls in with an [include] as its last directive. Last matters: git applies config in file order, so anything after the include would override it.

$HOME/.gitconfig is copied rather than symlinked, so that an ad-hoc git config --global writes into $HOME instead of dirtying this repo. The trade-off is that git pull alone does not update it — re-run ./bootstrap.sh, or cp gitconfig ~/.gitconfig, after changing the tracked copy.

Usage

First clone the repo.

Run ./bootstrap.sh, this will create all the necessary symlinks, then source .zshrc.

Warning

This is a destructive process, so backup your dotfiles first.

As mentioned above, git identity lives in an untracked $HOME/.gitconfig.local. bootstrap.sh seeds it from gitconfig.local.template if it does not already exist, and never overwrites an existing one. Fill it in:

[user]
    name = Jonny Barnes
    email = jonny@jonnybarnes.uk
    signingkey = ssh-ed25519 AAAA...

[commit]
    gpgsign = true

[gpg "ssh"]
    program = /Applications/1Password.app/Contents/MacOS/op-ssh-sign

Do not skip this. Git will not prompt you — with no identity it quietly derives one from your username and hostname, warns once, and signs nothing.

$HOME/.extra is a separate untracked file for other machine-local environment variables, sourced from .zshrc. Keep git out of it:

Important

Never put git config --global in .extra. It is re-sourced on every SIGUSR1, so with several tmux panes the concurrent writes race on ~/.gitconfig.lock and spew error: could not lock config file. Put git settings in .gitconfig.local instead.

Light and dark mode

Most of this is now handled natively and needs no configuration:

  • ghostty follows the system appearance itself via theme = light:tangere-light.conf,dark:tangere-dark.conf.
  • tmux 3.6+ learns the terminals theme over OSC 2031 and exposes it as #{client_theme}.
  • bat picks a theme per invocation from BAT_THEME_LIGHT / BAT_THEME_DARK.
  • delta and nvim detect the terminal background themselves.

The tmux status bar needs help, because its colours are set explicitly. They live in tmux-light.conf and tmux-dark.conf — the same layout, with each colour taken from the matching tangere palette index — and tmux sources one of them from three hooks:

  • client-light-theme / client-dark-theme react to a change,
  • client-attached picks the right one for a client that attaches mid-way, since the two above only fire on a change.

Because this keys off the terminal's reported theme rather than a schedule, it behaves identically whether the change came from Auto at sunrise/sunset or from toggling Light/Dark by hand — nothing in the chain knows why it changed.

Note

A running nvim will not follow a live change: the docs are explicit that the TUI sets background on startup if it can detect it. New instances are fine — verified, a fresh nvim in light mode reports background=light — but existing ones need :set background=light or a restart.

Verified in light mode: the status bar switches in the same second the hook fires, a fresh nvim detects light, and delta resolves its light default (syntax-theme = GitHub, against Monokai Extended on dark).

Tip

When adding these hooks to an already running tmux server, detach and reattach. tmux enables the terminals theme-reporting mode when a client attaches, so a client that predates the hooks never gets asked to report changes — #{client_theme} still reads correctly, because that is answered by a direct query, but no hook fires until the client reattaches.

Note

This previously used dark-mode-notify as a launchd agent that ran pkill -usr1 zsh on every appearance change. That has been removed. It could never have worked: re-sourcing .zshrc runs inside each shell, but the status bar belongs to the tmux server and colours to a running nvim, so it could not retheme either. The one variable it set was read by nothing. Meanwhile it fired on every unlock, re-running .zshrc in every pane. Dont bring it back.