claude-tmux-notify.nvim
Quand Claude Code vous attend dans une autre fenêtre tmux, un toast tombe dans Neovim.
- Stack
- Lua · Neovim · tmux · ★ 3
- Année
- 2026
Anatomie
7 pièces · une seule les compteÉcrire l’événement
À chaque attente ou fin de Claude, ajoute une ligne JSON avec sa fenêtre tmux.
CACHE_FILE9
CACHE_FILE="${CLAUDE_TMUX_NOTIFY_FILE:-${XDG_CACHE_HOME:-$HOME/.cache}/claude-tmux-notify.jsonl}"10
mkdir -p "$(dirname "$CACHE_FILE")" 2>/dev/null || true12
input="$(cat)"Repartir de la fin
Au démarrage, vide le fichier s’il dépasse 1 Mio, puis ne lit que les lignes à venir.
M.config.max_cache_size149
local path = resolve_cache_file()150
pcall(vim.fn.writefile, {}, path, "a") -- ensure file exists (no-op append)155
local st = uv.fs_stat(path)Surveiller le fichier
Neovim regarde si le fichier a changé toutes les 1000 ms, sans bloquer l’éditeur.
uv.new_fs_poll()164
local poll = uv.new_fs_poll()165
state.handle = poll166
poll:start(path, M.config.poll_interval, function(err)Lire les nouvelles lignes
Lit seulement les octets ajoutés depuis la dernière lecture et décode chaque ligne.
handle_lines()104
local function handle_lines(chunk)105
for line in (chunk .. "\n"):gmatch("(.-)\n") do106
line = vim.trim(line)Vérifier la fenêtre active
Demande à tmux si la fenêtre de Claude est déjà affichée : si oui, pas d’alerte.
window_is_focused()65
local function window_is_focused(window_id)66
if not (M.config.suppress_focused and window_id and window_id ~= "" and vim.env.TMUX) then67
return falseComposer l’alerte
Titre l’alerte « Claude — 2:api-server », en warn s’il attend, en info s’il a fini.
emit()86
local function emit(event)87
if window_is_focused(event.window_id) then88
returnChoisir le notifieur
Passe par Snacks s’il est installé, sinon par la notification native de Neovim.
default_notify()76
local function default_notify(message, level, opts)77
local Snacks = rawget(_G, "Snacks")78
if Snacks and Snacks.notifier then
Cliquez une fenêtre pour faire attendre Claude, un volet tombé pour y brancher la ficheTouchez une fenêtre pour faire attendre Claude, un volet tombé pour y brancher la fiche
Nomenclature
- 01 Perforateur Le crochet Claude Code : lit l’événement, demande à tmux sa fenêtre et perfore une ligne JSON de cinq champs au bout de la bande. Sort toujours en 0. Code : scripts/tmux-notify.sh, lignes 9–59 ↗
- 02 Bobine et massicot Le fichier de cache : à la mise en route, il est tronqué au-delà de 1 Mio, puis la lecture part de sa fin. Code : lua/claude-tmux-notify/init.lua, lignes 149–162 ↗
- 03 Échappement à la seconde Le fs_poll de libuv, qui regarde le fichier toutes les 1000 ms. Code : lua/claude-tmux-notify/init.lua, lignes 164–170 ↗
- 04 Tête de lecture et boucle tampon Lit les octets au-delà du décalage, avance le décalage et décode chaque ligne JSON. Code : lua/claude-tmux-notify/init.lua, lignes 104–142 ↗
- 05 Fiche à cordon Demande à tmux si la fenêtre de l’événement est active ; branchée dans le jack de cette fenêtre, la fiche retient son volet. Code : lua/claude-tmux-notify/init.lua, lignes 64–74 ↗
- 06 Volet Le toast : titre Claude — <fenêtre>, message de Claude, niveau selon l’événement. Code : lua/claude-tmux-notify/init.lua, lignes 86–102 ↗
- 07 Sonnette trembleuse Le notifieur : Snacks s’il est chargé, sinon vim.notify au niveau warn ou info. Code : lua/claude-tmux-notify/init.lua, lignes 76–84 ↗