home: add zellij menu script
This commit is contained in:
		
							parent
							
								
									bbf085ecc4
								
							
						
					
					
						commit
						a64a116cd7
					
				
					 2 changed files with 241 additions and 0 deletions
				
			
		|  | @ -5,5 +5,6 @@ | |||
|     ./ookvolume.nix | ||||
|     ./kdeconnect.nix | ||||
|     ./ookbrightness.nix | ||||
|     ./zellijMenu.nix | ||||
|   ]; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										240
									
								
								modules/home/workstation/tools/zellijMenu.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										240
									
								
								modules/home/workstation/tools/zellijMenu.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,240 @@ | |||
| { | ||||
|   lib, | ||||
|   config, | ||||
|   pkgs, | ||||
|   osConfig, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf; | ||||
|   inherit (osConfig.ooknet.console) multiplexer; | ||||
|   inherit (config.programs) rofi; | ||||
|   inherit (config.ooknet) binds; | ||||
|   zellijmenu = pkgs.writeShellApplication { | ||||
|     name = "zellijmenu"; | ||||
|     runtimeInputs = with pkgs; [coreutils rofi-wayland]; | ||||
|     text = | ||||
|       /* | ||||
|       bash | ||||
|       */ | ||||
|       '' | ||||
|         set -e | ||||
| 
 | ||||
|         type="" | ||||
|         type_dir="" | ||||
|         project_name="" | ||||
|         project_dir="" | ||||
|         session_name="" | ||||
|         layout="" | ||||
|         spawn_terminal=0 | ||||
| 
 | ||||
|         while [[ "$#" -gt 0 ]]; do | ||||
|           case $1 in | ||||
|           -n) spawn_terminal=1 ;; | ||||
|           *) | ||||
|             echo "Unknown parameter: $1" >&2 | ||||
|             exit 1 | ||||
|             ;; | ||||
|           esac | ||||
|           shift | ||||
|         done | ||||
| 
 | ||||
|         rofi_cmd() { | ||||
|           MSG=$1 | ||||
|           rofi -dmenu -i -mesg "$MSG" | ||||
|         } | ||||
| 
 | ||||
|         zellij_cmd() { | ||||
|           if [[ "$spawn_terminal" -eq 1 ]]; then | ||||
|             ${binds.terminalLaunch} zellij "$@" | ||||
|           else | ||||
|             zellij "$@" | ||||
|           fi | ||||
|         } | ||||
| 
 | ||||
|         session_manager() { | ||||
|           session_list() { | ||||
|             zellij ls -s | tr ' ' '\n' | ||||
|           } | ||||
| 
 | ||||
|           layout_menu() { | ||||
|             layout_list=$(find ~/.config/zellij/layouts -name "*.kdl" | sed 's|.*/||; s/\.kdl$//' | tr ' ' '\n') | ||||
|             echo -e "$layout_list" | rofi_cmd "Select layout for $session_name:" | ||||
|           } | ||||
| 
 | ||||
|           session_menu() { | ||||
|             echo -e "$(session_list)" | rofi_cmd "Session:" | ||||
|           } | ||||
| 
 | ||||
|           session_select() { | ||||
|             session_name=$(session_menu) | ||||
|             if [[ -z "$session_name" ]]; then | ||||
|               echo "Nothing selected." | ||||
|               exit 0 | ||||
|             fi | ||||
| 
 | ||||
|             if session_list | grep -qx "$session_name"; then | ||||
|               session_action="select" | ||||
|             else | ||||
|               session_action="create" | ||||
|             fi | ||||
|           } | ||||
| 
 | ||||
|           selection_menu() { | ||||
|             echo -e "Attach\nDelete\nBack" | rofi_cmd "$session_name action:" | ||||
|           } | ||||
| 
 | ||||
|           while true; do | ||||
|             session_select | ||||
|             case $session_action in | ||||
|             "create") | ||||
|               layout="$(layout_menu)" | ||||
|               if [ -z "$layout" ]; then | ||||
|                 echo "No layout given" | ||||
|                 continue | ||||
|               fi | ||||
|               zellij_cmd -s "$session_name" --layout "$layout" | ||||
|               break | ||||
|               ;; | ||||
|             "select") | ||||
|               selection=$(selection_menu) | ||||
|               case $selection in | ||||
|               "Attach") | ||||
|                 zellij_cmd attach "$session_name" | ||||
|                 break | ||||
|                 ;; | ||||
|               "Delete") zellij delete-session --force "$session_name" ;; | ||||
|               "Back") echo "Going back." ;; | ||||
|               *) echo "Going Back." ;; | ||||
|               esac | ||||
|               ;; | ||||
|             *) echo "Going Back" ;; | ||||
|             esac | ||||
|           done | ||||
|         } | ||||
| 
 | ||||
|         project_manager() { | ||||
|           get_project_type() { | ||||
|             while true; do | ||||
|               type=$(echo -e "script\nnix" | rofi_cmd "Select project type:") | ||||
|               case "$type" in | ||||
|               script) | ||||
|                 type_dir="$SCRIPTS" | ||||
|                 break | ||||
|                 ;; | ||||
|               nix) | ||||
|                 type_dir="$NIX_DIR" | ||||
|                 break | ||||
|                 ;; | ||||
|               *) | ||||
|                 echo "Invalid selection, try again." | ||||
|                 ;; | ||||
|               esac | ||||
|             done | ||||
|           } | ||||
| 
 | ||||
|           get_project_name() { | ||||
|             while true; do | ||||
|               project_name=$(rofi_cmd "Enter project name:") | ||||
|               if [ -z "$project_name" ]; then | ||||
|                 echo "No name provided, try again." | ||||
|               elif [ -d "$type_dir/$project_name" ]; then | ||||
|                 echo "Project already exists, try again." | ||||
|               else | ||||
|                 project_dir="$type_dir/$project_name" | ||||
|                 break | ||||
|               fi | ||||
|             done | ||||
|           } | ||||
| 
 | ||||
|           get_session_name() { | ||||
|             session_name="$project_name" | ||||
|             if zellij ls | grep -q "^$session_name$"; then | ||||
|               session_name=$(rofi_cmd "Session name '$project_name' in use, enter a new session name:") | ||||
|               if [ -z "$session_name" ]; then | ||||
|                 echo "No session name entered, exiting." | ||||
|                 exit 1 | ||||
|               fi | ||||
|             fi | ||||
|           } | ||||
| 
 | ||||
|           get_layout() { | ||||
|             case "$type" in | ||||
|             script) | ||||
|               layout="script" | ||||
|               ;; | ||||
|             nix) | ||||
|               layout="nix" | ||||
|               ;; | ||||
|             *) | ||||
|               echo "Unknown project type, using default layout." | ||||
|               layout="base" | ||||
|               ;; | ||||
|             esac | ||||
|           } | ||||
| 
 | ||||
|           select_project() { | ||||
|             project_name=$(find "$type_dir" -maxdepth 1 -mindepth 1 -type d ! -name .git -exec basename {} \; | rofi_cmd "Select project:") | ||||
|             project_dir="$type_dir/$project_name" | ||||
| 
 | ||||
|             cd "$project_dir" || return 1 | ||||
|             get_session_name | ||||
|             get_layout | ||||
|             zellij_cmd -s "$session_name" --layout "$layout" | ||||
|           } | ||||
| 
 | ||||
|           create_and_start_project() { | ||||
|             mkdir -p "$project_dir" | ||||
|             cd "$project_dir" || return 1 | ||||
| 
 | ||||
|             case "$type" in | ||||
|             script) | ||||
|               echo -e "#!/usr/bin/env bash\necho 'hello world'" >"$project_name.sh" | ||||
|               chmod +x "$project_name.sh" | ||||
|               ;; | ||||
|             nix) | ||||
|               echo "Creating Nix project..." | ||||
|               # still need to implement | ||||
|               ;; | ||||
|             *) | ||||
|               echo "Unknown project type." | ||||
|               return 1 | ||||
|               ;; | ||||
|             esac | ||||
| 
 | ||||
|             get_session_name | ||||
|             get_layout | ||||
|             zellij_cmd -s "$session_name" --layout "$layout" | ||||
|           } | ||||
|           project_action=$(echo -e "Create Project\nSelect Project" | rofi_cmd "Project action:") | ||||
|           case "$project_action" in | ||||
|           "Create Project") | ||||
|             get_project_type | ||||
|             get_project_name | ||||
|             create_and_start_project | ||||
|             ;; | ||||
|           "Select Project") | ||||
|             get_project_type | ||||
|             select_project | ||||
|             ;; | ||||
|           esac | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         main() { | ||||
|           main_action=$(echo -e "Projects\nSessions" | rofi_cmd "Choose action:") | ||||
|           case "$main_action" in | ||||
|           "Projects") project_manager ;; | ||||
|           "Sessions") session_manager ;; | ||||
|           *) echo "Invalid option, exiting." ;; | ||||
|           esac | ||||
|         } | ||||
| 
 | ||||
|         main | ||||
|       ''; | ||||
|   }; | ||||
| in { | ||||
|   config = mkIf (multiplexer == "zellij" && rofi.enable) { | ||||
|     home.packages = [zellijmenu]; | ||||
|     ooknet.binds.zellijMenu = "zellijmenu -n"; | ||||
|   }; | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue