Display a Random Inspiring Quote for Journaling or Shell Prompts

The odd title gives it away – I don’t have a good use-case for this :)

Dr. Drang shared how he displayed one random line of “Oblique Strategies” in his email signatures many years ago.

The “Oblique Strategies” can be found here: http://www.rtqe.net/ObliqueStrategies/Edition1-3.html

They look like this:

Abandon normal instruments
Accept advice
Accretion
A line has two sides
Allow an easement (an easement is the abandonment of a stricture)
Always first steps

“Fortunes” or inspirational “quotes for thought” can work as journaling prompts. It’s also possible to start a new shell session with this “fortune cookie” format as a greeting or Message of the Day.

I’ve formatted the file thus:

  • Treat # at the beginning of a line to be a comment (referencing the source(s))
  • Assuming ~/fortunes.txt as the location

Bash script, e.g. for MotD updates

Bash is simple. Filter out comments, then use shuf to get 1 random line:

$ grep -e "^[^#]" ~/fortunes.txt | shuf -n 1

That prints any line from the file. Easy. Use cron to replace the Message of the Day in /etc/motd and then you have an inspirational greeting in the shell.

Elisp random fortune function for journaling

To get a random prompt in my Emacs org-mode journaling templates was a bit more involved. Instead of piping in the shell, I’m using “the Emacs way”, i.e. applying modifications to invisible, temporary buffers with the file contents:

(defun ct/random-fortune (&optional file)
  "From a fortunes file, produce a random line.
Prints the line to the minibuffer when called interactively,
returns the line otherwise.

When FILE is not nil, read that file. Otherwise, defaults to '~/fortunes.txt'.
Ignores lines that start with a hash \"#\"."
  (interactive)
  (let (($random-line (with-temp-buffer
                        (insert-file-contents "~/fortunes.txt")
                        (keep-lines "^[^#]")
                        (goto-line (1+ (random (count-lines (point-min) (point-max)))))
                        (buffer-substring-no-properties (line-beginning-position) (line-end-position)))))
    ;; 22.4 Distinguish Interactive Calls <https://www.gnu.org/software/emacs/manual/html_node/elisp/Distinguish-Interactive.html>
    (if (called-interactively-p 'any)
        (message "%s" $random-line)
      $random-line)))

This either “"”inspires””” me interactively, by showing the line at the bottom of the window, or when called programmatically, it returns the string for insertion into the meditative journaling template.

That all presupposes I actually have such a template or perform a practice like this, but in reality, this was just a short and fun thing to do between holidays, really.

Maybe your journaling practice benefits from this, though!