diff --git a/home-manager/modules/tmux/gitmux.yml b/home-manager/modules/tmux/gitmux.yml new file mode 100644 index 0000000..ca58708 --- /dev/null +++ b/home-manager/modules/tmux/gitmux.yml @@ -0,0 +1,28 @@ +tmux: + symbols: + branch: " " + hashprefix: ":" + ahead: " " + behind: " " + staged: " " + conflict: "󰕚 " + untracked: "󱀶 " + modified: " " + stashed: " " + clean: " " + insertions: " " + deletions: " " + styles: + state: "#[fg=red,nobold]" + branch: "#[fg=white,nobold]" + staged: "#[fg=green,nobold]" + conflict: "#[fg=red,nobold]" + modified: "#[fg=yellow,nobold]" + untracked: "#[fg=gray,nobold]" + stashed: "#[fg=gray,nobold]" + clean: "#[fg=green,nobold]" + divergence: "#[fg=cyan,nobold]" + layout: [branch, divergence, flags, stats, " "] + options: + branch_max_len: 0 + hide_clean: true diff --git a/home-manager/modules/tmux/ta.sh b/home-manager/modules/tmux/ta.sh deleted file mode 100644 index 224af53..0000000 --- a/home-manager/modules/tmux/ta.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash - -not_in_tmux() { - [ -z "$TMUX" ] -} - -DIR="$1" - -# If no arguments are passed in, try to immediately attach or start without further input -echo "$DIR" -if [ -z "$DIR" ]; then - if not_in_tmux; then - tmux attach && exit 1 || DIR="--start" - else - exit 1 - fi -fi - -# If --start was passed in, immediately start a new session based on the current directory -if [ "$DIR" = "--start" ]; then - echo "Starting" - path_name="$(basename "$PWD" | tr . -)" - session_name="${path_name//./_}" -else - # Ask the user which directory to start in - _session_name=$(cd "$DIR" && find -L . -maxdepth 1 -type d -printf "%f\n" | sed "s|/||g" | fzf --reverse --header="Select project from $(basename "$DIR") ") - session_name="${_session_name//./_}" - path_name="$DIR/$_session_name" -fi - -echo "Session name is \"$session_name\"" -echo "Path name is \"$path_name\"" - -if [ -z "$session_name" ]; then - # Operation cancelled by user - exit 1 -fi - -session_exists() { - # Check if the $session_name exists - tmux has-session -t "=$session_name" -} - -create_detached_session() { - if [ "$DIR" = "--start" ]; then - (TMUX='' - tmux new-session -Ad -s "$session_name" -c "$path_name" - ) - else - (TMUX='' - tmux new-session -Ad -s "$session_name" -c "$path_name" - # tmux split-window -vb -t "$session_name" -c "$path_name" -p 70 - tmux send-keys -t "$session_name" "nvim '+Telescope find_files'" Enter - ) - fi -} - -create_if_needed_and_attach() { - if not_in_tmux; then - tmux new-session -As "$session_name" -c "$path_name" - else - if ! session_exists; then - create_detached_session - fi - tmux switch-client -t "$session_name" - fi -} - -attach_to_first_session() { - first_session_name=$(tmux list-sessions -F "#{session_name}" | head -n 1) - if [ -n "$first_session_name" ]; then - tmux attach -t "$first_session_name" - tmux choose-tree -Za - fi -} - -create_if_needed_and_attach || attach_to_first_session diff --git a/home-manager/modules/tmux/tmux.nix b/home-manager/modules/tmux/tmux.nix index 58fdb2b..33bfc9a 100644 --- a/home-manager/modules/tmux/tmux.nix +++ b/home-manager/modules/tmux/tmux.nix @@ -18,122 +18,132 @@ ]; extraConfig = '' - bind -n M-r source-file ~/.config/tmux/tmux.conf + bind -n M-r source-file ~/.config/tmux/tmux.conf - set -ag terminal-overrides ",xterm-256color:RGB" + set -ag terminal-overrides ",xterm-256color:RGB" - set -g detach-on-destroy off # don't exit from tmux when closing a session + set -g detach-on-destroy off # don't exit from tmux when closing a session - # New Theme - set -g status-interval 3 # update the status bar every 3 seconds - set -g status-left "#[fg=blue,bold,bg=#${config.lib.stylix.colors.base00}]#S  " - set -g status-right "#[fg=#${config.lib.stylix.colors.base07},bold,bg=#${config.lib.stylix.colors.base00}]%a %Y-%m-%d 󱑒 %l:%M %p" - set -ga status-right "#($HOME/.config/tmux/scripts/cal.sh)" - 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 # macOS / darwin style - set -g status-style 'bg=#${config.lib.stylix.colors.base00}' # transparent - set -g window-status-current-format '#[fg=magenta,bg=#${config.lib.stylix.colors.base00}]#I #W#{?window_zoomed_flag,(),} ' - set -g window-status-format '#[fg=gray,bg=#${config.lib.stylix.colors.base00}] #I #W' - set -g window-status-last-style 'fg=white,bg=black' - set -g message-command-style bg=default,fg=yellow - set -g message-style bg=default,fg=yellow - set -g mode-style bg=default,fg=yellow - set -g pane-active-border-style 'fg=magenta,bg=default' - set -g pane-border-style 'fg=brightblack,bg=default' - set -g @tmux-last-prompt-pattern ' ' + # New Theme + set -g status-interval 3 # update the status bar every 3 seconds + #set -g status-left "#[fg=blue,bold,bg=#${config.lib.stylix.colors.base00}] #S  " + set -ga status-left " #[fg=blue,nobold]#(gitmux -cfg $HOME/.config/tmux/gitmux.yml)" + set -g status-right "" + + 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 # macOS / darwin style + set -g status-style 'bg=#${config.lib.stylix.colors.base00}' # transparent + set -g window-status-current-format '#[fg=magenta,bg=#${config.lib.stylix.colors.base00}]#I👉#W#{?window_zoomed_flag,(),} ' + set -g window-status-format '#[fg=gray,bg=#${config.lib.stylix.colors.base00}] #I #W' + set -g window-status-last-style 'fg=white,bg=black' + set -g message-command-style bg=default,fg=yellow + set -g message-style bg=default,fg=yellow + set -g mode-style bg=default,fg=yellow + set -g pane-active-border-style 'fg=magenta,bg=default' + set -g pane-border-style 'fg=brightblack,bg=default' + set -g @tmux-last-prompt-pattern ' ' - set -g mouse on + set -g mouse on - set-option -g status-position top + set-option -g status-position top - bind-key g display-popup -h 95% -w 95% -E 'lazygit' - bind-key t display-popup -h 95% -w 95% -E "${pkgs.htop}/bin/htop" + bind-key x kill-pane - bind C-g display-popup -E "tat ~/Projects" + #bind-key g display-popup -h 95% -w 95% -E 'lazygit' + bind -N "⌘+g lazygit " g new-window -c "#{pane_current_path}" -n "🌳" "lazygit 2> /dev/null" + bind -N "⌘+G gh-dash " G new-window -c "#{pane_current_path}" -n "😺" "gh-dash 2> /dev/null" + bind-key t display-popup -h 95% -w 95% -E "${pkgs.htop}/bin/htop" + bind-key e send-keys "tmux capture-pane -p -S - | nvim -c 'set buftype=nofile' +" Enter - bind -n M-g display-popup -E "tmux new-session -A -s scratch" + bind -n M-g display-popup -E "tmux new-session -A -s scratch" - bind -n M-b switch-client -l - bind -n M-p previous-window # for ansi - bind -n M-n next-window # for ansi - bind -n M-P switch-client -p - bind -n M-N switch-client -n + bind -n M-b switch-client -l + bind -n M-p previous-window # for ansi + bind -n M-n next-window # for ansi + bind -n M-P switch-client -p + bind -n M-N switch-client -n - unbind f - bind f resize-pane -Z + unbind f + bind f resize-pane -Z - # create session - bind C-c new-session + # create session + bind C-c new-session - # split current window horizontally - bind - split-window -v - # split current window vertically - bind _ split-window -h + # split current window horizontally + bind - split-window -v + # split current window vertically + bind _ split-window -h - # Select Layouts - #――――――――――――――――― - bind -n M-a select-layout main-vertical - bind -n M-A select-layout main-horizontal - bind -n M-E select-layout even-vertical - bind -n M-V select-layout even-horizontal + # Select Layouts + #――――――――――――――――― + bind -n M-a select-layout main-vertical + bind -n M-A select-layout main-horizontal + bind -n M-E select-layout even-vertical + bind -n M-V select-layout even-horizontal - # pane navigation - bind -r h select-pane -L # move left - bind -r j select-pane -D # move down - bind -r k select-pane -U # move up - bind -r l select-pane -R # move right - bind > swap-pane -D # swap current pane with the next one - bind < swap-pane -U # swap current pane with the previous one + # pane navigation + bind -r h select-pane -L # move left + bind -r j select-pane -D # move down + bind -r k select-pane -U # move up + bind -r l select-pane -R # move right + bind > swap-pane -D # swap current pane with the next one + bind < swap-pane -U # swap current pane with the previous one - # pane resizing - bind -r H resize-pane -L 2 - bind -r J resize-pane -D 2 - bind -r K resize-pane -U 2 - bind -r L resize-pane -R 2 - bind -r c-f resize-pane -Z + # pane resizing + bind -r H resize-pane -L 2 + bind -r J resize-pane -D 2 + bind -r K resize-pane -U 2 + bind -r L resize-pane -R 2 + bind -r c-f resize-pane -Z - # window navigation - # unbind n - # unbind p + # window navigation + # unbind n + # unbind p - setw -g mode-keys vi + setw -g mode-keys vi - bind Enter copy-mode # enter copy mode + bind Enter copy-mode # enter copy mode - bind -T copy-mode-vi v send -X begin-selection - bind -T copy-mode-vi C-v send -X rectangle-toggle - bind -T copy-mode-vi y send -X copy-selection-and-cancel - bind -T copy-mode-vi Escape send -X cancel - bind -T copy-mode-vi H send -X start-of-line - bind -T copy-mode-vi L send -X end-of-line + bind -T copy-mode-vi v send -X begin-selection + bind -T copy-mode-vi C-v send -X rectangle-toggle + bind -T copy-mode-vi y send -X copy-selection-and-cancel + bind -T copy-mode-vi Escape send -X cancel + bind -T copy-mode-vi H send -X start-of-line + bind -T copy-mode-vi L send -X end-of-line - # -- buffers ------------------------------------------------------------------- + # -- buffers ------------------------------------------------------------------- - bind b list-buffers # list paste buffers - #bind p paste-buffer -p # paste from the top paste buffer - bind P choose-buffer # choose which buffer to paste from + bind b list-buffers # list paste buffers + #bind p paste-buffer -p # paste from the top paste buffer + bind P choose-buffer # choose which buffer to paste from - # -- display ------------------------------------------------------------------- + # -- display ------------------------------------------------------------------- - set -g renumber-windows on # renumber windows when a window is closed + set -g renumber-windows on # renumber windows when a window is closed - bind k display-popup -E "\ - tmux list-sessions -F '#{?session_attached,,#{session_name}}' |\ - fzf --reverse -m --header=kill-session |\ - xargs -I {} tmux kill-session -t {}" + bind k display-popup -E "\ + tmux list-sessions -F '#{?session_attached,,#{session_name}}' |\ + fzf --reverse -m --header=kill-session |\ + xargs -I {} tmux kill-session -t {}" - bind C-j display-popup -E "\ - tmux list-sessions -F '#{?session_attached,,#{session_name}}' |\ - sed '/^$/d' |\ - fzf --reverse --header jump-to-session --preview 'tmux capture-pane -pt {}' |\ - xargs tmux switch-client -t" + bind-key "T" run-shell "sesh connect $( + sesh list -tz | fzf-tmux -p 55%,60% \ + --no-sort --border-label ' sesh ' --prompt '⚡ ' \ + --header ' ^a all ^t tmux ^x zoxide ^f find' \ + --bind 'tab:down,btab:up' \ + --bind 'ctrl-a:change-prompt(⚡ )+reload(sesh list)' \ + --bind 'ctrl-t:change-prompt(🪟 )+reload(sesh list -t)' \ + --bind 'ctrl-x:change-prompt(📁 )+reload(sesh list -z)' \ + --bind 'ctrl-f:change-prompt(🔎 )+reload(fd -H -d 2 -t d -E .Trash . ~)' + --bind 'ctrl-d:execute(tmux kill-session -t {})+change-prompt(⚡ )+reload(sesh list)' + )" ''; }; @@ -143,15 +153,12 @@ }; home.packages = [ - # Open tmux for current project. - (pkgs.writeShellApplication { - name = "tat"; - runtimeInputs = [pkgs.tmux pkgs.fzf]; - text = builtins.readFile ./ta.sh; - }) pkgs.fzf + pkgs.gitmux ]; + home.file.".config/tmux/gitmux.yml".source = ./gitmux.yml; + programs.zsh = { shellAliases = { tx = "tmux new -s default";