diff options
author | Soispha <soispha@vhack.eu> | 2024-02-24 14:59:50 +0100 |
---|---|---|
committer | Soispha <soispha@vhack.eu> | 2024-02-24 15:04:49 +0100 |
commit | 8284b6a7b4d212913083b003a819fda8d4931d4d (patch) | |
tree | 1a41cb60fe64f3f9b1a8c33bd2895ad419366cb5 /sys/nixpkgs/pkgs/scripts/source/specific/neorg | |
parent | fix(hm/pkgs/git-update-index): Remove '--' from help text (diff) | |
download | nixos-config-8284b6a7b4d212913083b003a819fda8d4931d4d.tar.gz nixos-config-8284b6a7b4d212913083b003a819fda8d4931d4d.zip |
refactor(hm/pkgs): Implement with an nixpkgs overlay
Diffstat (limited to 'sys/nixpkgs/pkgs/scripts/source/specific/neorg')
20 files changed, 485 insertions, 0 deletions
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/neorg_id_function.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/neorg_id_function.sh new file mode 100755 index 00000000..7c3fb2a3 --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/neorg_id_function.sh @@ -0,0 +1,12 @@ +#! /bin/sh +context="$(task _get rc.context)" +if [ "$context" ]; then + filter="project:$context" +else + filter="0-10000" +fi +tasks="$(task "$filter" _ids)" + +if [ "$tasks" ]; then + echo "$tasks" | xargs task _zshids | awk -F: -v q="'" '{gsub(/'\''/, q "\\" q q ); print $1 ":" q $2 q}' +fi diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/add.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/add.nu new file mode 100755 index 00000000..8cf9666c --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/add.nu @@ -0,0 +1,3 @@ +export def "main" [] { + "hi!" +} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/dmenu.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/dmenu.nu new file mode 100755 index 00000000..177e7483 --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/dmenu.nu @@ -0,0 +1,5 @@ +# Select a project in dmenu mode +# +# This will give you all projects +# and exectute the selected one as in 'neorg projects <selected>' +def "main" [] {} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstart.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstart.nu new file mode 100755 index 00000000..f77cd3f6 --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstart.nu @@ -0,0 +1,5 @@ +# Starts the task +# +# This only happens after it stooped +# the previous active task, if it existed. +def "main" [id: int] {} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstop.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstop.nu new file mode 100755 index 00000000..bcaac944 --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstop.nu @@ -0,0 +1,2 @@ +# Stops the current active task +def "main" [] {} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/list.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/list.nu new file mode 100755 index 00000000..68a130f9 --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/list.nu @@ -0,0 +1,2 @@ +# Lists all available contexts +def "main" [] {} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/neorg.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/neorg.nu new file mode 100755 index 00000000..92af49cc --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/neorg.nu @@ -0,0 +1,74 @@ +#!/usr/bin/env nu + +use add.nu main +use dmenu.nu +use fstart.nu +use fstop.nu +use list.nu +use project.nu +use task.nu +use workspace.nu [main workspaces] + +# The core of the system-integrated task handling and management +def main [] { + add +} + +# Allows you to quickly add projects +def "main add" [] { + add +} + +# Select a project in dmenu mode +# +# This will give you all projects +# and exectute the selected one as in 'neorg projects <selected>' +def "main dmenu" [] { + dmenu +} + +# Starts the task +# +# This only happens after it stooped +# the previous active task, if it existed. +def "main fstart" [id: int] { + fstart +} + +# Stops the current active task +def "main fstop" [] { + fstop +} + +# Lists all available contexts +def "main list" [] { + list +} + +# Opens the project in the webbrowser +# +# Opens the webbrowser with either the context (P) or +# the current active context as argument if no context is supplied +def "main project" [project?: string] { + project +} + +# Open the context of a task +# +# Open the neorg context associated with the current context and +# the uuid of the task with id ID. Without ID, it'll open the +# current context's norg file. +# If no context is set, drops you to the selection prompt +def "main task" [id?: int] { + task +} + +# Open a neorg workspace +# +# The neorg workspace to open at startup, an empty value drops +# you at a prompt to enter the workspace yourself. +def "main workspace" [ + workspace?: string@workspaces # The workspace to open +] { + workspace $workspace +} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/project.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/project.nu new file mode 100755 index 00000000..530eab9b --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/project.nu @@ -0,0 +1,5 @@ +# Opens the project in the webbrowser +# +# Opens the webbrowser with either the context (P) or +# the current active context as argument if no context is supplied +def "main" [project?: string] {} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/task.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/task.nu new file mode 100755 index 00000000..41d1d6e5 --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/task.nu @@ -0,0 +1,7 @@ +# Open the context of a task +# +# Open the neorg context associated with the current context and +# the uuid of the task with id ID. Without ID, it'll open the +# current context's norg file. +# If no context is set, drops you to the selection prompt +def "main" [id?: int] {} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/workspace.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/workspace.nu new file mode 100755 index 00000000..dfa79f29 --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/workspace.nu @@ -0,0 +1,25 @@ +export def workspaces [] { + # echo "%ALL_WORKSPACES" | split row '|' + ["a", "b"] +} + + +export def "main" [ workspace?: string ] { + if $workspace != null { + let pred = workspaces | where $it == $workspace | is-empty + if $pred == false { + true + } else { + error make { + msg: $"Your Workspace \(($workspace)) is not one of the defined ones: (workspaces)", + } + } + } else { + let tmp = mktemp + printf ":Neorg workspace " | save --append $tmp + + nvim -c "NeorgStart" -s $tmp + + rm $tmp + } +} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/add.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/add.sh new file mode 100755 index 00000000..5a830a10 --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/add.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env dash + +add0open_taskwarrior_project_file() { + task_project_file="%TASK_PROJECT_FILE" + + cd "$(dirname $task_project_file)" || die "BUG: task_project_file ('$task_project_file') can't be accessed" + + git_dir="$(search_flake_base_dir)" + [ "$git_dir" ] || die "(BUG): No git directory?" + cd "$git_dir" || die "Unreachable, this MUST exists" + + nvim "$task_project_file" + git add "$task_project_file" + + base_task_project_file_path="$(awk "{ gsub(\"$git_dir/\", \"\", \$0); print }" "$(ptmp "$task_project_file")")" + git add $task_project_file + + # Check that only the project file has been added (and that our file is actually + # modified) + if git status --porcelain=v2 | awk -v path="$base_task_project_file_path" 'BEGIN { hit = 0 } { if ($2 ~ /A./ || $2 ~ /M./) { if ($NF ~ path) { hit = 1 } else { hit = 0; exit 1 } } } END { if (hit == 1) { exit 0 } else { exit 1 } }'; then + git commit --verbose --message="chore($(dirname "$base_task_project_file_path")): Update" + fi +} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/context.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/context.sh new file mode 100755 index 00000000..7095847d --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/context.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env dash + +context0open_current_task_context() { + current_context="$(utils0get_current_context)" + + if [ "$current_context" ]; then + context_path="$(utils0get_current_context_path "$current_context")" + + extended_neorg_project_dir="$(utils0get_neorg_project_dir)" + cd "$extended_neorg_project_dir" || die "(BUG?): Can not access the project dir: $extended_neorg_project_dir" + + nvim "$extended_neorg_project_dir/$context_path" + + git add . + git commit --message="chore($(dirname "$context_path")): Update" --no-gpg-sign + else + warn "No context active" + fi +} + +context0open_current_task_context_at_task_id() { + task_id="$1" + current_context="$(utils0get_current_context)" + + if [ "$current_context" ]; then + context_path="$(utils0get_current_context_path "$current_context")" + extended_neorg_project_dir="$(utils0get_neorg_project_dir)" + task_uuid="$(task "$task_id" uuids)" + + cd "$extended_neorg_project_dir" || die "(BUG?): Can not access the project dir: $extended_neorg_project_dir" + + if ! grep -q "% $task_uuid" "$extended_neorg_project_dir/$context_path"; then + echo "* TITLE (% $task_uuid)" >>"$extended_neorg_project_dir/$context_path" + fi + + nvim "$extended_neorg_project_dir/$context_path" -c "/% $task_uuid" + + git add . + git commit --message="chore($(dirname "$context_path")): Update" --no-gpg-sign + else + warn "No context active" + fi +} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/dmenu.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/dmenu.sh new file mode 100755 index 00000000..73e9460a --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/dmenu.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env dash + +dmenu0open_context_in_browser() { + project="$(echo "%ALL_PROJECTS_PIPE" | rofi -sep "|" -dmenu)" + + if [ "$project" ]; then + project0open_project_in_browser "$project" + else + notify-send "(neorg/dmenu) No project selected" + exit 1 + fi +} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_start.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_start.sh new file mode 100755 index 00000000..2423dd44 --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_start.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env dash + +fstart0start_new_task() { + task_id="$1" + fstop0stop_current_task + task start "$task_id" +} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_stop.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_stop.sh new file mode 100755 index 00000000..e4ff0b94 --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_stop.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env dash + +fstop0stop_current_task() { + # we ensured that only one task may be active + active="$(task +ACTIVE _ids)" + [ "$active" ] && task stop "$active" +} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/list.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/list.sh new file mode 100755 index 00000000..10659457 --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/list.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env dash + +list0list_all_contexts_newline() { + print "%ALL_PROJECTS_NEWLINE" +} +list0list_all_contexts_comma() { + print "%ALL_PROJECTS_COMMA" +} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/project.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/project.sh new file mode 100755 index 00000000..64591850 --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/project.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env dash + +project0open_current_context_in_browser() { + current_context="$(utils0get_current_context)" + [ "$current_context" ] || die "No current context to use" + project0open_context_in_browser "$(utils0context2project "$current_context")" +} + +project0open_project_in_browser() { + project="$1" + [ "$project" ] || die "BUG: No context supplied to project0open_context_in_browser" + + old_context="$(utils0get_current_context)" + # We have ensured that only one task may be active + old_started_task="$(task +ACTIVE _ids)" + + tracking="$(mktmp)" + task "project:$project" _ids | xargs --no-run-if-empty task _zshids >"$tracking" + task context "$(utils0project2context "$project")" + + while read -r description; do + desc="$(echo "$description" | awk -F: '{print $2}')" + if [ "$desc" = "tracking" ]; then + task_id="$(echo "$description" | awk -F: '{print $1}')" + notify-send "(Neorg)" "Starting task $project -> $desc" + task start "$task_id" + break + fi + done <"$tracking" + + firefox -P "$project" + + task stop "$task_id" + [ "$old_started_task" ] && task start "$old_started_task" + + if [ "$old_context" ]; then + task context "$old_context" + else + task context none + fi +} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/utils.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/utils.sh new file mode 100755 index 00000000..c3843e8e --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/utils.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env dash + +# Runs it's first argument and then the second, regardless if the first failed or +# succeeded +utils0chain() { + eval "$1" + eval "$2" +} + +utils0get_current_context() { + current_context="$(task _get rc.context)" + printf "%s\n" "$current_context" +} + +utils0get_current_context_path() { + current_context="$1" + context_path="$(task _get rc.context."$current_context".rc.neorg_path 2>/dev/null)" + if ! [ "$context_path" ]; then + context_path="$(grep "context.$current_context.rc.neorg_path" "%HOME_TASKRC" | awk 'BEGIN {FS="="} {print $2}')" + [ "$context_path" ] || die "All contexts should have a 'neorg_path' set!" + fi + printf "%s\n" "$context_path" +} + +utils0get_neorg_project_dir() { + # Perform shell expansion of Tilde + neorg_project_dir="$(sed "s|^~|$HOME|" "$(ptmp "%DEFAULT_NEORG_PROJECT_DIR")")" + printf "%s\n" "$neorg_project_dir" +} + +utils0project2context() { + project="$1" + context="$(sed 's|\.|_|g' "$(ptmp "$project")")" + printf "%s\n" "$context" +} +utils0context2project() { + context="$1" + project="$(sed 's|_|\.|g' "$(ptmp "$context")")" + printf "%s\n" "$project" +} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/workspace.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/workspace.sh new file mode 100755 index 00000000..d5eb2fca --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/workspace.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env dash + +workspace0open_neorg_workspace() { + workspace="$1" + nvim -c "NeorgStart" -s "$(ptmp ":Neorg workspace $workspace\n")" +} +workspace0open_neorg_workspace_prompt() { + nvim -c "NeorgStart" -s "$(ptmp ":Neorg workspace ")" +} diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/main.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/main.sh new file mode 100755 index 00000000..5087c391 --- /dev/null +++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/main.sh @@ -0,0 +1,155 @@ +#!/usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH + +# load dependencies +. ./functions/add.sh +. ./functions/context.sh +. ./functions/dmenu.sh +. ./functions/f_start.sh +. ./functions/f_stop.sh +. ./functions/list.sh +. ./functions/project.sh +. ./functions/utils.sh +. ./functions/workspace.sh + +# these are used in version() +# shellcheck disable=2034 +AUTHORS="Soispha" +# shellcheck disable=2034 +YEARS="2023" + +NAME="neorg" + +help() { + cat <<EOF +This is the core interface to the system-integrated task management + +USAGE: + $NAME [OPTIONS] [COMMAND] + +OPTIONS: + --help | -h + Display this help and exit. + + --version | -v + Display version and copyright information and exit. +COMMANDS: + task [ID] + Open the neorg context associated with the current context and + the uuid of the task with id ID. Without ID, it'll open the + current context's norg file. + If no context is set, drops you to the selection prompt + + dmenu + Select a project in dmenu mode. This will give you all projects + and exectute the selected one as in 'neorg projects <selected>' + + workspace [WS] + The neorg workspace (WS) to open at startup, an empty value drops + you at a prompt to enter the workspace yourself. + + project [P] + Opens the webbrowser with either the context (P) or + the current active context as argument if no context is supplied + + list + Lists all available contexts + + add + Allows you to quickly add projects + + fstart ID + Starts the task (ID) but only after it stooped + the previous active task, if it existed. + + fstop + Stops the current active task +ARGUMENTS: + ID | *([0-9]) := [[%ID_GENERATION_FUNCTION]] + The function displays all possible IDs of the eligable tasks. + + WS := %ALL_WORKSPACES + All possible workspaces + + P := %ALL_PROJECTS_PIPE + The possible project + +EOF +} + +for arg in "$@"; do + case "$arg" in + "--help" | "-h") + help + exit 0 + ;; + "--version" | "-v") + version + exit 0 + ;; + esac +done + +while [ "$#" -ne 0 ]; do + case "$1" in + "t"*) # task + shift 1 + task_id="$1" + [ "$task_id" ] || utils0chain context0open_current_task_context "exit 0" + context0open_current_task_context_at_task_id "$task_id" + exit 0 + ;; + "w"*) # workspace + shift 1 + workspace_to_open="$1" + # TODO: Exit with 1 on error, instead of the 0 <2023-10-20> + [ "$workspace_to_open" ] || utils0chain workspace0open_neorg_workspace_prompt "exit 0" + workspace0open_neorg_workspace "$workspace_to_open" + exit 0 + ;; + "p"*) # project + shift 1 + project_to_open="$1" + # TODO: Exit with 1 on error, instead of the 0 <2023-10-20> + [ "$project_to_open" ] || utils0chain project0open_current_context_in_browser "exit 0" + if ! grep -q "$project_to_open" "$(ptmp "%ALL_PROJECTS_NEWLINE")"; then + die "Your project ('$project_to_open') is not in the list of available projects: +%ALL_PROJECTS_COMMA" + fi + project0open_project_in_browser "$project_to_open" + exit 0 + ;; + "l"*) # list + list0list_all_contexts_newline + exit 0 + ;; + "a"*) # add-project + add0open_taskwarrior_project_file + exit 0 + ;; + "d"*) # dmenu + dmenu0open_context_in_browser + exit 0 + ;; + "fsta"*) # fstart + shift 1 + task_id="$1" + [ "$task_id" ] || die "No task id provided to fstart" + fstart0start_new_task "$task_id" + exit 0 + ;; + "fsto"*) # fstop + fstop0stop_current_task + exit 0 + ;; + *) + die "Command '$1' does not exist! Please look at:\n $NAME --help" + exit 0 + ;; + esac +done + +context0open_current_task_context +# vim: ft=sh |