I was considering what part of my workflow to improve next when I remembered that I've had to type #+begin_ and #+end_ a lot recently. I looked at org-structure-template-alist, but realized that if I wanted to start using templating in my workflows then it should be something universal, not something only useful within org-mode. Enter YASnippet:

(use-package yasnippet
  :ensure t
  :pin melpa
  :mode "/emacs.[dp]/snippets/[^/]*/"
  :config
  (setq yas-snippet-dirs '("~/.emacs.d/snippets" "~/.emacs.p/snippets"))
  (yas-global-mode t))

A great project exists called yasnippet-snippets, containing snippets for most programming languages. While that's a great reasource, I'd much rather import and customize the snippets I like and intend to use than import a massive collection of them. I've hardwired YASnippet to look in both my public (~/.emacs.d) and my private (~/.emacs.p) configurations for snippets. This allows me to keep, for example, templates for my emails and Git commits private.

Most snippets I have seen online begin with # -*- mode: snippet -*-, which tells Emacs to use the major mode snippet-mode for the file's buffer. I dislike using such things, and instead have used the :mode keyword to enable the major mode for all files within subdirectories of yas-snippet-dirs.

Now to make three templates that reduce the effort of writing these blog posts ever so slightly. First up is a source block, which is used for both executing code (as above) and displaying code without executing it (as below):

# name: src block
# key: <s
# --
#+begin_src ${1:emacs-lisp}
$0
#+end_src
# name: example block
# key: <e
# --
#+begin_example
$0
#+end_example
# name: verse block
# key: <v
# --
#+begin_verse
$0
#+end_verse

The relevant difference between example and verse blocks, for my purposes, is that example blocks don't wrap text, while verse blocks do.

Now typing <s[TAB] expands the src block template if I'm in an org-mode buffer.