three separate faults behind "reconnecting gets weird and the keyboard is not natural". ── the replay typed into the shell ── the pty buffer was stored raw and replayed verbatim on every re-attach. anything in it that ASKS the terminal a question — DSR, DA, DECRQM, XTVERSION, XTGETTCAP, the OSC colour queries — got asked again, and xterm answered correctly by writing the reply to its input. the pty receives that as a keystroke nobody typed. stripped on the way IN, since the buffer is the thing that gets replayed and a live client already answered them once when they were legitimately asked. only questions are removed; everything that draws is untouched. where a control shares its final byte with one that draws, the parameter is enumerated rather than wildcarded — CSI 18 t asks the window size, CSI 22 t pushes the title, and stripping the second would change what a replay renders. 36 tests, both directions, because both fail silently. ── two sockets on one session ── handleClose armed a reconnect timer; handleVisibilityChange fired on tab focus whenever readyState was CLOSED — which is exactly what a pending timer leaves. both ran. every keystroke went twice, two replay frames fought over the screen, and only one socket was ever cleaned up because __terminalCleanup is overwritten by whichever connect ran last. connect() is now the single guard, and a stale socket's close no longer speaks for the session. ── the keyboard ── alt-arrow was dead for everyone: xterm.js 5 rewrote it into the ctrl-arrow sequence, xterm.js 6 removed that rewrite and emits the honest ^[[1;3C/D (verified — the string 1;3D does not appear anywhere in the 6.0 bundle). nothing bound it. so it broke on a dependency bump, with no shell config changed. bound in zsh rather than translated in the browser, deliberately: tmux.conf claims M-Left/M-Right for pane switching, and a client-side rewrite would send ^[b to tmux and break it. the real sequence lets tmux handle it inside a session and zsh outside. ctrl-arrow was worse and more embarrassing: it worked for MEMBERS and not for the OWNER. shell-skel/zshrc has had the bindings all along; the owner's .zshrc is assembled in machine-setup and never got them. the owner had a strictly worse shell than the accounts they provision. confirmed with `zsh -i -c bindkey` before and after. also: escape-time 10 in tmux.conf. the 500ms default delays every Alt chord and every Escape, which is most of what "not natural" felt like. applied to this host by hand — setup only runs at install. cmd+arrow is left alone: xterm emits nothing for it, so there is no sequence to bind. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
107 lines
3.2 KiB
Bash
107 lines
3.2 KiB
Bash
########## TPM AUTO-INSTALL + SESSION PERSISTENCE ##########
|
|
|
|
# Auto-install TPM if missing
|
|
if-shell '[ ! -d ~/.tmux/plugins/tpm ]' \
|
|
'run-shell "git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm"'
|
|
|
|
# Plugin list
|
|
set -g @plugin 'tmux-plugins/tpm'
|
|
|
|
# remap prefix from 'C-b' to 'C-a'
|
|
unbind C-b
|
|
set-option -g prefix C-a
|
|
bind-key C-a send-prefix
|
|
|
|
set -g base-index 1
|
|
|
|
# split panes using | and -
|
|
unbind '"'
|
|
unbind %
|
|
bind | split-window -h
|
|
bind - split-window -v
|
|
|
|
# reload config file (change file location to your the tmux.conf you want to use)
|
|
unbind r
|
|
bind r source-file ~/.tmux.conf \; display-message "Config reloaded!" \; refresh-client -S
|
|
|
|
# Meta keys are ESC-prefixed on the wire, and tmux waits `escape-time` to decide whether an incoming ESC is
|
|
# a lone Escape or the start of one. The default is 500ms, so every Alt-chord below — and every Escape in
|
|
# vim — pays half a second before anything happens. 10ms is enough to disambiguate a sequence that arrives
|
|
# in one TCP frame, which over a websocket relay it always does.
|
|
set -sg escape-time 10
|
|
|
|
# switch panes using Alt-arrow without prefix
|
|
bind -n M-Left select-pane -L
|
|
bind -n M-Right select-pane -R
|
|
bind -n M-Up select-pane -U
|
|
bind -n M-Down select-pane -D
|
|
# switch panes using Alt-HJKL without prefix
|
|
bind -n M-h select-pane -L
|
|
bind -n M-l select-pane -R
|
|
bind -n M-k select-pane -U
|
|
bind -n M-j select-pane -D
|
|
|
|
# Enable mouse control (clickable windows, panes, resizable panes)
|
|
|
|
# don't rename windows automatically
|
|
set-option -g allow-rename off
|
|
|
|
######################
|
|
### DESIGN CHANGES ###
|
|
######################
|
|
|
|
# loud or quiet?
|
|
set -g visual-activity off
|
|
set -g visual-bell off
|
|
set -g visual-silence off
|
|
setw -g monitor-activity off
|
|
set -g bell-action none
|
|
|
|
# modes
|
|
setw -g clock-mode-colour colour12
|
|
setw -g mode-style 'fg=colour1 bg=colour18 bold'
|
|
|
|
# panes
|
|
set -g pane-border-style 'fg=colour19 bg=colour0'
|
|
set -g pane-active-border-style 'bg=colour0 fg=colour9'
|
|
|
|
# statusbar
|
|
set -g status-position bottom
|
|
set -g status-justify left
|
|
set -g status-style 'bg=colour2 fg=colour23'
|
|
# set -g status-left '#[fg=white,bg=black,bold] pastilhas #[default]'
|
|
set -g status-left '#[fg=#ffffff,bg=#000000,bold] #{USER}@#H #[default]'
|
|
# set -g status-left-length 20
|
|
set -g status-right '#[fg=#ffffff,bg=colour1] %d/%m #[fg=#ffffff,bg=colour8] %H:%M:%S '
|
|
set -g status-right-length 50
|
|
set -g status-left-length 20
|
|
|
|
setw -g window-status-current-style 'fg=colour1 bg=colour19 bold'
|
|
setw -g window-status-current-format ' #I#[fg=colour249]:#[fg=colour255]#W#[fg=colour249]#F '
|
|
|
|
setw -g window-status-style 'fg=colour9 bg=colour18'
|
|
setw -g window-status-format ' #I#[fg=colour237]:#[fg=colour250]#W#[fg=colour244]#F '
|
|
|
|
setw -g window-status-bell-style 'fg=colour255 bg=colour1 bold'
|
|
# ...existing code...
|
|
# messages
|
|
set -g message-style 'fg=#ffffff bg=red bold'
|
|
# Change the font color for the exit pane confirmation message
|
|
set -g message-command-style 'fg=#ffffff bg=red bold'
|
|
|
|
# ...existing code...
|
|
|
|
# messages
|
|
# set -g message-style 'fg=colour232 bg=colour16 bold'
|
|
|
|
##########################
|
|
### END DESIGN CHANGES ###
|
|
##########################
|
|
|
|
##########################
|
|
### EASY MOUSE SCROLL ###
|
|
##########################
|
|
|
|
set -g mouse on
|
|
set -ga terminal-overrides ',*256color*:smcup@:rmcup@'
|