From 56ce8ba7351c88be500a321fb2584d75f277ce74 Mon Sep 17 00:00:00 2001 From: Oliver Davies <oliver@oliverdavies.dev> Date: Sat, 31 Aug 2024 17:17:32 +0100 Subject: [PATCH] Add `create-zellij-session` script Based on t.nix, this creates or attaches to a Zellij session based on a given directory. --- lib/shared/home-manager-packages.nix | 4 ++ lib/shared/scripts/create-zellij-session.nix | 67 ++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 lib/shared/scripts/create-zellij-session.nix diff --git a/lib/shared/home-manager-packages.nix b/lib/shared/home-manager-packages.nix index ed7b8832..daa54dc8 100644 --- a/lib/shared/home-manager-packages.nix +++ b/lib/shared/home-manager-packages.nix @@ -12,6 +12,9 @@ let inherit (pkgs) writeShellApplication; _timer = writeShellApplication (import ./scripts/_timer.nix); + create-zellij-session = writeShellApplication ( + import ./scripts/create-zellij-session.nix { inherit pkgs; } + ); export-video-list = writeShellApplication ( import ./scripts/export-video-list.nix { inherit pkgs username; } ); @@ -66,6 +69,7 @@ with pkgs; yarn # Scripts. + create-zellij-session notetaker run t diff --git a/lib/shared/scripts/create-zellij-session.nix b/lib/shared/scripts/create-zellij-session.nix new file mode 100644 index 00000000..808c1753 --- /dev/null +++ b/lib/shared/scripts/create-zellij-session.nix @@ -0,0 +1,67 @@ +{ pkgs }: +{ + name = "create-zellij-session"; + + runtimeInputs = with pkgs; [ + openssl + zellij + ]; + + text = '' + function _execute_zellij_layout { + local session_name="$1" + local layout_file="$2" + + DIGEST="$(openssl sha512 "$layout_file")" + + # Prompt the first time we see a given layout file before running it. + if ! grep -q "$DIGEST" ~/..zellij.digests 2> /dev/null; then + cat "$layout_file" + + read -r -n 1 -p "Trust (and run) this Zellij file? (t = trust, otherwise = skip) " + + if [[ $REPLY =~ ^[Tt]$ ]]; then + echo "$DIGEST" >> ~/..zellij.digests + + _attach_to_or_create_zellij_session --layout "$layout_file" + fi + else + _attach_to_or_create_zellij_session --layout "$layout_file" + fi + } + + function _attach_to_or_create_zellij_session { + zellij attach "$session_name" 2>/dev/null || zellij --session "$session_name" "$@" + } + + function main { + if [[ $# -eq 1 ]]; then + selected_path=$1 + else + items=$(find "$REPOS" ~/Documents \ + -maxdepth 1 -mindepth 1 -type d \ + ! -name "*-old" \ + ! -name "*.bak" \ + ! -name "*.old" \ + ! -name "_archive" + ) + + selected_path=$(echo "''${items}" | sort | fzf --reverse) + fi + + session_name=$(basename "$selected_path") + + cd "$selected_path" + + if [[ -f ".ignored/dev.kdl" ]]; then + _execute_zellij_layout "$session_name" ".ignored/dev.kdl" + elif [[ -f "dev.kdl" ]]; then + _execute_zellij_layout "$session_name" "dev.kdl" + fi + + _attach_to_or_create_zellij_session + } + + main "$@" + ''; +}