From 92b5ac3e4c32258b7151db086b956d9dd28d2bb4 Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Sun, 10 Oct 2021 08:55:57 +0100 Subject: [PATCH] BIN: Work on fzf-remind --- bin/.bin/fzf-remind | 145 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100755 bin/.bin/fzf-remind diff --git a/bin/.bin/fzf-remind b/bin/.bin/fzf-remind new file mode 100755 index 00000000..958fdd25 --- /dev/null +++ b/bin/.bin/fzf-remind @@ -0,0 +1,145 @@ +#!/usr/bin/env bash + +formatDate(){ + date="$1" + if [[ "$date" = *"00" ]]; then + fixeddate="${date%-*}-01" + echo -e "$date\t$(date +"%B %Y" -d $fixeddate)" + else + echo -e "$date\t$(date +"%d %B %Y" -d $date)" + fi +} +export -f formatDate + +listMonths(){ + for i in {01..12}; do + date -d "2020-$i-01" +"%B" + done +} +MONTHS="$(listMonths)" +export MONTHS + + +# Gets a list of months to pipe into fzf +getMonthsList(){ + typed="$1" + # For the current year, just get current and remaining months + currentMonth="$(date +"%m")" + currentYear="$(date +"%Y")" + if [[ -n "$typed" ]] && [[ "$typed" = *" "* ]]; then + if [[ "$typed" = "Next"* ]]; then + for i in {1..5}; do + echo "Next $i Weeks" + done + for i in {1..5}; do + echo "Next $i Months" + done + else + # If it contains a space + month="" + year="" + day="" + # Loop through each part and try to determine what it is + while read part; do + # totest will be 'a' if the first character is a letter + totest="$(echo -n "${part:0:1}" | tr '[a-zA-Z]' 'a')" + if [[ "$totest" = "a" ]]; then + # Assume if the first letter is a character, we have typed a month + month="$(echo "$MONTHS" | cat -n | grep -i "$part" | awk '{print $1}')" + else + # If we get here, it starts with a number so get rid of any letters + # Things like st, nd th + num="$(echo "$part" | tr -d '[a-zA-Z]')" + if [[ "$num" -lt 32 ]]; then + day="$num" + else + year="$num" + fi + fi + done <<<"$(echo "$typed" | tr ' ' '\n' )" + echo "Year: $year Month: $month Day: $day" + if [[ -n "$year" ]]; then + if [[ -n "$month" ]]; then + formatDate "$year-$month-00" + for day in {1..31}; do + date -d "$year-$month-$day" > /dev/null 2>&1 && formatDate "$year-$month-$day" + done + else + for month in $(seq 1 12); do + formatDate "$year-$month-00" + for day in {1..31}; do + date -d "$year-$month-$day" > /dev/null 2>&1 && formatDate "$year-$month-$day" + done + done + fi + else + for year in $(seq $((currentYear)) $((currentYear + 10)) ); do + if [[ -n "$month" ]]; then + formatDate "$year-$month-00" + for day in {1..31}; do + date -d "$year-$month-$day" > /dev/null 2>&1 && formatDate "$year-$month-$day" + done + else + for month in $(seq 1 12); do + formatDate "$year-$month-00" + for day in {1..31}; do + date -d "$year-$month-$day" > /dev/null 2>&1 && formatDate "$year-$month-$day" + done + done + fi + done + fi + fi + else + # Default + echo "Next 5 Weeks" + for month in $(seq $currentMonth 12); do + formatDate "$currentYear-$month-00" + done + for year in $(seq $((currentYear + 1)) $((currentYear + 10)) ); do + for month in $(seq 1 12); do + formatDate "$year-$month-00" + done + done + echo -e "Today\nTomorrow\nMonday\nTuesday\nWednesday\nThursday\nFriday\nSaturday\nSunday" + echo -e "Next 1 Week\nNext 1 Month" + fi +} +export -f getMonthsList + +preview(){ + choice="$1" + + # This manages things like "tomorow" + date -d "$choice" > /dev/null 2>&1 && choice="$(date -d "$choice" +"%Y-%m-%d")" + + + if [[ "$choice" = *"00" ]]; then + echo "option 1" + date="${choice%-*}-01" + rem -@ -w$FZF_PREVIEW_COLUMNS -c "$date" + elif [[ "$choice" = "Next"* ]]; then + echo "option 2" + num="$(echo "$choice" | tr -d '[a-zA-Z ]')" + echo "$choice" + case "${choice##* }" in + Week|Weeks) + rem -@ -w$FZF_PREVIEW_COLUMNS "-c+$num" + ;; + Month|Months) + rem -@ -w$FZF_PREVIEW_COLUMNS "-c$num" + ;; + esac + else + echo "option 3" + echo "$choice" + rem -@ -w$FZF_PREVIEW_COLUMNS "$choice" + fi +} +export -f preview + +getMonthsList | fzf --delimiter "\t"\ + --bind 'change:reload:bash -c "getMonthsList {q}" || true'\ + --preview 'bash -c "preview {1}"'\ + --preview-window="up:90%" --height="100%" +