January 27, 2025
icon
Leader Key
If you are looking for a program which helps your interaction with macOS, you should consider Alfred or/and Keyboard Maestro. If you don’t want to spend money or introduce an interesting alternative to help you launch files and do other stuff with macOS, LeaderKey.app, is a new entrant. It is open-source and free.
An Alternative Way
Both Alfred and Keyboard Maestro are primarily keyboard shortcut driven. For instance, I have a whole series of keyboard commands set, in Alfred, to launch programs in macOS.
⌃+⇧+C: Launches Google Chrome
⌃+⇧+E: Launches Emacs
⌃+⇧+M: Launches SpamSieve and Mail, and so on.
You run out of keyboard commands if you use this feature. Alfred of course has the option of typing the name of the application, folder, and a whole host of items if you need that. But if you like keyboard commands, you are going to do what I have to do.
⌃+⇧+B: Launches BBEdit
⌃+⇧+⌥+B: Launches Better Rename
Introduce keyboard commands which let you use the same launch letter for different programs.
Keyboard Maestro gives you the option of a palette. You can assign the same keyboard commands to a whole host of launchers and that will bring up a palette. You choose the option you are looking for, by typing a character to choose your desired option. This is a better option than Alfred.
Leader Key is built on a similar vein. I set it up to launch with ⌘+.. Leader Key lets you form groups of commands. I have set up a group which is activated by typing ‘o’, then I type another letter to get the app I want to launch. I type ‘oe’ to launch Mail. ‘ow’ for Emacs. ‘ot’ for Ghostty, and so on.
Preferences
You can have sets of keyboard input to launch applications, URL’s, commands and folders. The arrangement ensures that you are not going to run out of keyboard commands.
Leader Key is well-designed and capable of being a solution for your launching needs.
Caveats
Use the Choose option to pick the application you are going to assign. Sequoia has internally changed the path of where the programs are stored. In the Finder, it looks like they are all in the Applications folder. However, their paths show different locations. For example, the path to Safari is "/System/Volumes/Preboot/Cryptexes/App/System/Applications/Safari.app"
, while the path to Messages is "/System/Applications/Messages.app"
. Strange.
The configuration for Leader Key can be set through the program’s preferences. It can also be edited as a .json file. .json is not the most malleable text format. You have to be mindful of the presence and absence of commas that the format requires.
Suggested Improvements
- The input box for the path of the application does not let you paste the path of the application, you have to type it in. I use the Choose option and that lets me not worry about pasting in the path. I would have liked to be able to paste in the path.
- Would have loved it if I could assign multiple applications to the same keyboard command. I work in sets of programs. Launching them together would make sense to me. I do this in both Alfred and Keyboard Maestro. Leader Key doesn’t let me do that.
- Would like the preferences to be sort-able. The static order it shows is the order you added the programs in. Would have loved the ability to show it sorted. I added the programs I wanted, then opened the .json file in Emacs and re-ordered the settings to be alphabetically sorted. That is my way around this mess.
Sorted
- I am trying to integrate Leader Key with Alfred’s workflows and system commands. Haven’t been successful in the attempt so far. I see it works with Raycast.
Conclusion
Leader Key is a worthy addition to the macOS toolset. Recommended without any reservations.
macosxguru at the gmail thingie.
PS: Video from the developer The faster than your launcher launcher – Leader Key for macOS - YouTube
macOS
January 13, 2025
Tools
App Defaults 2025
This was inspired by App Defaults ldstephens and he was inspired by Hemispheric Views - App Defaults.
Mail Client: Mail()
Mail Server: Gmail
Spam: SpamSieve
Notes: Emacs
To-Do: Emacs and Reminders()
Project-management: Emacs
Diary/Journal: Emacs
iPhone Photo Shooting: Camera+ Pro Camera & Editor
Photo Management: Photos()
Image Manipulation: Acorn 8
Music Player: Music (), Swinsian
Calendar: Calendar()
Contacts: Contacts()
Cloud File Storage: iCloud(), and Dropbox
RSS: Newsblur, NetNewsWire, Emacs
Browser: Safari(), Chrome
Chat: Messages(), Telegram
Bookmarks: pinboard.in, Emacs
Read It Later: Emacs
Reading epubs: ClearView X, Kindle
Reading pdf’s: Reader, PDF Expert
Podcast: Podcasts()
Text: Emacs, iA Writer, BBEdit
Markdown Previewer: Marked 2
Launcher: Alfred
Spreadsheets: Numbers()
Shopping Lists: Emacs
Password Management: Enpass
Weather: Weather()
File Rename: Better Rename
File Search: HoudahSpot
Netword Security: Little Snitch
File Management: Hazel
Macros: Alfred, Keyboard Maestro
Clipboard: Alfred
Snippets/Text-expansion: Alfred
Keep computer awake: Amphetamine
Delete Apps: AppCleaner
Crosswords: Black Ink 2
Calculator: PCalc, Calca
Youtube Downloader: Downie
File Dump: EagleFiler
Terminal: Ghostty
Video-player: IINA
Compressor/uncompressor: Keka
Window Management: Moom
Quicklook: Peek
Mindmaps: Scapple, Emacs
Screenshot: ScreenFloat
Writing Everything: Emacs
macosxguru at the gmail thingie.
Thanks to: Photo by cottonbro studio: https://www.pexels.com/photo/silver-and-blue-metal-tools-4480531/
macOS
January 2, 2025
Emacs
Much Ado About Emacs 006
These are some of the things which got my attention last week.
Constraining the movement of the cursor in the mini-buffer
The cursor in the mini-buffer needs to be constrained from moving around. Errant arrow-keys make life difficult. This is the solution, from the documentation of Daniel Mendler’s Vertico package:
#+begin_src emacs-lisp
(setq minibuffer-prompt-properties
'(read-only t cursor-intangible t face minibuffer-prompt))
(add-hook 'minibuffer-setup-hook #'cursor-intangible-mode)
#+end_src
Get rid of ^M
I have the need to copy some file names in the Finder and paste into an org-mode buffer.
This is what happens:
Evil fuckers
What are these ^M
characters? Did some research and they seemed to be DOS line-ending markers. What? DOS? Confused the hell out of me. I don’t have that in BBEdit. What is going on? More research led to this solution.
#+begin_src emacs-lisp
(defun dos2unix ()
"Replace DOS eolns CR LF with Unix eolns CR"
(interactive)
(goto-char (point-min))
(while (search-forward (string ?\C-m) nil t) (replace-match "\n")))
#+end_src
I run the dos2unix function to get rid of these evil things.
Outliner minor mode for everything
I love org-mode because it lets me have outliner behavior in my text editor. Like folding, hoisting, and so on. I got exposed to outline-minor-mode and decided to bring that to Markdown. The keybindings need work but this is what I am starting with:
#+begin_src emacs-lisp
(add-hook 'markdown-mode-hook 'outline-minor-mode)
;; Define outline-minor-mode key map
(define-prefix-command 'cm-map nil "Outline-")
(define-key outline-minor-mode-map (kbd "C-c @") 'cm-map)
;; Define key bindings for outline minor mode
(define-key cm-map (kbd "t") 'outline-hide-body) ; Hide all but headings
(define-key cm-map (kbd "a") 'outline-show-all) ; Show everything
(define-key cm-map (kbd "c") 'outline-hide-entry) ; Hide this entry's body
(define-key cm-map (kbd "e") 'outline-show-entry) ; Show this entry's body
(define-key cm-map (kbd "l") 'outline-hide-leaves) ; Hide all body lines
(define-key cm-map (kbd "k") 'outline-show-branches) ; Show all entries
(define-key cm-map (kbd "q") 'outline-hide-sublevels); Hide everything but top-level
(define-key cm-map (kbd "o") 'outline-hide-other) ; Hide other branches
#+end_src
reveal-in-osx-finder
Looking at some transients Howard Melman sent me, I came across a reference to reveal-in-osx-finder. Shows you the file you are working on in the Finder. Useful.
#+begin_src emacs-lisp
(use-package reveal-in-osx-finder)
(require 'reveal-in-osx-finder)
(global-set-key (kbd "C-c z") 'reveal-in-osx-finder)
#+end_src
cycle-spacing
Ran across this in Precise Word Spacing in macOS Emacs. It is a problem I face quite often and now I have a solution:
#+begin_src emacs-lisp
(keymap-global-set "M-SPC" #'cycle-spacing)
#+end_src
Transients and General
I use General for assigning my own keybindings to org-mode and markdown-mode. The default keybindings are too elaborate. General is not helpful if you don’t know what the options are that are available to you. Transients are handy in the process of discovery. The act of creating the transients helps you get familiar with the options that you can access. Howard Melman clued me in to the efficiency of this addition. Two examples of what he pointed me to.
Transient for C-x r
#+begin_src emacs-lisp
;;;; Transient for C-x r - rectangles, registers, bookmarks
(defun hrm-list-bookmarks ()
(interactive)
(call-interactively 'bookmark-bmenu-list))
(transient-define-prefix hrm-ctl-x-r-transient ()
"Transient for C-x r commands"
["C-x r …"
["Rectangles"
("M-w" "Copy" copy-rectangle-as-kill)
("k" "Kill" kill-rectangle)
("y" "Yank" yank-rectangle)
("d" "Delete" delete-rectangle)
("o" "Open" open-rectangle)
("c" "Clear" clear-rectangle)
("t" "String" string-rectangle)
("N" "Number" rectangle-number-lines)
(":" "Sum Down" calc-grab-sum-down) ; Unnecessary since I add it to rectangle-mark-mode-map
]
["To Register"
("SPC" "Point" point-to-register)
;; ("C-SPC" "Point" point-to-register)
;; ("C-@" "Point" point-to-register)
("s" "Region" copy-to-register)
("a" "Region Append" append-to-register) ; unbound
("p" "Region Prepend" prepend-to-register) ; unbound
("r" "Rectangle" copy-rectangle-to-register)
("w" "Window Config" window-configuration-to-register)
("f" "Frameset" frameset-to-register)
("n" "Number" number-to-register)
("+" "Increment" increment-register)
("K" "KMacro" kmacro-to-register) ; C-x C-k K, can be here too
]
["From Register"
("j" "Jump" jump-to-register)
("i" "Insert" insert-register)
("x" "Consult" consult-register :if (lambda () (fboundp 'consult-register)))
]
["Bookmarks"
("m" "Set" bookmark-set)
;;("b" "Jump" bookmark-jump) ; I bind C-x r b to consult-bookmark
("b" "Jump Consult" consult-bookmark)
("l" "List" hrm-list-bookmarks) ; list-bookmarks fails, probably because of call-interactively
("M" "Set if Unset" bookmark-set-no-overwrite)
("S" "Save" bookmark-save)
]
]
)
(global-set-key (kbd "C-x R") #'hrm-ctl-x-r-transient)
#+end_src
Transient for M-g
#+begin_src emacs-lisp
(transient-define-prefix hrm-goto-transient ()
"Transient for navigation commands on M-g."
["Goto"
["Position #"
("g" "Line" consult-goto-line)
("c" "Char" avy-goto-char-timer)
("TAB" "Column" move-to-column)
("t" "Window Top/Bot" move-to-window-line-top-bottom)
]
["Index Here"
("i" "Imenu" consult-imenu)
("o" "Outline" consult-outline) ; goto outline-regexp matches
("h" "Org Heading" consult-org-heading :if-mode org-mode)
("m" "Mark" consult-mark) ; goto marker in mark-ring
]
["Index All"
("I" "Project Imenu" consult-imenu-multi)
("M" "Global Mark" consult-global-mark)
("T" "All Todo" consult-todo-all)
]
["Here in"
("D" "Dired" dired-jump)
("B" "IBuffer" ibuffer-jump)
("S" "Shell" shell) ; eshell?
("R" "Finder" reveal-in-osx-finder :if (lambda () (fboundp 'reveal-in-osx-finder)))
]
["Avy"
("l" "Line" avy-goto-line)
("w" "Word" avy-goto-word-0)
("W" "Prompted Word" avy-goto-word-1)
]
])
(global-set-key (kbd "M-G") 'hrm-goto-transient)
#+end_src
Lists of Some Other Changes
- I installed the Spacemacs theme. I like the light version of the theme.
- Also installed the Standard themes from Protesilaos. Love the light theme there.
- Installed the Nano theme from Rougier. It is an impressively minimal look.
- Installed the Embark package. Have little idea of what it does. I am reading up on it. Will discuss when I have a better idea of what that package is good for.
As you can tell, I am having fun and learning some new stuff.
Till next time.
macosxguru at the gmail thingie.
emacs
December 28, 2024
Kitty
2024 Review
The Major Changes
Two major changes happened over 2024. The introduction of the ZSA Moonlander Next-gen Ergonomics zsa.io to the hardware stack, and the other was GNU Emacs - GNU Project.
ZSA Moonlander
I had been using the Planck from ZSA. It is a great keyboard but I wanted to try out a split keyboard and had been drooling over the Moonlander for a while. I acquired it in July.
Took me a few weeks to get comfortable in it. Having used the Planck for about two years, I am used to the ortholinear setup. The Moonlander has so many extra keys, that it took some getting used to. Of course, that process was also accompanied by a ton of tweaks to the keyboard. The Moonlander is completely programmable through Oryx The ZSA Keyboard Configurator.
Programmable means choices. I had to answer basic questions like:
- Where do I put the space bar?
- What about the modifier keys? Do I need a right ⌘ key? Or a right ⌃ key?
Choices which had to be tried out for a while before I could make an informed one. Took a while and it is still an ongoing process.
I love the keyboard. Just absolutely love it. It has made my pain in my fingers and wrists go away. I am usually on the keyboard for more than 14 hours a day. Yeah, I know, I need a life. This is the best investment I have made on my health in a long while. Feels fantastic.
Things which make this keyboard perfect:
- No Shift key required. Auto-shift is a god-send. A little longer press on a key and it types the character with the shift key held down. The downside? I can’t use any other keyboard. Using the keyboard on the Air, I find myself holding on to a key expecting the Auto-shift behavior and nothing happens. Deeply frustrating.
- The ability to get the extra keys to do the usual things which I do on a regular basis is a killer feature. One key for Alfred - Productivity App for macOS. One key for Keyboard Maestro 11.0.3 Work Faster with Macros for macOS.
- The Hyper key and the Meh key.
- For the Emacs user, multiple Esc keys, and a dedicated
C-g
key.
If you are interested in improving your input device, I would recommend the Moonlander with glowing praise.
This is an interesting article on Your first month with a ZSA Keyboard.
If you want to check out my configuration, here it is.
Emacs
If you follow my blog, you know this story. I am all-in on Emacs at this stage. I wish I had made this move earlier on in life. But I am making up. Took a deep-dive into it for it to stick.
I will tell you a story.
I had just posted the article Part Five of My Battles with Emacs - Bicycle For Your Mind when I got email from someone I did not know. He recommended the Consult-notes package and gave me a bit of code:
#+begin_src emacs-lisp
(defun lookup-word-at-point ()
"Lookup word at point in OSX Dictionary"
(interactive)
(call-process-shell-command (format "open dict:///%s/" (word-at-point))))
#+end_src
Out of the blue, one of the OG’s of the Emacs world, Mr. Howard Melman sent me email. Encouraging me and giving me advice. How cool is that? I was floored. There are a whole bunch of people who are Emacs-gurus and they help unknown newbies get comfortable with Emacs. I am so thankful to these folks. They make the journey rewarding. Thank you Mr. Melman.
Thank you Mr. Protesilaos Stavrou.
Thank you Mr. David Wilson.
Thank you Mr. Mike Zamansky.
Thank you Ms. Sasha Chua.
Thank you Mr. Rainer Konig.
Thank you all for teaching me stuff.
This list can be a lot longer. In fact, I will make this a recurring part of the Much Ado About Emacs series. There are a lot of people to thank.
Anyway, I am enjoying my time in Emacs. Learning new things, trying out new things. Loving the act of writing. An unexpected by-product? Emacs makes me write more. The environment is created by me (with a lot of help from other folks). There is no friction. It is perfectly designed for me and my writing. I love it here.
The Others
These are the ones which get used everyday.
I have a ton of other software installed but they get sporadic use.
macOS is blessed with a vibrant eco-system of software and I am thankful to the developers. They make my life better.
macosxguru at the gmail thingie.
Thanks: to Photo by Ludvig Hedenborg: https://www.pexels.com/photo/close-up-of-hands-holding-cute-kitten-16191918/
macOS