June 11, 2025

this is not a good ideathis is not a good idea

Abandoned Software and Lock In

An user called Skywatcher, in the OutlinerSoftware Forum posted the following question: Outliner Software About the survival of our Data ( when Apps die ).

He was a heavy user of iThoughts and was surprised by development on the product being terminated and the product being abandoned.

Let me try to address the question that is underlying his post: “…what might happen to the massive amount of data I have in various applications, especially Curio, Tinderbox, Devonthink and Obsidian.”

DEVONthink is safe. All of the data it collects is still available in its raw form. You will need to get into the package contents of the file it keeps all the data in, but it is there. All the documents, in their original form, are available to you if want to get to them.

Obsidian is almost future-proof. At the base of it are Markdown based text files. Obsidian also has Canvas files, which are text files but not Markdown. They are readable in any text editor but would require a significant amount of clean-up to be useful in some other application. But the documents in your files should be Markdown based text files which are lock-in proof. Incidentally, one of the main reasons I moved away from Obsidian is the Canvas introduction. That was a bridge too far away from Markdown for me. It is still a good Markdown based editor and it does wonderful things with Markdown but I didn’t want to introduce non-portable files to the mix.

I am not so sure about Curio. From my recall, Curio does some unique things and there is significant lock-in. It is a great program but I moved away from it only because it did things which were particular to it and I was not going to adopt that into my digital life. It does have a comprehensive export system. So you might be able to get your data out of it in a format useful to you. But it will not be as friction-less as you would like.

Tinderbox is a program which is unique in the marketplace. I am sure you can export some or all of the data out of it. However you can’t replicate the functionality of Tinderbox in any other program. It is the work of one major developer and I don’t know how sustainable it would be if Mark Bernstein, the developer, for some reason, decided to stop work on it.

iThoughts. I was sad to see its demise. I owned the application but I didn’t use it much. I think in lists and not in visual maps. So, mind-maps are not my thing. I use Scapple for that. It is a proprietary format but it has sufficient export functions. It is also not a particularly comprehensive mind-mapping program, so its ability to lock you in to it is minimal at best.

I would recommend Mermaid. You can use Mermaid documents in most text editors. BBEdit is a notable exception. VSCode, Zed, Vim, NeoVim, and Emacs all support Mermaid. It is a different language to learn and the experience of using it is different from a dedicated mind-mapping program. But it is widely supported and you are not dependent on the whims of a single developer.

The Broader Question

How do you avoid lock-in? How do you avoid depending on the large corporations? How do you avoid depending on the small individual developers who probably do the best work?

I ran into this problem with the launch of Microsoft Word 6.0. At launch it had a bug. If it found a funky font (or what it considered, a funky font), the program would get into a loop and not start for a long time (more than an hour, sometimes)1. I was in the middle of work and had a whole host of documents I suddenly had no access to. I had to reinstall the previous version and that got me thinking. Wanted to be independent of the reliance on one product to produce my work. That led me to text files and BBEdit. The writing got done in BBEdit and I used a plethora of other programs to make the work look pretty. I think PageMaker and in a little while, InDesign, became the programs in charge of that. The writing? That got done in BBEdit.

A little after that, I discovered Markdown and the fantastic plug-in for it written by Brett Terpstra for TextMate. I moved on to TextMate. Then it was Sublime Text. The cornerstone was Markdown based text files. There are countless editors which can deal with Markdown and text files. I was finally rid of the scourge of Microsoft Word.

The moral of this recounting of my history? Concentrate on the base format. Choose a format that is universal. In my case it is text files. Obsidian implements a kanban board. It is useful and beautiful. But at the core of it is text files. I love that. Obsidian can close down tomorrow and my files are still readable and available to me. They will not look as pretty, or be as useful for task management, but they are accessible and mine. The data in it is not dependent on Obsidian.

Another Example

I love outlines. I live in outlines. For the longest time I used OmniOutliner. Got scared when I noticed that the developer seemed to have lost interest in the product. It wasn’t getting as much attention from them. Scared the hell out of me. I moved on to TaskPaper.

I seem to try every outliner launched in the marketplace. It is one of my favorite categories of software. Now I use org-mode in Emacs. Org-mode is heavily reliant on Emacs for its goodness, but it is a text file. If I can’t run Emacs I can convert the org files to any format I want, thanks to Pandoc. I will lose functionality but the text files will contain everything that I wrote in it.

If you want to reduce your reliance on developers, big and small, you have to move your work on to formats which are not tied to them. You have to get rid of lock-in.

I am not saying that this is the easiest thing to do. Hell, it took me almost a year to get moderately comfortable in Emacs, which is a requisite for org-mode. But I am not worried. Emacs will outlive me. Even if it doesn’t, I will move back to Markdown and things will be fine. I will not have lost work. It is a text file.

Hole In My Argument

All the categories of software do not have an easy answer like the “use plain text” solution. For instance, I have no idea what to do about Excel. This is not a category which is relevant to my life. So, I am not the most versed in the nuances of Excel and its competitors. But if it was an important category to me, I would explore The 11 Best Free Microsoft Excel Alternative Programs in 2025.

There are large categories of specialized applications which are not easily avoided or replaced. Statistical software is a category which comes to mind. Although R The R Project for Statistical Computing is a good alternative. This might be true for a lot of categories of software. There is no easy solution to this problem.

Size of the Developer

I don’t think the answer is “stick to products from the large companies.” I don’t trust them. They are ultimately beholden to the shareholders and Wall Street. They don’t care about the users. We have enough data-points to make that axiomatic. Can’t rely on small developers. They do great work, but they are not reliable. Too many of them abandon their products, or sell them to other developers who have trouble continuing the development of the products they2 bought.

Use any product you like, make sure that you have a bailout plan. Make sure that the data is portable. It might not be as useful in some other program, but you will still have the contents of the files. Of course, in some cases, the process will entail rebuilding the functionality and features in some other program, and that is a huge pain. However, you are not going to lose all your work.

For me, with my focus on writing, the solution is “focus on the format.” Text formats are my focus. I don’t veer from that. That is my cure for the pitfalls of depending on a developer, big or small.

Conclusion

I don’t have an easy and simple solution to the problem that Skywatcher raises. I think text format is an answer that I have come up with for my own work. Universal formats might be the best solution for other categories. If you have a better solution, I am willing to listen.

macosxguru at the gmail thingie.

Notes: Thanks to Photo By: Kaboompics.com: https://www.pexels.com/photo/a-woman-hammering-a-screw-6920086/


  1. This was at the time Microsoft was telling us that they were committed to the macOS platform and they showed said commitment by investing millions of dollars on a quality control operation for macOS products.↩︎

  2. I am looking at you VoodooPad.↩︎

macOS software
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