While tinkering with Obsidian recently, something I liked was having a daily notes template with a Dataview query showing the other files I'd added that same day. I added something similar for Denote. It's a Yasnippet:
I just run that after first creating the daily note and I get a list of links to the other Denote files from that day. There's probably a way to automate that, but this is good enough for who it's for.
I've gone back to using Espanso for text expansion. As powerful as Keyboard Maestro is, every time I reach for it I feel like I've already lost a battle somewhere. Text expansion macros are about all I use KM for these days, so it's not much of a disruption.
I bookmark Espanso's config folder in Emacs so I can jump right in any time. The expansion macros ("matches") are contained in YAML files and can be as simple as:
- trigger: "j@"
replace: "jack@baty.net
They can get pretty fancy. I don't take full advantage of all the gizmos, but I use a ton of stuff like this:
you can “study” the data later and rearrange it. But the initial “just remember this” impulse should be as close to simply throwing the data at Emacs as possible.
I've been secretly conducting an experiment called "Use Obsidian Exclusively for 30 Days". It started a week ago. I'm typing this in Emacs, in case you're wondering how it's going.
Most days, I write the same things in both paper and digital journals. Then I print the digitital one. What's wrong with me? 😄[1]
Dante Stella on over-thinking travel photography:
It is difficult for amateur photographers to accept that, on any given
trip, they will not likely take unique photos of staggering social
significance or prize-winning landscapitude. The reality is that the
photos most likely to survive generationally will be the ones with
family members in them. The rest stand a good chance of being binned.
Consistency is the last refuge of the unimaginative.
Oscar Wilde
Walking Alice this morning shortly after 3:30 AM, I thought the moon looked weird. There was only the slightest sliver lit and the rest was a deep red. Turns out there was a total lunar eclipse at 3:30 that no one told me about. That explained it.
I spun up a WordPress blog this morning because I was bored and wanted to tinker with something. It's so easy to get started, but the block and site editors still feel like a janky, confusing mess. Just make me a nice theme with a few options and access to CSS and I'm good. I deleted the site 20 minutes later. Guess I'll need to find something else to play with today.
Something weird is that my Emacs setup feels like it's both complete and just started at the same time.
Nothing feels fun right now. Most of the things I typically enjoy have become frustrating exercises. I love paper notebooks, but can't bring myself to write in them for more than a few minutes. I love film photography, but I don't feel like dealing with the constraints and the costs. I've no patience for it. I love movies, but none of them look interesting. My typewriters collect dust. It's probably just another allergic reaction to the terrible shit happening in the world right now, but I'm finding it hard to shake.
I just exported 2700 tiddlers from my TiddlyWiki as one big markdown file, split it into individual files, and renamed them using Denote's format. ¯_(ツ)_/¯. I guess I tired of searching my Denote notes, coming up empty, then having to go to the wiki and search again. I'll write some notes about it at some point.
Using ChatGPT reminds me of when they started letting us use calculators in class. Sure, I forgot how to do long division by hand, but who cares? Everything else was so much easier it was worth the trade.
It seems like this is turning into an Emacs blog.
Not that there's anything wrong with that :).
It's getting harder and harder to discover useful videos on YouTube. Every thumbnail is created using the same "Make a crazy face and point at something!" format. Every title is a despirate grab for attention. The recommendation algorithm is all over the map and usually not helpful. I rely on subscriptions to known quantities and recommendations from other people. I wish it was better.
Dave's still doing fun stuff with Tinderbox.
I decided to try something new and I created a "quote"-type post.
I've been meaning to do something similar, but haven't gotten around to it. I'd probably not be so fancy. I also like the <cite> block in quotes, as seen above. That would be even more involved. Right now I have a bookmarklet that copies a Markdown-formatted version and I tweak it by hand as needed.
I'm thinking about migrating all of the content from the wiki into individual text (.md or .org) files and freezing the wiki. I love the thing, but I would like to focus my attention on Emacs/Org/etc. right now.
The more time I spend in Emacs' Dired mode, the more I want to tweak things. I wrote about a few of these last year.
One other thing I wanted was to hide any hidden (.dot) files in Dired listings. The simplest way to do this would be to set dired-listing-switches from -al to -l instead. But that would always hide them. I wanted to toggle them on and off, like I can in Finder on macOS using CMD-Shift-..
I poked around the Emacs documentation and a handful of Reddit posts and cobbled together something that worked. I figured I might as well share it. I assume there are smarter ways to do this, but here are the relevant bits from my config.
(use-package dired
:init
(require 'dired-x) ;; I think this is required for dired-omit-mode
:bind
(:map dired-mode-map
("s->" . dired-omit-mode)) ;; toggle using Command-Shift-. same as macOS Finder
:hook
(dired-mode . (lambda () (dired-omit-mode))) ;; hide .dot files by default
:config
(setq dired-omit-files ;; hide .dot files when in dired-omit-mode
(concat dired-omit-files "\\|^\\..+$")))
This configuration means that every time I create a dired buffer, the .dot files are hidden. What I haven't figured out is how to toggle it globally. Sometimes I want to show hidden files by default instead, for a while. It's not hard to toggle them, but it would be nice to "turn them on" until I want to "turn them off" again. This works well enough for now, though.
Long story, short: I'm using both Howm and Denote for notes in Emacs. But why? Below are some quick notes about why (with some "how" thrown in).
Denote is such a pleasure to work with. It's simple, powerful, and sensible. There are no dependencies or gotchas.
Howm is clever and interesting and fun. It offers a useful new take on both writing and reading notes. As a long-time fan of the Noguchi filing method, Howm resonated with me immediately.
For a couple of months, I was using both packages independently. My thought was that I'd use Howm for quick, "fleeting" notes and Denote for my personal notes, projects, and "topic journals". This worked well enough, but it meant that every new note required a decision. Plus, looking for notes meant searching 2 places. My dream has always been "Everything in one place" so keeping them separate wasn't ideal.
The trick for me was learning a way to make my Howm notes look just like Denote notes, and then manage them all using Denote. Here's a summary of what that involved.
Both Howm and Denote can be configured to use any kind of note format (e.g. Org mode, Markdown, etc.).
Recent versions of Howm have some built-in configuration for using Org mode files. This sets some basic configuration. Here's how to do that:
That's not exactly Denote's format, but the proper date string means that Denote will at least recognize it as a Denote file.
The next change was to modify the default header format to use a real #+title: because by default it uses a top-level heading ("*"):
(setopt howm-view-title-header "#+title:")
Doing that really messes with the Howm-menu and other howm lists. Buried in the comments in issue #33, I found functions (by @mmarshall540) that work around this nicely.
;; Advise `howm-view-item-basename' so that if its return value
;; includes "--", only the text before is returned.
(defun my/howm-basename-chop (str)
"Advice for `howm-view-item-basename'.
Takes a file's basename, STR, and returns only the portion before
\"--\"."
(let ((dashes-pos (string-match "--" str)))
(cond (dashes-pos (substring str 0 dashes-pos))
(t str))))
(advice-add 'howm-view-item-basename :filter-return
'my/howm-basename-chop)
;; Advise `howm-view-item-summary' so that it removes the "#+title: "
;; portion of note titles.
(defvar howm-view-title-regexp)
(defun my/howm-cut-title (str)
"Remove `howm-view-title-header' plus whitespace from STR."
(let ((begin (when (string-match howm-view-title-regexp str)
(match-beginning 2))))
(if begin (substring str begin) str)))
(advice-add 'howm-view-item-summary :filter-return 'my/howm-cut-title)
With that, note listings in Howm look perfect. Note that the best fix for all this is to simply always use Denote for creating files, but I'd already configured things before I decided to combine both sets of notes. Besides, now I can create notes using either method. For any files created using Howm, I do need to rename them, but that's easy enough in a Dired buffer using denote-dired-rename-marked-files-using-front-matter once in a while (or from within the buffer while taking the note, if I think of it).
Also in that thread is a function (also from mmarshall540) for converting existing Howm notes to use #+title: instead of "*" or "=". This worked great for me. here's the comment.
The final change was to make howm-directory and denote-directory the same directory.
That seems like a lot, but it's easier than it looks.
Now my Howm Menu and note lists look like they're supposed to, even though they're actually full Denote-style files and have #+title: in the first line.
Howm Recent Files
Why am I doing this again? Well, because I get the best of both worlds this way. I create notes using Denote as normal, but then I can review them easily using Howm. And I also get all the same Howm tricks with >>> and <<< links.
I haven't worked out when or if to use the Howm TODO features. They're cool, but I'm pretty invested in my Org agenda. I'm testing the idea of using Howm TODOs for "someday/maybe" tasks, using the "~" notation in Howm. This surfaces the someday stuff without distracting from my gotta-do stuff.
Still noodlin' on all this. It would be cool if someone better at this stuff than me would create a howm-denote.el package or something that encapsulated all this in an easy, consistent way.
I like having a felt pad on my desk, but I don't like how it sometimes causes mouse movements to become choppy.
My favorite mouse is the Logitech MX Master. Maybe other mouses work better on felt, but I want to use this one, so I decided to buy a mouse pad. Then I remembered I have a 3D printer.
I downloaded this model and an hour later I had a custom-sized simple mouse pad and it works great.
Ladybird is a brand-new browser & web engine. Driven by a web standards first approach, Ladybird aims to render the modern web with good performance, stability and security.
From its humble beginnings as an HTML viewer for the SerenityOS hobby operating system project, Ladybird has since grown into a cross-platform browser supporting Linux, macOS, and other Unix-like systems.
Ladybird is currently in heavy development. We are targeting a first Alpha release for early adopters in 2026.
I'd like to not create these daily journal posts, and instead create several individial posts. The problem is that so much of what I write here in journal posts is not Postworthy. So, I'll keep doing this, I guess.
A week ago, I toyed with the idea of using Gnus for reading Email in Emacs.
As expected, I hated it at first. But then...
Gnus is a newsreader that can be coerced into pretending it's an email client. There's no getting around this masquerade and it feels awkward. On the other hand, it's a powerful news reader pretending to be an email client.
I don't manage a ton of email, so experiments with how I deal with it aren't high risk. Still, my recent email fiasco made me nervous. It also what got me looking into using Gnus.
Most of the time, I read email on my desktop Mac. I've been using Notmuch for this. The problem is that the Notmuch database is then tied to that computer. I was eventually able to configure muchsync so that I could read everything on my laptop (MBP) as well. It was working, but felt fragile and the process would often fail for various reasons.
The other place I manage email is of course on my phone. Notmuch isn't an option there, so I use Apple Mail. As I wrote in I think I have to go back to Mu4e, Notmuch wasn't fitting my workflow as well as I'd have liked. As I was looking at returning to Mu4e, I figured I'd play with Gnus.
Gnus solves the sync problem because it feeds directly off the IMAP server (Fastmail, in my case). Using Gnus, not only do I not worry about syncing between Macs, I don't even need to sync to my desktop Mac, at all[1].
Long story short, I've stuck with Gnus for the past week and I'm kind of digging it. Once one gets past the weird terminology (Groups, Articles, Dormant, Ticked, etc.) it's actually very powerful.
I cobbled together my configuration from a half-dozen Stack Exchange answers and blog posts[2], with some tweaks from me. It ain't pretty, but it's working. I'm not even sure what some of it is doing, but here's most of it:
(use-package gnus
:bind
(("C-c o g" . gnus)
(:map gnus-group-mode-map
;; I like seeing all mailboxes, not just those with unread messages
("o" . my/gnus-group-list-subscribed-groups))
(:map gnus-summary-mode-map
;; Move message to "Archive" folder
("C-c a" . my/gnus-summary-archive)))
:custom
;; Archive outgoing email in Sent Items folder, mark it as read
;; UPDATE: Do I need this? Fastmail saves Sent items automatically
;; (gnus-message-archive-method '(nnimap "personal"))
;; (gnus-message-archive-group "Sent Items")
(gnus-message-archive-group (format-time-string "sent.%Y")) ;; keep local copy
(gnus-gcc-mark-as-read t)
(gnus-search-use-parsed-queries t) ;; standardize searches
(gnus-auto-select-next nil)
(gnus-paging-select-next nil)
(gnus-summary-stop-at-end-of-message t)
(gnus-mime-display-multipart-related-as-mixed t)
(gnus-auto-select-first nil)
(gnus-summary-display-arrow nil)
(gnus-thread-sort-functions
'(gnus-thread-sort-by-most-recent-date
(not gnus-thread-sort-by-number)))
(gnus-show-threads t)
(gnus-sum-thread-tree-false-root nil) ;; use subject
(gnus-sum-thread-tree-root nil)
(gnus-sum-thread-tree-indent " ")
(gnus-sum-thread-tree-vertical "│")
(gnus-sum-thread-tree-leaf-with-other "├─► ") ;; fancy
(gnus-sum-thread-tree-single-leaf "╰─► ")
;; |2025-03-06 (Thu)| Sender Name | Subject |
(gnus-summary-line-format (concat
"%0{%U%R%z%}"
"%3{│%}%1{%&user-date;%}%3{│%}" ;; date
"%ub:" ;; indicate (+) if known (bbdb)
"%4{%-20,20f%}" ;; name
" "
"%3{│%}"
" "
"%1{%B%}"
"%s\n"))
(gnus-user-date-format-alist '((t . "%Y-%m-%d (%a)")
gnus-thread-sort-functions '(gnus-thread-sort-by-date)))
:config
(setq gnus-select-method '(nnnil ""))
(setq gnus-secondary-select-methods '((nnimap "personal"
(nnimap-address "imap.fastmail.com")
(nnimap-server-port 993)
(nnimap-stream ssl)
(nnmail-expiry-target "nnimap+personal:Trash")))))
;; Send email via Fastmail's SMTP:
(use-package smtpmail
:custom
(send-mail-function 'smtpmail-send-it)
(smtpmail-default-smtp-server "smtp.fastmail.com")
(smtpmail-stream-type 'ssl)
(smtpmail-smtp-service 465))
I've configured BBDB (Insidious Big Brother Database) for contact management.
(use-package bbdb :ensure t
:config
;; initialization for both Gnus and Notmuch
(bbdb-initialize 'gnus 'message 'notmuch)
(bbdb-mua-auto-update-init 'gnus 'message 'notmuch)
;; When invoking bbdb interactively
(setq bbdb-mua-update-interactive-p '(query . create))
;; Check every address in a message and not only the first
(setq bbdb-message-all-addresses t)
;; use ; on a message to invoke bbdb
(add-hook 'gnus-summary-mode-hook
(lambda ()
(define-key gnus-summary-mode-map (kbd ";") 'bbdb-mua-edit-field)))
(add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus)
(add-hook 'gnus-startup-hook 'bbdb-insinuate-notmuch)
(setq bbdb-complete-name-allow-cycling t))
Using BBDB is neat because when I'm viewing a message, a small window pops up at the bottom with that person's info. One nice feature is that, in the list of messages (Summary view), a "+" symbol is displayed before the name of people who are already in BBDB. (This is via %ub in the format string). Plus, Notmuch and Gnus can share the contact database. BBDB was initially developed by Jamie Zawinski.
In 1991, I wrote this program, "The Insidious Big Brother Database", which was an address-book and note-taking system that was tightly integrated with the Emacs mail and news readers. It was pretty popular until 1997 or so when even the last hold-outs stopped reading their mail in Emacs.
Well, not everyone stopped :).
I'm still very clumsy using Gnus, but it's been a blast to learn and play with. Part of the attraction is that it's built into Emacs and needs nothing else to work. It's nice not having to deal with sync or external dependencies. I admit that I also like that it's really really old and feels almost rebellious to use.
That said, I am still syncing and keeping the Notmuch database up to date, because I like having a local copy of all my email. Also, who knows how long I'll be using Gnus? ↩︎
I went down a rabbit hole with the built-in Remember mode in Emacs today.
Persistent Scratch with remember-note
The Emacs *scratch* buffer is handy. It's always available and easy to get to. However, by default it doesn't persist between runs of Emacs. So, when I quit Emacs, anything in the scratch buffer is lost. Sometimes I get burned by this, so I thought I'd fix it using the persistent-scratch package.
While looking for details about the package, I spotted a couple comments about using the built-in remember-notes function instead.
Return the notes buffer, creating it if needed, and maybe switch to it.
This buffer is for notes that you want to preserve across Emacs sessions.
The notes are saved in ‘remember-data-file’.
OK, I tried it and it works great.
My remember-notes file/buffer
I now have a persistent Org mode file as my scratchpad, and I can easily capture new notes as org headings to it using remember.
New frame defaults
Now that I had a nice, persistent scratchpad, I wanted it to be the default buffer for new frames and at startup. Easy enough:
;; Persistent notes (like persistent-scratch, but built-in)
(setq initial-buffer-choice 'remember-notes
remember-data-file "~/Documents/Notes/remember-notes"
remember-notes-initial-major-mode 'org-mode
remember-notes-auto-save-visited-file-name t
remember-in-new-frame t))
(defun my/switch-to-scratch-buffer (f)
(with-selected-frame f
(remember-notes t)))
(add-hook 'after-make-frame-functions #'my/switch-to-scratch-buffer)
I'm not sure all of that is necessary now that I've learned about remember-in-new-frame but it works as-is, so I'll leave it.
Remember mode via Raycast for system-wide capture
I'd created a keymap (C-c o n) for bringing up the remember-notes buffer while in Emacs, but thought it would be nice having a system-wide option. I've never understood how to configure =org-protocol= so I cheated and created a Raycast script:
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Remember
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/emacs.png
# Documentation:
# @raycast.description Open Emacs remember in new frame
# @raycast.author Jack Baty
# @raycast.authorURL https://baty.net
emacsclient -e "(remember-other-frame)"
Now I can trigger Raycast, type part of "Remember" (usually just "R" is enough) and it brings up a new Emacs frame containing the remember buffer. I type or paste whatever, and hit C-c C-c which adds the note to the remember file and kills the frame. Handy!
Creating emails via Remember mode
While reading the Remember manual, I spotted the option to save Remember notes as emails. WUT?!
By default, this uses an mbox file, ~/Mail/remember, which I can use Mutt to view.
neomutt -f ~/Mail/remember
My remember notes as emails in Neomutt
Crazy, right? Yeah, I'm not going to view my captured notes in Mutt, but it's cool that I could. But it got me thinking about my urge to put everything into Notmuch. Notmuch indexes Maildir-formatted emails, not mboxes. What if I converted the mbox to Maildir and used Emacs to read the notes where I'm already reading my emails? Plus super fast search and tagging, etc.?!
I've not gotten to that yet, but it's something to think about.
Now what?
This whole thing started because I wanted to make my scratch buffer persistent. Instead, I've ended up with a whole new capture setup for quick notes.
Why not use Org-capture or Howm-remember or a million possible other things for this? Fair question. The answer is that I didn't know anything about Remember mode when I woke up this morning, and now I do. It remains to be seen whether I should have used Org-capture for this, but it was fun learning how to do it this way.
It's possible we've, er, forgotten about Remember mode too soon.
This package provides a search utility for Denote, the simple-to-use, focused-in-scope, and effective note-taking tool for Emacs.
The command denote-search is the main point of entry. It accepts a query, which should be a regular expression, and then searches the contents of all the notes stored in denote-directory for it. The results are put in a buffer which allows folding and further filtering; all standard commands offered by Xref are available as well.
This package has the same code principles as Denote: to be simple-to-use, focused-in-scope, and effective. We build upon Xref to be good Emacs citizens, and don't use any dependencies other than Denote and built-in libraries.
This works pretty well. It returns a nice, foldable list of results. One can also refine the results by filtering by file names, etc. I'll probably continue using Deadgrep, but denote-search is nice to have in the quiver.
When I bought the Nikon Z f recently, the way I intended to offset the cost was to sell the Leica SL2. The mistake I made was to buy the Nikon before selling the Leica.
Yesterday, I gathered up the SL2 with accessories and took some photos of it for the listing. Picking up the camera reminded me that, as nice as the Z f is, it's not in the same league as the SL2. Everything about the Leica feels nicer. Controls, covering, grip, doors, battery, all of it.
I've been lost in the Nikon's menu system for a week. I still don't know where anything is. There's more "stuff" available on the Nikon, but the Leica's menus are simple, clear, and easy to understand. Sometimes less is more, you know?
I started to reconsider the move to Nikon for my digital photography.
On the other hand, the Z f is significantly smaller and lighter. Accessories are less expensive. The RAW files look good, and are much smaller (due to being 24MP vs 47MP, sure, but still). It's better at everything in low light. And auto-focus with the Nikon is miles ahead of the Leica. Eye detection with continuous auto-focus is a thing to behold.
I'm keeping both cameras.
The Nikon is for everyday stuff. It's perfect for the dog and my grandson and out-and-about photography. The Leica will remain for more "serious" things like studio portraits, which I want to do more of.