89 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { withSystem, ... }:
 | |
| 
 | |
| {
 | |
|   perSystem =
 | |
|     { pkgs, ... }:
 | |
|     {
 | |
|       packages.tmux-sessionizer = pkgs.writeShellApplication {
 | |
|         name = "tmux-sessionizer";
 | |
| 
 | |
|         runtimeInputs = with pkgs; [
 | |
|           coreutils
 | |
|           fzf
 | |
|           tmux
 | |
|         ];
 | |
| 
 | |
|         text = ''
 | |
|           set -euo pipefail
 | |
| 
 | |
|           # Based on https://github.com/jessarcher/dotfiles/blob/master/scripts/t
 | |
|           # and https://github.com/ThePrimeagen/tmux-sessionizer.
 | |
| 
 | |
|           has_session() {
 | |
|             tmux list-sessions | grep -q "^$1:"
 | |
|           }
 | |
| 
 | |
|           hydrate() {
 | |
|             if [ -f "$2/.tmux-sessionizer" ]; then
 | |
|               tmux send-keys -t "$1" "source $2/.tmux-sessionizer" c-M
 | |
|             elif [ -f "$HOME/.tmux-sessionizer" ]; then
 | |
|               tmux send-keys -t "$1" "source $HOME/.tmux-sessionizer" c-M
 | |
|             fi
 | |
|           }
 | |
| 
 | |
|           is_tmux_running() {
 | |
|             tmux_running=$(pgrep tmux)
 | |
| 
 | |
|             if [[ -z ''${TMUX:-} ]] && [[ -z $tmux_running ]]; then
 | |
|               return 1
 | |
|             fi
 | |
| 
 | |
|             return 0
 | |
|           }
 | |
| 
 | |
|           switch_to() {
 | |
|             tmux attach-session -t "$1" || tmux switch-client -t "$1"
 | |
|           }
 | |
| 
 | |
|           if [[ $# -eq 1 ]]; then
 | |
|             selected=$1
 | |
|           else
 | |
|             items=$(
 | |
|               find "$HOME/Code" -maxdepth 3 -mindepth 1 -type d
 | |
|               find "$HOME/Documents" -maxdepth 1 -mindepth 1 -type d
 | |
|               find "$HOME/tmp" -maxdepth 1 -type d
 | |
|             )
 | |
| 
 | |
|             selected=$(echo "$items" | sed "s|^$HOME/||" | sort | fzf)
 | |
|             [[ $selected ]] && selected="$HOME/$selected"
 | |
|           fi
 | |
| 
 | |
|           if [[ -z $selected ]]; then
 | |
|             exit 0
 | |
|           fi
 | |
| 
 | |
|           selected_name=$(basename "$selected" | tr . _)
 | |
| 
 | |
|           if ! is_tmux_running; then
 | |
|             tmux new-session -ds "$selected_name" -c "$selected"
 | |
|             hydrate "$selected_name" "$selected"
 | |
|           fi
 | |
| 
 | |
|           if ! has_session "$selected_name"; then
 | |
|             tmux new-session -ds "$selected_name" -c "$selected"
 | |
|             hydrate "$selected_name" "$selected"
 | |
|           fi
 | |
| 
 | |
|           switch_to "$selected_name"
 | |
|         '';
 | |
|       };
 | |
|     };
 | |
| 
 | |
|   flake.modules.homeManager.base =
 | |
|     { pkgs, ... }:
 | |
|     {
 | |
|       home.packages = [
 | |
|         (withSystem pkgs.system (psArgs: psArgs.config.packages.tmux-sessionizer))
 | |
|       ];
 | |
|     };
 | |
| }
 |