aboutsummaryrefslogtreecommitdiffstats
path: root/pkgs/by-name/ne
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-05-23 13:26:22 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-05-23 13:26:22 +0200
commit204731c0a69136c9cebcb54f1afecf5145e26bbe (patch)
treefc9132e5dc74e4a8e1327cdd411839a90f9410aa /pkgs/by-name/ne
parentrefactor(sys): Modularize and move to `modules/system` or `pkgs` (diff)
downloadnixos-config-204731c0a69136c9cebcb54f1afecf5145e26bbe.zip
refactor(pkgs): Categorize into `by-name` shards
This might not be the perfect way to organize a package set -- especially if the set is not nearly the size of nixpkgs -- but it is _at_ least a way of organization.
Diffstat (limited to 'pkgs/by-name/ne')
-rwxr-xr-xpkgs/by-name/ne/neorg/functions/add.sh23
-rwxr-xr-xpkgs/by-name/ne/neorg/functions/context.sh43
-rwxr-xr-xpkgs/by-name/ne/neorg/functions/dmenu.sh14
-rwxr-xr-xpkgs/by-name/ne/neorg/functions/f_start.sh7
-rwxr-xr-xpkgs/by-name/ne/neorg/functions/f_stop.sh7
-rwxr-xr-xpkgs/by-name/ne/neorg/functions/list.sh8
-rwxr-xr-xpkgs/by-name/ne/neorg/functions/project.sh41
-rwxr-xr-xpkgs/by-name/ne/neorg/functions/review.sh12
-rwxr-xr-xpkgs/by-name/ne/neorg/functions/utils.sh40
-rwxr-xr-xpkgs/by-name/ne/neorg/functions/workspace.sh9
-rwxr-xr-xpkgs/by-name/ne/neorg/main.sh164
-rwxr-xr-xpkgs/by-name/ne/neorg/neorg_id_function.sh16
-rw-r--r--pkgs/by-name/ne/neorg/package.nix69
13 files changed, 453 insertions, 0 deletions
diff --git a/pkgs/by-name/ne/neorg/functions/add.sh b/pkgs/by-name/ne/neorg/functions/add.sh
new file mode 100755
index 00000000..5a830a10
--- /dev/null
+++ b/pkgs/by-name/ne/neorg/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/pkgs/by-name/ne/neorg/functions/context.sh b/pkgs/by-name/ne/neorg/functions/context.sh
new file mode 100755
index 00000000..7095847d
--- /dev/null
+++ b/pkgs/by-name/ne/neorg/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/pkgs/by-name/ne/neorg/functions/dmenu.sh b/pkgs/by-name/ne/neorg/functions/dmenu.sh
new file mode 100755
index 00000000..5a138982
--- /dev/null
+++ b/pkgs/by-name/ne/neorg/functions/dmenu.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env dash
+
+dmenu0open_context_in_browser() {
+ project="$(echo "%ALL_PROJECTS_PIPE" | rofi -sep "|" -dmenu)"
+
+ if [ "$project" ]; then
+ [ -d "%NEORG_REVIEW_PATH" ] || mkdir --parents "%NEORG_REVIEW_PATH"
+ [ -f "%NEORG_REVIEW_PATH/$project.lock" ] || touch "%NEORG_REVIEW_PATH/$project.lock"
+ project0open_project_in_browser "$project"
+ else
+ notify-send "(neorg/dmenu) No project selected"
+ exit 1
+ fi
+}
diff --git a/pkgs/by-name/ne/neorg/functions/f_start.sh b/pkgs/by-name/ne/neorg/functions/f_start.sh
new file mode 100755
index 00000000..2423dd44
--- /dev/null
+++ b/pkgs/by-name/ne/neorg/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/pkgs/by-name/ne/neorg/functions/f_stop.sh b/pkgs/by-name/ne/neorg/functions/f_stop.sh
new file mode 100755
index 00000000..e4ff0b94
--- /dev/null
+++ b/pkgs/by-name/ne/neorg/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/pkgs/by-name/ne/neorg/functions/list.sh b/pkgs/by-name/ne/neorg/functions/list.sh
new file mode 100755
index 00000000..10659457
--- /dev/null
+++ b/pkgs/by-name/ne/neorg/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/pkgs/by-name/ne/neorg/functions/project.sh b/pkgs/by-name/ne/neorg/functions/project.sh
new file mode 100755
index 00000000..64591850
--- /dev/null
+++ b/pkgs/by-name/ne/neorg/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/pkgs/by-name/ne/neorg/functions/review.sh b/pkgs/by-name/ne/neorg/functions/review.sh
new file mode 100755
index 00000000..a0a9ab8d
--- /dev/null
+++ b/pkgs/by-name/ne/neorg/functions/review.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env dash
+
+review0start() {
+ for project in $(list0list_all_contexts_newline); do
+ if [ -f "%NEORG_REVIEW_PATH/$project.lock" ]; then
+ msg "Reviewing '$project'"
+ notify-send "Neorg" "Reviewing '$project'"
+ firefox -P "$project"
+ rm "%NEORG_REVIEW_PATH/$project.lock"
+ fi
+ done
+}
diff --git a/pkgs/by-name/ne/neorg/functions/utils.sh b/pkgs/by-name/ne/neorg/functions/utils.sh
new file mode 100755
index 00000000..c3843e8e
--- /dev/null
+++ b/pkgs/by-name/ne/neorg/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/pkgs/by-name/ne/neorg/functions/workspace.sh b/pkgs/by-name/ne/neorg/functions/workspace.sh
new file mode 100755
index 00000000..d5eb2fca
--- /dev/null
+++ b/pkgs/by-name/ne/neorg/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/pkgs/by-name/ne/neorg/main.sh b/pkgs/by-name/ne/neorg/main.sh
new file mode 100755
index 00000000..559351b9
--- /dev/null
+++ b/pkgs/by-name/ne/neorg/main.sh
@@ -0,0 +1,164 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.1.2" . %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
+. ./functions/review.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
+
+ review
+ Review all firefox tabs
+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
+ ;;
+ "r"*) # review
+ shift 1
+ review0start
+ 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
diff --git a/pkgs/by-name/ne/neorg/neorg_id_function.sh b/pkgs/by-name/ne/neorg/neorg_id_function.sh
new file mode 100755
index 00000000..865ecacf
--- /dev/null
+++ b/pkgs/by-name/ne/neorg/neorg_id_function.sh
@@ -0,0 +1,16 @@
+#! /usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+
+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/pkgs/by-name/ne/neorg/package.nix b/pkgs/by-name/ne/neorg/package.nix
new file mode 100644
index 00000000..112df35c
--- /dev/null
+++ b/pkgs/by-name/ne/neorg/package.nix
@@ -0,0 +1,69 @@
+{
+ lib,
+ sysLib,
+ # dependencies
+ cocogitto,
+ rofi,
+ libnotify,
+ taskwarrior,
+ gawk,
+ findutils,
+ # config
+ defaultNeorgProjectDir ? "/no-default-dir", # homeConfig.programs.nixvim.plugins.neorg.modules."core.dirman".config.workspaces.projects
+ allProjectsNewline ? "", # homeConfig.soispha.taskwarrior.projects.projects_newline
+ allProjectsComma ? "", # homeConfig.soispha.taskwarrior.projects.projects_comma
+ allProjectsPipe ? "", # homeConfig.soispha.taskwarrior.projects.projects_pipe
+ allWorkspaces ? "", # homeConfig.programs.nixvim.plugins.neorg.modules."core.dirman".config.workspaces
+ xdgConfigHome ? builtins.getEnv "XDG_CONFIG_HOME",
+ xdgDataHome ? builtins.getEnv "XDG_DATA_HOME",
+}:
+sysLib.writeShellScriptMultiPart {
+ name = "neorg";
+ src = ./.;
+ generateCompletions = true;
+ keepPath = true;
+
+ baseName = "main.sh";
+ cmdPrefix = "functions";
+ cmdNames = [
+ "add.sh"
+ "context.sh"
+ "dmenu.sh"
+ "f_start.sh"
+ "f_stop.sh"
+ "list.sh"
+ "project.sh"
+ "review.sh"
+ "utils.sh"
+ "workspace.sh"
+ ];
+
+ dependencies = [
+ cocogitto
+ rofi
+ libnotify
+ ];
+ replacementStrings = {
+ DEFAULT_NEORG_PROJECT_DIR = defaultNeorgProjectDir;
+ HOME_TASKRC = "${xdgConfigHome}/task/home-manager-taskrc";
+ NEORG_REVIEW_PATH = "${xdgDataHome}/neorg/review";
+
+ ALL_PROJECTS_NEWLINE = allProjectsNewline;
+ ALL_PROJECTS_COMMA = allProjectsComma;
+ ALL_PROJECTS_PIPE = allProjectsPipe;
+ ALL_WORKSPACES = "${lib.strings.concatStringsSep "|" (builtins.attrNames allWorkspaces)}";
+
+ ID_GENERATION_FUNCTION = "${sysLib.writeShellScript {
+ name = "neorg_id_function";
+ src = ./source/specific/neorg/neorg_id_function.sh;
+ dependencies = [
+ taskwarrior
+ gawk
+ findutils # source of xargs
+ ];
+ }}/bin/neorg_id_function";
+
+ # TODO: Replace the hard-coded path here with some reference <2023-10-20>
+ TASK_PROJECT_FILE = "/home/soispha/repos/nix/nixos-config/hm/soispha/conf/taskwarrior/projects/default.nix";
+ };
+}