Remove dark-mode-notify, document the native approach
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) <noreply@anthropic.com>
This commit is contained in:
parent
583bbaa533
commit
59d5622442
2 changed files with 67 additions and 72 deletions
110
README.md
110
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).
|
[`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
|
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
|
directory. There is one exception to this, the `.gitconfig` file. I don’t want
|
||||||
stored in a `.extra` file which gets sourced. This then calls the relavent git
|
actual commiter details committed into this repo, and they differ per machine
|
||||||
command, which causes git to edit `$HOME/.gitconfig`. If that file was a symlink
|
anyway — this Mac signs with my work address, the iMac with my personal one.
|
||||||
to this repo, then the repo would see the file as edited and the repo would then
|
|
||||||
be in a dirty state, permanently.
|
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
|
## Usage
|
||||||
|
|
||||||
First clone the repo.
|
First clone the repo.
|
||||||
|
|
||||||
As mentioned above my git credentials are stored in an untracked file:
|
Run `./bootstrap.sh`, this will create all the necessary symlinks, then source
|
||||||
`$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
|
|
||||||
`.zshrc`.
|
`.zshrc`.
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> This is a **destructive** process, so backup your dotfiles first.
|
> 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:
|
[gpg "ssh"]
|
||||||
|
program = /Applications/1Password.app/Contents/MacOS/op-ssh-sign
|
||||||
```xml
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
|
||||||
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>Label</key>
|
|
||||||
<string>ke.bou.dark-mode-notify</string>
|
|
||||||
<key>KeepAlive</key>
|
|
||||||
<true/>
|
|
||||||
<key>StandardErrorPath</key>
|
|
||||||
<string>/Users/jonny/.local/var/log/dark-mode-notify-stderr.log</string>
|
|
||||||
<key>StandardOutPath</key>
|
|
||||||
<string>/Users/jonny/.local/var/log/dark-mode-notify-stdout.log</string>
|
|
||||||
<key>ProgramArguments</key>
|
|
||||||
<array>
|
|
||||||
<string>/usr/local/bin/dark-mode-notify</string>
|
|
||||||
<string>/Users/jonny/git/dotfiles/zsh/dark-mode-notify.zsh</string>
|
|
||||||
</array>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
```
|
```
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
Loading…
Reference in a new issue