| 
									
										
										
										
											2016-03-23 15:33:28 +08:00
										 |  |  | { config, pkgs, lib, ... }: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							| 
									
										
										
										
											2018-07-20 19:36:12 +00:00
										 |  |  |   inherit (lib) mkOption mkIf types; | 
					
						
							| 
									
										
										
										
											2016-03-23 15:33:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   cfg = config.programs.tmux; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-31 23:22:17 +08:00
										 |  |  |   defaultKeyMode  = "emacs"; | 
					
						
							|  |  |  |   defaultResize   = 5; | 
					
						
							|  |  |  |   defaultShortcut = "b"; | 
					
						
							|  |  |  |   defaultTerminal = "screen"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   boolToStr = value: if value then "on" else "off"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   tmuxConf = ''
 | 
					
						
							|  |  |  |     set  -g default-terminal "${cfg.terminal}" | 
					
						
							|  |  |  |     set  -g base-index      ${toString cfg.baseIndex} | 
					
						
							|  |  |  |     setw -g pane-base-index ${toString cfg.baseIndex} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ${if cfg.newSession then "new-session" else ""} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ${if cfg.reverseSplit then ''
 | 
					
						
							|  |  |  |     bind v split-window -h | 
					
						
							|  |  |  |     bind s split-window -v | 
					
						
							|  |  |  |     '' else ""}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     set -g status-keys ${cfg.keyMode} | 
					
						
							|  |  |  |     set -g mode-keys   ${cfg.keyMode} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-28 19:10:42 +08:00
										 |  |  |     ${if cfg.keyMode == "vi" && cfg.customPaneNavigationAndResize then ''
 | 
					
						
							| 
									
										
										
										
											2016-03-31 23:22:17 +08:00
										 |  |  |     bind h select-pane -L | 
					
						
							|  |  |  |     bind j select-pane -D | 
					
						
							|  |  |  |     bind k select-pane -U | 
					
						
							|  |  |  |     bind l select-pane -R | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bind -r H resize-pane -L ${toString cfg.resizeAmount} | 
					
						
							|  |  |  |     bind -r J resize-pane -D ${toString cfg.resizeAmount} | 
					
						
							|  |  |  |     bind -r K resize-pane -U ${toString cfg.resizeAmount} | 
					
						
							|  |  |  |     bind -r L resize-pane -R ${toString cfg.resizeAmount} | 
					
						
							|  |  |  |     '' else ""}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ${if (cfg.shortcut != defaultShortcut) then ''
 | 
					
						
							|  |  |  |     # rebind main key: C-${cfg.shortcut} | 
					
						
							|  |  |  |     unbind C-${defaultShortcut} | 
					
						
							|  |  |  |     set -g prefix C-${cfg.shortcut} | 
					
						
							|  |  |  |     bind ${cfg.shortcut} send-prefix | 
					
						
							|  |  |  |     bind C-${cfg.shortcut} last-window | 
					
						
							|  |  |  |     '' else ""}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setw -g aggressive-resize ${boolToStr cfg.aggressiveResize} | 
					
						
							|  |  |  |     setw -g clock-mode-style  ${if cfg.clock24 then "24" else "12"} | 
					
						
							|  |  |  |     set  -s escape-time       ${toString cfg.escapeTime} | 
					
						
							|  |  |  |     set  -g history-limit     ${toString cfg.historyLimit} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ${cfg.extraTmuxConf} | 
					
						
							|  |  |  |   '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | in { | 
					
						
							| 
									
										
										
										
											2016-03-23 15:33:28 +08:00
										 |  |  |   ###### interface | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   options = { | 
					
						
							|  |  |  |     programs.tmux = { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-07 21:26:36 +00:00
										 |  |  |       enable = mkOption { | 
					
						
							|  |  |  |         type = types.bool; | 
					
						
							|  |  |  |         default = false; | 
					
						
							|  |  |  |         description = "Whenever to configure <command>tmux</command> system-wide."; | 
					
						
							|  |  |  |         relatedPackages = [ "tmux" ]; | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2016-03-23 15:33:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-31 23:22:17 +08:00
										 |  |  |       aggressiveResize = mkOption { | 
					
						
							|  |  |  |         default = false; | 
					
						
							|  |  |  |         type = types.bool; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |           Resize the window to the size of the smallest session for which it is the current window. | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       baseIndex = mkOption { | 
					
						
							|  |  |  |         default = 0; | 
					
						
							|  |  |  |         example = 1; | 
					
						
							|  |  |  |         type = types.int; | 
					
						
							|  |  |  |         description = "Base index for windows and panes."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       clock24 = mkOption { | 
					
						
							|  |  |  |         default = false; | 
					
						
							|  |  |  |         type = types.bool; | 
					
						
							|  |  |  |         description = "Use 24 hour clock."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-28 19:10:42 +08:00
										 |  |  |       customPaneNavigationAndResize = mkOption { | 
					
						
							|  |  |  |         default = false; | 
					
						
							|  |  |  |         type = types.bool; | 
					
						
							|  |  |  |         description = "Override the hjkl and HJKL bindings for pane navigation and resizing in VI mode."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-31 23:22:17 +08:00
										 |  |  |       escapeTime = mkOption { | 
					
						
							|  |  |  |         default = 500; | 
					
						
							|  |  |  |         example = 0; | 
					
						
							|  |  |  |         type = types.int; | 
					
						
							|  |  |  |         description = "Time in milliseconds for which tmux waits after an escape is input."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       extraTmuxConf = mkOption { | 
					
						
							| 
									
										
										
										
											2016-03-23 15:33:28 +08:00
										 |  |  |         default = ""; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							| 
									
										
										
										
											2016-03-31 23:22:17 +08:00
										 |  |  |           Additional contents of /etc/tmux.conf | 
					
						
							| 
									
										
										
										
											2016-03-23 15:33:28 +08:00
										 |  |  |         '';
 | 
					
						
							|  |  |  |         type = types.lines; | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2016-03-31 23:22:17 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       historyLimit = mkOption { | 
					
						
							|  |  |  |         default = 2000; | 
					
						
							|  |  |  |         example = 5000; | 
					
						
							|  |  |  |         type = types.int; | 
					
						
							|  |  |  |         description = "Maximum number of lines held in window history."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       keyMode = mkOption { | 
					
						
							|  |  |  |         default = defaultKeyMode; | 
					
						
							|  |  |  |         example = "vi"; | 
					
						
							|  |  |  |         type = types.enum [ "emacs" "vi" ]; | 
					
						
							|  |  |  |         description = "VI or Emacs style shortcuts."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       newSession = mkOption { | 
					
						
							|  |  |  |         default = false; | 
					
						
							|  |  |  |         type = types.bool; | 
					
						
							|  |  |  |         description = "Automatically spawn a session if trying to attach and none are running."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       reverseSplit = mkOption { | 
					
						
							|  |  |  |         default = false; | 
					
						
							|  |  |  |         type = types.bool; | 
					
						
							|  |  |  |         description = "Reverse the window split shortcuts."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       resizeAmount = mkOption { | 
					
						
							|  |  |  |         default = defaultResize; | 
					
						
							|  |  |  |         example = 10; | 
					
						
							|  |  |  |         type = types.int; | 
					
						
							|  |  |  |         description = "Number of lines/columns when resizing."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       shortcut = mkOption { | 
					
						
							|  |  |  |         default = defaultShortcut; | 
					
						
							|  |  |  |         example = "a"; | 
					
						
							|  |  |  |         type = types.str; | 
					
						
							|  |  |  |         description = "Ctrl following by this key is used as the main shortcut."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       terminal = mkOption { | 
					
						
							|  |  |  |         default = defaultTerminal; | 
					
						
							|  |  |  |         example = "screen-256color"; | 
					
						
							|  |  |  |         type = types.str; | 
					
						
							|  |  |  |         description = "Set the $TERM variable."; | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2017-12-29 15:02:58 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       secureSocket = mkOption { | 
					
						
							|  |  |  |         default = true; | 
					
						
							|  |  |  |         type = types.bool; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |           Store tmux socket under /run, which is more secure than /tmp, but as a | 
					
						
							|  |  |  |           downside it doesn't survive user logout. | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2016-03-23 15:33:28 +08:00
										 |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ###### implementation | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   config = mkIf cfg.enable { | 
					
						
							|  |  |  |     environment = { | 
					
						
							| 
									
										
										
										
											2016-03-31 23:22:17 +08:00
										 |  |  |       etc."tmux.conf".text = tmuxConf; | 
					
						
							| 
									
										
										
										
											2016-05-27 15:57:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       systemPackages = [ pkgs.tmux ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       variables = { | 
					
						
							| 
									
										
										
										
											2019-05-30 13:48:22 +02:00
										 |  |  |         TMUX_TMPDIR = lib.optional cfg.secureSocket ''''${XDG_RUNTIME_DIR:-"/run/user/$(id -u)"}''; | 
					
						
							| 
									
										
										
										
											2016-05-27 15:57:12 +08:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2016-03-23 15:33:28 +08:00
										 |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } |