239 lines
6.3 KiB
Nix
239 lines
6.3 KiB
Nix
{
|
|
lib,
|
|
config,
|
|
pkgs,
|
|
...
|
|
}: let
|
|
inherit (lib) mkIf;
|
|
inherit (config.ooknet.console) multiplexer;
|
|
inherit (config.ooknet.wayland) launcher;
|
|
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" && launcher == "rofi") {
|
|
home.packages = [zellijmenu];
|
|
ooknet.binds.zellijMenu = "zellijmenu -n";
|
|
};
|
|
}
|