Add mblaze related files

This commit is contained in:
Lucas 2020-03-11 23:25:28 +00:00
parent 96862e6556
commit 69e00b6f58
6 changed files with 398 additions and 0 deletions

34
mblaze/Makefile Normal file
View File

@ -0,0 +1,34 @@
# mblaze.env
# Written in 2020 by Lucas
# CC0 1.0 Universal/Public domain - No rights reserved
#
# To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this software to the
# public domain worldwide. This software is distributed without any
# warranty. You should have received a copy of the CC0 Public Domain
# Dedication along with this software. If not, see
# <http://creativecommons.org/publicdomain/zero/1.0/>.
.POSIX:
.SUFFIXES:
.SUFFIXES: .sh
PREFIX = ${HOME}/.mblaze
BIN = m mless
all: ${BIN}
clean:
rm -f ${BIN}
install: all env mlesskey mless-key-handler
mkdir -pm 700 ${PREFIX}
lesskey -o ${PREFIX}/mless mlesskey
cp -f env mless-key-handler ${PREFIX}
mkdir -p ${PREFIX}/bin
cp -f ${BIN} ${PREFIX}/bin
cd ${PREFIX}/bin && chmod 555 ${BIN}
uninstall:
cd ${PREFIX}/bin && rm -f ${BIN}
rm -f ${PREFIX}/env ${PREFIX}/mless ${PREFIX}/mless-key-handler

72
mblaze/env Normal file
View File

@ -0,0 +1,72 @@
# mblaze.env
# Written in 2020 by Lucas
# CC0 1.0 Universal/Public domain - No rights reserved
#
# To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this software to the
# public domain worldwide. This software is distributed without any
# warranty. You should have received a copy of the CC0 Public Domain
# Dedication along with this software. If not, see
# <http://creativecommons.org/publicdomain/zero/1.0/>.
if [ -z "$mblaze_account" ]; then
printf "Usage: mblaze_account=example.com . ~/.mblaze/env\n" >&2
return 1
fi
MBLAZE=~/.mblaze/$mblaze_account
if [ ! -d "$MBLAZE" ]; then
printf "Unknown account \"%s\"\n" "$mblaze_account" >&2
return 1
fi
export MBLAZE
if [ -d ~/.mblaze/bin ]; then
PATH=~/.mblaze/bin:$PATH
export PATH
fi
# account in prompt
PS1='@$mblaze_account \$ '
export PS1
# mless colors
MCOLOR_CUR=10
MCOLOR_MISS=1
export MCOLOR_CUR MCOLOR_MISS
# mcolor colors
MCOLOR_SEP=7
MCOLOR_FROM=14
MCOLOR_HEADER=6
MCOLOR_FOOTER=7
MCOLOR_SIG=5
MCOLOR_QQQUOTE=3
MCOLOR_QQUOTE=3
MCOLOR_QUOTE=3
export MCOLOR_SEP MCOLOR_FROM MCOLOR_HEADER MCOLOR_FOOTER MCOLOR_SIG
export MCOLOR_QQQUOTE MCOLOR_QQUOTE MCOLOR_QUOTE
if [ -f "$MBLAZE/private.env" ]; then
. "$MBLAZE/private.env"
fi
mfetch()
{
command -v _account_mfetch >/dev/null 2>&1 &&
_account_mfetch "$mblaze_account"
lockfile=%h/mail/.fdm-$mblaze_account-lock
fdm -qa "$mblaze_account" -D "\$lockfile=$lockfile" fetch || return 1
mcount=$(mdirs ~/mail/"$mblaze_account" | xargs minc | wc -l)
mcount=$(printf "%u\n" "$mcount")
prefix="$(date "+%a %d %b %T") [$mblaze_account]"
case $mcount in
0) printf "%s: no new emails.\n" "$prefix"
;;
1) printf "%s: 1 new email.\n" "$prefix"
;;
*) printf "%s: %u new emails.\n" "$prefix" "$mcount"
;;
esac
}
cd ~/mail/"$mblaze_account"

117
mblaze/m.sh Normal file
View File

@ -0,0 +1,117 @@
#!/bin/sh
# mblaze.env
# Written in 2020 by Lucas
# CC0 1.0 Universal/Public domain - No rights reserved
#
# To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this software to the
# public domain worldwide. This software is distributed without any
# warranty. You should have received a copy of the CC0 Public Domain
# Dedication along with this software. If not, see
# <http://creativecommons.org/publicdomain/zero/1.0/>.
usage()
{
cat - <<. >&2
Usage:
${0##*/} f|fetch
${0##*/} l|list [dirs...]
${0##*/} r|read dir [dirs...]
${0##*/} s|scan [-a] dir [dirs...]
.
exit 1
}
_mdirs()
{
mdirs "$@" | sort -t /
}
m_fetch_usage()
{
printf "Usage: %s f|fetch\n" "${0##*/}" >&2
exit 1
}
m_read_usage()
{
printf "Usage: %s r|read dir [dirs...]\n" "${0##*/}" >&2
exit 1
}
m_scan_usage()
{
printf "Usage: %s s|scan [-a] dir [dirs...]\n" "${0##*/}" >&2
exit 1
}
m_fetch()
{
if [ $# -ne 0 ]; then
m_fetch_usage
fi
printf "%s: fetch TBD.\n" >&2
exit 1
}
m_list()
{
pwd=$(pwd)
# cut(1) lists are 1-based, and +1 for leading slash
_mdirs "${@:-.}" | cut -c $((${#pwd} + 2))- | mlist -i
}
m_read()
{
if [ $# -eq 0 ]; then
m_read_usage
fi
_mdirs "$@" | mlist -s | msort -d | mthread | mless
}
m_scan()
{
mlist_flags=-s
while getopts a flag; do
case $flag in
a)
mlist_flags=
;;
*)
m_scan_usage
;;
esac
done
shift $(($OPTIND - 1))
if [ $# -eq 0 ]; then
m_scan_usage
fi
_mdirs "$@" | mlist $mlist_flags | msort -d | mthread | mseq -S | mscan
}
if [ $# -lt 1 ]; then
usage
fi
cmd=$1
shift
case $cmd in
f|fetch)
m_fetch "$@"
;;
l|list)
m_list "$@"
;;
r|read)
m_read "$@"
;;
s|scan)
m_scan "$@"
;;
*)
usage
;;
esac

41
mblaze/mless-key-handler Normal file
View File

@ -0,0 +1,41 @@
#!/bin/sh
# mblaze.env
# Written in 2020 by Lucas
# CC0 1.0 Universal/Public domain - No rights reserved
#
# To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this software to the
# public domain worldwide. This software is distributed without any
# warranty. You should have received a copy of the CC0 Public Domain
# Dedication along with this software. If not, see
# <http://creativecommons.org/publicdomain/zero/1.0/>.
keyhandler()
{
case "$1" in
0|1)
exit $1
;;
70) # F flag
mflag -F .
mseq -f : | mseq -S
mseq -C +
;;
82) # R mark read
mflag -S .
mseq -f : | mseq -S
mseq -C +
;;
94) # ^ goto parent
mseq -C '.^' 2>/dev/null
;;
123) # { prev thread
prev=$(mseq .-1 | sed 's/^ *//')
prev_root=$(mseq -c "$prev" = | head -n 1 | sed 's/^ *//')
mseq -C "$prev_root" 2>/dev/null
;;
125) # } next thread
mseq -C "$(mseq .+1: | sed -n '/^[^ <]/{p;q;}')"
;;
esac
}

114
mblaze/mless.sh Normal file
View File

@ -0,0 +1,114 @@
#!/bin/sh
# mless [MSG] - less(1)-wrapper around mshow
colorscan() {
awk '
function co(n, c) { e = ENVIRON["MCOLOR_" n]; return e ? e : c }
function fg(c, s) { return sprintf("\033[38;5;%03dm%s\033[0m", c, s) }
function so(s) { return sprintf("\033[1m%s\033[0m", s) }
/^>/ { print so(fg(co("CUR",119), $0)); next }
/^ *\\_/ { print fg(co("MISS",242), $0); next }
{ print }'
}
keyhandler() {
case "$?" in
0|1) exit $?;;
36) # $ goto end
mseq -C '$' 2>/dev/null
;;
78) # N go to next unseen message
nu=$(magrep -v -m1 :S .:) && mseq -C "$nu"
;;
107) # k next thread
mseq -C "$(mseq .+1: | sed -n '/^[^ <]/{p;q;}')"
;;
100) # d mark read
mflag -S .
mseq -f : | mseq -S
mseq -C +
;;
82) # R toggle raw mode
MLESS_RAW=$((1-$MLESS_RAW))
;;
72) # H toggle HTML mode
MLESS_HTML=$((1-$MLESS_HTML))
;;
94) # ^ goto parent
mseq -C '.^' 2>/dev/null
;;
esac
}
if [ -n "${NO_COLOR+set}" ]; then
colorscan() { cat -; }
fi
if [ "$1" = --filter ]; then
if [ "$2" = //scan ]; then
mscan : 2>/dev/null | colorscan
exit $?
fi
mseq -C "$2"
mscan .-2:.+3 2>/dev/null | colorscan
echo
if ! [ -f "$(mseq -r "$2")" ]; then
mseq "$2"
exit
fi
if [ $MLESS_RAW -eq 0 ]; then
if [ $MLESS_HTML -eq 1 ]; then
mshow -A text/html "$2"
else
mshow "$2"
fi | mcolor
else
mseq -r "$2"
echo
cat "$(mseq -r "$2")"
fi
exit $?
fi
if [ "$#" -eq 0 ] && ! [ -t 0 ]; then
mseq -S >/dev/null
set -- :
fi
if ! [ -t 1 ]; then
exec mseq :
fi
[ "$#" -eq 1 ] && set -- ${1:-.}
if [ "$#" -ge 1 ]; then
mseq -C "$1"
fi
nl="
"
export MLESS_RAW=0
export MLESS_HTML=0
if [ -f "$MBLAZE/mless" ]; then
export LESSKEY="$MBLAZE/mless"
elif [ -f "$HOME/.mblaze/mless" ]; then
export LESSKEY="$HOME/.mblaze/mless"
elif [ -f "$HOME/.mless" ]; then
export LESSKEY="$HOME/.mless"
fi
if [ -f "$MBLAZE/mless-key-handler" ]; then
. "$MBLAZE/mless-key-handler"
elif [ -f "$HOME/.mblaze/mless-key-handler" ]; then
. "$HOME/.mblaze/mless-key-handler"
elif [ -f "$HOME/.mless-key-handler" ]; then
. "$HOME/.mless-key-handler"
fi
while :; do
LESSOPEN="|$0 --filter %s" \
less -Ps"mless %f?m (message %i of %m).." -R \
"+:e $(mscan -n .)$nl" //scan $(mscan -n :)
keyhandler $?
done

20
mblaze/mlesskey Normal file
View File

@ -0,0 +1,20 @@
# mblaze.env
# Written in 2020 by Lucas
# CC0 1.0 Universal/Public domain - No rights reserved
#
# To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this software to the
# public domain worldwide. This software is distributed without any
# warranty. You should have received a copy of the CC0 Public Domain
# Dedication along with this software. If not, see
# <http://creativecommons.org/publicdomain/zero/1.0/>.
Q quit \1
[ prev-file
] next-file
S noaction E//scan\n
` noaction E\#\n
F quit F
R quit R
{ quit {
} quit }
\^ quit \^