From 4a7514f2eae42f0c36abee8b105265c3e73a89ca Mon Sep 17 00:00:00 2001 From: Daiderd Jordan Date: Fri, 21 Oct 2016 23:32:03 +0200 Subject: [PATCH] add basic options for programs.tmux --- config.nix | 17 +++------ modules/environment.nix | 2 +- modules/tmux.nix | 85 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 12 deletions(-) create mode 100644 modules/tmux.nix diff --git a/config.nix b/config.nix index 8997ccb4..7daea04c 100644 --- a/config.nix +++ b/config.nix @@ -9,6 +9,7 @@ let [ config ./modules/system.nix ./modules/environment.nix + ./modules/tmux.nix ]; }; @@ -48,21 +49,15 @@ let environment.shellAliases.ls = "ls -G"; environment.etc."tmux.conf".text = '' - set -g default-command "reattach-to-user-namespace -l $SHELL" - set -g default-terminal "screen-256color" + source-file ${config.system.build.setTmuxOptions} + set -g status-bg black set -g status-fg white - - set -g base-index 1 - set -g renumber-windows on - - setw -g mode-keys vi - - bind c new-window -c '#{pane_current_path}' - bind % split-window -v -c '#{pane_current_path}' - bind '"' split-window -h -c '#{pane_current_path}' ''; + programs.tmux.enableSensible = true; + programs.tmux.enableVim = true; + environment.etc."zshrc".text = '' autoload -U compinit && compinit autoload -U promptinit && promptinit diff --git a/modules/environment.nix b/modules/environment.nix index d2e0d143..58a5e25b 100644 --- a/modules/environment.nix +++ b/modules/environment.nix @@ -39,6 +39,7 @@ in { }; environment.variables = mkOption { + type = types.attrsOf (types.loeOf types.str); default = {}; description = '' A set of environment variables used in the global environment. @@ -47,7 +48,6 @@ in { strings. The latter is concatenated, interspersed with colon characters. ''; - type = types.attrsOf (types.loeOf types.str); apply = mapAttrs (n: v: if isList v then concatStringsSep ":" v else v); }; diff --git a/modules/tmux.nix b/modules/tmux.nix new file mode 100644 index 00000000..249e0157 --- /dev/null +++ b/modules/tmux.nix @@ -0,0 +1,85 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + inherit (pkgs) stdenv; + + cfg = config.programs.tmux; + + tmuxConfigs = + mapAttrsToList (n: v: "${v}") cfg.text; + +in { + options = { + + programs.tmux.enableSensible = mkOption { + type = types.bool; + default = false; + example = true; + description = '' + Enable sensible configuration options. + ''; + }; + + programs.tmux.enableVim = mkOption { + type = types.bool; + default = false; + example = true; + description = '' + Enable vim style keybindings for copy mode, and navigation of panes. + ''; + }; + + programs.tmux.text = mkOption { + internal = true; + type = types.attrsOf types.str; + default = {}; + }; + + }; + + config = { + + system.build.setTmuxOptions = pkgs.writeText "set-tmux-options" + (concatStringsSep "\n" tmuxConfigs); + + programs.tmux.text.sensible = mkIf cfg.enableSensible ('' + set -g default-terminal "screen-256color" + setw -g aggressive-resize on + + set -g base-index 1 + set -g renumber-windows on + bind 0 set -g status + + set -g status-keys emacs + set -s escape-time 0 + + bind c new-window -c '#{pane_current_path}' + bind % split-window -v -c '#{pane_current_path}' + bind '"' split-window -h -c '#{pane_current_path}' + + # TODO: make these interactive + bind C new-session + bind S switch-client -l + + # set -g status-utf8 on + # set -g utf8 on + '' + optionalString stdenv.isDarwin '' + set -g default-command "reattach-to-user-namespace -l $SHELL" + ''); + + programs.tmux.text.vim = mkIf cfg.enableVim '' + setw -g mode-keys vi + + bind h select-pane -L + bind j select-pane -D + bind k select-pane -U + bind l select-pane -R + bind s split-window -v -c '#{pane_current_path}' + bind v split-window -h -c '#{pane_current_path}' + ''; + + }; +}