A few weeks ago I learnt about bug-reference-mode, a neat little Emacs
minor-mode that automatically links text to a bug tracker. A few of my projects
use bug trackers or GitHub issues, and different clients often have their own
There are two variables that I usually want to set for bug-reference-mode:
The URL of an individual bug, with %s used
as a placeholder for the bug ID.
The regular expression that finds bug ID
references. This is usually something like #1234.
I use directory local variables1 for a lot of projects, but Emacs also
supports file local variables for more fine-grained settings. org-mode has its
own syntax for setting file local variables, so I needed to adjust things
slightly to get it all working.
Setting local variables for a bug tracker looks like this:
I've been using zetteldeft to manage my notes for about six months now. Recently
I've been wanting to reorganize my notes as some of them don't follow the
zettelkasten principal of one idea per note.
Okay, most of them don't follow that principal if I'm honest about it.
I wanted to slice up my existing notes into smaller files and then link them all
together. In my mind the process would go something like:
Highlight the region to extract.
Enter a title for the new note.
Emacs would automatically move the text to the new note and insert a link
where it used to be.
Emacs macros are handy for this kind of repeatable behaviour, so I started
recording with an example note.
However, I quickly ran into a roadblock due to zetteldeft's behaviour when
creating a new note. zetteldeft will create a file, insert the title, and save
the file name to the Emacs kill ring. This meant any text I'd copied would be
overwritten by the note title.
I decided to abandon the macro method and use a dedicated function instead. I
wrote a little function called sodaware/zd-extract-region-to-note that
extracts a highlighted region to a new note:
(defun sodaware/zd-extract-region-to-note (title)
"Extract the marked region to a new note with TITLE."
(interactive (list (read-string "Note title: ")))
(let* ((deft-use-filename-as-title t)
(note-id (zetteldeft-generate-id title))
(note-filename (concat note-id zetteldeft-id-filename-separator title))
(note-text (kill-region (region-beginning) (region-end))))
(when (featurep 'evil) (evil-insert-state)))
(sodaware/zd-insert-link note-filename title)))
(defun sodaware/zd-insert-link (note title)
"Insert a link to NOTE with TITLE as its link text."
(insert (format "[[zdlink:%s][%s]]" note title)))
I use the zdlink protocol for my links, but the sodaware/zd-insert-link
function can be modified to use any kind of link. Eventually I'd like this to be
controlled via a variable.
I'd also like a function that returns focus to the original note after
extraction, but for now I'm pretty happy with how things work.
Each month I set primary and secondary goals as part of my Groundhog Day
Resolutions process. Setting goals is good, but I have a nasty habit of
forgetting about them until a few days before they're due. Not good.
To combat this issue I wanted to add my goals somewhere I would see them every
day: my org agenda.
My daily agenda display currently looks like this (minus client/private tasks):
I wanted to keep the same agenda information, but with my monthly goals at the
top so that I can't ignore them.
The first step was to create a place to store my goals. I created an org file
with TODO entries for each goal, all stored under a headline for the
month. These entries are tagged with :GHD: so they can be filtered, and I
added an :ACTIVE: tag for the current month.
The finished goals.org is laid out like this:
* TODO March 2021 [0/7] :GHD:ACTIVE:
** TODO [#A] Finish version 1.0 of Writing PHP with Emacs
** TODO [#A] Complete another session of deliberate practice
** TODO [#A] Finish version 0.3 of Craft Roulette
** TODO [#A] Contribute to a free software project
** TODO [#C] Run 120 miles
** TODO [#C] Read a book
** TODO [#C] Add detail pages to my secondary goals
The tag properties are inherited from the parent for each child goal, which
makes setting the active month much simpler.
My first attempt used A and B for the priorities, but org-agenda gives all
tasks a priority of B by default so the month headline was showing in the
final view. Using A and C for my primary and secondary goals fixes this.
The custom agenda is made up of three parts:
A list of primary goals.
A list of secondary goals.
The regular org agenda which shows scheduled tasks and deadlines.
I used the tags-todo command to list goals; it can filter tasks by file, tag,
and priority which makes it perfect for the job. The configuration to show my
primary goals is fairly simple: