From 1ca1d04e8d4865582d83ef715cca1277c762d426 Mon Sep 17 00:00:00 2001 From: Joao Porta Date: Wed, 15 Jul 2026 11:25:18 -0300 Subject: [PATCH] tmux --- hosts/jpporta-nixos/home.nix | 4 +- hosts/writter-deck/home.nix | 4 +- modules/home-manager/tmux/default.nix | 180 ++++++++++++++++++++++++-- 3 files changed, 178 insertions(+), 10 deletions(-) diff --git a/hosts/jpporta-nixos/home.nix b/hosts/jpporta-nixos/home.nix index 50821ee..1ffb684 100644 --- a/hosts/jpporta-nixos/home.nix +++ b/hosts/jpporta-nixos/home.nix @@ -86,7 +86,9 @@ nvim.enable = true; pi.enable = true; - tmux.enable = true; + tmux = { + enable = true; + }; openspec.enable = true; power-profiles.enable = true; }; diff --git a/hosts/writter-deck/home.nix b/hosts/writter-deck/home.nix index 91803cf..00ba03c 100644 --- a/hosts/writter-deck/home.nix +++ b/hosts/writter-deck/home.nix @@ -38,7 +38,9 @@ in enable = true; fastfetch = false; }; - tmux.enable = true; + tmux = { + enable = true; + }; oh-my-posh.enable = true; pi.enable = true; nvim.enable = true; diff --git a/modules/home-manager/tmux/default.nix b/modules/home-manager/tmux/default.nix index 941b014..b4e059b 100644 --- a/modules/home-manager/tmux/default.nix +++ b/modules/home-manager/tmux/default.nix @@ -1,16 +1,180 @@ - -{ lib, config, pkgs, ... }: { + lib, + config, + pkgs, + ... +}: - options.custom = { - tmux.enable = lib.mkEnableOption "enable tmux - terminal multiplexer"; +{ + options.custom.tmux = { + enable = lib.mkEnableOption "enable tmux - terminal multiplexer"; + + defaultShell = lib.mkOption { + type = lib.types.package; + default = pkgs.zsh; + defaultText = lib.literalExpression "pkgs.zsh"; + description = '' + Shell used by tmux for new windows and panes. Resolved to its + store path so it works the same on NixOS and non-NixOS hosts. + ''; + example = lib.literalExpression "pkgs.bash"; + }; + + defaultTerminal = lib.mkOption { + type = lib.types.str; + default = "tmux-256color"; + description = "Default terminal type reported to applications inside tmux."; + }; + + catppuccinFlavor = lib.mkOption { + type = lib.types.enum [ + "latte" + "frappe" + "macchiato" + "mocha" + ]; + default = "mocha"; + description = "Catppuccin flavor used by the tmux theme plugin."; + }; + + extraConfig = lib.mkOption { + type = lib.types.lines; + default = ""; + description = "Extra lines appended verbatim to ~/.config/tmux/tmux.conf."; + }; }; config = lib.mkIf config.custom.tmux.enable { - home.packages = with pkgs; [ - tmux - ]; + home.packages = with pkgs; [ + tmux + ]; - xdg.configFile."tmux/tmux.conf".source = config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/ndots/modules/home-manager/tmux/tmux.conf"; + xdg.configFile."tmux/tmux.conf".text = '' + ##### Terminal & Color Support ##### + + # Kitty = truecolor + set -g default-terminal "${config.custom.tmux.defaultTerminal}" + set -ga terminal-overrides ",*:Tc" + + # Key line: + set -g pane-border-style "bg=default" + set -g pane-active-border-style "bg=default" + set -g status-style "bg=default" + set -g window-style "bg=default" + set -g window-active-style "bg=default" + set -g default-shell ${config.custom.tmux.defaultShell}/bin/${ + config.custom.tmux.defaultShell.meta.mainProgram or (lib.getName config.custom.tmux.defaultShell) + } + set -g extended-keys on + set -g extended-keys-format csi-u + + # Reduce escape sequence delay (fixes lag in nvim/zsh) + set -sg escape-time 0 + + # Prefix to C-a + # set -g prefix C-a + # unbind C-b + # bind-key C-a send-prefix + + # Mouse follow + set -g mouse on + + # Split with better keys + # unbind % + # bind | split-window -h -c "#{pane_current_path}" + # unbind '"' + # bind - split-window -v -c "#{pane_current_path}" + + # Easy config reload + unbind r + bind r source-file ~/.config/tmux/tmux.conf + + # Move between panes with tmux-navigator + is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ + | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|l?n?vim?x?|fzf)(diff)?$'" + bind-key -n 'C-h' if-shell "$is_vim" 'send-keys M-h' 'select-pane -L' + bind-key -n 'C-j' if-shell "$is_vim" 'send-keys M-j' 'select-pane -D' + bind-key -n 'C-k' if-shell "$is_vim" 'send-keys M-k' 'select-pane -U' + bind-key -n 'C-l' if-shell "$is_vim" 'send-keys M-l' 'select-pane -R' + + # No automatic window renaming + set-option -g allow-rename off + + # Bell + 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 + + # Status bar + set -g status-position top + set -g status-justify left + + # Start index on 1 + set -g base-index 1 + set -g pane-base-index 1 + set-window-option -g pane-base-index 1 + set-option -g renumber-windows on + + # Resize panes + bind -r J resize-pane -D 5 + bind -r K resize-pane -U 5 + bind -r L resize-pane -R 5 + bind -r H resize-pane -L 5 + bind -r m resize-pane -Z + # Resize dragging + unbind -T copy-mode-vi MouseDragEnd1Pane # don't exit copy mode after dragging with mouse + + # Vim motions + set-window-option -g mode-keys vi + + # Selection + bind-key -T copy-mode-vi 'v' send -X begin-selection # start selecting text with "v" + bind-key -T copy-mode-vi 'y' send -X copy-selection # copy text with "y" + + set -g @plugin "dweidner/tmux-theme" + set -g @plugin 'tmux-plugins/tmux-yank' + set -g @plugin 'tmux-plugins/tmux-cpu' + set -g @plugin 'tmux-plugins/tmux-battery' + set -g @plugin 'catppuccin/tmux#v2.1.1' # See https://github.com/catppuccin/tmux/tags for additional tags + set -g @plugin 'b0o/tmux-autoreload' + set -g @plugin 'tmux-plugins/tpm' + + bind-key -T copy-mode-vi v send-keys -X begin-selection + bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle + bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel + + # Catppuccin config + set -g @catppuccin_status_background none + set -g @catppuccin_flavor '${config.custom.tmux.catppuccinFlavor}' + set -g @catppuccin_window_status_style "basic" + + set -g status-right-length 100 + set -g status-left "" + set -g status-left-length 200 + set -g status-right "#{E:@catppuccin_status_application}" + set -agF status-right "#{E:@catppuccin_status_cpu}" + set -ag status-right "#{E:@catppuccin_status_session}" + set -ag status-right "#{E:@catppuccin_status_uptime}" + set -agF status-right "#{E:@catppuccin_status_battery}" + + + # Neovim delay fix + set -sg escape-time 0 + + # Tmux keep session + set-option -g detach-on-destroy off + + # Focus events + set-option -g focus-events on + bind-key z resize-pane -Z \; if-shell "tmux list-panes -F '#F' | grep -q Z" "set -g status off" "set -g status on" + + # Clipboard + set -g set-clipboard on + + run '~/.tmux/plugins/tpm/tpm' + '' + + config.custom.tmux.extraConfig; }; }