#!/usr/bin/env bash # Note taking tool # # Usage: # note [name] - Create a new note with optional name (defaults to "New note") # note -e|--edit [name] - Edit an existing note by name # # Arguments explanation: # [name] - Note filename (without extension) and title # -e, --edit [name] - Edit existing note by name # # Detailed usage: # note - Creates "New note" with current timestamp # note my-idea - Creates note titled "my-idea" # note my-idea "My Great Idea" - Creates note file "my-idea" but titled "My Great Idea" # note -e my-idea - Edits existing note with name "my-idea" # # Notes are stored as markdown files in ~/notes/ with timestamps # When multiple notes have the same name, you'll be prompted to select which one to edit arg1="$1" arg2="$2" path="$HOME/notes" [[ ! -d "$path" ]] && mkdir -p "$path" shopt -s nullglob files=("$path"/*.md) shopt -u nullglob case "$arg1" in -e|--edit) [[ -z "$arg2" ]] && { echo "Note name is required" exit 1 } # shellcheck disable=SC2207 found=($(echo "${files[@]}" | grep -P "[0-9]{10}-$arg2.md")) [[ ${#found[@]} -eq 0 ]] && { echo "Note with name '$arg2' not found." echo "Create it with using 'note $arg2'" exit } [[ ${#found[@]} -eq 1 ]] && { nano "${found[0]}" exit } PS3="Select a note to edit: " select selection in "${found[@]}" "Exit"; do [[ "$selection" == "Exit" ]] && exit [[ -f "$selection" ]] && { nano "$selection" exit } continue done ;; *) [[ -z "$arg2" ]] && arg2="${arg1:-New note}" file="$path/$(date +%s)-$arg1.md" cat < "$file" # $arg2 Note taken: $(date '+%d.%m.%Y %H:%M:%S') EOF nano "$file" ;; esac