Skip to content

Instantly share code, notes, and snippets.

@gruber
Forked from chockenberry/tot.sh
Last active November 9, 2024 22:41
Show Gist options
  • Save gruber/b18d8b53385fa612713754799ed4d0a2 to your computer and use it in GitHub Desktop.
Save gruber/b18d8b53385fa612713754799ed4d0a2 to your computer and use it in GitHub Desktop.
A shell script for Tot
#!/bin/bash
# Fork of CHOCK's original tot.sh to add support for dot "0" to target
# the first empty dot.
# https://gist.github.com/chockenberry/d33ef5b6e6da4a3e4aa9b07b093d3c23
#
# 2 Mar 2020
# + Incorporated suggestions from ShellCheck (https://www.shellcheck.net).
# Thanks to Ramsey Dow.
# + Changed call to `python` to `/usr/bin/python` to get Python 2, avoiding
# conflicts for folks whose default `python` is Python 3.
basename=$(basename "$0")
if [ -z "$*" ]; then
echo "usage: ${basename} <dot> [ -o | -r | <file> | - ]"
echo ""
echo "options:"
echo " -o open dot in window with keyboard focus"
echo " -r read contents of dot"
echo " -c clear contents of dot"
echo " <file> append contents of regular file to dot"
echo " - append standard input to dot"
echo ""
echo "examples:"
echo " $ cal -h | tot 1 - # put a calendar in first dot"
echo " $ tot 2 MyApp.crash # put a crash report in second dot"
echo " $ date | tot 0 - # put a timestamp in first empty dot"
echo ""
exit 1
fi
dot="$1"
if [ -z "$2" ]; then
echo "error: no dot action specified"
exit 1
else
if [ "$dot" = "0" ]; then
# dot 0: first empty dot; error if no dots are empty
for testdot in {1..7}
do
content=$(osascript -e "tell application \"Tot\" to open location \"tot://${testdot}/content\"")
# Matching whitespace-only strings in Bash: https://stackoverflow.com/questions/9767644/
if ! [[ $content =~ [^[:space:]] ]]; then
# testdot is the first empty dot
dot=$testdot
# clear contents of dot, in case there's whitespace:
osascript -e "tell application \"Tot\" to open location \"tot://${dot}/replace?text=\""
break
fi
done
if [ "$dot" = "0" ]; then
echo "error: no empty dots"
exit 1
fi
fi
if [ "$2" = "-o" ]; then
# open dot
osascript -e "tell application \"Tot\" to open location \"tot://${dot}\""
osascript -e "tell application \"Tot\" to activate"
elif [ "$2" = "-r" ]; then
# get contents of dot
osascript -e "tell application \"Tot\" to open location \"tot://${dot}/content\""
elif [ "$2" = "-c" ]; then
# clear contents of dot
osascript -e "tell application \"Tot\" to open location \"tot://${dot}/replace?text=\""
else
# append file or stdin to dot
if [ "$2" = "-" ]; then
FILE=$(mktemp -t "$basename") || exit 1
cat /dev/stdin > "$FILE"
else
if [ -f "$2" ]; then
FILE="$2"
else
echo "error: not a regular file"
exit 1
fi
fi
text=$(/usr/bin/python -c 'import urllib; import sys; print urllib.quote(sys.stdin.read())' < "$FILE")
osascript -e "tell application \"Tot\" to open location \"tot://${dot}/append?text=${text}\""
fi
fi
@ibuys
Copy link

ibuys commented Feb 29, 2020

My best idea: hardcoding the call to /usr/bin/python, which should be Python 2 for everyone, regardless their default for python.

That's probably the right thing to do.

@gruber
Copy link
Author

gruber commented Feb 29, 2020 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment