mirror of
https://github.com/LnL7/nix-darwin.git
synced 2024-12-14 11:57:34 +00:00
171 lines
4.3 KiB
Nix
171 lines
4.3 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
|
|
inherit (pkgs) stdenv;
|
|
|
|
cfg = config.programs.tmux;
|
|
|
|
tmux = pkgs.runCommand pkgs.tmux.name
|
|
{ buildInputs = [ pkgs.makeWrapper ]; }
|
|
''
|
|
source $stdenv/setup
|
|
|
|
mkdir -p $out/bin
|
|
makeWrapper ${pkgs.tmux}/bin/tmux $out/bin/tmux \
|
|
--set __ETC_BASHRC_SOURCED "" \
|
|
--set __ETC_ZPROFILE_SOURCED "" \
|
|
--set __ETC_ZSHENV_SOURCED "" \
|
|
--set __ETC_ZSHRC_SOURCED "" \
|
|
--add-flags -f --add-flags /etc/tmux.conf
|
|
'';
|
|
|
|
text = import ../lib/write-text.nix {
|
|
inherit lib;
|
|
mkTextDerivation = name: text: pkgs.writeText "tmux-options-${name}" text;
|
|
};
|
|
|
|
tmuxOptions = concatMapStringsSep "\n" (attr: attr.text) (attrValues cfg.tmuxOptions);
|
|
|
|
fzfTmuxSession = pkgs.writeScript "fzf-tmux-session" ''
|
|
#! ${stdenv.shell}
|
|
set -e
|
|
|
|
session=$(tmux list-sessions -F '#{session_name}' | fzf --query="$1" --exit-0)
|
|
tmux switch-client -t "$session"
|
|
'';
|
|
|
|
in {
|
|
options = {
|
|
|
|
programs.tmux.enable = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
description = ''
|
|
Whether to configure tmux.
|
|
'';
|
|
};
|
|
|
|
programs.tmux.enableSensible = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
example = true;
|
|
description = ''
|
|
Enable sensible configuration options for tmux.
|
|
'';
|
|
};
|
|
|
|
programs.tmux.enableMouse = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
example = true;
|
|
description = ''
|
|
Enable mouse support for tmux.
|
|
'';
|
|
};
|
|
|
|
programs.tmux.enableFzf = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
example = true;
|
|
description = ''
|
|
Enable fzf keybindings for selecting tmux sessions and panes.
|
|
'';
|
|
};
|
|
|
|
programs.tmux.enableVim = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
example = true;
|
|
description = ''
|
|
Enable vim style keybindings for copy mode, and navigation of tmux panes.
|
|
'';
|
|
};
|
|
|
|
programs.tmux.tmuxOptions = mkOption {
|
|
internal = true;
|
|
type = types.attrsOf (types.submodule text);
|
|
default = {};
|
|
};
|
|
|
|
programs.tmux.tmuxConfig = mkOption {
|
|
type = types.lines;
|
|
default = "";
|
|
};
|
|
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
environment.systemPackages =
|
|
[ # Include wrapped tmux package.
|
|
tmux
|
|
];
|
|
|
|
environment.etc."tmux.conf".text = ''
|
|
${tmuxOptions}
|
|
${cfg.tmuxConfig}
|
|
|
|
source-file -q /etc/tmux.conf.local
|
|
'';
|
|
|
|
programs.tmux.tmuxOptions.login-shell.text = if stdenv.isDarwin then ''
|
|
set -g default-command "reattach-to-user-namespace ${config.environment.loginShell}"
|
|
'' else ''
|
|
set -g default-command "${config.environment.loginShell}"
|
|
'';
|
|
|
|
programs.tmux.tmuxOptions.sensible.text = mkIf cfg.enableSensible ''
|
|
set -g default-terminal "screen-256color"
|
|
setw -g aggressive-resize on
|
|
|
|
set -g base-index 1
|
|
set -g renumber-windows on
|
|
|
|
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
|
|
'';
|
|
|
|
programs.tmux.tmuxOptions.mouse.text = mkIf cfg.enableMouse ''
|
|
set -g mouse on
|
|
setw -g mouse on
|
|
set -g terminal-overrides 'xterm*:smcup@:rmcup@'
|
|
'';
|
|
|
|
programs.tmux.tmuxOptions.fzf.text = mkIf cfg.enableFzf ''
|
|
bind-key -n M-p run "tmux split-window -p 40 -c '#{pane_current_path}' 'tmux send-keys -t #{pane_id} \"$(fzf -m | paste -sd\\ -)\"'"
|
|
bind-key -n M-s run "tmux split-window -p 40 'tmux send-keys -t #{pane_id} \"$(${fzfTmuxSession})\"'"
|
|
'';
|
|
|
|
programs.tmux.tmuxOptions.vim.text = 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}'
|
|
|
|
bind -t vi-copy v begin-selection
|
|
'' + optionalString stdenv.isLinux ''
|
|
bind -t vi-copy y copy-selection
|
|
'' + optionalString stdenv.isDarwin ''
|
|
bind -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"
|
|
'');
|
|
|
|
};
|
|
}
|