From 59d56224424dd6fc390f7c8093377482ea35a33e Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Sun, 9 Aug 2026 11:37:24 +0100 Subject: [PATCH] Remove dark-mode-notify, document the native approach MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The launchd agent ran `pkill -usr1 zsh` on every appearance change, which made every shell re-source .zshrc. That could never have achieved its goal: the tmux status bar belongs to the tmux server and colours to a running nvim, so re-sourcing a shell rc cannot retheme either. The one variable it set, MACOS_APPEARANCE, was read by nothing. Its only real effect was firing on each unlock — 5253 times on this machine, 3437 on the iMac — which is what drove the ~/.gitconfig.lock contention fixed in 583bbaa. The agent and plist are removed from both machines; this drops the script. ghostty, bat, delta and nvim all handle appearance natively, and tmux 3.6+ detects it over OSC 2031 (#{client_theme} already reports correctly). Wiring the tmux client-light-theme/client-dark-theme hooks is left as the next step. Also refreshes the stale parts of the README: the intro still explained ~/.gitconfig as a copy because .extra edited it, and the .extra example still showed the `git config --global` calls that caused the lock errors, plus the misspelled GIT_COMMITER_* vars. Following it would have reinstated the bug. Co-Authored-By: Claude Opus 5 (1M context) --- README.md | 110 +++++++++++++++++++++++---------------- zsh/dark-mode-notify.zsh | 23 -------- 2 files changed, 64 insertions(+), 69 deletions(-) delete mode 100755 zsh/dark-mode-notify.zsh diff --git a/README.md b/README.md index 5adbb7c..4b2f8f0 100644 --- a/README.md +++ b/README.md @@ -4,65 +4,83 @@ Here’s my dotfiles, inspired by people like Mathias. See his dotfiles at [`https://github.com/mathias/dotfiles`](https://github.com/mathias/dotfiles). The idea I’m currently going down is to create a symlink from `$HOME` to this -directory. There is one exception to this, the `.gitconfig` file. I don’t want actual commiter details committed into this repo. So my git credentials are -stored in a `.extra` file which gets sourced. This then calls the relavent git -command, which causes git to edit `$HOME/.gitconfig`. If that file was a symlink -to this repo, then the repo would see the file as edited and the repo would then -be in a dirty state, permanently. +directory. There is one exception to this, the `.gitconfig` file. I don’t 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. -As mentioned above my git credentials are stored in an untracked file: -`$HOME/.extra`. This must be manually created, mine looks something like: - -``` -# Git credentials -GIT_AUTHOR_NAME="Jonny Barnes" -GIT_COMMITER_NAME="$GIT_AUTHOR_NAME" -git config --global user.name "$GIT_AUTHOR_NAME" -GIT_AUTHOR_EMAIL="jonny@jonnybarnes.uk" -GIT_COMMITER_EMAIL="$GIT_AUTHOR_EMAIL" -git config --global user.email "$GIT_AUTHOR_EMAIL" -``` - -Run `./boostrap.sh`, this will create all the necessary symlinks, then source +Run `./bootstrap.sh`, this will create all the necessary symlinks, then source `.zshrc`. > [!WARNING] > This is a **destructive** process, so backup your dotfiles first. -## Auto switch between light and dark mode +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: -To switch between dark and light mode automatically, we use a helper lib. +``` +[user] + name = Jonny Barnes + email = jonny@jonnybarnes.uk + signingkey = ssh-ed25519 AAAA... -Clone it from `https://github.com/bouk/dark-mode-notify` then run `make` and `make install`. +[commit] + gpgsign = true -Then make a script to run is automatically, put the plist where your system can find it: `~/Library/LaunchAgents/ke.bou.dark-mode-notify.plist` with the following content: - -```xml - - - - - Label - ke.bou.dark-mode-notify - KeepAlive - - StandardErrorPath - /Users/jonny/.local/var/log/dark-mode-notify-stderr.log - StandardOutPath - /Users/jonny/.local/var/log/dark-mode-notify-stdout.log - ProgramArguments - - /usr/local/bin/dark-mode-notify - /Users/jonny/git/dotfiles/zsh/dark-mode-notify.zsh - - - +[gpg "ssh"] + program = /Applications/1Password.app/Contents/MacOS/op-ssh-sign ``` -Make the log file and script file point to the right location. For clarity `dark-mode-notify.zsh` is in this repo. +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 terminal’s 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. + +Still outstanding: the tmux status bar is hardcoded to dark-tuned colours, so it +is unreadable in light mode. tmux has `client-light-theme` and +`client-dark-theme` hooks for exactly this — not yet wired up. + +Both machines currently run pinned Dark, so the delta and nvim behaviour above is +documented-but-untested here. Worth re-checking when Auto goes back on. + +> [!NOTE] +> This previously used [`dark-mode-notify`](https://github.com/bouk/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. Don’t bring it back. diff --git a/zsh/dark-mode-notify.zsh b/zsh/dark-mode-notify.zsh deleted file mode 100755 index fa52ade..0000000 --- a/zsh/dark-mode-notify.zsh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env zsh - -function switch-dark-mode() -{ - local darkMode=true; - - if [[ $(defaults read -g AppleInterfaceStyle 2> /dev/null) != 'Dark' ]]; then - darkMode=false - fi - - if [[ $darkMode == true ]]; then - echo "Switched to dark mode" - export MACOS_APPEARANCE="dark" - else - echo "Switched to light mode" - export MACOS_APPEARANCE="light" - fi - - # Reload zshrc - pkill -usr1 zsh -} - -switch-dark-mode