# Nord-style status line built natively, no theme plugin. # The powerline separators (U+E0B0..U+E0B3) are written as escapes via # fromJSON: literal private-use glyphs get stripped silently on copy/paste. # Commas inside #{?...} separate arguments, hence the escaped `#,` below. let sep = builtins.fromJSON '' { "right": "", "rightThin": "", "left": "", "leftThin": "" } ''; in { programs.tmux = { enable = true; prefix = "C-a"; keyMode = "vi"; mouse = true; terminal = "tmux-256color"; # truecolor, italics and undercurl in nvim escapeTime = 10; # the 500ms default lags leaving insert mode in nvim focusEvents = true; # nvim autoread historyLimit = 50000; baseIndex = 1; # window numbers match the number row extraConfig = '' set -g status-keys vi # outer terminal does 24-bit colour set -sa terminal-features ",*:RGB" # forward Shift+Enter and other extended keys as CSI-u (tmux >= 3.5) set -s extended-keys always set -s extended-keys-format csi-u set -as terminal-features '*:extkeys' # Status bar options set -g status-interval 5 set -g status-justify left # Clock mode setw -g clock-mode-colour cyan # Colors set -g status-bg black set -g status-fg white # Key bindings bind r source-file ~/.config/tmux/tmux.conf \; display-message "tmux.conf reloaded" # Panel split and selection, new panes/windows inherit the cwd unbind % unbind '"' bind v split-window -v -c "#{pane_current_path}" bind c split-window -h -c "#{pane_current_path}" bind i new-window -c "#{pane_current_path}" bind -r b previous-window bind -r n next-window # Move around panes with hjkl bind h select-pane -L bind j select-pane -D bind k select-pane -U bind l select-pane -R # Resize panes bind -r H resize-pane -L 5 bind -r J resize-pane -D 5 bind -r K resize-pane -U 5 bind -r L resize-pane -R 5 # copy to both the clipboard and primary selection bind -T copy-mode-vi v send-keys -X begin-selection bind -T copy-mode-vi C-v send-keys -X rectangle-toggle bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "wl-copy && wl-copy --primary" bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "wl-copy && wl-copy --primary" bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "wl-copy && wl-copy --primary" # Kill commands bind q confirm-before -p "kill window #W? (y/n)" kill-window bind Q confirm-before -p "kill session #S? (y/n)" kill-session # Bars set -g status-left-length 24 set -g status-left "#[fg=black,bg=blue,bold] #{=20:session_name} #[fg=blue,bg=black,nobold,noitalics,nounderscore]${sep.right}" set -g status-right "#{?client_prefix,#[fg=black#,bg=yellow#,bold] ^A ,}#[fg=brightblack,bg=black,nobold,noitalics,nounderscore]${sep.left}#[fg=white,bg=brightblack] %Y-%m-%d #[fg=white,bg=brightblack,nobold,noitalics,nounderscore]${sep.leftThin}#[fg=white,bg=brightblack] %H:%M #[fg=cyan,bg=brightblack,nobold,noitalics,nounderscore]${sep.left}#[fg=black,bg=cyan,bold] #H " # Windows set -g window-status-format "#[fg=black,bg=brightblack,nobold,noitalics,nounderscore]${sep.right} #[fg=white,bg=brightblack]#I #[fg=white,bg=brightblack,nobold,noitalics,nounderscore]${sep.rightThin} #[fg=white,bg=brightblack]#W #F #[fg=brightblack,bg=black,nobold,noitalics,nounderscore]${sep.right}" set -g window-status-current-format "#[fg=black,bg=cyan,nobold,noitalics,nounderscore]${sep.right} #[fg=black,bg=cyan]#I #[fg=black,bg=cyan,nobold,noitalics,nounderscore]${sep.rightThin} #[fg=black,bg=cyan]#W #F #[fg=cyan,bg=black,nobold,noitalics,nounderscore]${sep.right}" set -g window-status-separator "" ''; }; }