Bear is one of my favorite apps. It's simple, has a fantastic minimalist design, and uses Markdown. I'm happy to support its development since it's one of the rare apps that delight me. But, I've also noticed that some features are missing.
I like to stick to the same format when creating some types of notes. For Zettelkasten notes, I use one format and add a meta info in the header. I also journal almost every day, and I've started to use one format for all my journal entries.
That's why I would love to see support for templates added to Bear. Actually, I'm impatient with this, so I've tried to find a workaround, and lo and behold, there is one.
The trick is to use Automator that executes a Ruby script and map it to a keyboard shortcut.
So, in Automator, create a "Quick Action". Drag "Run Shell Script", select "Workflow receives no input", and enable "Output replaces selected text".
Since I'm writing a template for my journal, I want it to automatically:
#journal/year/month
format)Here's the script for this that I've put in Automator:
ruby <<END
require "date"
require "open3"
# I use my small NPM package for getting the location and weather
weather_and_location = Open3.popen3("npx wethr") do |_, stdout|
stdout.read
end.strip
puts <<~TEMPLATE
#{Date.today}
#{Time.now.strftime("%A")} at #{Time.now.strftime("%I:%M %p")}
#{weather_and_location}
Mood:
#journal/#{Time.now.strftime("%Y/%m")}
---
## Thoughts
*
---
## I am grateful for
*
*
*
## What would make today great?
*
---
## What awesome things have happened today?
*
*
*
## How could I have made today even better?
*
TEMPLATE
END
I've saved it and went to
System Preferences > Keyboard > Shortcuts > Services
and assigned a new keyboard shortcut to it. I've mapped it to ⌃⇧⌘A
, which made this possible in Bear:
Templates are not the only thing where Automator is useful.
I wanted to update all of the dates in Bear, to be consistent with the date formatting. It's much easier to find specific dates like this. Luckily, Ruby
has excellent support for dates and Date.parse
handled anything I threw at it:
ruby -e '
require "date"
puts Date.parse(gets)'
I mapped this to ⌃⇧⌘D
and went ahead and highlighted all
the dates.
Nested tags are useful to improve organization, but also
to more easily find things. I like the idea of
tagging people under #@
, so David
would be tagged under
#@/david
. This makes it easier to find all the mentions of him by just clicking on his tag.
Since I haven't used this system before, I wanted to convert some names to this format. All it took was another simple Ruby script:
ruby -e '
link = gets.strip
bare = link.scan(/([[:alnum:]]+)/).flatten.join("-")
print "#@/#{bare.downcase}"'
I mapped this to ⌃⇧⌘X
and then converted all names to use
the nested tag.