-- NORMAL -- ~/projets/claude-tmux-notify.nvim.md projet 02 / 06

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
Dépôt
github.com/Popoch39/claude-tmux-notify.nvim ↗
A

Anatomie

7 pièces · une seule les compte
Fig. 1 Tableau d’annonciateur à volets
  1. 01tmux-notify.shL9–59 ↗

    Écrire l’événement

    À chaque attente ou fin de Claude, ajoute une ligne JSON avec sa fenêtre tmux.

    CACHE_FILE

    9CACHE_FILE="${CLAUDE_TMUX_NOTIFY_FILE:-${XDG_CACHE_HOME:-$HOME/.cache}/claude-tmux-notify.jsonl}"

    10mkdir -p "$(dirname "$CACHE_FILE")" 2>/dev/null || true

    12input="$(cat)"

  2. 02uv.fs_statL149–162 ↗

    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_size

    149local path = resolve_cache_file()

    150pcall(vim.fn.writefile, {}, path, "a") -- ensure file exists (no-op append)

    155local st = uv.fs_stat(path)

  3. 03poll_intervalL164–170 ↗

    Surveiller le fichier

    Neovim regarde si le fichier a changé toutes les 1000 ms, sans bloquer l’éditeur.

    uv.new_fs_poll()

    164local poll = uv.new_fs_poll()

    165state.handle = poll

    166poll:start(path, M.config.poll_interval, function(err)

  4. 04state.offsetL104–142 ↗

    Lire les nouvelles lignes

    Lit seulement les octets ajoutés depuis la dernière lecture et décode chaque ligne.

    handle_lines()

    104local function handle_lines(chunk)

    105 for line in (chunk .. "\n"):gmatch("(.-)\n") do

    106 line = vim.trim(line)

  5. 05#{window_active}L64–74 ↗

    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()

    65local function window_is_focused(window_id)

    66 if not (M.config.suppress_focused and window_id and window_id ~= "" and vim.env.TMUX) then

    67 return false

  6. 06warn · infoL86–102 ↗

    Composer l’alerte

    Titre l’alerte « Claude — 2:api-server », en warn s’il attend, en info s’il a fini.

    emit()

    86local function emit(event)

    87 if window_is_focused(event.window_id) then

    88 return

  7. 07vim.notifyL76–84 ↗

    Choisir le notifieur

    Passe par Snacks s’il est installé, sinon par la notification native de Neovim.

    default_notify()

    76local function default_notify(message, level, opts)

    77 local Snacks = rawget(_G, "Snacks")

    78 if Snacks and Snacks.notifier then

1:nvim au premier plan · sondage 1000 ms
Lecture des notes

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

Fig. 1 — Le crochet Notification ou Stop de Claude Code ajoute une ligne JSON au fichier de cache ; toutes les 1000 ms, Neovim lit ce qui dépasse son décalage et lève un toast, sauf si la fenêtre tmux de Claude est déjà au premier plan.

Nomen­clature

  1. 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 ↗
  2. 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 ↗
  3. 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 ↗
  4. 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 ↗
  5. 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 ↗
  6. 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 ↗
  7. 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 ↗