#!/usr/bin/env dash # shellcheck source=/dev/null SHELL_LIBRARY_VERSION="1.9.0" . %SHELL_LIBRARY_PATH # these are used in version() AUTHORS="Soispha" YEARS="2023" NAME="neorg" help() { cat << EOF This is a quick wrapper to make starting neorg easier. 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 ' 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 ARGUMENTS: ID | *([0-9]) := [[$(cat %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 } # Utils {{{ UTILS_get_current_context() { current_context="$(task _get rc.context)"; printf "%s\n" "$current_context"; } UTILS_get_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" } UTILS_get_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" } # }}} # Workspace {{{ WORKSPACE_open_neorg_workspace() { nvim -c "NeorgStart" -s "$(ptmp ":Neorg workspace $1\n")" } WORKSPACE_open_neorg_workspace_prompt() { nvim -c "NeorgStart" -s "$(ptmp ":Neorg workspace ")" } # }}} # Context {{{ CONTEXT_open_current_task_context() { current_context="$(UTILS_get_current_context)" if [ "$current_context" ]; then context_path="$(UTILS_get_current_context_path "$current_context")"; extended_neorg_project_dir="$(UTILS_get_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"; WORKSPACE_open_neorg_workspace_prompt; fi } CONTEXT_open_current_task_context_at_task_id() { task_id="$1"; current_context="$(UTILS_get_current_context)" if [ "$current_context" ]; then context_path="$(UTILS_get_current_context_path "$current_context")"; extended_neorg_project_dir="$(UTILS_get_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"; WORKSPACE_open_neorg_workspace_prompt; fi } # }}} # Project {{{ PROJECT_open_current_context_in_browser() { current_context="$(UTILS_get_current_context)"; [ "$current_context" ] || WORKSPACE_open_neorg_workspace_prompt; PROJECT_open_context_in_browser "$current_context"; } PROJECT_open_context_in_browser() { context="$1"; [ "$context" ] || die "BUG: No context supplied to PROJECT_open_context_in_browser" firefox -P "$context" } # }}} # Dmenu {{{ DMENU_open_context_in_browser() { project="$(echo "%ALL_PROJECTS_PIPE" | rofi -sep "|" -dmenu)"; if [ "$project" ]; then PROJECT_open_context_in_browser "$project"; else current_context="$(UTILS_get_current_context)"; [ "$current_context" ] || (notify-send "(Neorg) No current context"; exit 1) PROJECT_open_context_in_browser "$current_context"; fi } # }}} # List {{{ LIST_list_all_contexts_newline() { print "%ALL_PROJECTS_NEWLINE" } LIST_list_all_contexts_comma() { print "%ALL_PROJECTS_COMMA" } # }}} # Add {{{ ADD_open_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; if ! [ "$(git status --porcelain=v2 | awk '{print $2}' | head -c 1)" = "." ]; then # TODO: Also check that only our file is staged before committing <2023-10-20> git commit --verbose --message="chore($(dirname "$base_task_project_file_path")): Update" fi } # }}} 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" ] || (CONTEXT_open_current_task_context; exit 0); CONTEXT_open_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" ] || (WORKSPACE_open_neorg_workspace_prompt; exit 0); WORKSPACE_open_neorg_workspace "$workspace_to_open"; exit 0; ;; "p"*) # project shift 1; context_to_open="$1"; # TODO: Exit with 1 on error, instead of the 0 <2023-10-20> [ "$context_to_open" ] || (PROJECT_open_current_context_in_browser; exit 0); if ! grep -q "$context_to_open" "$(ptmp "%ALL_PROJECTS_NEWLINE")"; then die "Your context ('$context_to_open') is not in the list of available contexts: %ALL_PROJECTS_COMMA"; fi PROJECT_open_context_in_browser "$context_to_open"; exit 0; ;; "l"*) # list LIST_list_all_contexts_newline; exit 0 ;; "a"*) # add-project ADD_open_taskwarrior_project_file; exit 0 ;; "d"*) # dmenu DMENU_open_context_in_browser; exit 0 ;; *) die "Command '$1' does not exist! Please look at:\n $NAME --help"; exit 0; ;; esac done CONTEXT_open_current_task_context; # vim: ft=sh