#!/usr/bin/env bash # ███ ███ ███ ███ # █ █ █ █ █ ██ # █ █ ███ █ ███ # note # needs: fzf, rg # written mostly by chatgpt and deepseek (ai) in april 2026 # agentic engineer: brontosaurusrex set -euo pipefail # set -x NOTES_DIR="${NOTES_DIR:-$HOME/notes}" # try multiple editors for ed in "${EDITOR:-}" hx vim nano; do if command -v "$ed" >/dev/null 2>&1; then EDITOR="$ed" break fi done export FZF_DEFAULT_OPTS="--pointer='>' --color=fg:-1,bg:-1,hl:-1,fg+:-1,bg+:-1,hl+:-1,info:-1,prompt:-1,spinner:-1,pointer:-1,marker:-1,border:-1" # deps for cmd in fzf rg; do if ! command -v "$cmd" &>/dev/null; then echo "Error: $cmd is required" >&2 exit 1 fi done mkdir -p "$NOTES_DIR" today() { date +"%Y-%m-%d" } slugify() { local input="${1:-}" input="$( echo "$input" \ | tr '[:upper:]' '[:lower:]' \ | tr -cd 'a-z0-9 -' \ | tr ' ' '-' \ | sed 's/-\+/-/g' \ | sed 's/^-//' \ | sed 's/-$//' )" echo "$input" } open_note_fzf() { local files # shellcheck disable=SC2016 mapfile -t files < <( find "$NOTES_DIR" -maxdepth 1 -type f -name '*.md' \ -printf '%T@ %f\n' \ | sort -nr \ | cut -d' ' -f2- \ | fzf \ --prompt="open> " \ --multi \ --marker='*' \ --bind='tab:toggle' \ --preview='fold -s -w "$FZF_PREVIEW_COLUMNS" "'"$NOTES_DIR"'"/{}' \ --preview-window=right:50% \ --height=80% \ --reverse ) [[ ${#files[@]} -eq 0 ]] && return "$EDITOR" "${files[@]/#/$NOTES_DIR/}" } search_notes() { local query="${1:-}" local selection file line # shellcheck disable=SC2016 selection=$( rg -i -m1 --no-heading --line-number --color=never "$query" "$NOTES_DIR" \ | fzf \ --delimiter : \ --prompt="search> " \ --preview='fold -s -w "$FZF_PREVIEW_COLUMNS" {1}' \ --bind "change:reload:rg -i -m1 --no-heading --line-number --color=never {q} '$NOTES_DIR' || true" \ --phony \ --query "$query" \ --preview-window=right:50% \ --height=80% \ --reverse ) [[ -z "$selection" ]] && return file="${selection%%:*}" line="${selection#*:}" line="${line%%:*}" "$EDITOR" "$file" "+$line" } create_note() { local text="$1" local title slug file [[ -z "$text" ]] && return # first line, max 6 words title="$( printf '%s\n' "$text" \ | head -n1 \ | awk '{ for(i=1;i<=6 && i<=NF;i++) printf "%s%s",$i,(i<6 && i "$file" < "$file" <