<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Emacs on . local author .</title>
    <link>https://localauthor.github.io/categories/emacs/</link>
    <description>Recent content in Emacs on . local author .</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 18 Sep 2025 12:17:00 +0300</lastBuildDate><atom:link href="https://localauthor.github.io/categories/emacs/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Simple Document Tagging with &#39;doc-tags.el&#39;</title>
      <link>https://localauthor.github.io/posts/doc-tags/</link>
      <pubDate>Thu, 18 Sep 2025 12:17:00 +0300</pubDate>
      
      <guid>https://localauthor.github.io/posts/doc-tags/</guid>
      <description>&lt;p&gt;&lt;em&gt;When I posted last week about tab-sets.el, I didn’t know that this month’s &lt;a href=&#34;https://www.emacswiki.org/emacs/Carnival#h5o-5&#34; target=&#34;_blank&#34;&gt;Emacs Carnival&lt;/a&gt; topic is &lt;a href=&#34;https://goritskov.com/posts/obscure_packages.html&#34; target=&#34;_blank&#34;&gt;“Obscure Packages.”&lt;/a&gt; Well, it’s hard to be more obscure than an unpublished package that I use for my own idiosyncratic ends. So, here’s another!&lt;/em&gt;&lt;/p&gt;
&lt;style&gt;.org-center { margin-left: auto; margin-right: auto; text-align: center; }&lt;/style&gt;
&lt;div class=&#34;org-center&#34;&gt;
&lt;p&gt;&lt;strong&gt;——————————————————————————————&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Introducing &lt;a href=&#34;https://github.com/localauthor/doc-tags&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;doc-tags.el&lt;/code&gt;&lt;/a&gt;: a simple, low-overhead Emacs package for tagging and retrieving files using a SQLite backend.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;doc-tags&lt;/code&gt; is a straightforward package that lets you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tag any file or directory on your computer, with one or more tags&lt;/li&gt;
&lt;li&gt;Quickly find and open files by tag, using “AND” (all tags) or “OR” (any tag) search&lt;/li&gt;
&lt;li&gt;Update, rename, or remove tags interactively&lt;/li&gt;
&lt;li&gt;Keep your tagged-doc database in a single regular file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You add only what matters to you: notes, readings, drafts, reference folders, syllabi, whatever. Tags are just Emacs strings — no renaming or relocating files, no global search, no magic.&lt;/p&gt;
&lt;h2 id=&#34;nota-bene&#34;&gt;Nota Bene&lt;/h2&gt;
&lt;p&gt;In general, I am skeptical about the long-term use value of tags. I find them flimsy. I much prefer organizing files in directories, and relying on searching to find what I’m looking for.&lt;/p&gt;
&lt;p&gt;With that in mind, &lt;code&gt;doc-tags&lt;/code&gt; is not — &lt;em&gt;and is not meant to be&lt;/em&gt; — a replacement for file management writ large. I use &lt;a href=&#34;https://devontechnologies.com&#34; target=&#34;_blank&#34;&gt;devonthink&lt;/a&gt; for that. It is a huge directory structure of PDFs and lecture notes, organized within the devonthink program in all sort of useful ways, for long-term storage and findability, but otherwise — for all intents and purposes — a jumble of files in a maze of directories.&lt;/p&gt;
&lt;p&gt;The major downside of devonthink, for me, is that its database structure is not accessible from inside Emacs. (Yet?) Sure, I can use a recursive search to plumb the depths of my devonthink database for what I think I need, but that’s a somewhat crude approach.&lt;/p&gt;
&lt;p&gt;So, I wrote &lt;code&gt;doc-tags&lt;/code&gt; as a middle-ground, ad-hoc solution, allowing me to assign tags to files in disparate locations across my file system, wherever they may be, even deep within my devonthink database.&lt;/p&gt;
&lt;p&gt;Because of my deep skepticism of tags, I mostly use &lt;code&gt;doc-tags&lt;/code&gt; when working on fleeting tasks, like preparing for a class or working on short-term writing projects. When the task is finished, I just delete the tags I no longer need and move on without remorse. No need to create a new directory, copy or symlink files. Just quick and dirty tagging, for the moment.&lt;/p&gt;
&lt;h2 id=&#34;how-to-set-it-up&#34;&gt;How to set it up&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;doc-tags.el&lt;/code&gt; isn’t up on M/ELPA, so install directly from GitHub:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;use-package&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;doc-tags&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:ensure&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:vc&lt;/span&gt; (&lt;span style=&#34;color:#a90d91&#34;&gt;:url&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;https://github.com/localauthor/doc-tags&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:custom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#000&#34;&gt;doc-tags-db-file&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;~/.emacs.d/var/doc-tags.sqlite&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#177500&#34;&gt;;; pick your database location&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#000&#34;&gt;doc-tags-connect&lt;/span&gt;) &lt;span style=&#34;color:#177500&#34;&gt;;; opens/creates the database and initializes the schema&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You’ll also need &lt;a href=&#34;https://github.com/ahyatt/triples&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;triples&lt;/code&gt;&lt;/a&gt; (which manages the SQLite database and backups) and &lt;code&gt;sqlite3&lt;/code&gt; available to Emacs.&lt;/p&gt;
&lt;h2 id=&#34;how-does-it-work&#34;&gt;How does it work?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;To add a document: &lt;code&gt;M-x doc-tags-add-doc&lt;/code&gt; (prompts for a file, then for one or more tags)&lt;/li&gt;
&lt;li&gt;To search by tag: &lt;code&gt;M-x doc-tags-find-file&lt;/code&gt; (AND logic by default; use C-u for OR search)&lt;/li&gt;
&lt;li&gt;To add/remove tags: &lt;code&gt;M-x doc-tags-add-tag&lt;/code&gt; / &lt;code&gt;M-x doc-tags-remove-tag&lt;/code&gt;
To edit/rename tags: &lt;code&gt;M-x doc-tags-edit-tag&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;To remove a document: &lt;code&gt;M-x doc-tags-remove-doc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most commands offer smart completion (minibuffer with tag annotations, document previews); if you use &lt;a href=&#34;https://github.com/oantolin/embark&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;embark&lt;/code&gt;&lt;/a&gt;, doc-tags offers a keymap for quick actions on tags and docs.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Managing Emacs Tabs with &#39;tab-sets.el&#39;</title>
      <link>https://localauthor.github.io/posts/tab-sets/</link>
      <pubDate>Sat, 13 Sep 2025 01:54:00 +0300</pubDate>
      
      <guid>https://localauthor.github.io/posts/tab-sets/</guid>
      <description>&lt;style&gt;.org-center { margin-left: auto; margin-right: auto; text-align: center; }&lt;/style&gt;
&lt;div class=&#34;org-center&#34;&gt;
&lt;p&gt;&lt;strong&gt;——————————————————————————————&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;In Emacs, my text editor of choice, &lt;code&gt;tab-bar-mode&lt;/code&gt; lets you replicate something like the experience of using tabs in a web browser. For me, this means opening a lot of tabs with notes, lists, drafts, etc., such that my tab bar becomes a visual buffet of whatever documents are pertinent to the task at hand, be it writing, teaching, coding, whatever.&lt;/p&gt;
&lt;p&gt;This works great for me, on a project by project basis. But what if I want to switch to another task or project? What is to become of the perfectly curated set of tabs I have open?&lt;/p&gt;
&lt;p&gt;The problem of tab proliferation is a &lt;a href=&#34;https://www.hackingyouradhd.com/podcast/digital-declutter-too-many-tabs&#34; target=&#34;_blank&#34;&gt;distinctly&lt;/a&gt; &lt;a href=&#34;https://www.makeuseof.com/browser-tab-management-tips/&#34; target=&#34;_blank&#34;&gt;modern&lt;/a&gt; &lt;a href=&#34;https://www.newyorker.com/cartoons/daily-cartoon/tuesday-february-4th-open-tabs&#34; target=&#34;_blank&#34;&gt;one&lt;/a&gt;. Raise your hand if the top of your web browser looks like a graveyard of articles you’ve been meaning to read since the last time your computer crashed. Many browsers have solved this issue by allowing users to save and restore groups of tabs under meaningful names, like “Research Project” or “Articles I Still Won’t Read.” But who does that? (Ok, I do&amp;hellip;)&lt;/p&gt;
&lt;p&gt;As far as I know,™ Emacs does not offer any built-in way to save and restore a beautifully curated row of tabs. There are &lt;a href=&#34;https://www.youtube.com/watch?v=pqrFAsO0KA4&#34; target=&#34;_blank&#34;&gt;many options&lt;/a&gt; for saving and restoring &lt;a href=&#34;https://github.com/alphapapa/activities.el&#34; target=&#34;_blank&#34;&gt;activities&lt;/a&gt;, &lt;a href=&#34;https://github.com/Bad-ptr/persp-mode.el&#34; target=&#34;_blank&#34;&gt;workspaces&lt;/a&gt;, and &lt;a href=&#34;https://github.com/protesilaos/beframe&#34; target=&#34;_blank&#34;&gt;frame/buffer&lt;/a&gt; configurations. But none that do exactly what I want, namely, allow me to save and later re-open a set of tabs, one file per tab, in a specific order.&lt;/p&gt;
&lt;p&gt;So, I wrote &lt;a href=&#34;https://github.com/localauthor/tab-sets&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;tab-sets.el&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I find &lt;code&gt;tab-sets&lt;/code&gt; most useful for teaching and writing.&lt;/p&gt;
&lt;p&gt;For example: I sometimes teach the same class several times in a week. I therefore often found myself repeating the process of finding and re-opening all the files that I wanted to reference for that class, mostly lecture notes and slides (exported with &lt;a href=&#34;https://github.com/yjwen/org-reveal&#34; target=&#34;_blank&#34;&gt;org-reveal&lt;/a&gt;). Because these files can be spread out across my file system, finding and re-opening them is rarely as simple as navigating to a dedicated directory.&lt;/p&gt;
&lt;p&gt;Now, with tab-sets.el, I can use a single command, &lt;code&gt;tab-sets-save&lt;/code&gt;, to save the current frame’s tabs under a meaningful name, say, “Week 1 Class”, and safely close the frame. When it’s time to teach the same class again, I can call &lt;code&gt;tab-sets-open&lt;/code&gt;, select “Week 1 Class,” and find a brand new frame displaying all the tabs exactly as they were when I saved them.&lt;/p&gt;
&lt;p&gt;The same process works for quickly returning to a writing project.&lt;/p&gt;
&lt;p&gt;A few niceties include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;minibuffer annotations, offering a preview of each tab set&lt;/li&gt;
&lt;li&gt;optional integration with &lt;code&gt;bookmarks.el&lt;/code&gt;, meaning tab sets are accessible as standard bookmarks, through &lt;code&gt;list-bookmarks&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;optional integration with &lt;a href=&#34;https://github.com/oantolin/embark&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;embark&lt;/code&gt;&lt;/a&gt;, meaning you can open, rename, or delete a tab set right from the minibuffer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This package isn’t published anywhere, so install directly, however you want or know how. For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;use-package&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;tab-sets&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:ensure&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:vc&lt;/span&gt; (&lt;span style=&#34;color:#a90d91&#34;&gt;:url&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;https://github.com/localauthor/tab-sets&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:custom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#000&#34;&gt;tab-sets-data-file&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;~/.emacs.d/var/tab-sets.eld&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#000&#34;&gt;tab-sets-setup-embark&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Emacs Popup Frames Anywere — MacOS Edition</title>
      <link>https://localauthor.github.io/posts/popup-frames/</link>
      <pubDate>Sat, 28 Sep 2024 11:15:00 +0300</pubDate>
      
      <guid>https://localauthor.github.io/posts/popup-frames/</guid>
      <description>&lt;p&gt;&lt;em&gt;This post shows how to set up Emacs popup frames in macOS, allowing quick access to Emacs functions from anywhere on your system.&lt;/em&gt;&lt;/p&gt;
&lt;style&gt;.org-center { margin-left: auto; margin-right: auto; text-align: center; }&lt;/style&gt;
&lt;div class=&#34;org-center&#34;&gt;
&lt;p&gt;&lt;strong&gt;——————————————————————————————&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;As much as I would like to live in &lt;a href=&#34;https://www.gnu.org/software/emacs/&#34; target=&#34;_blank&#34;&gt;Emacs&lt;/a&gt; full time, I’m not quite there. But a &lt;a href=&#34;https://protesilaos.com/codelog/2024-09-19-emacs-command-popup-frame-emacsclient/&#34; target=&#34;_blank&#34;&gt;recent post&lt;/a&gt; by &lt;a href=&#34;https://protesilaos.com&#34; target=&#34;_blank&#34;&gt;Protesilaos Stavrou&lt;/a&gt; (aka Prot) is helping me bridge the gap.&lt;/p&gt;
&lt;p&gt;Prot has written a short but powerful bit of code that allows you to access any piece of Emacs goodness — like &lt;code&gt;org-capture&lt;/code&gt; — from outside Emacs with just one keystroke. The only requirement is that you are running in &lt;code&gt;server-mode&lt;/code&gt; or using the Emacs daemon.&lt;/p&gt;
&lt;p&gt;Whether you’re in a web browser, a PDF reader, or just staring at an empty desktop, your favorite Emacs command can be right at your fingertips. See &lt;a href=&#34;https://www.youtube.com/watch?v=vbWxT8tht9A&#34; target=&#34;_blank&#34;&gt;Prot’s video&lt;/a&gt; for a thorough demonstration.&lt;/p&gt;
&lt;p&gt;Now, I can quickly open a PDF using citar or copy a password from my pass-store. See below for some other useful popups — org-agenda view, mu4e inbox, and a quick translation interface.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://localauthor.github.io/images/popup-frame-citar-demo.gif&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;setting-up-emacs-popup-frames-in-macos&#34;&gt;Setting Up Emacs Popup Frames in MacOS&lt;/h2&gt;
&lt;p&gt;Since Prot wrote the code for use in Linux, it didn’t immediately work in MacOS. It turns out, the only necessary change was to add a &lt;code&gt;window-system&lt;/code&gt; frame parameter to the popup frame. (See code below).&lt;/p&gt;
&lt;p&gt;But while I was at it, I made a few additions: 1) a &lt;code&gt;title&lt;/code&gt; frame parameter, which allows me to configure the popup frame size and placement through my tiling window manager, &lt;a href=&#34;https://github.com/koekeishiya/yabai&#34; target=&#34;_blank&#34;&gt;yabai&lt;/a&gt;; and 2) an optional argument that runs &lt;code&gt;delete-frame&lt;/code&gt; after the main command runs. This makes it possible to call commands that are minibuffer-centric — in my case, that’s &lt;code&gt;citar-open-file&lt;/code&gt; and &lt;code&gt;password-store-copy&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here’s the main code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;popup-frame-delete&lt;/span&gt; (&lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;rest&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Kill selected frame if it has parameter &lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;`popup-frame&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a90d91&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;frame-parameter&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;popup-frame&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#000&#34;&gt;delete-frame&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defmacro&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;popup-frame-define&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;command&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;title&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;optional&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;delete-frame&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Define interactive function to call COMMAND in frame with TITLE.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;`&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;,&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;intern&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;popup-frame-%s&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;command&lt;/span&gt;)) ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#a90d91&#34;&gt;interactive&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#a90d91&#34;&gt;let*&lt;/span&gt; ((&lt;span style=&#34;color:#000&#34;&gt;display-buffer-alist&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    (&lt;span style=&#34;color:#000&#34;&gt;display-buffer-full-frame&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       (&lt;span style=&#34;color:#000&#34;&gt;frame&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;make-frame&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#000&#34;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;title&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;title&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 (&lt;span style=&#34;color:#000&#34;&gt;window-system&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ns&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 (&lt;span style=&#34;color:#000&#34;&gt;popup-frame&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;t&lt;/span&gt;)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#000&#34;&gt;select-frame&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;frame&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#000&#34;&gt;switch-to-buffer&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34; popup-frame-hidden-buffer&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#a90d91&#34;&gt;condition-case&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a90d91&#34;&gt;progn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#000&#34;&gt;call-interactively&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;,command&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#000&#34;&gt;delete-other-windows&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       (&lt;span style=&#34;color:#000&#34;&gt;error&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;delete-frame&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;frame&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#a90d91&#34;&gt;when&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;delete-frame&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       (&lt;span style=&#34;color:#000&#34;&gt;sit-for&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0.2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       (&lt;span style=&#34;color:#000&#34;&gt;delete-frame&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;frame&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;use-package&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:defer&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a90d91&#34;&gt;unless&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;server-running-p&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#000&#34;&gt;server-start&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And here are the macro calls that define commands:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;popup-frame-define&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;org-capture&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;capture-popup&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;add-hook&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;org-capture-after-finalize-hook&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;#&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;popup-frame-delete&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;popup-frame-define&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;password-store-copy&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;minimal-popup&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;delete-frame&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;popup-frame-define&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;citar-open-files&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;minimal-popup&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;delete-frame&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;triggering-popups-with-keyboard-shortcuts&#34;&gt;Triggering Popups with Keyboard Shortcuts&lt;/h2&gt;
&lt;p&gt;To quickly bring up these popup frames with keyboard shortcuts, I use &lt;a href=&#34;https://github.com/koekeishiya/skhd&#34; target=&#34;_blank&#34;&gt;skhd&lt;/a&gt;, a hotkey daemon for macOS. The following configuration goes in the skhd config file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmd + ctrl - c : emacsclient -e &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;(popup-frame-org-capture)&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;||&lt;/span&gt; yabai -m window –focus recent
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmd + ctrl - o : emacsclient -e &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;(popup-frame-citar-open-files)&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;||&lt;/span&gt; yabai -m window –focus recent
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmd + ctrl - p : emacsclient -e &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;(popup-frame-password-store-copy)&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;||&lt;/span&gt; yabai -m window –focus recent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;managing-windows-with-yabai&#34;&gt;Managing Windows with yabai&lt;/h2&gt;
&lt;p&gt;Finally, I have configured my tiling window manager, &lt;a href=&#34;https://github.com/koekeishiya/yabai&#34; target=&#34;_blank&#34;&gt;yabai&lt;/a&gt;, to give the popup frames the desired size and placement.&lt;/p&gt;
&lt;p&gt;First, the following goes in the yabai config file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yabai -m signal –add &lt;span style=&#34;color:#000&#34;&gt;event&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;window_created &lt;span style=&#34;color:#000&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Emacs&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;~/.yabai-emacs-window-handler.sh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will run a bash script (located at ~/.yabai-emacs-window-handler.sh) every time a new Emacs frame is created. The script tells yabai how to move and resize the new frame, depending on the frame’s title. Here is that script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;$(&lt;/span&gt;yabai -m query –windows –window &lt;span style=&#34;color:#000&#34;&gt;$YABAI_WINDOW_ID&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;$data&lt;/span&gt; | jq .title&lt;span style=&#34;color:#a90d91&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;display&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;$data&lt;/span&gt; | jq .display&lt;span style=&#34;color:#a90d91&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;[[&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;$title&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;~ &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;capture-popup&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;$display&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#a90d91&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yabai -m window &lt;span style=&#34;color:#000&#34;&gt;$YABAI_WINDOW_ID&lt;/span&gt; –toggle float –move abs:430:230
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yabai -m window &lt;span style=&#34;color:#000&#34;&gt;$YABAI_WINDOW_ID&lt;/span&gt; –resize abs:655:300
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yabai -m window &lt;span style=&#34;color:#000&#34;&gt;$YABAI_WINDOW_ID&lt;/span&gt; –focus
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;elif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;[[&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;$title&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;~ &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;minimal-popup&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;$display&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#a90d91&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yabai -m window &lt;span style=&#34;color:#000&#34;&gt;$YABAI_WINDOW_ID&lt;/span&gt; –toggle float –move abs:430:230
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yabai -m window &lt;span style=&#34;color:#000&#34;&gt;$YABAI_WINDOW_ID&lt;/span&gt; –resize abs:655:200
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yabai -m window &lt;span style=&#34;color:#000&#34;&gt;$YABAI_WINDOW_ID&lt;/span&gt; –focus
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;additional-custom-commands&#34;&gt;Additional Custom Commands&lt;/h2&gt;
&lt;p&gt;In some cases, an Emacs command will work nicely in a popup frame right out of the box. A good case in point is &lt;code&gt;org-capture&lt;/code&gt;. In other cases, I have needed to write my own custom commands. Here a few:&lt;/p&gt;
&lt;h3 id=&#34;google-translate-interface&#34;&gt;Google Translate Interface&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;my/translate&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a90d91&#34;&gt;interactive&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#000&#34;&gt;choice&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#000&#34;&gt;completing-read&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Select: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;EN-&amp;gt;LT&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;LT-&amp;gt;EN&amp;#34;&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a90d91&#34;&gt;cond&lt;/span&gt; ((&lt;span style=&#34;color:#000&#34;&gt;string=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;choice&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;EN-&amp;gt;LT&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#000&#34;&gt;google-translate-query-translate-reverse&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          ((&lt;span style=&#34;color:#000&#34;&gt;string=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;choice&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;LT-&amp;gt;EN&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#000&#34;&gt;google-translate-query-translate&lt;/span&gt;)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;popup-frame-define&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;my/translate&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;minimal-popup&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src=&#34;https://localauthor.github.io/images/popup-frame-translate-demo.gif&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;unread-emails-in-mu4e&#34;&gt;Unread Emails in mu4e&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;my/mu4e-unread&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a90d91&#34;&gt;interactive&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#000&#34;&gt;mu4e&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;background&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#000&#34;&gt;mu4e-search-bookmark&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#000&#34;&gt;mu4e-get-bookmark-query&lt;/span&gt; &lt;span style=&#34;color:#2300ce&#34;&gt;?u&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;popup-frame-define&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;my/org-agenda&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;large-popup&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For this, I add another “elif” to the bash script, to ensure I can see the whole inbox in the popup:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;elif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;[[&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;$title&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;~ &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;large-popup&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;$display&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#a90d91&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yabai -m window &lt;span style=&#34;color:#000&#34;&gt;$YABAI_WINDOW_ID&lt;/span&gt; –toggle float –move abs:350:130
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yabai -m window &lt;span style=&#34;color:#000&#34;&gt;$YABAI_WINDOW_ID&lt;/span&gt; –resize abs:730:600
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yabai -m window &lt;span style=&#34;color:#000&#34;&gt;$YABAI_WINDOW_ID&lt;/span&gt; –focus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;custom-org-agenda-view&#34;&gt;Custom Org-Agenda View&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;my/org-agenda&lt;/span&gt; (&lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;optional&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a90d91&#34;&gt;interactive&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;P&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#000&#34;&gt;org-agenda&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;d&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#000&#34;&gt;org-agenda-redo-all&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;popup-frame-define&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;my/org-agenda&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;large-popup&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Just don’t forget to add a system-wide keyboard shortcut for each new command!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Emacs: Quickly find and insert links in zk notes, with Embark</title>
      <link>https://localauthor.github.io/posts/zk-links/</link>
      <pubDate>Thu, 21 Jul 2022 14:12:00 +0300</pubDate>
      
      <guid>https://localauthor.github.io/posts/zk-links/</guid>
      <description>&lt;p&gt;&lt;em&gt;This post continues a series of video demos in which I show how I use the Emacs package &lt;a href=&#34;https://github.com/localauthor/zk&#34; target=&#34;_blank&#34;&gt;zk&lt;/a&gt; for notetaking. The emphasis is on showcasing the practicalities of my process.&lt;/em&gt;&lt;/p&gt;
&lt;style&gt;.org-center { margin-left: auto; margin-right: auto; text-align: center; }&lt;/style&gt;
&lt;div class=&#34;org-center&#34;&gt;
&lt;p&gt;&lt;strong&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/VIPxC8TMR6s&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;In &lt;a href=&#34;https://www.youtube.com/watch?v=VIPxC8TMR6s&#34; target=&#34;_blank&#34;&gt;this video&lt;/a&gt;, I show how I quickly find notes related to the note I am working on in &lt;a href=&#34;https://github.com/localauthor/zk&#34; target=&#34;_blank&#34;&gt;zk&lt;/a&gt;, and then insert the relevant links.&lt;/p&gt;
&lt;p&gt;The goal is to find and insert links with a minimum of mental overhead and technical friction, so that I can keep my focus on the ideas and content of the note at hand.&lt;/p&gt;
&lt;p&gt;Trying to find a single note among hundreds, and then putting the link in the right spot, could be a task unto itself &amp;mdash; a not inconsiderable problem and distraction. But a few handy search functions, and some help from the package &lt;a href=&#34;https://github.com/oantolin/embark&#34; target=&#34;_blank&#34;&gt;Embark&lt;/a&gt;, make the matter all but effortless.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Emacs: Getting started with zk, using hydra and an inbox note</title>
      <link>https://localauthor.github.io/posts/zk-hydra/</link>
      <pubDate>Tue, 19 Jul 2022 00:31:00 -0400</pubDate>
      
      <guid>https://localauthor.github.io/posts/zk-hydra/</guid>
      <description>&lt;p&gt;&lt;em&gt;This post inaugurates a series of video demos in which I will show how I use the Emacs package &lt;a href=&#34;https://github.com/localauthor/zk&#34; target=&#34;_blank&#34;&gt;zk&lt;/a&gt; for notetaking. The emphasis will be on showcasing the practicalities of my process.&lt;/em&gt;&lt;/p&gt;
&lt;style&gt;.org-center { margin-left: auto; margin-right: auto; text-align: center; }&lt;/style&gt;
&lt;div class=&#34;org-center&#34;&gt;
  &lt;div&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;style&gt;.org-center { margin-left: auto; margin-right: auto; text-align: center; }&lt;/style&gt;
&lt;div class=&#34;org-center&#34;&gt;
  &lt;div&gt;&lt;/div&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/oEgdJlojlU8&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;In this video I show how I use a &lt;a href=&#34;https://github.com/abo-abo/hydra&#34; target=&#34;_blank&#34;&gt;hydra&lt;/a&gt; as an entry point to my zk. The config for my hydra is here, &lt;a href=&#34;https://github.com/localauthor/.emacs.d/blob/210531740c05104b7718b257671f2674f605f374/my-lisp/zk-setup.el#L154&#34; target=&#34;_blank&#34;&gt;in my dotfiles&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also show how I use an &amp;ldquo;inbox&amp;rdquo; note as a starting place for new notes. For more on the place of the inbox in a notetaking practice, see section 2.1 of &lt;em&gt;How to Take Smart Notes&lt;/em&gt; by Sönke Ahrens.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;In the next video, I will show how I use the function &lt;code&gt;zk-find-file&lt;/code&gt; and others in combination with &lt;a href=&#34;https://github.com/oantolin/embark&#34; target=&#34;_blank&#34;&gt;Embark&lt;/a&gt; to quickly find notes and insert links &amp;mdash; with a minimum of effort!&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Sönke Ahrens, &lt;i&gt;How to Take Smart Notes: One Simple Technique to Boost Writing, Learning and Thinking&lt;/i&gt; (North Charleston, SC: CreateSpace, 2017).&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Emacs: With ace-window and link-hint, open links exactly where you want them</title>
      <link>https://localauthor.github.io/posts/aw-select/</link>
      <pubDate>Thu, 14 Apr 2022 12:28:00 +0300</pubDate>
      
      <guid>https://localauthor.github.io/posts/aw-select/</guid>
      <description>&lt;p&gt;&lt;em&gt;This post describes how the Emacs package &lt;a href=&#34;http://github.com/noctuid/link-hint.el&#34; target=&#34;_blank&#34;&gt;link-hint&lt;/a&gt; can be combined with
&lt;a href=&#34;https://github.com/abo-abo/ace-window&#34; target=&#34;_blank&#34;&gt;ace-window&lt;/a&gt; to allow you to select, on-the-fly, which window a link will open in—instead of letting fate, or custom, or Emacs decide for you.&lt;/em&gt;&lt;/p&gt;
&lt;style&gt;.org-center { margin-left: auto; margin-right: auto; text-align: center; }&lt;/style&gt;
&lt;div class=&#34;org-center&#34;&gt;
&lt;p&gt;&lt;strong&gt;——————————————————————————————&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&#34;ace-window-is--more-than--a-fancy-window-switcher&#34;&gt;Ace-window is (more than) a fancy window-switcher&lt;/h2&gt;
&lt;p&gt;The ace-window package, written by &lt;a href=&#34;https://github.com/abo-abo&#34; target=&#34;_blank&#34;&gt;abo-abo&lt;/a&gt;, offers a handy, full-featured
alternative to the built-in window-switching function &lt;code&gt;other-window&lt;/code&gt;. The
package&amp;rsquo;s primary function—the titular =ace-window=—overlays a different
character (letter or number) over each visible Emacs window, so you can
switch to the desired window by simply pressing its assigned character. Very
useful, very sleek.&lt;/p&gt;
&lt;p&gt;But ace-window is more than just a handy way to switch windows.&lt;/p&gt;
&lt;p&gt;The package also offers the ability to perform an action in the selected
window before switching to it. In this regard, it follows the design of its
parent package &lt;a href=&#34;https://github.com/abo-abo/avy&#34; target=&#34;_blank&#34;&gt;avy&lt;/a&gt;—also by abo-abo. Instead of simply switching to a
window, you can &lt;a href=&#34;https://github.com/abo-abo/ace-window#aw-dispatch-alist&#34; target=&#34;_blank&#34;&gt;split it first, call switch-to-buffer in it, or even close
it&lt;/a&gt;. For a demonstration of this aspect of ace-window, see &lt;a href=&#34;https://www.youtube.com/watch?v=I3BvGZ3m8Oo&#34; target=&#34;_blank&#34;&gt;this video
from Protesilaos Stavrou&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;The greatness of ace-window truly comes through, however, when it is combined
with other packages.&lt;/p&gt;
&lt;h2 id=&#34;with-ace-window-and-embark-open-files-buffers-in-specified-windows&#34;&gt;With ace-window and Embark, open files/buffers in specified windows&lt;/h2&gt;
&lt;p&gt;In his &lt;a href=&#34;https://karthinks.com/software/fifteen-ways-to-use-embark/&#34; target=&#34;_blank&#34;&gt;detailed write-up on using Embark&lt;/a&gt;, Karthik Chikmagalur showcases a
killer mash-up of ace-window and Embark, demonstrating how ace-window can be
used for more than just switching windows.&lt;/p&gt;
&lt;p&gt;Briefly put, Karthik shows how to incorporate ace-window&amp;rsquo;s window-selection
function into the opening of a file or buffer from the minibuffer so that, as
he writes, &amp;ldquo;any buffer/file/bookmark I open is always placed exactly where I
want it to be on the screen.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;An example usage would be:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;call &lt;code&gt;find-file&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;call &lt;code&gt;embark-act&lt;/code&gt; on file you wish to open&lt;/li&gt;
&lt;li&gt;call &lt;code&gt;my/embark-ace-action-find-file&lt;/code&gt; (this is the slightly unwieldy name
Karthik gives to the embark/ace-window function)&lt;/li&gt;
&lt;li&gt;select desired window with &lt;code&gt;ace-window&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;with-ace-window-and-link-hint-follow-links-in-specified-windows&#34;&gt;With ace-window and link-hint, follow links in specified windows&lt;/h2&gt;
&lt;p&gt;Inspired by what Karthik showed was possible, I wanted to incorporate
ace-window with link-hint, so that I could choose which window a link
would open in. The result is a function called &lt;code&gt;link-hint-aw-select&lt;/code&gt;:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://localauthor.github.io/images/aw-select-demo.gif&#34;
    alt=&#34;Figure 1: Using &amp;rsquo;link-hint-aw-select&amp;rsquo; to open each of the links in the top left window in a different window. First, the desired link is chosen via character overlay, courtsey of link-hint, then the desired window is chosen via character overlay, courtsey of ace-window.&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 1: &lt;/span&gt;Using &amp;rsquo;link-hint-aw-select&amp;rsquo; to open each of the links in the top left window in a different window. First, the desired link is chosen via character overlay, courtsey of link-hint, then the desired window is chosen via character overlay, courtsey of ace-window.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;If you&amp;rsquo;re unfamiliar, link-hint is a package that is conceptually similar to
ace-window: it puts a character overlay on visible links in a buffer so that
you can choose a link to follow by typing its assigned character. (The
conceptual similarity of link-hint and ace-window is not surprising, since
both are based on avy.)&lt;/p&gt;
&lt;p&gt;Link-hint can identify a lot of different type of links, such as urls, file
paths, mailto links, org-links, buttons, and dired filenames. New link
types can also be defined by the user. (More on that later.)&lt;/p&gt;
&lt;p&gt;As with avy and ace-window, link-hint allows for different actions to
performed on the chosen link. However, there are only two default actions for acting on links: open link and copy link.&lt;/p&gt;
&lt;p&gt;Defining a new action is done by defining a new function, in this case the
above-mentioned &lt;code&gt;link-hint-aw-select&lt;/code&gt;, which will be entry-point command for all link types:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;link-hint-aw-select&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Use avy to open a link in a window selected with ace-window.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a90d91&#34;&gt;interactive&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a90d91&#34;&gt;unless&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#000&#34;&gt;avy-with&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;link-hint-aw-select&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#000&#34;&gt;link-hint&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;one&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;:aw-select&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#000&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;No visible links&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Things get more complicated very quickly, however.&lt;/p&gt;
&lt;p&gt;Each action must be tailored to each different link type. Take the case of
the &amp;ldquo;open&amp;rdquo; action, for examples: urls open one way—in a browser—and
filepaths open another way—in a relevant application—and email addresses
open another way—in a new draft email. Each action is actually many
different actions, all roughly similar.&lt;/p&gt;
&lt;p&gt;When creating a new action, then, it is necessary to make sure that each link
type is associated with a function that will perform the new action in the
appropriate way.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;aw-select&lt;/code&gt; action for file links is quite simple:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;link-hint&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;aw-select-file-link&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;link&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a90d91&#34;&gt;with-demoted-errors&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;%s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#000&#34;&gt;aw-switch-to-window&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;aw-select&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nil&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#000&#34;&gt;find-file&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;link&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To make the link-hint ecosystem aware of this new association of link-type,
action, and function, there is a handy macro:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;link-hint-define-type&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;file-link&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:aw-select&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;#&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;link-hint&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;aw-select-file-link&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If different link-types behave similarly, it is possible to create a macro
of our own that will do all of the above very efficiently. This is the case with buttons and dired-filenames, for example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defmacro&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;define-link-hint-aw-select&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;link-type&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;fn&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;`&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;progn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#000&#34;&gt;link-hint-define-type&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;,link-type&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#a90d91&#34;&gt;:aw-select&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;#&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;,&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;intern&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;concat&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;link-hint–aw-select-&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                     (&lt;span style=&#34;color:#000&#34;&gt;symbol-name&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;link-type&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#a90d91&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;,&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;intern&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;concat&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;link-hint–aw-select-&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                             (&lt;span style=&#34;color:#000&#34;&gt;symbol-name&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;link-type&lt;/span&gt;))) (&lt;span style=&#34;color:#000&#34;&gt;_link&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       (&lt;span style=&#34;color:#a90d91&#34;&gt;with-demoted-errors&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;%s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;length&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;aw-window-list&lt;/span&gt;)) &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             (&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#000&#34;&gt;window&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;aw-select&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nil&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (&lt;span style=&#34;color:#000&#34;&gt;buffer&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;current-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (&lt;span style=&#34;color:#000&#34;&gt;new-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#000&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;fn&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#a90d91&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;new-buffer&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;current-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#000&#34;&gt;switch-to-buffer&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;buffer&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#000&#34;&gt;aw-switch-to-window&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;window&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#000&#34;&gt;switch-to-buffer&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;new-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#000&#34;&gt;link-hint-open-link-at-point&lt;/span&gt;))))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;define-link-hint-aw-select&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;button&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;push-button&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;define-link-hint-aw-select&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;dired-filename&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;dired-find-file&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The same is &lt;em&gt;almost&lt;/em&gt; the case with org-links as well, except that by default
org-links are opened using &lt;code&gt;find-file-other-window&lt;/code&gt; instead of &lt;code&gt;find-file&lt;/code&gt;,
meaning that the above macro wouldn&amp;rsquo;t work properly.&lt;/p&gt;
&lt;p&gt;I prefer to change this setting globally, so that org-links are opened in the
current window, by evaluating the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;setf&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;cdr&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;assoc&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;file&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;org-link-frame-setup&lt;/span&gt;)) &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;find-file&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This allows me to use the macro:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;define-link-hint-aw-select&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;org-link&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;org-open-at-point&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To leave org&amp;rsquo;s default behavior in place globally, it is necessary to define
a function specifically for org-links, in which the behavior is changed
locally in a let-binding:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;link-hint&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;aw-select-org-link&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;_link&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#000&#34;&gt;org-link-frame-setup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#000&#34;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;file&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;find-file&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a90d91&#34;&gt;with-demoted-errors&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;%s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;length&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;aw-window-list&lt;/span&gt;)) &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#000&#34;&gt;window&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;aw-select&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nil&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#000&#34;&gt;buffer&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;current-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#000&#34;&gt;new-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#000&#34;&gt;org-open-at-point&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#a90d91&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;new-buffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  (&lt;span style=&#34;color:#000&#34;&gt;current-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#000&#34;&gt;switch-to-buffer&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;buffer&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#000&#34;&gt;aw-switch-to-window&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;window&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#000&#34;&gt;switch-to-buffer&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;new-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#000&#34;&gt;link-hint-open-link-at-point&lt;/span&gt;)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;link-hint-define-type&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;org-link&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;:aw-select&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;#&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;link-hint&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;aw-select-org-link&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Things are actually even a bit more complicated than this with org-links.&lt;/p&gt;
&lt;p&gt;Since org handles different link-types internally, the function
&lt;code&gt;link-hint–aw-select-org-link&lt;/code&gt; can also be made to handle certain org
link-types differently. For example, if you want http/https links to be
opened externally, there is no reason to call the &lt;code&gt;aw-select&lt;/code&gt; behavior for
that type of org-link. This could be accomplished by including something like
the following in the function&amp;rsquo;s &amp;ldquo;if&amp;rdquo; conditional:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;not&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;member&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;org-element-property&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;:type&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;org-element-context&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#000&#34;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;http&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;https&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The whole function would be:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;link-hint&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;aw-select-org-link&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;_link&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#000&#34;&gt;org-link-frame-setup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#000&#34;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;file&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;find-file&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a90d91&#34;&gt;with-demoted-errors&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;%s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a90d91&#34;&gt;and&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;length&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;aw-window-list&lt;/span&gt;)) &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#000&#34;&gt;not&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;member&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;org-element-property&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                             &lt;span style=&#34;color:#a90d91&#34;&gt;:type&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;org-element-context&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       &lt;span style=&#34;color:#000&#34;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;http&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;https&amp;#34;&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#000&#34;&gt;window&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;aw-select&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nil&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#000&#34;&gt;buffer&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;current-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#000&#34;&gt;new-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#000&#34;&gt;org-open-at-point&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#a90d91&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;new-buffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  (&lt;span style=&#34;color:#000&#34;&gt;current-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#000&#34;&gt;switch-to-buffer&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;buffer&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#000&#34;&gt;aw-switch-to-window&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;window&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#000&#34;&gt;switch-to-buffer&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;new-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#000&#34;&gt;link-hint-open-link-at-point&lt;/span&gt;)))))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;example-use-case-note-taking-zettelkasten-etc-dot&#34;&gt;Example use-case: note-taking, zettelkasten, etc.&lt;/h2&gt;
&lt;p&gt;I find this functionality really useful in my note-taking environment, where
each of my notes contains several links to other notes. I rarely want to
follow a link in the same window as the note where the link appears. I
typically want to leave that note where it is and open a link somewhere else.
If I have several windows arrayed around my screen, I can use
&lt;code&gt;link-hint-aw-select&lt;/code&gt; to open the linked note exactly where I want it to be.&lt;/p&gt;
&lt;p&gt;To use this with org, the above configuration is enough. If you use another note-taking environment, you may need to define a new link type.&lt;/p&gt;
&lt;p&gt;For example, for use with my own Zettelkasten package &lt;a href=&#34;https://github.com/localauthor/zk&#34; target=&#34;_blank&#34;&gt;zk&lt;/a&gt;, I define a new link
type &lt;code&gt;zk-link&lt;/code&gt; and a function &lt;code&gt;zk-link-hint-aw-select&lt;/code&gt;, along with other
functions necessary to fully incorporate a new link type into the link-hint
system:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;zk-link-hint&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;zk-link-at-point-p&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Return the ID for the zk-link at the point or nil.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a90d91&#34;&gt;and&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;zk&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;id-at-point&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       (&lt;span style=&#34;color:#000&#34;&gt;thing-at-point-looking-at&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;zk-link-regexp&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;zk-link-hint&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;next-zk-link&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;bound&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Find the unext zk-link.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;Only search the range between just after the point and BOUND.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#000&#34;&gt;link-hint&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;next-regexp&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;zk-id-regexp&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;bound&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;link-hint&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;aw-select-zk-link&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a90d91&#34;&gt;with-demoted-errors&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;%s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;length&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;aw-window-list&lt;/span&gt;)) &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#000&#34;&gt;window&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;aw-select&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nil&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#000&#34;&gt;buffer&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;current-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#000&#34;&gt;new-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#000&#34;&gt;zk-follow-link-at-point&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a90d91&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;new-buffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#000&#34;&gt;current-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#000&#34;&gt;switch-to-buffer&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;buffer&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#000&#34;&gt;aw-switch-to-window&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;window&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#000&#34;&gt;switch-to-buffer&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;new-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#000&#34;&gt;link-hint-open-link-at-point&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#000&#34;&gt;link-hint-define-type&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;zk-link&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:next&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;#&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;zk-link-hint&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;next-zk-link&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:at-point-p&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;#&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;zk-link-hint&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;zk-link-at-point-p&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:open&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;#&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;zk-follow-link-at-point&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:copy&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;#&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;kill-new&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a90d91&#34;&gt;:aw-select&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;#&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;link-hint&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;aw-select-zk-link&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;push&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;link-hint-zk-link&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;link-hint-types&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Even though link-hint can be a bit complex under the hood, it is quite
effortless, even elegant, when put in combination with ace-window. Give
it a try and puzzle over what you had done so long without it.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
