#!/bin/bash #Display calendar with arrow key navigation for month and year. # By The Free Thinker, 2020. gopher://aussies.space/1/~freet/ # #Usage: # browsecal.sh [cal args] [-m month] [-y year] # #See "man cal" for "cal args". # # UP = next year, DOWN = last year, RIGHT = next month, # LEFT = last month, SPACE = current month/year, q = quit. # #Example usage: # browsecal.sh -3 -y 2013 -m 1 # urxvt -geometry 22x9 -title "Calendar" -e browsecal.sh clear #Process command-line arguments: calargs= until [ -z "$1" ] do case "$1" in "-m") shift; [ ! -z "${1##*[!0-9]*}" ] && month=$1 || month=`date -d "$1 1" +%-m` ;; #https://stackoverflow.com/a/2704760 "-y") shift; year=$1 ;; *) calargs="$calargs $1" ;; esac shift done [ -z $month ] && month=`date +%-m` [ -z $year ] && year=`date +%-Y` cal $calargs $month $year || exit oldIFS="$IFS" IFS= #Arrow key reading from: # https://stackoverflow.com/a/46481173 escape_char=$(printf "\u1b") while true do read -rsn1 mode # get 1 character if [[ $mode == $escape_char ]]; then read -rsn2 mode # read 2 more chars fi case $mode in #key q 'q') exit ;; #key SPACE ' ') IFS=" " month=`date +%-m` year=`date +%-Y` clear cal $calargs $month $year IFS= ;; #key UP '[A') IFS=" " (( year++ )) clear cal $calargs $month $year IFS= ;; #key DOWN '[B') IFS=" " [ $year -gt 1 ] && (( year-- )) clear cal $calargs $month $year IFS= ;; #key LEFT '[D') IFS=" " if [ $month -gt 1 ]; then (( month-- )) else (( year-- )) month=12 fi clear cal $calargs $month $year IFS= ;; #key RIGHT '[C') IFS=" " if [ $month -lt 12 ]; then (( month++ )) else (( year++ )) month=1 fi clear; cal $calargs $month $year IFS= ;; esac done IFS="$oldIFS"