#!/usr/bin/env bash set -euo pipefail NOTES_DIR="${NOTES_DIR:-$HOME/notes}" N="${1:-100}" # this should now also work with older versions of fzf, if not comment out next line: 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" open_url() { local url="$1" if grep -qi microsoft /proc/version 2>/dev/null; then cmd.exe /c start "" "$url" >/dev/null 2>&1 elif command -v xdg-open >/dev/null 2>&1; then xdg-open "$url" >/dev/null 2>&1 & elif command -v open >/dev/null 2>&1; then open "$url" else echo "No opener for: $url" fi } # --- get last N notes --- mapfile -t files < <( find "$NOTES_DIR" -maxdepth 1 -type f -name '*.md' \ -printf '%T@ %p\n' \ | sort -nr \ | head -n "$N" \ | cut -d' ' -f2- ) [[ ${#files[@]} -eq 0 ]] && { echo "No notes found" exit 0 } # --- fzf selection --- selection=$( for f in "${files[@]}"; do rg -o 'https?://[^ )"]+' "$f" \ | while read -r url; do printf "%s\t%s\n" "$url" "$(basename "$f")" done done \ | fzf --multi \ --delimiter='\t' \ --with-nth=1,2 \ --prompt="open url> " \ --preview='cat "'"$NOTES_DIR"'"/{2}' \ --height=80% \ --reverse ) [[ -z "$selection" ]] && exit 0 # --- open selected --- while IFS=$'\t' read -r url file; do echo "Opening: $url ($file)" open_url "$url" done <<< "$selection"