130 lines
3.3 KiB
Nix
130 lines
3.3 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
|
|
with lib;
|
|
let
|
|
cfg = config.my.programs.tmux;
|
|
|
|
fzf1 = pkgs.writeShellApplication {
|
|
name = "fzf1";
|
|
runtimeInputs = with pkgs; [ coreutils fzf ];
|
|
text = ''
|
|
#!/usr/bin/env bash
|
|
|
|
options=$(fzf --filter "''$*" < /dev/stdin)
|
|
|
|
if [[ -z $options ]]; then
|
|
exit 1
|
|
elif [[ $(wc -l <<< "$options") -eq 1 ]]; then
|
|
selected="$options"
|
|
else
|
|
selected=$(echo "$options" | fzf --query="$*")
|
|
fi
|
|
|
|
if [[ -z $selected ]]; then
|
|
exit 0
|
|
fi
|
|
|
|
echo "$selected"
|
|
'';
|
|
};
|
|
|
|
tmux-switch = pkgs.writeShellApplication {
|
|
name = "tmux-switch";
|
|
runtimeInputs = with pkgs; [ tmux ];
|
|
text = ''
|
|
#!/usr/bin/env bash
|
|
if [[ -z ''${TMUX+x} ]]; then
|
|
tmux attach -t "$1"
|
|
else
|
|
tmux switch-client -t "$1"
|
|
fi
|
|
'';
|
|
};
|
|
|
|
tmux-sessionizer = pkgs.writeFishApplication {
|
|
name = "ts";
|
|
runtimeInputs = with pkgs; [ tmux findutils coreutils procps fd fzf1 tmux-switch ];
|
|
text = readFile ./tmux-sessionizer/script.fish;
|
|
completions = readFile ./tmux-sessionizer/completions.fish;
|
|
};
|
|
|
|
tmux-attach = pkgs.writeFishApplication {
|
|
name = "ta";
|
|
runtimeInputs = with pkgs; [ tmux fzf1 tmux-switch ];
|
|
text = readFile ./tmux-attach/script.fish;
|
|
completions = readFile ./tmux-attach/completions.fish;
|
|
};
|
|
|
|
in
|
|
{
|
|
options.my.programs.tmux = {
|
|
enable = mkEnableOption "tmux";
|
|
autoAttach = mkEnableOption "autoAttach";
|
|
keybinds = mkOption {
|
|
type = with types; attrsOf (attrsOf string);
|
|
default = { };
|
|
description = "Keybinds for tmux";
|
|
example = literalExample ''
|
|
{
|
|
prefix = {
|
|
"-" = "split-window -v";
|
|
"|" = "split-window -h";
|
|
};
|
|
copy-mode-vi = {
|
|
"v" = "send -X begin-selection";
|
|
};
|
|
}
|
|
'';
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
my.shell.abbreviations.t = "tmux";
|
|
|
|
home-manager.users.moritz.home.packages = [
|
|
tmux-sessionizer
|
|
tmux-attach
|
|
];
|
|
home-manager.users.moritz.programs = {
|
|
tmux = {
|
|
enable = true;
|
|
clock24 = true;
|
|
customPaneNavigationAndResize = true;
|
|
keyMode = "vi";
|
|
mouse = true;
|
|
prefix = "C-Space";
|
|
sensibleOnTop = false;
|
|
plugins = with pkgs.tmuxPlugins; [
|
|
sensible
|
|
tmux-fzf
|
|
vim-tmux-navigator
|
|
yank
|
|
];
|
|
extraConfig =
|
|
let
|
|
mkKeybind = table: mapAttrsToList (keybind: value: "bind-key -T ${table} '${keybind}' ${value}");
|
|
keybinds = flatten (mapAttrsToList mkKeybind cfg.keybinds);
|
|
in
|
|
''
|
|
# Keybinds
|
|
${concatStringsSep "\n" keybinds}
|
|
'';
|
|
};
|
|
fzf.tmux.enableShellIntegration = true;
|
|
fish.interactiveShellInit =
|
|
let
|
|
insideVariables = [ "$TMUX" "$INSIDE_EMACS" "$EMACS" "$VIM" "$VSCODE_RESOLVING_ENVIRONMENT" ];
|
|
insideVariableMissing = concatStringsSep " && " (map (x: "test -z ${x}") insideVariables);
|
|
in
|
|
mkIf cfg.autoAttach
|
|
''
|
|
if ! fish_is_root_user && test "$TERM_PROGRAM" != 'vscode' && ${insideVariableMissing}
|
|
if test -z $tmux_autostarted
|
|
set -x tmux_autostarted true
|
|
ts
|
|
end
|
|
end
|
|
'';
|
|
};
|
|
};
|
|
}
|