June 8, 2025

IconIcon

Antinote: A Beautiful Scratchpad

Product: Antinote Beautiful Temporary Notes and Calculations
Price: $5

I am all-in on Emacs. I use it for everything and have been consciously avoiding every other application which handles text in any way. It was going well. Antinote changed that.

The developer describes Antinote as:

Antinote is a productivity scratchpad exclusively for macOS. It’s meant for temporary notes, calculations, and quick text manipulation; and designed to be beautiful, fast, keyboard-driven, and privacy-first.

In other words, Antinote is a scratchpad which you use for temporary notes. I have a note for URL’s I want to read later.

linkslinks

I create notes to write elisp snippets of code which I want to add to my config.

I have notes containing information which I need for some task on the horizon. It is a dumping ground of little ephemeral notes for me.

Antinote is beautiful software. It is well-designed and performs its functions admirably well. I must admit that I don’t use it for calculations or quick text manipulation. For calculations, I use Soulver 3 and for text manipulation I use Emacs or BBEdit. I use Antinote only for temporary notes. And it shines in that task.

It is easily accessible. ⌥A anywhere and Antinote is active. Make your note. Press ⌥A again and you are back in the application that you were in. Quick and convenient. I love it.

Antinote comes with a good manual online. Antinote Manual. Read it. Antinote is feature-rich and does things you don’t expect. The manual is essential for discovery.

Preferences Galore

You get to setup Antinote according to the workflow you want. The preferences are extensive and easy to understand.

preferencespreferences

There are nice themes which ship with the product and you can get more at antinote-extensionsthemes-community. There is also a site where you can design your own themes. Check out Antinote Theme Maker

I made a theme for myself. Here it is:

{
  "name": "macosxguru Solarized",
  "isDarkTheme": false,
  "background": "#fdf6e3",
  "backgroundFade": "#ECECEC",
  "typeMain": "#586e75",
  "typeSubtle": "#1F4F79",
  "typeSubtlePlus": "#085EA3",
  "typeHighlight": "#eee8d5",
  "typeLight": "#B2B2B2",
  "typeSuperlight": "#DAD9D7",
  "typeHyperLight": "#F2F2F2",
  "typeReverse": "#FFFFFF",
  "accent1Main": "#1EBDFF",
  "accent1Secondary": "#0F8C8C",
  "accent1Tertiary": "#417863",
  "accent2Main": "#C14DFB",
  "accent2Secondary": "#C14DFB",
  "accent3Main": "#4DA425",
  "accent3Secondary": "#3C7F1C",
  "accent4Main": "#FF9E3C",
  "accent4Secondary": "#CE741A",
  "accent5Main": "#FF3B30",
  "accent5Secondary": "#AC2E27",
  "gridSuperlight": "#D9EEFA",
  "gridClear": "#CBE1ED",
  "gridBold": "#ABCBDD"
}

Not going to teach you how to setup the program. Read the manual. Try out a few things for yourself. Come up with a customized app which fits your needs.

I am going to talk about a setting which made life better for me. Antinote doesn’t fully support Markdown. It lets you export to Markdown but doesn’t help you write in Markdown. I tried using Keyboard Maestro macros which help me write Markdown and that didn’t work. I realized that I have Markdown Service Tools from Brett Terpstra and that would take care of my need for aids to write Markdown. Services are available to Antinote but you have to set up Antinote just right.

preferences 2preferences 2

You have to choose this option to have the Services menu available to you. Highlight some text and the Markdown Service Tools show up in their full glory.

servicesservices

I have a habit of pressing ⌘+s to save the document I am working in. I press that almost convulsively. Antinote saves files automatically. You don’t need to do that. Unfortunately, that keyboard command is assigned to Quick Export in Antinote. You can change it, and I did.

quick exportquick export

Now when I press ⌘+s, the program just beeps at me and I can move on with my note-taking.

Working With Antinote

slashslash

You can type / and get a list of Antinote keywords which you can use on a note. You can’t mix and match these but they are useful for individual notes.

Paste is an interesting keyword. You can type paste in your Antinote note and copy text to the clipboard in another program in the background. It automatically gets pasted into Antinote. So you can copy text in batches in another application and the clipboard contents get pasted into Antinote. I use this a lot.

Code is another useful keyword. Syntax highlights the code if you specify the language that you are using. For example: code: lisp will syntax highlight your elisp code.

codecode

Timer is a keyword in Antinote which I find useful. It has a pomodoro function too. Love that there are these little features which I don’t expect in a scratchpad application. They are useful and they make Antinote unique.

Antinote keeps its data in a sqlite database. So you are not dealing with text files in this program. The program makes it possible for you to export your notes to plain text files, Markdown, Obsidian, Bear, Apple Notes and any application which supports URL Schemes.

exportexport

I export to the Markdown format. You can export all of the notes into a zipped text file if you need to. There is no lock-in.

Improvements

As you can tell, I am impressed with Antinote. I have been recommending it to everyone I know. However, there are certain things I would like Antinote to do or do better. They are:

  • Keyboard commands for Markdown. Antinote is not a Markdown-based text editor. But it does export to Markdown. Let me write my notes in Markdown and let me have some help in doing that.
  • Support for lists other than TODO lists: numbered and bulleted lists. I live in lists but they are not all TODO lists. Please let me make different kinds of lists.
  • Automatic continuation of numbered and bulleted lists. If you are going to let me make lists help me in that process.
  • Support spell checking from macOS.
  • Fix full-screen mode. Full-screen mode is unusable. Let me show the text in the middle of the screen in a reasonably sized window. I don’t want to work on a line which covers the width of the screen. That is insane, no one can work like that.
  • Let me use my own fonts. This is a biggie for me. I want to use my own fonts. One for text and the other for code. Please let me set the size of the font. The preferences that are available makes me do the following to enable font sizes which I can read on screen. I am 64 years old, my eyesight is screwy.

font sizefont size

Conclusion

I love Antinote. I think it is an useful addition to my workflow. It has a lot of competition in the scratchpad space, but it is unique in that space. It does what it sets out to do well and adds some features which are not usually supported by this category of applications. It’s priced well and is supported by the developer.

Antinote is recommended heartily.

macosxguru at the gmail thingie.

Notes: I was provided a license code by the developer to write about the product.
Another Review: PTPL 160 · A New Mac App That Can Add Notes, With Calculations, to Obsidian - Ellane W

notes macOS
June 6, 2025

DesignDesign

Links of Note 2025-06-06

macosxguru at the gmail thingie.

Thanks to: Photo by SANDRA GOPAN: https://www.pexels.com/photo/geometric-modern-apartment-facade-in-dubai-32312787/

macOS font editor
May 4, 2025

Quick Bites 012

Haven’t done one of these in a long while. Have a few more lined up in my mind.

Move Focus With Your Mouse or Trackball Pointer

autoraise iconautoraise icon

AutoRaise (and focus) a window when hovering over it with the mouse

I came across a little utility which lets you bring windows to the front by moving your mouse/trackball pointer to any part of that window. Works beautifully and is perfect for those of you who are fond of navigation with the mouse/trackball.

autoraise preferencesautoraise preferences

The preferences are extensive and you can tweak the program to do what you want.

Copy URL’s From Browser

HyperLink iconHyperLink icon

Hyperlink

This is a menubar app which grabs the URL from your browser tab and puts it in the clipboard. A keyboard command and the URL is in your clipboard. Useful and well-designed.

Hyperlink preferencesHyperlink preferences

I was amazed by how well-designed and presented the preferences for this little utility was. Great work.

Both utilities are heartily recommended.

macosxguru at the gmail thingie.

utilities macOS
April 24, 2025

EmacsEmacs

Much Ado About Emacs 009

Moving away from Evil

Conceptually it reminds me of fog. When I am in Emacs, trying to write, there seems to be an invisible curtain keeping me detached from the program. That is the effect evil-mode has on me. Yes, I love the space-bar leader key. But the actual writing and editing is foggy. Part of it is due to my limited knowledge of VIM keybindings but a part of it is the fact that I am putting a layer of complexity between Emacs and me. It feels like a stream of worry. Anxiety. Uncomfortable.

I decided to move back to god-mode and do away with evil-mode. VIM keybindings are fantastic and they are useful but I am not in VIM, I am in Emacs. I decided to not introduce this layer of discomfort into the process and deal with pure, vanilla Emacs.

So, it is back to vanilla Emacs. To the Emacs tutorial.

I decided to try to replicate the space-bar configuration through general.el and used the leader-key M-o.

#+begin_src emacs-lisp
  (general-create-definer my-leader-def
  :prefix "M-o"
  :non-normal-prefix "M-o")
  (my-leader-def
  ;; Top level functions
  "." '(find-file :which-key "find file")
  ";" '(consult-recent-file :which-key "recent files")
  "/" '(bufferfile-rename :which-key "rename file")
  "TAB" '(switch-to-prev-buffer :which-key "previous buffer")
  "p" '(org-capture :which-key "org-capture")
  "x" '(execute-extended-command :which-key "execute command")

  ;; Applications
  "a" '(nil :which-key "applications")
  "ao" '(org-agenda :which-key "org-agenda")
  "ac" '(org-capture :which-key "org-capture")
  "ab" '(nil :which-key "browse url")
  "abc" '(browse-url-chrome :which-key "chrome")
  "abg" '(my/er-google :which-key "google search")
  "av" '(nil :which-key "avy")
  "avc" '(avy-goto-char-timer :which-key "avy goto char")
  "avp" '(avy-goto-parens :which-key "avy goto parens")
  "ad" '(dired :which-key "dired")

  ;; Buffers
  "b" '(nil :which-key "buffer")
  "bb" '(switch-to-buffer :which-key "switch-to-buffer")
  "bc" '(consult-buffer :which-key "consult-buffer")
  "bd" '(kill-buffer :which-key "kill-buffer")
  "bi" '(ibuffer :which-key "ibuffer")
  "bn" '(next-buffer :which-key "next-buffer")
  "bp" '(previous-buffer :which-key "previous-buffer")
  "bR" '(revert-buffer :which-key "revert-buffer")
  "br" '(bufferfile-rename :which-key "rename buffer")
  "bs" '(scratch :which-key "scratch buffer")

  ;;Consult
  "c" '(nil :which-key "consult")
  "cb" '(nil :which-key "bookmark/buffer")
  "cd" '(consult-dir :which-key "con dir")
  "cg" '(consult-grep :which-key "con grep")
  "ch" 'consult-org-heading :which-key "con org heading"
  "cl" '(consult-line :which-key "con line")
  "cn" '(consult-notes :which-key "con notes")
  "co" '(consult-outline :which-key "con outline")
  "cy" '(consult-yasnippet :which-key "con yasnippet")

  "cb" '(nil :which-key "bookmark/buffer")
  "cbo" '(consult-bookmark :which-key "con bookmark")
  "cbu" '(consult-buffer :which-key "con buffer")
  ;;Consult-register
  "cr" '(nil :which-key "consult-register")
  "crr" '(consult-register :which-key "con register")
  "crs" '(consult-register-store :which-key "con reg store")

  ;; Denote
  "d" '(nil :which-key "denote")
  "dl" '(denote-link :which-key "denote-link")
  "dL" '(denote-add-links :which-key "denote-add-links")
  "dn" '(denote :which-key "denote")
  "db" '(denote-backlinks :which-key "denote-backlinks")
  "dr" '(denote-rename-file :which-key "denote-rename-file")
  "dR" '(denote-rename-file-using-front-matter :which-key "denote-rename-file-using-front-matter")

  ;;Elfeed
  "e" '(nil :which-key "elfeed")
  "ee" '(elfeed :which-key "elfeed")
  "eu" '(elfeed-update :which-key "elfeed-update")

  ;; Files
  "f" '(nil :which-key "files")
  "ff" '(find-file :which-key "find file")
  "fs" '(save-buffer :which-key "save buffer")
  "fS" '(write-file :which-key "write file")
  "fd" '(dired :which-key "dired")
  "fo" '(reveal-in-osx-finder :which-key "reveal in finder")
  "fR" '(consult-recent-file :which-key "recent files")
  "fr" '(bufferfile-rename :which-key "rename buffer")

  ;; Help/emacs
  "h" '(nil :which-key "help/emacs")
  "hv" '(consult-describe-variable :which-key "des. variable")
  "hb" '(describe-bindings :which-key "des. bindings")
  "hM" '(describe-mode :which-key "des. mode")
  "hf" '(consult-describe-function :which-key "des. func")
  "hF" '(describe-face :which-key "des. face")
  "hk" '(describe-key :which-key "des. key")

  ;;set-mode
  "hm" '(nil :which-key "which-mode")
  "hme" '(emacs-lisp-mode :which-key "elisp mode")
  "hmo" '(org-mode :which-key "org mode")
  "hmm" '(markdown-mode :which-key "markdown mode")
  "hmt" '(text-mode :which-key "text mode")

  ;; Jumps
  "j" '(nil :which-key "jumps")
  "jr" '(jump-to-register :which-key "registers")
  "jb" '(bookmark-jump :which-key "bookmark jump")

  ;;package
  "hp" '(nil :which-key "package")
  "hpr" '(package-refresh-contents)
  "hpi" '(package-install)
  "hpd" '(package-delete)

  ;; Search
  "s" '(nil :which-key "search")
  "sa" '(avy-goto-char-2 :which-key "avy-goto-char-2")
  "ss" '(isearch-forward :which-key "isearch-forward")
  "sr" '(isearch-backward :which-key "isearch-backward")
  "sp" '(project-search)
  "si" '(consult-imenu :which-key "consult-imenu")
  "sm" '(consult-mark :which-key "jump to marker")
  "sl" '(consult-goto-line :which-key "Go to line")

  ;;System
  "m" '(nil :which-key "system")
  "m1" '(restart-emacs :which-key "restart emacs")
  "m+" '(tab-bar-new-tab :which-key "tab new")
  "m-" '(tab-close :which-key "tab close")
  "mf" '(my/resources-visit :which-key "visit resources")'

  "mr" '(nil :which-key "region")
  "mre" '(er/expand-region :which-key "expand region")
  "mrc" '(er/contract-region :which-key "contract region")

  "mp" '(nil :which-key "palimpsest")
  "mpb" '(palimpsest-move-region-to-bottom :which-key "pal move bottom")
  "mpt" '(palimpsest-move-region-to-top :which-key "pal move top")

  "mm" '(nil :which-key "mark")
  "mml" '(my/mark-line :which-key "mark line")
  "mmb" '(my/mark-block :which-key "mark block")

  ;; Newsticker
  "n" '(nil :which-key "newsticker")
  "ng" '(newsticker-get-all-news :which-key "get news")
  "ns" '(newsticker-show-news :which-key "show news")
  "no" '(newsticker-treeview-mark-list-items-old :which-key "mark as old")
  "nq" '(newsticker-treeview-quit :which-key "newsticker quit")

  "nu" '(newsticker-treeview-update :which-key "treeview-update")

  ;; Org-mode
  "o" '(nil :which-key "org-mode")
  "oa" '(org-agenda :which-key "org-agenda")
  "oc" '(org-capture :which-key "org-capture")
  "on" '(recursive-narrow-or-widen-dwim :which-key "narrow")
  "or" '(org-refile :which-key "refile")
  "ot" '(org-todo :which-key "DONE")
  "ou" '(my/org-jump-to-heading-beginning :which-key "jump to heading")
  ;; More Org
  "ol" '(nil :which-key "line/link")
  "olb" '(org-beginning-of-line :which-key "begin of line")
  "ole" '(org-end-of-line :which-key "end of line")
  "oli" '(my/org-insert-link-dwim :which-key "org insert link")
  "ols" '(org-store-link :which-key "org store link")
  ;; Yet More org
  "," '(nil :which-key "more-org")
  ",c" '(org-cycle :which-key "org-cycle")
  ",n" '(outline-next-visible-heading :which-key "next-heading")
  ",p" '(outline-previous-visible-heading :which-key "previous-heading")
  ",t" '(org-set-tags-command :which-key "set-tags")
  ",u" '(outline-up-heading :which-key "up-heading")

  ;; text and tab
  "t" '(nil :which-key "text")
  "tn" '(tab-next :which-key "tab next")
  "tp" '(tab-previous :which-key "tab previous")
  "tr" '(isearch-query-replace :which-key "find and replace")
  "ts" '(yas-insert-snippet :which-key "insert yasnippet")
  "tR" '(replace-regexp :which-key "replace-regexp")
  "tt" '(titlecase-dwim :which-key "titlecase")
  "t/" '(my/comment-or-uncomment :which-key "comment")
  ;; date/time
  "td" '(nil :which-key "stamp date/time")
  "tdd" '(my/time-stamp-short :which-key "time-stamp-short")
  "tds" '(my/date-stamp :which-key "date-stamp")
  ;; word
  "tw" '(nil :which-key "word")
  "twc" '(my/copy-whole-word :which-key "copy whole word")
  "twk" '(my/kill-inner-word :which-key "kill inner word")
  "two" '(copy-as-format-org-mode :which-key "copy as org mode")
  "twm" '(copy-as-format-markdown :which-key "copy as markdown mode")
  "twi" '(org-web-tools-insert-web-page-as-entry :which-key "insert web page as entry")
  "tww" '(org-web-tools-insert-link-for-url :which-key "insert link for url")
  "twl" '(dictionary-lookup-definition :which-key "dictionary lookup")
  "twp" '(my/lookup-word-at-point :which-key "lookup word at point")

  ;; Windows
  "w" '(nil :which-key "window")
  "wl" '(windmove-right :which-key "windmove-right")
  "wh" '(windmove-left :which-key "windmove-left")
  "wk" '(windmove-up :which-key "windmove-up")
  "wj" '(windmove-down :which-key "windmove-down")
  "wd" '(delete-window :which-key "delete-window")
  "wr" '(hsplit-last-buffer :which-key "split-window-right")
  "wb" '(vsplit-last-buffer :which-key "split-window-below")

  ;; Visual
  "v" '(nil :which-key "visual")
  "vt" '(consult-theme :which-key "load theme")
  "vR" '(read-only-mode :which-key "read only mode"))
#+end_src

This is a work in progress. I tweak it from time to time depending on my usage.

defalias

I got exposed to this through

Defalias a quick guide to making an alias in Emacs coding - YouTube

Thank you, Raoul Comninos.

There are commands I run in Emacs only sporadically. They might or might not be bound to keyboard commands. I have to remember what the commands are and I find myself searching for them. I have assigned them an alias. I can go into command mode (M-x), and type the alias and hit enter. The command executes. Reminds me of aliases I use in the shell.

#+begin_src emacs-lisp
(defalias 'brf 'bufferfile-rename-file)
(defalias 'pde 'package-delete)
(defalias 'pud 'auto-package-update-now)
(defalias 'rem 'restart-emacs)
#+end_src

I am going to add to this list as I go along and find more commands that are not used often but are good to alias.

recursive-narrow

Another thing I learned from Raoul. The Emacs recursive narrow package coding programming - YouTube.

Thank you Raoul.

Using recursive-narrow - MELPA. Lets me concentrate on portions of a document.

I have set it up with Raoul’s help.

#+begin_src emacs-lisp
(use-package recursive-narrow)
(defun recursive-narrow-or-widen-dwim ()
  "If the region is active, narrow to that region.
Otherwise, narrow to the current function. If this has no effect,
widen the buffer. You can add more functions to
`recursive-narrow-dwim-functions'."
  (interactive)
  (recursive-narrow-save-position
   (cond ((region-active-p) (narrow-to-region (region-beginning) (region-end)))
         ((run-hook-with-args-until-success 'recursive-narrow-dwim-functions))
         ((derived-mode-p 'prog-mode) (narrow-to-defun))
         ((derived-mode-p 'org-mode) (org-narrow-to-subtree)))
   ;; If we don't narrow
   (progn
     (message "Recursive settings: %d" (length recursive-narrow-settings))
     (recursive-widen))))
#+end_src

It is assigned a keybinding, (C-x n n). I have also configured it in general.el to M-o o n. Works like a charm.

bufferfile.el

jameschertibufferfile.el Emacs helper functions to delete and rename buffer files. This is a package which provides helper functions to delete and rename buffer files:

  • bufferfile-rename: Renames the file visited by the current buffer and updates the buffer name for all associated buffers, including clones/indirect buffers. It also ensures that buffer-local features referencing the file, such as Eglot, are correctly updated to reflect the new file name.
  • bufferfile-delete: Delete the file associated with a buffer and kill all buffers visiting the file, including clones/indirect buffers.
  • bufferfile-copy: Copies the file visited by the current buffer to a new file.

I use the bufferfile-rename command multiple times a day. It might help to explain the workflow.

  • I read the Letters from an American Heather Cox Richardson Substack everyday and then using a Chrome extension copy the markdown link to the entry and download the content of the entry to a Markdown file in my Downloads folder.
  • I open the file in Emacs. Add the markdown link to the top of the page. Add a heading 1 item above the link. The heading is of the form “HCR - (the date of the entry)”.
  • I want the file-name to be this new heading 1 entry. So, I copy it and then proceed to change the name of the file, buffer-file-rename and then select the name of the file and paste in the new name of the file.
  • Then I proceed to re-read the entry and add my comments and observations to the file.
  • After I am done with it, I move it to an EagleFiler document.

This package makes the process of renaming my Emacs buffer easier. I use the following coinfiguration:

#+begin_src emacs-lisp
(use-package bufferfile
  :ensure t
  :vc (:url "https://github.com/jamescherti/bufferfile.el"
       :rev :newest))
#+end_src

That is all I have for you today.

macosxguru at the gmail thingie.

emacs
March 12, 2025

TrashTrash

Gruber Calls It

Gruber wrote Daring Fireball Something Is Rotten in the State of Cupertino.

I am not going to rewrite the article for you. Go read it.

This is a quote from the article.

When mediocrity, excuses, and bullshit take root, they take over. A culture of excellence, accountability, and integrity cannot abide the acceptance of any of those things, and will quickly collapse upon itself with the acceptance of all three.

Reminded me of what Guy Kawasaki called “bozosity.” I think Apple is afflicted with that.

macosxguru at the gmail thingie.

Note: Thanks to Photo by Lisa from Pexels: https://www.pexels.com/photo/stainless-steel-can-with-fire-2456828/

macOS Apple