From 897a924c759c3414c8dca278ca8bdb07a759eacc Mon Sep 17 00:00:00 2001 From: Konrad Malik Date: Mon, 11 Dec 2023 22:06:37 +0100 Subject: [PATCH] refactor: modularize tmux for better readability and maintainability --- home/konrad/common/global/default.nix | 5 +- home/konrad/common/global/modules.nix | 6 + home/konrad/common/global/packages.nix | 2 - home/konrad/common/global/shells.nix | 4 - home/konrad/common/global/tmux.nix | 179 ------------------ home/konrad/common/modules/default.nix | 1 + home/konrad/common/modules/tmux/config.nix | 76 ++++++++ home/konrad/common/modules/tmux/default.nix | 71 +++++++ .../common/modules/tmux/text_processor.nix | 14 ++ home/konrad/common/modules/tmux/theme.nix | 51 +++++ .../tmux}/tmux-sessionizer/default.nix | 0 .../tmux-sessionizer/tmux-sessionizer.sh | 0 .../modules/tmux}/tmux-switcher/default.nix | 0 .../tmux}/tmux-switcher/tmux-switcher.sh | 0 .../modules/tmux}/tmux-windowizer/default.nix | 0 .../tmux}/tmux-windowizer/tmux-windowizer.sh | 0 home/konrad/m3800.nix | 1 - home/konrad/mbp13.nix | 1 - home/konrad/rpi4-1.nix | 2 - home/konrad/rpi4-2.nix | 2 - pkgs/default.nix | 3 - 21 files changed, 221 insertions(+), 197 deletions(-) create mode 100644 home/konrad/common/global/modules.nix delete mode 100644 home/konrad/common/global/tmux.nix create mode 100644 home/konrad/common/modules/tmux/config.nix create mode 100644 home/konrad/common/modules/tmux/default.nix create mode 100644 home/konrad/common/modules/tmux/text_processor.nix create mode 100644 home/konrad/common/modules/tmux/theme.nix rename {pkgs => home/konrad/common/modules/tmux}/tmux-sessionizer/default.nix (100%) rename {pkgs => home/konrad/common/modules/tmux}/tmux-sessionizer/tmux-sessionizer.sh (100%) rename {pkgs => home/konrad/common/modules/tmux}/tmux-switcher/default.nix (100%) rename {pkgs => home/konrad/common/modules/tmux}/tmux-switcher/tmux-switcher.sh (100%) rename {pkgs => home/konrad/common/modules/tmux}/tmux-windowizer/default.nix (100%) rename {pkgs => home/konrad/common/modules/tmux}/tmux-windowizer/tmux-windowizer.sh (100%) diff --git a/home/konrad/common/global/default.nix b/home/konrad/common/global/default.nix index 97fdfcf5..a04d255e 100644 --- a/home/konrad/common/global/default.nix +++ b/home/konrad/common/global/default.nix @@ -15,6 +15,7 @@ in ./git.nix ./glow.nix ./k9s.nix + ./modules.nix ./neovim.nix ./packages.nix ./readline.nix @@ -23,11 +24,9 @@ in ./ssh-keys.nix ./starship.nix ./tealdeer.nix - ./tmux.nix - ] ++ (builtins.attrValues (import ./../modules)) + ] ++ (builtins.attrValues customArgs.homeManagerModules); - # Let Home Manager install and manage itself. programs.home-manager.enable = true; home = { diff --git a/home/konrad/common/global/modules.nix b/home/konrad/common/global/modules.nix new file mode 100644 index 00000000..7d133278 --- /dev/null +++ b/home/konrad/common/global/modules.nix @@ -0,0 +1,6 @@ +{ + imports = builtins.attrValues (import ./../modules); + + konrad.programs.tmux.enable = true; + konrad.programs.ssh-egress.enable = true; +} diff --git a/home/konrad/common/global/packages.nix b/home/konrad/common/global/packages.nix index 216db734..1b62a31e 100644 --- a/home/konrad/common/global/packages.nix +++ b/home/konrad/common/global/packages.nix @@ -46,8 +46,6 @@ up rfv - tmux-sessionizer - tmux-windowizer ] ++ lib.optionals pkgs.stdenvNoCC.isLinux [ psmisc trace-cmd diff --git a/home/konrad/common/global/shells.nix b/home/konrad/common/global/shells.nix index 48e1de57..ef26c54c 100644 --- a/home/konrad/common/global/shells.nix +++ b/home/konrad/common/global/shells.nix @@ -167,10 +167,6 @@ in watch = "viddy"; # For a full list of active aliases, run `alias`. # to run command that is shadowed by an alias run (for example): \ls or command ls - # prime - txs = "${pkgs.tmux-sessionizer}/bin/tmux-sessionizer"; - txw = "${pkgs.tmux-windowizer}/bin/tmux-windowizer"; - txr = "${pkgs.tmux-switcher}/bin/tmux-switcher"; # faster navigation ".." = "cd .."; "..." = "cd ../.."; diff --git a/home/konrad/common/global/tmux.nix b/home/konrad/common/global/tmux.nix deleted file mode 100644 index 40337122..00000000 --- a/home/konrad/common/global/tmux.nix +++ /dev/null @@ -1,179 +0,0 @@ -{ config, lib, pkgs, ... }: -let - tmux = "${pkgs.tmux}/bin/tmux"; - tmuxTextProcessor = pkgs.writeShellScript "tmux_text_processor" '' - program="$1" - paneid="$2" - currentpanepath="$3" - capturename="$(basename $program)-$paneid" - showandpipe="${tmux} show-buffer -b '$capturename' | $program || true; ${tmux} delete-buffer -b '$capturename'" - - ${tmux} capture-pane -J -S - -E - -b "$capturename" -t "$paneid" - ${tmux} split-window -c "$currentpanepath" "$showandpipe" - ''; - baseConfig = '' - ## KONRAD's SENSIBLE DEFAULTS - # tmux messages are displayed for 4 seconds - set-option -g display-time 4000 - # upgrade color and fix italics - set -ga terminal-overrides ",-256color:Tc,alacritty:Tc" - # focus events enabled for terminals that support them - set-option -g focus-events on - # refresh interval - set-option -g status-interval 60 - - # Let the window to be renamed automatically when launching a process - set-option -g automatic-rename on - # But prevent renaming once you have manually changed it. And you can re-rename it after. - set-option -g allow-rename off - set-option -g set-titles on - - # renumber so that we have 1,2,3 always - set-option -g renumber-windows on - - # Set window notifications - set-option -g monitor-activity on - set-option -g visual-activity off - - # vim splits - bind-key v split-window -h - bind-key g split-window -v - - # vim panes - bind-key h select-pane -L - bind-key j select-pane -D - bind-key k select-pane -U - bind-key l select-pane -R - - # vim pane resize - bind-key < resize-pane -L 10 - bind-key > resize-pane -R 10 - bind-key - resize-pane -D 10 - bind-key + resize-pane -U 10 - - # Setup 'v' to begin selection, just like vim - bind-key -T copy-mode-vi 'v' send-keys -X begin-selection - bind-key -T copy-mode-vi 'V' send-keys -X select-line - bind-key -T copy-mode-vi 'r' send-keys -X rectangle-toggle - # Setup 'y' to yank (copy), just like VIM - bind-key -T copy-mode-vi 'y' send-keys -X copy-selection-and-cancel - # Setup P (capital) to paste after the prefix keys, JUST LIKE VIM - bind P paste-buffer - - # Use m to toggle mouse mode - unbind m - bind-key m setw mouse - # enable mouse by default, useful for resizing - set-option -g mouse on - - # when nested tmux session, - # C-a will send the prefix directly to the remote session - # C-A clashes with C-A in neovim! - #bind-key -n C-a send-prefix - - # facebook pathpicker - bind-key F run-shell -b "${tmuxTextProcessor} '${pkgs.fpp}/bin/fpp' '#{pane_id}' '#{pane_current_path}'" - - # urlscan - bind-key U run-shell -b "${tmuxTextProcessor} '${pkgs.urlscan}/bin/urlscan' '#{pane_id}' '#{pane_current_path}'" - - # tmux session switcher - bind-key r run-shell -b "${pkgs.tmux-switcher}/bin/tmux-switcher" - - # toggle last window - bind-key W last-window - - # toggle last session - bind-key S switch-client -l - ''; - themeConfig = - let - c = config.colorscheme.colors; - in - '' - # Base16 ${config.colorscheme.name} - # Scheme author: ${config.colorscheme.author} - # Template author: Tinted Theming: (https://github.com/tinted-theming) - - # default statusbar colors - set-option -g status-style "fg=#${c.base04},bg=default" - - # default window title colors - set-window-option -g window-status-style "fg=#${c.base04},bg=default" - - # active window title colors - set-window-option -g window-status-current-style "fg=#${c.base0A},bg=default" - - # pane border - set-option -g pane-border-style "fg=#${c.base01}" - set-option -g pane-active-border-style "fg=#${c.base02}" - - # message text - set-option -g message-style "fg=#${c.base05},bg=#${c.base01}" - - # pane number display - set-option -g display-panes-active-colour "#${c.base0B}" - set-option -g display-panes-colour "#${c.base0A}" - - # clock - set-window-option -g clock-mode-colour "#${c.base0B}" - - # copy mode highlight - set-window-option -g mode-style "fg=#${c.base04},bg=#${c.base02}" - - # bell - set-window-option -g window-status-bell-style "fg=#${c.base01},bg=#${c.base08}" - - # status bar formatting - set -g status-left "#[fg=#${c.base0D},bold] #S " - set -g status-right "#[fg=#${c.base06},bold]%a %Y-%m-%d 󱑒 %H:%M" - set -g status-justify left - set -g status-left-length 200 # increase length (from 10) - set -g status-right-length 200 # increase length (from 10) - set -g status-position top - - # window formatting - set -g window-status-current-format '#[fg=#${c.base0E}][#I #W#{?window_zoomed_flag,( ),}]' - set -g window-status-format '#[fg=#${c.base04}] #I #W ' - set -g window-status-last-style 'fg=#${c.base06},bg=#${c.base01}' - ''; -in -{ - programs.tmux = { - enable = true; - aggressiveResize = true; - sensibleOnTop = true; - # tmux-256color is the proper one to enable italics - # just ensure you have that terminfo, newer ncurses provide it - # Macos does not have it but we fix that by installing ncurses through nix-darwin - # screen-256color works properly everywhere but does not have italics - terminal = "tmux-256color"; - keyMode = "vi"; - escapeTime = 0; - baseIndex = 1; - historyLimit = 50000; - extraConfig = lib.concatStringsSep "\n" [ baseConfig themeConfig ]; - plugins = [ ]; - }; - - programs.git.ignores = [ - ".tmux.sh" - ]; - - programs.fzf.tmux.enableShellIntegration = true; - - programs.zsh.initExtra = '' - # tmux baby - # (this cannot be a zsh widget unfortunately, tmux attach can only attach to a terminal, - # but zsh widgets do not allocate/reuse current terminal) - __txs() { ${pkgs.tmux-sessionizer}/bin/tmux-sessionizer } - bindkey -s '^F' '^u__txs^M' - - # fix for ssh socket and display env var in tmux - # run after attaching to a remote session for a 2+ time if you need it - tmux-refresh() { - eval "$(tmux show-environment -s SSH_AUTH_SOCK)" - eval "$(tmux show-environment -s DISPLAY)" - } - ''; -} diff --git a/home/konrad/common/modules/default.nix b/home/konrad/common/modules/default.nix index 9fd24dd3..74011391 100644 --- a/home/konrad/common/modules/default.nix +++ b/home/konrad/common/modules/default.nix @@ -2,6 +2,7 @@ alacritty = import ./alacritty.nix; bitwarden = import ./bitwarden.nix; gpg-agent = import ./gpg-agent.nix; + tmux = import ./tmux; restic = import ./restic.nix; ssh-egress = import ./ssh-egress.nix; syncthing = import ./syncthing.nix; diff --git a/home/konrad/common/modules/tmux/config.nix b/home/konrad/common/modules/tmux/config.nix new file mode 100644 index 00000000..1685e034 --- /dev/null +++ b/home/konrad/common/modules/tmux/config.nix @@ -0,0 +1,76 @@ +{ tmux-switcher, tmuxTextProcessor, pkgs, ... }: +'' + ## KONRAD's SENSIBLE DEFAULTS + # tmux messages are displayed for 4 seconds + set-option -g display-time 4000 + # upgrade color and fix italics + set -ga terminal-overrides ",-256color:Tc,alacritty:Tc" + # focus events enabled for terminals that support them + set-option -g focus-events on + # refresh interval + set-option -g status-interval 60 + + # Let the window to be renamed automatically when launching a process + set-option -g automatic-rename on + # But prevent renaming once you have manually changed it. And you can re-rename it after. + set-option -g allow-rename off + set-option -g set-titles on + + # renumber so that we have 1,2,3 always + set-option -g renumber-windows on + + # Set window notifications + set-option -g monitor-activity on + set-option -g visual-activity off + + # vim splits + bind-key v split-window -h + bind-key g split-window -v + + # vim panes + bind-key h select-pane -L + bind-key j select-pane -D + bind-key k select-pane -U + bind-key l select-pane -R + + # vim pane resize + bind-key < resize-pane -L 10 + bind-key > resize-pane -R 10 + bind-key - resize-pane -D 10 + bind-key + resize-pane -U 10 + + # Setup 'v' to begin selection, just like vim + bind-key -T copy-mode-vi 'v' send-keys -X begin-selection + bind-key -T copy-mode-vi 'V' send-keys -X select-line + bind-key -T copy-mode-vi 'r' send-keys -X rectangle-toggle + # Setup 'y' to yank (copy), just like VIM + bind-key -T copy-mode-vi 'y' send-keys -X copy-selection-and-cancel + # Setup P (capital) to paste after the prefix keys, JUST LIKE VIM + bind P paste-buffer + + # Use m to toggle mouse mode + unbind m + bind-key m setw mouse + # enable mouse by default, useful for resizing + set-option -g mouse on + + # when nested tmux session, + # C-a will send the prefix directly to the remote session + # C-A clashes with C-A in neovim! + #bind-key -n C-a send-prefix + + # facebook pathpicker + bind-key F run-shell -b "${tmuxTextProcessor} '${pkgs.fpp}/bin/fpp' '#{pane_id}' '#{pane_current_path}'" + + # urlscan + bind-key U run-shell -b "${tmuxTextProcessor} '${pkgs.urlscan}/bin/urlscan' '#{pane_id}' '#{pane_current_path}'" + + # tmux session switcher + bind-key r run-shell -b "${tmux-switcher}/bin/tmux-switcher" + + # toggle last window + bind-key W last-window + + # toggle last session + bind-key S switch-client -l +'' diff --git a/home/konrad/common/modules/tmux/default.nix b/home/konrad/common/modules/tmux/default.nix new file mode 100644 index 00000000..70e8b852 --- /dev/null +++ b/home/konrad/common/modules/tmux/default.nix @@ -0,0 +1,71 @@ +{ config, lib, pkgs, ... }: +with lib; +let + cfg = config.konrad.programs.tmux; + tmuxTextProcessor = pkgs.callPackage ./text_processor.nix { }; + tmux-sessionizer = pkgs.callPackage ./tmux-sessionizer { }; + tmux-switcher = pkgs.callPackage ./tmux-switcher { }; + tmux-windowizer = pkgs.callPackage ./tmux-windowizer { }; + baseConfig = pkgs.callPackage ./config.nix { inherit tmuxTextProcessor tmux-switcher; }; + themeConfig = import ./theme.nix { inherit (cfg) colorscheme; }; +in +{ + options.konrad.programs.tmux = { + enable = mkEnableOption "Enables personalized tmux through home-manager"; + + colorscheme = lib.mkOption { + type = lib.types.nullOr lib.types.attrs; + default = config.colorscheme; + description = "Colorscheme attrset compatible with nix-colors format."; + example = "config.colorscheme"; + }; + }; + + config = mkIf cfg.enable + { + programs.tmux = { + enable = true; + aggressiveResize = true; + sensibleOnTop = true; + # tmux-256color is the proper one to enable italics + # just ensure you have that terminfo, newer ncurses provide it + # Macos does not have it but we fix that by installing ncurses through nix-darwin + # screen-256color works properly everywhere but does not have italics + terminal = "tmux-256color"; + keyMode = "vi"; + escapeTime = 0; + baseIndex = 1; + historyLimit = 50000; + extraConfig = lib.concatStringsSep "\n" [ baseConfig themeConfig ]; + plugins = [ ]; + }; + + programs.git.ignores = [ + ".tmux.sh" + ]; + + programs.fzf.tmux.enableShellIntegration = true; + + programs.zsh = { + initExtra = '' + # tmux baby + # (this cannot be a zsh widget unfortunately, tmux attach can only attach to a terminal, + # but zsh widgets do not allocate/reuse current terminal) + __txs() { ${pkgs.tmux-sessionizer}/bin/tmux-sessionizer } + bindkey -s '^F' '^u__txs^M' + + # fix for ssh socket and display env var in tmux + # run after attaching to a remote session for a 2+ time if you need it + tmux-refresh() { + eval "$(tmux show-environment -s SSH_AUTH_SOCK)" + eval "$(tmux show-environment -s DISPLAY)" + } + ''; + shellAliases = { + txs = "${tmux-sessionizer}/bin/tmux-sessionizer"; + txw = "${tmux-windowizer}/bin/tmux-windowizer"; + txr = "${tmux-switcher}/bin/tmux-switcher"; + }; + }; + }; +} diff --git a/home/konrad/common/modules/tmux/text_processor.nix b/home/konrad/common/modules/tmux/text_processor.nix new file mode 100644 index 00000000..802ff1e6 --- /dev/null +++ b/home/konrad/common/modules/tmux/text_processor.nix @@ -0,0 +1,14 @@ +{ tmux, writeShellScript, ... }: +let + tmux' = "${tmux}/bin/tmux"; +in +writeShellScript "tmux_text_processor" '' + program="$1" + paneid="$2" + currentpanepath="$3" + capturename="$(basename $program)-$paneid" + showandpipe="${tmux'} show-buffer -b '$capturename' | $program || true; ${tmux'} delete-buffer -b '$capturename'" + + ${tmux'} capture-pane -J -S - -E - -b "$capturename" -t "$paneid" + ${tmux'} split-window -c "$currentpanepath" "$showandpipe" +'' diff --git a/home/konrad/common/modules/tmux/theme.nix b/home/konrad/common/modules/tmux/theme.nix new file mode 100644 index 00000000..feb472e1 --- /dev/null +++ b/home/konrad/common/modules/tmux/theme.nix @@ -0,0 +1,51 @@ +{ colorscheme }: +let + c = colorscheme.colors; +in +'' + # Base16 ${colorscheme.name} + # Scheme author: ${colorscheme.author} + # Template author: Tinted Theming: (https://github.com/tinted-theming) + + # default statusbar colors + set-option -g status-style "fg=#${c.base04},bg=default" + + # default window title colors + set-window-option -g window-status-style "fg=#${c.base04},bg=default" + + # active window title colors + set-window-option -g window-status-current-style "fg=#${c.base0A},bg=default" + + # pane border + set-option -g pane-border-style "fg=#${c.base01}" + set-option -g pane-active-border-style "fg=#${c.base02}" + + # message text + set-option -g message-style "fg=#${c.base05},bg=#${c.base01}" + + # pane number display + set-option -g display-panes-active-colour "#${c.base0B}" + set-option -g display-panes-colour "#${c.base0A}" + + # clock + set-window-option -g clock-mode-colour "#${c.base0B}" + + # copy mode highlight + set-window-option -g mode-style "fg=#${c.base04},bg=#${c.base02}" + + # bell + set-window-option -g window-status-bell-style "fg=#${c.base01},bg=#${c.base08}" + + # status bar formatting + set -g status-left "#[fg=#${c.base0D},bold] #S " + set -g status-right "#[fg=#${c.base06},bold]%a %Y-%m-%d 󱑒 %H:%M" + set -g status-justify left + set -g status-left-length 200 # increase length (from 10) + set -g status-right-length 200 # increase length (from 10) + set -g status-position top + + # window formatting + set -g window-status-current-format '#[fg=#${c.base0E}][#I #W#{?window_zoomed_flag,( ),}]' + set -g window-status-format '#[fg=#${c.base04}] #I #W ' + set -g window-status-last-style 'fg=#${c.base06},bg=#${c.base01}' +'' diff --git a/pkgs/tmux-sessionizer/default.nix b/home/konrad/common/modules/tmux/tmux-sessionizer/default.nix similarity index 100% rename from pkgs/tmux-sessionizer/default.nix rename to home/konrad/common/modules/tmux/tmux-sessionizer/default.nix diff --git a/pkgs/tmux-sessionizer/tmux-sessionizer.sh b/home/konrad/common/modules/tmux/tmux-sessionizer/tmux-sessionizer.sh similarity index 100% rename from pkgs/tmux-sessionizer/tmux-sessionizer.sh rename to home/konrad/common/modules/tmux/tmux-sessionizer/tmux-sessionizer.sh diff --git a/pkgs/tmux-switcher/default.nix b/home/konrad/common/modules/tmux/tmux-switcher/default.nix similarity index 100% rename from pkgs/tmux-switcher/default.nix rename to home/konrad/common/modules/tmux/tmux-switcher/default.nix diff --git a/pkgs/tmux-switcher/tmux-switcher.sh b/home/konrad/common/modules/tmux/tmux-switcher/tmux-switcher.sh similarity index 100% rename from pkgs/tmux-switcher/tmux-switcher.sh rename to home/konrad/common/modules/tmux/tmux-switcher/tmux-switcher.sh diff --git a/pkgs/tmux-windowizer/default.nix b/home/konrad/common/modules/tmux/tmux-windowizer/default.nix similarity index 100% rename from pkgs/tmux-windowizer/default.nix rename to home/konrad/common/modules/tmux/tmux-windowizer/default.nix diff --git a/pkgs/tmux-windowizer/tmux-windowizer.sh b/home/konrad/common/modules/tmux/tmux-windowizer/tmux-windowizer.sh similarity index 100% rename from pkgs/tmux-windowizer/tmux-windowizer.sh rename to home/konrad/common/modules/tmux/tmux-windowizer/tmux-windowizer.sh diff --git a/home/konrad/m3800.nix b/home/konrad/m3800.nix index e683138f..2e18443b 100644 --- a/home/konrad/m3800.nix +++ b/home/konrad/m3800.nix @@ -7,7 +7,6 @@ fontProfiles.enable = true; konrad.programs.gpg.enable = true; - konrad.programs.ssh-egress.enable = true; konrad.programs.bitwarden.enable = true; konrad.programs.alacritty.enable = true; konrad.programs.restic = { diff --git a/home/konrad/mbp13.nix b/home/konrad/mbp13.nix index 0c916b0e..0382ed7c 100644 --- a/home/konrad/mbp13.nix +++ b/home/konrad/mbp13.nix @@ -12,7 +12,6 @@ monospace.size = 16.0; }; konrad.programs.gpg.enable = true; - konrad.programs.ssh-egress.enable = true; konrad.programs.bitwarden.enable = true; konrad.programs.alacritty = { enable = true; diff --git a/home/konrad/rpi4-1.nix b/home/konrad/rpi4-1.nix index 3c3909df..4ee71a0f 100644 --- a/home/konrad/rpi4-1.nix +++ b/home/konrad/rpi4-1.nix @@ -4,8 +4,6 @@ ./common/presets/nixos.nix ]; - konrad.programs.ssh-egress.enable = true; - programs.rtorrent = { enable = true; extraConfig = '' diff --git a/home/konrad/rpi4-2.nix b/home/konrad/rpi4-2.nix index 4c271fcf..643753c7 100644 --- a/home/konrad/rpi4-2.nix +++ b/home/konrad/rpi4-2.nix @@ -3,6 +3,4 @@ imports = [ ./common/presets/nixos.nix ]; - - konrad.programs.ssh-egress.enable = true; } diff --git a/pkgs/default.nix b/pkgs/default.nix index 978ffa08..9aab2046 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -2,7 +2,4 @@ { darwin-zsh-completions = pkgs.callPackage ./darwin-zsh-completions.nix { }; rfv = pkgs.callPackage ./rfv { }; - tmux-sessionizer = pkgs.callPackage ./tmux-sessionizer { }; - tmux-switcher = pkgs.callPackage ./tmux-switcher { }; - tmux-windowizer = pkgs.callPackage ./tmux-windowizer { }; }