
<feed xmlns="http://www.w3.org/2005/Atom">
    <generator>Hugo -- gohugo.io</generator>
    <title>
                orgroam on
            
        
        The Neo-Babbage Files</title>
        <link href="https://babbagefiles.xyz/tags/orgroam/atom.xml" rel="self" type="application/atom+xml" /><link href="https://babbagefiles.xyz/tags/orgroam/"/>
    <updated>2025-12-29T11:00:32+00:00</updated>
    <author>
            <name>Benjamin Slade</name>
            
                <email>slade@lambda-y.net</email>
            </author>
    <id>https://babbagefiles.xyz/tags/orgroam/</id>
        
        <entry>
            <title type="html"><![CDATA[Using Emacs and Org-Roam/Org-Node on Android (with Termux Extra Keys)]]></title>
            <link href="https://babbagefiles.xyz/termux-extra-keys-emacs-org-roam-node-android/"/>
            <id>https://babbagefiles.xyz/termux-extra-keys-emacs-org-roam-node-android/</id>
            
                    <author>
                        <name>Benjamin Slade</name>
                    </author>
            <published>2025-01-30T14:15:00-06:00</published>
            <updated>2025-02-03T11:42:23-06:00</updated>
            
            
            <content type="html"><![CDATA[<p>My main use of Emacs on Android (via Termux) is to be able to access
and add to my Org-roam library of notes. This post is primarily about
some Termux features which improve the user experience for this use
case. [Update <span class="timestamp-wrapper"><span class="timestamp">[2025-02-03 Mon]</span></span>: added some screenshots throughout to
give a sense of what it looks like.]</p>
<h2 id="trying-to-cope-with-emacs-on-mobile">Trying to Cope with Emacs on mobile</h2>
<p>I&rsquo;ve tried a number of different solutions for managing sync&rsquo;ed Org
files on mobile<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, and some of these are useful for some
purposes, but to being able to access and add to my Org-Roam notes,
I&rsquo;ve found I really need a full-blooded Emacs
instance.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>And dealing with interacting with Emacs on a touchscreen
interface/touchscreen keyboard is a bit of a nightmare.</p>



<figure>
    
        <img src="https://babbagefiles.xyz/ox-hugo/John_Tenniel_-_Playing_cards_-_in_The_nursery_Alice_in_Wonderland.jpg"/> </figure>

<p>Here, we&rsquo;ll try to improve it a little. Into the rabbit-hole&hellip;.</p>
<h2 id="note-about-using-termux-for-emacs-on-android">Note about using Termux for Emacs on Android</h2>
<p>You&rsquo;re probably better off installing Termux from <a href="https://f-droid.org/en/packages/com.termux/">F-Droid</a> rather than
from the Google Play Store [see the note from the official Termux
maintainers at:
<a href="https://github.com/termux/termux-app/discussions/4000">https://github.com/termux/termux-app/discussions/4000</a>]. This is
especially true is you want to use Emacs in Termux for managing
Org-roam files which are shared/kept in sync with your Emacs on
desktop machines, which you can do with <a href="https://syncthing.net/">Syncthing</a> (use Catfriend1&rsquo;s
Syncthing-fork [<a href="https://github.com/Catfriend1/syncthing-android">Github</a>]/[<a href="https://f-droid.org/en/packages/com.github.catfriend1.syncthingandroid/">F-Droid</a>] on Android), in order to be able to
grant Termux (and thus Emacs) access to your shared Org files.</p>
<h2 id="termux-extra-keys">Termux Extra Keys</h2>
<p>Termux has a very useful feature adding <a href="https://wiki.termux.com/wiki/Touch_Keyboard#Extra_Keys_Row">extra keys</a> above the system
keyboard. These are quite useful, including &lsquo;sticky&rsquo; <code>CTRL</code> and <code>ALT</code>
keys. (In addition, one can hold <code>volume-down</code> and press a key for
<code>CTRL</code> + [that-key] or <code>volume-up</code> and press a key for <code>ALT</code> + [that-key];
with <code>volume-up</code> + <code>t</code> inputting <code>TAB</code>. At least on my phone, using the
volume keys as modifiers is fairly awkward/uncomfortable, so I prefer
these extra keys.)</p>
<p>[Nb.: These keys are toggled on and off by pressing <code>volume-up + k</code> or
<code>volume-up + q</code>. This is important to note, for I once toggled them off
by accident and couldn&rsquo;t understand what had happened to them for
several months.]</p>
<p>Also worth mentioning is the fact that:</p>
<ul>
<li>swipe left on extra keys brings up swipe-compatible/regular keyboard
typing</li>
<li>swipe right on regular keyboard typing area (where extra keys was)
will get you back to extra keys</li>
</ul>
<p>The first of these lets you use any of your keyboard&rsquo;s regular
features and so can be quite useful.</p>
<p>See the <a href="https://wiki.termux.com/wiki/Touch_Keyboard#Extra_Keys_Row">Termux manual on Extra Keys</a> for a description and basic
configuration and usage instructions.</p>
<h2 id="extra-keys-for-better-emacs-navigation">Extra Keys for better Emacs navigation</h2>
<p>Here, I explore the possibilities offered by the advanced
configuration options for Extra Keys for navigating Emacs in Termux,
especially <a href="https://www.orgroam.com">Org-Roam</a> or <a href="https://github.com/meedstrom/org-node">Org-node</a> <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>, to create faster/easier ways of
calling commonly used commands since the user-interface to Emacs with
an on-screen keyboard is often somewhat frustrating compared to the
using Emacs with a physical keyboard. In addition to extra tappable
keys, Extra Keys also allows for different outcomes when the user does
swipe-up on a key, including the outputting of key sequences, which
can include modifier keys like <code>CTRL</code>. This allows the possibility of
loading them with Emacs key sequences which would otherwise be much
slower to access with an onscreen keyboard.</p>
<p>What I wanted was:</p>
<ul>
<li>
<p>An easy, single-key (no modifier) way of doing forward and backward
searches. It is painful to either hold <code>volume-down</code> or have to keep
on toggling the Extra Keys&rsquo; <code>CTRL</code> for each next/previous result. So I
recruited <code>♡</code> and <code>♤</code> for forward and back searches, respectively
(because ♡ is sort of pointed down and ♤ is sort of pointing up),
and bound these appropriately in my Emacs configuration (see below).</p>
</li>
<li>
<p>other convenient single-key buffer navigation interface features, e.g.,
arrow keys and page-up and page-down</p>
</li>
<li>
<p>some convenience things like closing all but the current window
(<code>delete-other-windows</code> = <code>C-x 1</code>), opening up iBuffer, switch-buffer</p>
</li>
<li>
<p>slashes and <code>-</code> and <code>~</code> available immediately to tap insert (not under
my keyboard&rsquo;s symbol toggle or long-hold)</p>
</li>
<li>
<p>ability to call some Org-mode/Org-node commands quickly: including
finding nodes, inserting links to nodes, capturing new dailies,
committing captures, going to today&rsquo;s daily entry, moving forward
and backwards through the dailies, toggling the org-roam backlinks
buffer</p>



<figure>
    
        <img src="https://babbagefiles.xyz/ox-hugo/termux-ycombinator-id-node-search-y_comb.png"/> </figure>

</li>
</ul>
<h2 id="example-configuration">Example configuration</h2>
<p>The configuration outlined below is partially specific for my Emacs
configuration, especially for the <code>C-c</code> (<code>CTRL c</code>) keys, but some things
involve default Emacs keybindings and it can at least serve as a model
for what one can do. To configure Extra Keys, you need to modify the
<code>extra-keys</code> part of <code>~/.termux/termux.properties</code> in this fashion:</p>
<div class="highlight"><pre class="chroma"><code class="language-shell" data-lang="shell">extra-keys <span class="o">=</span> <span class="o">[[</span> <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;ESC&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL x 1&#34;</span>, display: <span class="s2">&#34;C-x 1&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;CTRL&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL c&#34;</span>, display: <span class="s2">&#34;C-c&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;ALT&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;ALT x&#34;</span>, display: <span class="s2">&#34;M-x&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;♡&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL x r b&#34;</span>, display: <span class="s2">&#34;bookmarks&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;~&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL c n d&#34;</span>, display: <span class="s2">&#34;today&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;UP&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL c n n&#34;</span>, display: <span class="s2">&#34;new note&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;-&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL c CTRL k&#34;</span>, display: <span class="s2">&#34;cancel note&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;PGUP&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL c n y&#34;</span>, display: <span class="s2">&#34;prev note&#34;</span><span class="o">}}]</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">[</span> <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;TAB&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL x b&#34;</span>, display: <span class="s2">&#34;alttab&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;/&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL c n f&#34;</span>, display: <span class="s2">&#34;find node&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;\\\\&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL c n i&#34;</span>, display: <span class="s2">&#34;insert link&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;♤&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL x CTRL b&#34;</span>, display: <span class="s2">&#34;ibuffer&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;LEFT&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL c n l&#34;</span>, display: <span class="s2">&#34;backlinks&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;DOWN&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL c CTRL c&#34;</span>, display: <span class="s2">&#34;commit&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;RIGHT&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL c n v&#34;</span>, display: <span class="s2">&#34;goto-date&#34;</span><span class="o">}}</span>, <span class="se">\
</span><span class="se"></span>  <span class="o">{</span>key: <span class="s1">&#39;PGDN&#39;</span>, popup: <span class="o">{</span>macro: <span class="s2">&#34;CTRL c n t&#34;</span>, display: <span class="s2">&#34;next note&#34;</span><span class="o">}}]]</span>
</code></pre></div>


<figure>
    
        <img src="https://babbagefiles.xyz/ox-hugo/termux-ibuffer.png"/> </figure>

<p>Here is a rough summary of what this does:</p>
<table>
<thead>
<tr>
<th><strong>key</strong></th>
<th><strong>do on key tap</strong></th>
<th><strong>do on key swipe up</strong></th>
<th><strong>display on swipe up</strong></th>
<th><strong>what key swipe up does</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ESC</code></td>
<td>&lsquo;esc&rsquo;</td>
<td><code>C-x 1</code></td>
<td>&ldquo;C-x 1&rdquo;</td>
<td><code>delete-other-windows</code></td>
</tr>
<tr>
<td><code>CTRL</code></td>
<td>&lsquo;ctrl&rsquo; (<code>C-</code>) toggle</td>
<td><code>C-c</code></td>
<td>&ldquo;C-c&rdquo;</td>
<td>start <code>C-c</code> prefix command</td>
</tr>
<tr>
<td><code>ALT</code></td>
<td>&lsquo;alt&rsquo; (<code>M-</code>) toggle</td>
<td><code>M-x</code></td>
<td>&ldquo;M-x&rdquo;</td>
<td><code>M-x</code></td>
</tr>
<tr>
<td><code>♡</code></td>
<td><code>isearch-forward</code></td>
<td><code>C-x r b</code></td>
<td>&ldquo;bookmarks&rdquo;</td>
<td><code>bookmark-jump</code></td>
</tr>
<tr>
<td><code>~</code></td>
<td>&lsquo;~&rsquo;</td>
<td><code>C-c n d</code></td>
<td>&ldquo;today&rdquo;</td>
<td><code>org-node-goto-today</code></td>
</tr>
<tr>
<td><code>↑</code></td>
<td>&lsquo;up&rsquo;</td>
<td><code>C-c n n</code></td>
<td>&ldquo;new note&rdquo;</td>
<td><code>org-roam-dailies-capture-today</code></td>
</tr>
<tr>
<td><code>-</code></td>
<td>&lsquo;-&rsquo;</td>
<td><code>C-c C-k</code></td>
<td>&ldquo;cancel note&rdquo;</td>
<td><code>C-c C-k</code> to cancel capture</td>
</tr>
<tr>
<td><code>PGUP</code></td>
<td>&lsquo;pageup&rsquo;</td>
<td><code>C-c n y</code></td>
<td>&ldquo;prev note&rdquo;</td>
<td><code>org-node-goto-next-day</code></td>
</tr>
<tr>
<td><code>TAB</code></td>
<td>&lsquo;tab key&rsquo;</td>
<td><code>C-x b</code></td>
<td>&ldquo;alttab&rdquo;</td>
<td><code>consult-buffer</code> (<code>switch-to-buffer</code>)</td>
</tr>
<tr>
<td><code>/</code></td>
<td>&lsquo;/&rsquo;</td>
<td><code>C-c n f</code></td>
<td>&ldquo;find node&rdquo;</td>
<td><code>org-node-find</code></td>
</tr>
<tr>
<td><code>\</code></td>
<td>&lsquo;\&rsquo;</td>
<td><code>C-c n i</code></td>
<td>&ldquo;insert link&rdquo;</td>
<td><code>org-node-insert-link*</code></td>
</tr>
<tr>
<td><code>♤</code></td>
<td><code>isearch-backward</code></td>
<td><code>C-x C-b</code></td>
<td>&ldquo;ibuffer&rdquo;</td>
<td><code>ibuffer</code></td>
</tr>
<tr>
<td><code>←</code></td>
<td>&lsquo;left&rsquo;</td>
<td><code>C-c n l</code></td>
<td>&ldquo;backlinks&rdquo;</td>
<td><code>org-roam-buffer-toggle</code></td>
</tr>
<tr>
<td><code>↓</code></td>
<td>&lsquo;down&rsquo;</td>
<td><code>C-c C-c</code></td>
<td>&ldquo;commit&rdquo;</td>
<td><code>C-c C-c</code> to &lsquo;commit&rsquo;</td>
</tr>
<tr>
<td><code>→</code></td>
<td>&lsquo;right&rsquo;</td>
<td><code>C-c n v</code></td>
<td>&ldquo;goto-date&rdquo;</td>
<td><code>org-node-goto-daily</code></td>
</tr>
<tr>
<td><code>PGDN</code></td>
<td>&lsquo;pagedown&rsquo;</td>
<td><code>C-c n t</code></td>
<td>&ldquo;next note&rdquo;</td>
<td><code>org-node-goto-prev-day</code></td>
</tr>
</tbody>
</table>
<p>In case you do use Org-node (and, if you&rsquo;re trying to do Org-roam
things on Android, I would again recommend considering Org-node, if
only for making interactions fast enough to not be completely
frustrating), you could implement the following interactive functions:</p>
<div class="highlight"><pre class="chroma"><code class="language-elisp" data-lang="elisp"><span class="p">(</span><span class="nb">defun</span> <span class="nv">org-node-goto-daily</span> <span class="p">()</span>
  <span class="p">(</span><span class="nb">interactive</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">org-node-seq--jump</span> <span class="s">&#34;d&#34;</span><span class="p">))</span>

<span class="p">(</span><span class="nb">defun</span> <span class="nv">org-node-goto-today</span> <span class="p">()</span>
  <span class="p">(</span><span class="nb">interactive</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">org-node-seq-goto</span> <span class="s">&#34;d&#34;</span> <span class="p">(</span><span class="nf">format-time-string</span> <span class="s">&#34;%F&#34;</span><span class="p">)))</span>

<span class="p">(</span><span class="nb">defun</span> <span class="nv">org-node-goto-next-day</span> <span class="p">()</span>
  <span class="p">(</span><span class="nb">interactive</span> <span class="no">nil</span> <span class="nv">org-mode</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">org-node-seq--goto-next</span> <span class="s">&#34;d&#34;</span><span class="p">))</span>

<span class="p">(</span><span class="nb">defun</span> <span class="nv">org-node-goto-prev-day</span> <span class="p">()</span>
  <span class="p">(</span><span class="nb">interactive</span> <span class="no">nil</span> <span class="nv">org-mode</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">org-node-seq--goto-previous</span> <span class="s">&#34;d&#34;</span><span class="p">))</span>

<span class="p">(</span><span class="nb">defun</span> <span class="nv">org-roam-dailies-capture-today</span> <span class="p">()</span>
  <span class="p">(</span><span class="nb">interactive</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">org-roam-dailies-capture-today</span> <span class="no">nil</span> <span class="s">&#34;d&#34;</span><span class="p">))</span>
</code></pre></div><p>And then bind:</p>
<ul>
<li><code>org-node-insert-link*</code> to &ldquo;C-c n i&rdquo;</li>
<li><code>org-node-find</code> to &ldquo;C-c n f&rdquo;</li>
<li><code>org-node-goto-daily</code> to &ldquo;C-c n v&rdquo;</li>
<li><code>org-node-goto-today</code> to &ldquo;C-c n d&rdquo;</li>
<li><code>org-node-goto-next-day</code> to &ldquo;C-c n t&rdquo;  ('[t]omorrow&rsquo;)</li>
<li><code>org-node-goto-prev-day</code> to &ldquo;C-c n y&rdquo; ('[y]esterday&rsquo;)</li>
<li><code>org-roam-dailies-capture-today</code> to &ldquo;C-c n n&rdquo;</li>
<li><code>org-roam-buffer-toggle</code> to &ldquo;C-c n l&rdquo;</li>
</ul>
<p>Most of the other keybindings implemented above are default Emacs
bindings.</p>



<figure>
    
        <img src="https://babbagefiles.xyz/ox-hugo/termux-org-node-id-search-clo_s.png"/> </figure>

<p>In terms of how this improves the Termux Emacs experience, consider
that you could open up Emacs in Termux and then proceed by:</p>
<ul>
<li>swiping up on <code>↑</code> to open up a new Org-[roam/node] note in today&rsquo;s
daily journal</li>
<li>then swiping left on the extra keys pane to get into normal keyboard
entry mode</li>
<li>swipe/glide-typing the text of your note quickly, and pressing enter</li>
<li>swiping right on the now clear virtual keyboard pane to bring back
the extra keys</li>
<li>swiping up on <code>\</code> to insert (&lsquo;splice in&rsquo;) a org-id link to another
Org-roam node or two</li>
<li>swiping up on <code>↓</code> to commit/complete your daily note</li>
<li>swiping up on <code>PGUP</code> to see yesterday&rsquo;s Org-roam daily journal</li>
<li>swiping up on <code>/</code> to search for your &ldquo;Termux&rdquo; Org-roam node to add
notes about Extra Keys to your Termux Org-roam node/file</li>
<li>tapping <code>♡</code> to search through the entry to see all the places you made
reference to &ldquo;extra keys&rdquo;</li>
<li>swiping up on <code>←</code> to see what backlinks you have for &ldquo;Termux&rdquo;</li>
<li>swiping up on <code>ESC</code> to get back to single window view</li>
<li>swiping up on <code>♤</code> to get to IBuffer to be able to manage your buffers</li>
<li>swiping up on <code>↑</code> to open another new daily note in today&rsquo;s journal</li>
<li>changing your mind and swiping up on <code>-</code> to cancel the note capture</li>
<li>&hellip;..</li>
</ul>
<p>This is all a lot faster than having to tap <code>CTRL</code> and then type <code>c</code> <code>n</code> <code>n</code>
to start a new entry in today&rsquo;s Org-roam daily journal, typing it out
(tapping <code>CTRL</code> and then <code>c n i</code> each time you want to link text to
another node), and then tapping <code>CTRL</code> and then <code>c</code> and then <code>CTRL</code> and then
<code>c</code> to commit it, and so on.</p>
<p>For a bonus reduction in modifier and key tapping, consider using a
modal mode in Emacs: I particularly like <a href="https://github.com/meow-edit/meow">meow</a>.</p>
<h2 id="appendix-key-mnemonics">Appendix: Key Mnemonics</h2>
<p>A potentially useful/emblematic list of mnemonics for the keys. [I use
☝️ to indicate swiping up on a key below.] Some of these mnemonics are
stretches, but there are only so many keys and a particular set of
things one wants, so stretches are sometimes required.</p>
<ul>
<li><code>♡</code> is a forwards/downwards search because the heart points down</li>
<li><code>♤</code> is a backwards/upwards search because the spade points up [and we
use these pointy characters indicating card suits in preference to
others because I&rsquo;m not going to be typing them on Android ever]</li>
<li>(all other single tap keys just do what it says on the tin,
inserting characters, toggling modifiers, &amp;c.)</li>
<li>☝️ <code>♡</code> is bookmarks because these are &lsquo;favourites&rsquo; because you &lsquo;♡&rsquo; them</li>
<li>☝️ <code>♤</code> is IBuffer because if you have icons enabled in your IBuffer<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>
then you&rsquo;ll see icons and ♤ is like an icon (I know this one is a
stretch, but&hellip;.<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup>)</li>
<li>☝️ <code>ESC</code> is <code>delete-other-windows</code> because you&rsquo;re &lsquo;escaping&rsquo; from them</li>
<li>☝️ <code>CTRL</code> is <code>C-c</code> because <code>C-c</code> starts with CTRL</li>
<li>☝️ <code>ALT</code> is <code>M-x</code> because <code>M-x</code> starts with ALT</li>
<li>☝️ <code>~</code> is <code>org-node-goto-today</code> because in Unix <code>~</code> is &ldquo;user&rsquo;s home
directory&rdquo; and today&rsquo;s daily Org-roam entry is a sort of a &lsquo;home&rsquo;
(it makes sense to me anyway)</li>
<li>☝️ <code>-</code> is <code>C-c C-k</code> is which &lsquo;cancel&rsquo; in lots of places (like capture
templates) and <code>-</code> is a negative sign and so can be understood like
&ldquo;don&rsquo;t do it!&rdquo;</li>
<li>☝️ <code>↑</code> is <code>org-roam-dailies-capture-today</code> because this is the function
to capture a new Org-roam daily note and ↑ is like &ldquo;opening up
something&rdquo;</li>
<li>☝️ <code>↓</code> is <code>C-c C-c</code> which is in many places in Emacs something like
&lsquo;commit&rsquo;, and for capture templates it is the &lsquo;finish capture&rsquo;
binding and if ↑ is opening a new note, then ↓ is finishing it,
putting it &lsquo;down&rsquo;</li>
<li>☝️ <code>←</code> is open up Org-roam backlinks buffer because ← is pointing
&lsquo;backwards&rsquo;</li>
<li>☝️ <code>→</code> is <code>org-node-goto-daily</code> because we&rsquo;re looking &lsquo;forward&rsquo; towards a
specific date and going to it</li>
<li>☝️ <code>PGUP</code> is <code>org-node-goto-prev-day</code> because we&rsquo;re going
&lsquo;up&rsquo;/&lsquo;backwards&rsquo; in the calendar (of daily Org-roam journal entries)</li>
<li>☝️ <code>PGDN</code> is <code>org-node-goto-prev-day</code> because we&rsquo;re going
&lsquo;down&rsquo;/&lsquo;forwards&rsquo; in the calendar (of daily Org-roam journal
entries)</li>
<li>☝️ <code>TAB</code> is <code>consult-buffer</code> / <code>switch-to-buffer</code> because this function is
sort of like <code>Alt-TAB</code> in many window environments</li>
<li>☝️ <code>/</code> is <code>org-node-find</code> because <code>/</code> is the search key in Vim, and also
associated with searches elsewhere in Unixland (the marker of
beginning/end of regexs, often used for searches) [and because <code>/</code> is
the opposite slash from <code>\</code>, which we&rsquo;re going to use for the
complementary operation to insert links]</li>
<li>☝️ <code>\</code> is <code>org-node-insert-link*</code> because in many environments <code>\</code> is some
sort of &lsquo;splice&rsquo; indicator<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup>, and inserting a link to a node is
also sort of a splice [and because <code>\</code> is the opposite slash from <code>/</code>
which performs a complementary operation]</li>
</ul>
<section class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1" role="doc-endnote">
<p>E.g., <a href="https://www.orgzly.com/">orgzly</a>, <a href="https://organice.200ok.ch/">organice</a>. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>There is a <a href="https://f-droid.org/packages/org.gnu.emacs/">full GUI Emacs now on Android</a>, but I
don&rsquo;t know how to get it to be able to access files shared via
Syncthing, and, anyway, you wouldn&rsquo;t be able to do the sort of
convenient keyboard hacks there I&rsquo;m going to discuss in this post. <a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p>I highly recommend looking at Martin Edström&rsquo;s <a href="https://github.com/meedstrom/org-node">Org-node</a> package if
you&rsquo;re trying to manage Org-roam notes on Android; the performance
differences between the two packages are especially noticeable on
Android (orders of magnitude<sup id="fnref:7"><a href="#fn:7" class="footnote-ref" role="doc-noteref">7</a></sup>). And the two packages can live
alongside each other, so you can keep your existing Org-roam set-up
going while you set-up/experiment with Org-node. <a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p>With a package like
<a href="https://github.com/seagle0128/all-the-icons-ibuffer">https://github.com/seagle0128/all-the-icons-ibuffer</a>. On IBuffer
itself, see <a href="https://www.emacswiki.org/emacs/IbufferMode">https://www.emacswiki.org/emacs/IbufferMode</a>. <a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5" role="doc-endnote">
<p>Well, okay, so here&rsquo;s another one: think of
IBuffer as trying to right your buffer organisation like Two, Five,
and Seven (of Spades) in Alice in Wonderland trying sort out the
Queen of Hearts&rsquo; rose-bushes (by painting the roses red):
<img src="/ox-hugo/Two_Five_and_Seven_of_Spades_Painting_the_Rosebushes.jpg" alt=""> <a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:6" role="doc-endnote">
<p>From <a href="https://port70.net/~nsz/c/c11/n1570.html#5.1.1.2">https://port70.net/~nsz/c/c11/n1570.html#5.1.1.2</a>:</p>
<blockquote>
<p>Each instance of a backslash character (\) immediately followed by a
new-line character is deleted, <strong>splicing</strong> physical source lines to form
logical source lines. Only the last backslash on any physical source
line shall be eligible for being part of such a <strong>splice</strong>. A source file
that is not empty shall end in a new-line character, which shall not
be immediately preceded by a backslash character before any such
<strong>splicing</strong> takes place.</p>
</blockquote>
 <a href="#fnref:6" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></li>
<li id="fn:7" role="doc-endnote">
<p>Android 10/11 seems to have introduced
which restricts
how regular applications/users can interact with the filesystem, for
&lsquo;security&rsquo; reasons, implemented via <a href="https://en.wikipedia.org/wiki/Filesystem_in_Userspace">Filesystem in Userspace (FUSE)</a>,
which makes operations which interact with the file system sometimes
very sluggish. Accessing directories with lots of files, as one might
have in an Org-roam directory, can be amazingly slow. The increases
exponentially with the number of Org-roam files.</p>
<p>Org-node is implemented in such a way
[cf. <a href="https://github.com/meedstrom/org-node/issues/26">https://github.com/meedstrom/org-node/issues/26</a>] that it
caches/stores and accesses many things in ways that avoid directly
accessing the file-system (especially in <a href="https://github.com/meedstrom/org-node-fakeroam">org-node-fakeroam</a>), where
Org-roam does not. <a href="#fnref:7" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</section>
]]></content>
            
                 
                    
                         
                        
                            
                             
                                <category scheme="https://babbagefiles.xyz/categories/emacs" term="emacs" label="emacs" />
                            
                        
                    
                 
                    
                 
                    
                         
                        
                            
                             
                                <category scheme="https://babbagefiles.xyz/tags/orgroam" term="orgroam" label="orgroam" />
                             
                                <category scheme="https://babbagefiles.xyz/tags/android" term="android" label="android" />
                            
                        
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Automatically adding information to Org-roam file properties]]></title>
            <link href="https://babbagefiles.xyz/org-roam-auto-propertise/"/>
            <id>https://babbagefiles.xyz/org-roam-auto-propertise/</id>
            
                    <author>
                        <name>Benjamin Slade</name>
                    </author>
            <published>2021-08-10T21:12:00-06:00</published>
            <updated>2021-08-10T21:15:45-06:00</updated>
            
            
            <content type="html"><![CDATA[<p>This expands on a feature I included in the setup for using <a href="https://www.orgroam.com/">Org-roam</a>
on Android/LineageOS in the <a href="../org-roam-on-android">last post</a>, specifically automatically
adding properties to newly created Org-roam files.</p>
<p>Since Org-roam v2 creates a top properties drawer (with an <code>:ID:</code> tag) anyway, it is nice to stick other information there as well. Specifically, information that could be useful in some situation, but which usually we don&rsquo;t want to see, like <code>:AUTHOR:</code> (it&rsquo;s probably you, and you know who you are), <code>:CREATION_TIME:</code> (and why not use Unix epoch time?), and so on. I have org drawers fold themselves automatically, so the normally-useless information doesn&rsquo;t distract me.</p>
<p>We can do this by leveraging Org-roam&rsquo;s <code>org-roam-capture-new-node-hook</code>, and some <code>org-roam-add-property</code> function calls, as below.</p>
<p>But, while we&rsquo;re at it, we might also record <strong>where</strong> a note was made from. There are a number of ways we might do this, but an easy one (only requiring <code>curl</code> and an active Internet connection) is using <a href="https://ipinfo.io/developers/data-types#geolocation-data">ipinfo.io</a>. <code>curl ipinfo.io</code> will give you a bunch of information in JSON format about your internet provider, including latitude and longitude, which will likely be at least somewhere <strong>near</strong> your present location. And <code>curl ipinfo.io/loc</code> will return just latitude,longitude.</p>
<div class="highlight"><pre class="chroma"><code class="language-elisp" data-lang="elisp">  <span class="p">(</span><span class="nb">defun</span> <span class="nv">bms/add-other-auto-props-to-org-roam-properties</span> <span class="p">()</span>
    <span class="c1">;; if the file already exists, don&#39;t do anything, otherwise...</span>
    <span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nf">file-exists-p</span> <span class="p">(</span><span class="nf">buffer-file-name</span><span class="p">))</span>
      <span class="c1">;; if there&#39;s also a CREATION_TIME property, don&#39;t modify it</span>
      <span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nv">org-find-property</span> <span class="s">&#34;CREATION_TIME&#34;</span><span class="p">)</span>
        <span class="c1">;; otherwise, add a Unix epoch timestamp for CREATION_TIME prop</span>
        <span class="c1">;; (this is what &#34;%s&#34; does - see http://doc.endlessparentheses.com/Fun/format-time-string )</span>
        <span class="p">(</span><span class="nv">org-roam-add-property</span>
         <span class="p">(</span><span class="nf">format-time-string</span> <span class="s">&#34;%s&#34;</span>
                             <span class="p">(</span><span class="nf">nth</span> <span class="mi">5</span>
                                  <span class="p">(</span><span class="nf">file-attributes</span> <span class="p">(</span><span class="nf">buffer-file-name</span><span class="p">))))</span>
         <span class="s">&#34;CREATION_TIME&#34;</span><span class="p">))</span>
      <span class="c1">;; similarly for AUTHOR and MAIL properties</span>
      <span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nv">org-find-property</span> <span class="s">&#34;AUTHOR&#34;</span><span class="p">)</span>
        <span class="p">(</span><span class="nv">org-roam-add-property</span> <span class="nv">roam-user</span> <span class="s">&#34;AUTHOR&#34;</span><span class="p">))</span>
      <span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nv">org-find-property</span> <span class="s">&#34;MAIL&#34;</span><span class="p">)</span>
        <span class="p">(</span><span class="nv">org-roam-add-property</span> <span class="nv">roam-email</span> <span class="s">&#34;MAIL&#34;</span><span class="p">))</span>
      <span class="c1">;; also add the latitude and longitude</span>
      <span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nv">org-find-property</span> <span class="s">&#34;LAT_LONG&#34;</span><span class="p">)</span>
        <span class="c1">;; recheck location:</span>
        <span class="p">(</span><span class="nv">bms/get-lat-long-from-ipinfo</span><span class="p">)</span>
        <span class="p">(</span><span class="nv">org-roam-add-property</span> <span class="p">(</span><span class="nf">concat</span> <span class="p">(</span><span class="nf">number-to-string</span> <span class="nv">calendar-latitude</span><span class="p">)</span> <span class="s">&#34;,&#34;</span> <span class="p">(</span><span class="nf">number-to-string</span> <span class="nv">calendar-longitude</span><span class="p">))</span> <span class="s">&#34;LAT-LONG&#34;</span><span class="p">))))</span>

  <span class="c1">;; hook to be run whenever an org-roam capture completes</span>
  <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;org-roam-capture-new-node-hook</span> <span class="nf">#&#39;</span><span class="nv">bms/add-other-auto-props-to-org-roam-properties</span><span class="p">)</span>

<span class="c1">;; function to find latitude &amp; longitude</span>
<span class="c1">;;                      (requires curl to be installed on system)</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">calendar-latitude</span> <span class="mi">0</span><span class="p">)</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">calendar-longitude</span> <span class="mi">0</span><span class="p">)</span>
<span class="p">(</span><span class="nb">defun</span> <span class="nv">bms/get-lat-long-from-ipinfo</span> <span class="p">()</span>
  <span class="p">(</span><span class="nb">let*</span>
      <span class="p">((</span><span class="nv">latlong</span> <span class="p">(</span><span class="nf">substring</span>
                 <span class="p">(</span><span class="nv">shell-command-to-string</span> <span class="s">&#34;curl -s &#39;ipinfo.io/loc&#39;&#34;</span><span class="p">)</span>
                   <span class="mi">0</span> <span class="mi">-1</span><span class="p">))</span>
       <span class="p">(</span><span class="nv">latlong-list</span> <span class="p">(</span><span class="nv">split-string</span> <span class="nv">latlong</span> <span class="s">&#34;,&#34;</span><span class="p">)))</span>
    <span class="p">(</span><span class="nb">setq</span> <span class="nv">calendar-latitude</span> <span class="p">(</span><span class="nf">string-to-number</span> <span class="p">(</span><span class="nf">car</span> <span class="nv">latlong-list</span><span class="p">)))</span>
    <span class="p">(</span><span class="nb">setq</span> <span class="nv">calendar-longitude</span> <span class="p">(</span><span class="nf">string-to-number</span> <span class="p">(</span><span class="nv">cadr</span> <span class="nv">latlong-list</span><span class="p">)))))</span>
</code></pre></div><p>You might also calculate/set <code>calendar-latitude</code> and <code>calendar-longitude</code> in other ways. Including just hard-coding them for stationary machines. On Android, we could in theory make use of the Termux command <code>termux-location</code>, which queries the device&rsquo;s GPS. But unfortunately it doesn&rsquo;t always work (if it can&rsquo;t find a good connection to a GPS satellite) and even when it does work it&rsquo;s slow, so it&rsquo;s not something you&rsquo;d want to call every time you made a note. <a href="https://gitlab.freedesktop.org/geoclue/geoclue/-/wikis/home">GeoClue</a> would be another possible source.</p>
<p>(If you&rsquo;re using a VPN, you&rsquo;ll want to escape from it somehow to get something closer to your real location. How you do this will vary based on your VPN provider and other factors. (If you&rsquo;re calling from Emacs, and you use something like Mullvad, you may want to revise the <code>shell-command-to-string</code> to call up a bash session/script, then exclude that specific bash session/script from the VPN, and <em>then</em> call <code>curl</code>, so that the call references your &ldquo;real&rdquo; IP. E.g. if you&rsquo;re using Mullvad, then:</p>
<div class="highlight"><pre class="chroma"><code class="language-shell" data-lang="shell"><span class="cp">#!/bin/bash
</span><span class="cp"></span><span class="nv">PID</span><span class="o">=</span><span class="sb">`</span><span class="nb">echo</span> <span class="nv">$$</span><span class="sb">`</span>
mullvad split-tunnel pid add <span class="s2">&#34;</span><span class="si">${</span><span class="nv">PID</span><span class="si">}</span><span class="s2">&#34;</span>
curl ipinfo.io/loc <span class="c1"># for lat/long ; `curl ipinfo.io` for full info</span>
</code></pre></div><p>might give you a start on something.))</p>
<p>Let me know if you think of other properties that could be useful to automatically add to Org-roam file properties.</p>
]]></content>
            
                 
                    
                         
                        
                            
                             
                                <category scheme="https://babbagefiles.xyz/categories/emacs" term="emacs" label="emacs" />
                             
                                <category scheme="https://babbagefiles.xyz/categories/org" term="org" label="org" />
                            
                        
                    
                 
                    
                 
                    
                         
                        
                            
                             
                                <category scheme="https://babbagefiles.xyz/tags/orgroam" term="orgroam" label="orgroam" />
                            
                        
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Org-roam on Android]]></title>
            <link href="https://babbagefiles.xyz/org-roam-on-android/"/>
            <id>https://babbagefiles.xyz/org-roam-on-android/</id>
            
                    <author>
                        <name>Benjamin Slade</name>
                    </author>
            <published>2021-08-09T20:06:00-05:00</published>
            <updated>2025-02-03T11:32:00-06:00</updated>
            
            
            <content type="html"><![CDATA[<p>I&rsquo;ve been using the note-taking <a href="https://en.wikipedia.org/wiki/Zettelkasten">Zettelkasten</a>-ish <a href="https://www.orgroam.com/">Org-roam</a> system for a
few months and it&rsquo;s been very useful to me, just as a low-friction way
of making more notes and easily finding and/or (re)discovering notes
that I&rsquo;ve made.</p>



<figure>
    
        <img src="https://babbagefiles.xyz/ox-hugo/Screenshot_20210809-201713_Termux.png"/> </figure>

<p>It&rsquo;s pretty useful to be able to have access to these notes, and be
able to quickly add notes, on mobile as well. I thought it might be
useful to include here some notes on how to do, since (especially
since <a href="https://blog.jethro.dev/posts/org_roam_v2/">v2 of Org-roam</a>) there are some hurdles.</p>
<p>On Android/LineageOS install the <a href="https://f-droid.org/">F-Droid app store</a>, and then from
there install <a href="https://f-droid.org/en/packages/com.termux/">Termux</a>. Open Termux and install four things we&rsquo;ll need
(strictly speaking you don&rsquo;t need curl and ripgrep, but they&rsquo;ll
be useful): Emacs, sqlite, curl, and ripgrep via <code>pkg install emacs sqlite curl ripgrep</code>.</p>
<p>You can then open up Emacs via <code>emacs</code> and get started.</p>
<p>I include here a commented partial version of my <code>~/.emacs.d/init.el</code>
configuration file for my Termux/Emacs Org-roam setup:</p>
<div class="highlight"><pre class="chroma"><code class="language-elisp" data-lang="elisp"><span class="c1">;; BASIC SETUP:</span>

<span class="c1">;; package setup - bootstrap the package system</span>
<span class="p">(</span><span class="nb">require</span> <span class="ss">&#39;package</span><span class="p">)</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">package-enable-at-startup</span> <span class="no">nil</span><span class="p">)</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">gnutls-algorithm-priority</span> <span class="s">&#34;NORMAL:-VERS-TLS1.3&#34;</span><span class="p">)</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">package-archives</span>
      <span class="o">&#39;</span><span class="p">((</span><span class="s">&#34;GNU ELPA&#34;</span>     <span class="o">.</span> <span class="s">&#34;https://elpa.gnu.org/packages/&#34;</span><span class="p">)</span>
        <span class="p">(</span><span class="s">&#34;ORG&#34;</span>		<span class="o">.</span> <span class="s">&#34;https://orgmode.org/elpa/&#34;</span><span class="p">)</span>
        <span class="p">(</span><span class="s">&#34;MELPA Stable&#34;</span> <span class="o">.</span> <span class="s">&#34;https://stable.melpa.org/packages/&#34;</span><span class="p">)</span>
        <span class="p">(</span><span class="s">&#34;MELPA&#34;</span>        <span class="o">.</span> <span class="s">&#34;https://melpa.org/packages/&#34;</span><span class="p">))</span>
      <span class="nv">package-archive-priorities</span>
      <span class="o">&#39;</span><span class="p">((</span><span class="s">&#34;ORG&#34;</span>		<span class="o">.</span> <span class="mi">20</span><span class="p">)</span>
        <span class="p">(</span><span class="s">&#34;MELPA&#34;</span>        <span class="o">.</span> <span class="mi">15</span><span class="p">)</span>
        <span class="p">(</span><span class="s">&#34;MELPA Stable&#34;</span> <span class="o">.</span> <span class="mi">10</span><span class="p">)</span>
        <span class="p">(</span><span class="s">&#34;GNU ELPA&#34;</span>     <span class="o">.</span> <span class="mi">5</span><span class="p">)))</span>

<span class="p">(</span><span class="nv">package-initialize</span><span class="p">)</span>

<span class="c1">;; Bootstrap `use-package&#39;</span>
<span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nv">package-installed-p</span> <span class="ss">&#39;use-package</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">package-refresh-contents</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">package-install</span> <span class="ss">&#39;use-package</span><span class="p">))</span>

<span class="p">(</span><span class="nb">eval-when-compile</span>
  <span class="p">(</span><span class="nb">require</span> <span class="ss">&#39;use-package</span><span class="p">))</span>

<span class="c1">;; for Termux-specific things; useful if you want to share</span>
<span class="c1">;; configs across platforms</span>
<span class="p">(</span><span class="nb">defvar</span> <span class="nv">termux-p</span>
  <span class="p">(</span><span class="nv">not</span> <span class="p">(</span><span class="nf">null</span> <span class="p">(</span><span class="nv">getenv</span> <span class="s">&#34;ANDROID_ROOT&#34;</span><span class="p">)))</span>
  <span class="s">&#34;If non-nil, GNU Emacs is running on Termux.&#34;</span><span class="p">)</span>

<span class="p">(</span><span class="nb">when</span> <span class="nv">termux-p</span>
  <span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nv">package-installed-p</span> <span class="ss">&#39;use-package</span><span class="p">)</span>
    <span class="p">(</span><span class="nv">package-refresh-contents</span><span class="p">)</span>
    <span class="p">(</span><span class="nv">package-install</span> <span class="ss">&#39;use-package</span><span class="p">)))</span>

<span class="c1">;; This makes Emacs in Termux use your Android browser for opening urls</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">browse-url-browser-function</span> <span class="ss">&#39;browse-url-xdg-open</span><span class="p">)</span>

<span class="c1">;; mouse</span>
<span class="c1">;; enable mouse reporting for terminal emulators</span>
<span class="c1">;; this lets you scroll around by swiping</span>
<span class="p">(</span><span class="nb">unless</span> <span class="nf">window-system</span>
  <span class="p">(</span><span class="nv">xterm-mouse-mode</span> <span class="mi">1</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">global-set-key</span> <span class="p">[</span><span class="nv">mouse-4</span><span class="p">]</span> <span class="p">(</span><span class="nb">lambda</span> <span class="p">()</span>
                              <span class="p">(</span><span class="nb">interactive</span><span class="p">)</span>
                              <span class="p">(</span><span class="nf">scroll-down</span> <span class="mi">1</span><span class="p">)))</span>
  <span class="p">(</span><span class="nv">global-set-key</span> <span class="p">[</span><span class="nv">mouse-5</span><span class="p">]</span> <span class="p">(</span><span class="nb">lambda</span> <span class="p">()</span>
                              <span class="p">(</span><span class="nb">interactive</span><span class="p">)</span>
                              <span class="p">(</span><span class="nf">scroll-up</span> <span class="mi">1</span><span class="p">))))</span>

<span class="c1">;; ORG</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">org</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:ensure</span> <span class="nv">org-plus-contrib</span>
  <span class="nb">:init</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">org-src-fontify-natively</span> <span class="no">t</span><span class="p">)</span>
  <span class="nb">:config</span>
  <span class="c1">;; (add-to-list &#39;auto-mode-alist &#39;(&#34;\\.org\\&#39;&#34; . org-mode))</span>
  <span class="p">(</span><span class="nf">define-key</span> <span class="nv">org-mode-map</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">&#34;M-p&#34;</span><span class="p">)</span> <span class="ss">&#39;org-metaup</span><span class="p">)</span>
  <span class="p">(</span><span class="nf">define-key</span> <span class="nv">org-mode-map</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">&#34;M-n&#34;</span><span class="p">)</span> <span class="ss">&#39;org-metadown</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">org-catch-invisible-edits</span> <span class="ss">&#39;show-and-error</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">org-cycle-separator-lines</span> <span class="mi">-1</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">org-return-follows-link</span> <span class="no">t</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">org-export-with-toc</span> <span class="ss">&#39;nil</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">org-startup-folded</span> <span class="ss">&#39;content</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">org-ellipsis</span> <span class="s">&#34;⇣&#34;</span><span class="p">)</span>
  <span class="c1">;; **** use regular android apps to view pdfs &amp; images *****</span>
  <span class="p">(</span><span class="nb">when</span> <span class="nv">termux-p</span>
    <span class="p">(</span><span class="nv">add-to-list</span> <span class="ss">&#39;org-file-apps</span> <span class="o">&#39;</span><span class="p">(</span><span class="s">&#34;\\.pdf\\&#39;&#34;</span> <span class="o">.</span> <span class="s">&#34;termux-open %s&#34;</span><span class="p">))</span>
    <span class="p">(</span><span class="nv">add-to-list</span> <span class="ss">&#39;org-file-apps</span> <span class="o">&#39;</span><span class="p">(</span><span class="s">&#34;\\.png\\&#39;&#34;</span> <span class="o">.</span> <span class="s">&#34;termux-open %s&#34;</span><span class="p">))</span>
    <span class="p">(</span><span class="nv">add-to-list</span> <span class="ss">&#39;org-file-apps</span> <span class="o">&#39;</span><span class="p">(</span><span class="s">&#34;\\.jpg\\&#39;&#34;</span> <span class="o">.</span> <span class="s">&#34;termux-open %s&#34;</span><span class="p">))</span>
    <span class="p">(</span><span class="nv">add-to-list</span> <span class="ss">&#39;org-file-apps</span> <span class="o">&#39;</span><span class="p">(</span><span class="s">&#34;\\.jpeg\\&#39;&#34;</span> <span class="o">.</span> <span class="s">&#34;termux-open %s&#34;</span><span class="p">)))</span>
  <span class="c1">;; needed for &lt;s etc. expansion of code-blocks</span>
  <span class="p">(</span><span class="nb">require</span> <span class="ss">&#39;org-tempo</span><span class="p">))</span>

<span class="c1">;; define our Org-roam user and their email (set to your desired name/email)</span>
<span class="p">(</span><span class="nb">defvar</span> <span class="nv">roam-user</span> <span class="s">&#34;Some User&#34;</span>
  <span class="s">&#34;The name of the Org-roam note author.&#34;</span><span class="p">)</span>
<span class="p">(</span><span class="nb">defvar</span> <span class="nv">roam-email</span> <span class="s">&#34;roman@mode.org&#34;</span>
  <span class="s">&#34;The public email of that author.&#34;</span><span class="p">)</span>

<span class="p">(</span><span class="nb">setq</span> <span class="nv">org-roam-v2-ack</span> <span class="no">t</span><span class="p">)</span>

<span class="c1">;; we need this package for v2 of Org-oram</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">emacsql-sqlite3</span>
  <span class="nb">:ensure</span> <span class="no">t</span><span class="p">)</span>

<span class="c1">;; If you&#39;ve replicated my setup; otherwise change to the Termux</span>
<span class="c1">;; local path.</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">org-roam-directory</span> <span class="p">(</span><span class="nv">file-truename</span> <span class="s">&#34;~/Documents/Org/org-roam/&#34;</span><span class="p">))</span>

<span class="c1">;; org-roam</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">org-roam</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:custom</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">org-roam-db-location</span> <span class="p">(</span><span class="nv">file-truename</span> <span class="s">&#34;~&#34;</span><span class="p">))</span>
  <span class="p">(</span><span class="nv">org-roam-directory</span> <span class="p">(</span><span class="nv">file-truename</span> <span class="s">&#34;~/Documents/Org/org-roam/&#34;</span><span class="p">))</span>
  <span class="nb">:bind</span> <span class="p">((</span><span class="s">&#34;C-c n l&#34;</span> <span class="o">.</span> <span class="nv">org-roam-buffer-toggle</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-c n f&#34;</span> <span class="o">.</span> <span class="nv">org-roam-node-find</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-c n r&#34;</span> <span class="o">.</span> <span class="nv">org-roam-graph</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-c n i&#34;</span> <span class="o">.</span> <span class="nv">org-roam-node-insert</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-c n c&#34;</span> <span class="o">.</span> <span class="nv">org-roam-capture</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-c n g&#34;</span> <span class="o">.</span> <span class="nv">org-id-get-create</span><span class="p">)</span>
         <span class="c1">;; Dailies</span>
         <span class="p">(</span><span class="s">&#34;C-c n n&#34;</span> <span class="o">.</span> <span class="nv">org-roam-dailies-capture-today</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-c n d&#34;</span> <span class="o">.</span> <span class="nv">org-roam-dailies-goto-today</span><span class="p">)</span> <span class="c1">; find toDay</span>
         <span class="p">(</span><span class="s">&#34;C-c n v&#34;</span> <span class="o">.</span> <span class="nv">org-roam-dailies-goto-date</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-c n f&#34;</span> <span class="o">.</span> <span class="nv">org-roam-dailies-goto-next-note</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-c n b&#34;</span> <span class="o">.</span> <span class="nv">org-roam-dailies-goto-previous-note</span><span class="p">))</span>
  <span class="nb">:config</span>

  <span class="c1">;; this is a chunglak&#39;s hack to get sqlite to work on Android with org-roam v2:</span>
  <span class="c1">;; from: https://github.com/org-roam/org-roam/issues/1605#issuecomment-885997237</span>
  <span class="p">(</span><span class="nb">defun</span> <span class="nv">org-roam-db</span> <span class="p">()</span>
    <span class="s">&#34;Entrypoint to the Org-roam sqlite database.
</span><span class="s">Initializes and stores the database, and the database connection.
</span><span class="s">Performs a database upgrade when required.&#34;</span>
    <span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nb">and</span> <span class="p">(</span><span class="nv">org-roam-db--get-connection</span><span class="p">)</span>
                 <span class="p">(</span><span class="nv">emacsql-live-p</span> <span class="p">(</span><span class="nv">org-roam-db--get-connection</span><span class="p">)))</span>
      <span class="p">(</span><span class="nb">let</span> <span class="p">((</span><span class="nv">init-db</span> <span class="p">(</span><span class="nv">not</span> <span class="p">(</span><span class="nf">file-exists-p</span> <span class="nv">org-roam-db-location</span><span class="p">))))</span>
        <span class="p">(</span><span class="nv">make-directory</span> <span class="p">(</span><span class="nf">file-name-directory</span> <span class="nv">org-roam-db-location</span><span class="p">)</span> <span class="no">t</span><span class="p">)</span>
        <span class="p">(</span><span class="nb">let</span> <span class="p">((</span><span class="nv">conn</span> <span class="p">(</span><span class="nv">emacsql-sqlite3</span> <span class="nv">org-roam-db-location</span><span class="p">)))</span>
          <span class="p">(</span><span class="nv">emacsql</span> <span class="nv">conn</span> <span class="p">[</span><span class="nb">:pragma</span> <span class="p">(</span><span class="nf">=</span> <span class="nv">foreign_keys</span> <span class="nv">ON</span><span class="p">)])</span>
          <span class="p">(</span><span class="nf">set-process-query-on-exit-flag</span> <span class="p">(</span><span class="nv">emacsql-process</span> <span class="nv">conn</span><span class="p">)</span> <span class="no">nil</span><span class="p">)</span>
          <span class="p">(</span><span class="nf">puthash</span> <span class="p">(</span><span class="nf">expand-file-name</span> <span class="nv">org-roam-directory</span><span class="p">)</span>
                   <span class="nv">conn</span>
                   <span class="nv">org-roam-db--connection</span><span class="p">)</span>
          <span class="p">(</span><span class="nb">when</span> <span class="nv">init-db</span>
            <span class="p">(</span><span class="nv">org-roam-db--init</span> <span class="nv">conn</span><span class="p">))</span>
          <span class="p">(</span><span class="nb">let*</span> <span class="p">((</span><span class="nv">version</span> <span class="p">(</span><span class="nv">caar</span> <span class="p">(</span><span class="nv">emacsql</span> <span class="nv">conn</span> <span class="s">&#34;PRAGMA user_version&#34;</span><span class="p">)))</span>
                 <span class="p">(</span><span class="nv">version</span> <span class="p">(</span><span class="nv">org-roam-db--upgrade-maybe</span> <span class="nv">conn</span> <span class="nv">version</span><span class="p">)))</span>
            <span class="p">(</span><span class="nb">cond</span>
             <span class="p">((</span><span class="nf">&gt;</span> <span class="nv">version</span> <span class="nv">org-roam-db-version</span><span class="p">)</span>
              <span class="p">(</span><span class="nv">emacsql-close</span> <span class="nv">conn</span><span class="p">)</span>
              <span class="p">(</span><span class="ne">user-error</span>
               <span class="s">&#34;The Org-roam database was created with a newer Org-roam version.  &#34;</span>
               <span class="s">&#34;You need to update the Org-roam package&#34;</span><span class="p">))</span>
             <span class="p">((</span><span class="nf">&lt;</span> <span class="nv">version</span> <span class="nv">org-roam-db-version</span><span class="p">)</span>
              <span class="p">(</span><span class="nv">emacsql-close</span> <span class="nv">conn</span><span class="p">)</span>
              <span class="p">(</span><span class="ne">error</span> <span class="s">&#34;BUG: The Org-roam database scheme changed %s&#34;</span>
                     <span class="s">&#34;and there is no upgrade path&#34;</span><span class="p">)))))))</span>
    <span class="p">(</span><span class="nv">org-roam-db--get-connection</span><span class="p">))</span>
  <span class="p">(</span><span class="nb">defun</span> <span class="nv">org-roam-db--init</span> <span class="p">(</span><span class="nv">db</span><span class="p">)</span>
    <span class="s">&#34;Initialize database DB with the correct schema and user version.&#34;</span>
    <span class="p">(</span><span class="nv">emacsql-with-transaction</span> <span class="nv">db</span>
      <span class="p">(</span><span class="nv">emacsql</span> <span class="nv">db</span> <span class="s">&#34;PRAGMA foreign_keys = ON&#34;</span><span class="p">)</span> <span class="c1">;; added</span>
      <span class="p">(</span><span class="nv">emacsql</span> <span class="nv">db</span> <span class="p">[</span><span class="nb">:pragma</span> <span class="p">(</span><span class="nf">=</span> <span class="nv">foreign_keys</span> <span class="nv">ON</span><span class="p">)])</span>
      <span class="p">(</span><span class="nb">pcase-dolist</span> <span class="p">(</span><span class="o">`</span><span class="p">(</span><span class="o">,</span><span class="nv">table</span> <span class="o">,</span><span class="nv">schema</span><span class="p">)</span> <span class="nv">org-roam-db--table-schemata</span><span class="p">)</span>
        <span class="p">(</span><span class="nv">emacsql</span> <span class="nv">db</span> <span class="p">[</span><span class="nb">:create-table</span> <span class="nv">$i1</span> <span class="nv">$S2</span><span class="p">]</span> <span class="nv">table</span> <span class="nv">schema</span><span class="p">))</span>
      <span class="p">(</span><span class="nb">pcase-dolist</span> <span class="p">(</span><span class="o">`</span><span class="p">(</span><span class="o">,</span><span class="nv">index-name</span> <span class="o">,</span><span class="nv">table</span> <span class="o">,</span><span class="nv">columns</span><span class="p">)</span> <span class="nv">org-roam-db--table-indices</span><span class="p">)</span>
        <span class="p">(</span><span class="nv">emacsql</span> <span class="nv">db</span> <span class="p">[</span><span class="nb">:create-index</span> <span class="nv">$i1</span> <span class="nb">:on</span> <span class="nv">$i2</span> <span class="nv">$S3</span><span class="p">]</span> <span class="nv">index-name</span> <span class="nv">table</span> <span class="nv">columns</span><span class="p">))</span>
      <span class="p">(</span><span class="nv">emacsql</span> <span class="nv">db</span> <span class="p">(</span><span class="nf">format</span> <span class="s">&#34;PRAGMA user_version = %s&#34;</span> <span class="nv">org-roam-db-version</span><span class="p">))))</span>
  <span class="c1">;; end chunglak hack</span>

  <span class="p">(</span><span class="nv">org-roam-setup</span><span class="p">)</span>
  <span class="c1">;; If using org-roam-protocol</span>
  <span class="p">(</span><span class="nb">require</span> <span class="ss">&#39;org-roam-protocol</span><span class="p">))</span>

<span class="c1">;; These are my capture templates:</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">org-roam-capture-templates</span>
      <span class="o">`</span><span class="p">((</span><span class="s">&#34;d&#34;</span> <span class="s">&#34;default&#34;</span> <span class="nv">plain</span> <span class="s">&#34;%?&#34;</span> <span class="nb">:if-new</span>
         <span class="p">(</span><span class="nv">file+head</span> <span class="s">&#34;%&lt;%Y%m%d%H%M%S&gt;-${slug}.org&#34;</span>
                    <span class="o">,</span><span class="p">(</span><span class="nf">concat</span> <span class="s">&#34;#+title: ${title}\n&#34;</span>
                             <span class="s">&#34;#+date: %U\n\n&#34;</span><span class="p">))</span>
         <span class="nb">:unnarrowed</span> <span class="no">t</span><span class="p">)))</span>

<span class="p">(</span><span class="nb">setq</span> <span class="nv">org-roam-dailies-directory</span> <span class="s">&#34;~/Documents/Org/org-roam/daily&#34;</span><span class="p">)</span>

<span class="p">(</span><span class="nb">setq</span> <span class="nv">org-roam-dailies-capture-templates</span>
      <span class="o">`</span><span class="p">((</span><span class="s">&#34;d&#34;</span> <span class="s">&#34;default&#34;</span> <span class="nv">entry</span> <span class="s">&#34;* %?&#34;</span> <span class="nb">:if-new</span>
         <span class="p">(</span><span class="nv">file+head</span> <span class="s">&#34;%(concat org-roam-dailies-directory \&#34;/%&lt;%Y-%m-%d&gt;.org\&#34;)&#34;</span>
                    <span class="o">,</span><span class="p">(</span><span class="nf">concat</span> <span class="s">&#34;#+title: %&lt;%Y-%m-%d&gt;&#34;</span> <span class="s">&#34;\n&#34;</span>
                             <span class="s">&#34;#+filetags: :daily_journal:\n\n&#34;</span><span class="p">)))))</span>

<span class="c1">;; deft - one way to search Org-roam notes, but not the fastest (see below)</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">deft</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:config</span>
  <span class="nb">:after</span> <span class="nv">org</span>
  <span class="nb">:bind</span>
  <span class="p">(</span><span class="s">&#34;C-c r d&#34;</span> <span class="o">.</span> <span class="nv">deft</span><span class="p">)</span>
  <span class="nb">:custom</span>
  <span class="p">(</span><span class="nv">deft-recursive</span> <span class="no">t</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">deft-use-filter-string-for-filename</span> <span class="no">t</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">deft-default-extension</span> <span class="s">&#34;org&#34;</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">deft-directory</span> <span class="s">&#34;~/Documents/Org/org-roam/&#34;</span><span class="p">))</span>

<span class="c1">;; Here end the basic setup, but....</span>

<span class="c1">;; SOME OTHER THINGS YOU MIGHT ADD</span>

<span class="c1">;; bars seems pointless here, but if you like, don&#39;t do this</span>
<span class="p">(</span><span class="nv">menu-bar-mode</span> <span class="mi">-1</span><span class="p">)</span>
<span class="p">(</span><span class="nv">tool-bar-mode</span> <span class="mi">-1</span><span class="p">)</span>

<span class="c1">;; You could use a different theme</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">cyberpunk-theme</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:config</span>
  <span class="p">(</span><span class="nv">load-theme</span> <span class="ss">&#39;cyberpunk</span><span class="p">))</span>

<span class="c1">;;;;;;;;;;;;;;;;;;;;;</span>
<span class="c1">;; Spell-checking ;;;</span>
<span class="c1">;;;;;;;;;;;;;;;;;;;;;</span>
<span class="p">(</span><span class="nb">require</span> <span class="ss">&#39;flymake</span><span class="p">)</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">ispell-program-name</span> <span class="s">&#34;hunspell&#34;</span><span class="p">)</span> <span class="c1">; could be ispell as well, depending on your preferences</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">ispell-dictionary</span> <span class="s">&#34;en_GB&#34;</span><span class="p">)</span> <span class="c1">; this can obviously be set to any language your spell-checking program supports</span>
<span class="c1">;; I installed the en_GB ones, but these don&#39;t come in Termux by default. To add arbitrary hunspell languages, see:</span>
<span class="c1">;; https://www.reddit.com/r/termux/comments/k5o6mp/new_hunspell_dictionaries/?</span>
<span class="c1">;; in summary:</span>
<span class="c1">;; - how to add new: copy .aff and .dic files in /data/data/com.termux/files/usr/share/hunspell/</span>
<span class="c1">;; - where to get new: https://www.freeoffice.com/en/download/dictionaries</span>

<span class="p">(</span><span class="nb">dolist</span> <span class="p">(</span><span class="nv">hook</span> <span class="o">&#39;</span><span class="p">(</span><span class="nv">org-mode-hook</span><span class="p">))</span>
  <span class="p">(</span><span class="nv">add-hook</span> <span class="nv">hook</span> <span class="p">(</span><span class="nb">lambda</span> <span class="p">()</span> <span class="p">(</span><span class="nv">flyspell-mode</span> <span class="mi">1</span><span class="p">))))</span>
<span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;org-mode-hook</span> <span class="p">(</span><span class="nb">lambda</span> <span class="p">()</span> <span class="p">(</span><span class="nb">setq</span> <span class="nv">ispell-parser</span> <span class="ss">&#39;tex</span><span class="p">)))</span> <span class="c1">; make orgmode recognise LaTeX syntax [from http://stackoverflow.com/questions/11646880/flyspell-in-org-mode-recognize-latex-syntax-like-auctex ]</span>
<span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;text-mode-hook</span> <span class="nf">#&#39;</span><span class="nv">flyspell-mode</span><span class="p">)</span>

<span class="c1">;;;;;;;;;;;;;;;</span>
<span class="c1">;; Undo-Tree ;; - a new undo package</span>
<span class="c1">;;;;;;;;;;;;;;;</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">undo-tree</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:config</span>
  <span class="c1">;; (setq undo-tree-auto-save-history 1)</span>
  <span class="c1">;; Each node in the undo tree should have a timestamp.</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">undo-tree-visualizer-timestamps</span> <span class="no">t</span><span class="p">)</span>
  <span class="c1">;; Show a diff window displaying changes between undo nodes.</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">undo-tree-visualizer-diff</span> <span class="no">t</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">global-undo-tree-mode</span><span class="p">))</span>

<span class="c1">;; display time and date in modeline, if you like</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">display-time-day-and-date</span> <span class="no">t</span><span class="p">)</span>
<span class="p">(</span><span class="nv">display-time-mode</span> <span class="mi">1</span><span class="p">)</span>

<span class="c1">;; prettier bullets</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">org-bullets</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:config</span>
  <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;org-mode-hook</span> <span class="p">(</span><span class="nb">lambda</span> <span class="p">()</span> <span class="p">(</span><span class="nv">org-bullets-mode</span> <span class="mi">1</span><span class="p">)))</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">org-bullets-bullet-list</span> <span class="o">&#39;</span><span class="p">(</span><span class="s">&#34;⋇&#34;</span> <span class="s">&#34;∴&#34;</span> <span class="s">&#34;∵&#34;</span> <span class="s">&#34;∷&#34;</span> <span class="s">&#34;∺&#34;</span><span class="p">)))</span>

<span class="c1">;; A nice way of quickly adding links.</span>
<span class="c1">;; (Though in Termux, you first must paste from your</span>
<span class="c1">;; Android clipboard and then copy/kill via Emacs before</span>
<span class="c1">;; it&#39;ll work.)</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">org-cliplink</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:config</span>
  <span class="p">(</span><span class="nf">define-key</span> <span class="nv">org-mode-map</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">&#34;C-c o c&#34;</span><span class="p">)</span> <span class="nf">#&#39;</span><span class="nv">org-cliplink</span><span class="p">))</span>

<span class="c1">;; This is also not needed, but adds some (dubiously) useful properties</span>
<span class="c1">;; to the Org-roam file&#39;s property drawer.</span>

<span class="c1">;; First, set up a system for getting location</span>
<span class="c1">;; (we could also try to leverage termux&#39;s built-in</span>
<span class="c1">;; GPS location abilities via `termux-location`, but</span>
<span class="c1">;; it seems a bit slow and doesn&#39;t even always work if</span>
<span class="c1">;; your device can&#39;t get a good satellite connection.)</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">calendar-latitude</span> <span class="mi">0</span><span class="p">)</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">calendar-longitude</span> <span class="mi">0</span><span class="p">)</span>
<span class="p">(</span><span class="nb">defun</span> <span class="nv">bms/get-lat-long-from-ipinfo</span> <span class="p">()</span>
  <span class="p">(</span><span class="nb">let*</span>
      <span class="p">((</span><span class="nv">latlong</span> <span class="p">(</span><span class="nf">substring</span>
                 <span class="p">(</span><span class="nv">shell-command-to-string</span> <span class="s">&#34;curl -s &#39;ipinfo.io/loc&#39;&#34;</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">-1</span><span class="p">))</span>
       <span class="p">(</span><span class="nv">latlong-list</span> <span class="p">(</span><span class="nv">split-string</span> <span class="nv">latlong</span> <span class="s">&#34;,&#34;</span><span class="p">)))</span>
    <span class="p">(</span><span class="nb">setq</span> <span class="nv">calendar-latitude</span> <span class="p">(</span><span class="nf">string-to-number</span> <span class="p">(</span><span class="nf">car</span> <span class="nv">latlong-list</span><span class="p">)))</span>
    <span class="p">(</span><span class="nb">setq</span> <span class="nv">calendar-longitude</span> <span class="p">(</span><span class="nf">string-to-number</span> <span class="p">(</span><span class="nv">cadr</span> <span class="nv">latlong-list</span><span class="p">)))))</span>

<span class="p">(</span><span class="nb">defun</span> <span class="nv">bms/add-other-auto-props-to-org-roam-properties</span> <span class="p">()</span>
  <span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nf">file-exists-p</span> <span class="p">(</span><span class="nf">buffer-file-name</span><span class="p">))</span>
    <span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nv">org-find-property</span> <span class="s">&#34;CREATION_TIME&#34;</span><span class="p">)</span>
      <span class="p">(</span><span class="nv">org-roam-add-property</span> <span class="p">(</span><span class="nf">format-time-string</span> <span class="s">&#34;%s&#34;</span>
                                                 <span class="p">(</span><span class="nf">nth</span> <span class="mi">5</span>
                                                      <span class="p">(</span><span class="nf">file-attributes</span> <span class="p">(</span><span class="nf">buffer-file-name</span><span class="p">))))</span>
                             <span class="s">&#34;CREATION_TIME&#34;</span><span class="p">))</span>
    <span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nv">org-find-property</span> <span class="s">&#34;AUTHOR&#34;</span><span class="p">)</span>
      <span class="p">(</span><span class="nv">org-roam-add-property</span> <span class="nv">roam-user</span> <span class="s">&#34;AUTHOR&#34;</span><span class="p">))</span>
    <span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nv">org-find-property</span> <span class="s">&#34;MAIL&#34;</span><span class="p">)</span>
      <span class="p">(</span><span class="nv">org-roam-add-property</span> <span class="nv">roam-email</span> <span class="s">&#34;MAIL&#34;</span><span class="p">))</span>
    <span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nv">org-find-property</span> <span class="s">&#34;LAT_LONG&#34;</span><span class="p">)</span>
      <span class="p">(</span><span class="nv">bms/get-lat-long-from-ipinfo</span><span class="p">)</span>
      <span class="p">(</span><span class="nv">org-roam-add-property</span> <span class="p">(</span><span class="nf">concat</span> <span class="p">(</span><span class="nf">number-to-string</span> <span class="nv">calendar-latitude</span><span class="p">)</span> <span class="s">&#34;,&#34;</span> <span class="p">(</span><span class="nf">number-to-string</span> <span class="nv">calendar-longitude</span><span class="p">))</span> <span class="s">&#34;LAT-LONG&#34;</span><span class="p">))))</span>

<span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;org-roam-capture-new-node-hook</span> <span class="nf">#&#39;</span><span class="nv">bms/add-other-auto-props-to-org-roam-properties</span><span class="p">)</span>

<span class="c1">;; You could use Ivy or Helm or the default, but I</span>
<span class="c1">;; like Selectrum, Consult &amp; friends. Plus we can leverage</span>
<span class="c1">;; Consult for a nice alternative to deft for note-searching.</span>
<span class="c1">;; You&#39;ll need this to use my ripgrep note searching feature below.</span>

<span class="c1">;; selectrum</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">selectrum</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:config</span>
  <span class="p">(</span><span class="nv">selectrum-mode</span> <span class="mi">+1</span><span class="p">))</span>

<span class="c1">;; ;; prescient  - T9</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">prescient</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:config</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">prescient-persist-mode</span> <span class="no">t</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">prescient-filter-method</span> <span class="o">&#39;</span><span class="p">(</span><span class="nv">literal</span> <span class="nv">regexp</span> <span class="nv">initialism</span> <span class="nv">fuzzy</span><span class="p">)))</span> <span class="c1">;; added fuzzy</span>

<span class="p">(</span><span class="nb">use-package</span> <span class="nv">orderless</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:init</span> <span class="p">(</span><span class="nv">icomplete-mode</span><span class="p">)</span>                <span class="c1">; optional but recommended!</span>
  <span class="nb">:custom</span> <span class="p">(</span><span class="nv">completion-styles</span> <span class="o">&#39;</span><span class="p">(</span><span class="nv">orderless</span><span class="p">))</span>
  <span class="nb">:config</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">orderless-matching-styles</span> <span class="o">&#39;</span><span class="p">(</span><span class="nv">orderless-flex</span><span class="p">))</span>
  <span class="c1">;; This means that the company-capf backend will automatically use orderless, but following issue exists:</span>
  <span class="c1">;; Pressing SPC takes you out of completion, so with the default separator you are limited to one component,</span>
  <span class="c1">;; which is no fun. To fix this add a separator that is allowed to occur in identifiers, for example, for</span>
  <span class="c1">;; Emacs Lisp code you could use an ampersand:</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">orderless-component-separator</span> <span class="s">&#34;[ &amp;]&#34;</span><span class="p">)</span>

  <span class="c1">;; The matching portions of candidates aren’t highlighted. But while you can’t get different faces for</span>
  <span class="c1">;; different components, you can at least get the matches highlighted in the sole available face with this configuration</span>
  <span class="p">(</span><span class="nb">defun</span> <span class="nv">just-one-face</span> <span class="p">(</span><span class="nv">fn</span> <span class="kp">&amp;rest</span> <span class="nv">args</span><span class="p">)</span>
    <span class="p">(</span><span class="nb">let</span> <span class="p">((</span><span class="nv">orderless-match-faces</span> <span class="p">[</span><span class="nv">completions-common-part</span><span class="p">]))</span>
      <span class="p">(</span><span class="nf">apply</span> <span class="nv">fn</span> <span class="nv">args</span><span class="p">)))</span>

  <span class="p">(</span><span class="nv">advice-add</span> <span class="ss">&#39;company-capf--candidates</span> <span class="nb">:around</span> <span class="nf">#&#39;</span><span class="nv">just-one-face</span><span class="p">))</span>

<span class="p">(</span><span class="nb">use-package</span> <span class="nv">selectrum-prescient</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:config</span>
  <span class="c1">;; to make sorting and filtering more intelligent</span>
  <span class="p">(</span><span class="nv">selectrum-prescient-mode</span> <span class="mi">+1</span><span class="p">)</span>

  <span class="c1">;; Filtering with orderless</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">selectrum-refine-candidates-function</span> <span class="nf">#&#39;</span><span class="nv">orderless-filter</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">selectrum-highlight-candidates-function</span> <span class="nf">#&#39;</span><span class="nv">orderless-highlight-matches</span><span class="p">)</span>

  <span class="c1">;; If you also configure `completion-styles` for orderless you might want to use the</span>
  <span class="c1">;; following advice because orderless isn&#39;t well suited for initial gathering of</span>
  <span class="c1">;; candidates by completion in region.</span>
  <span class="p">(</span><span class="nv">advice-add</span> <span class="nf">#&#39;</span><span class="nv">completion--category-override</span> <span class="nb">:filter-return</span>
              <span class="p">(</span><span class="nb">defun</span> <span class="nv">completion-in-region-style-setup+</span> <span class="p">(</span><span class="nv">res</span><span class="p">)</span>
                <span class="s">&#34;Fallback to default styles for region completions with orderless.&#34;</span>
                <span class="p">(</span><span class="nb">or</span> <span class="nv">res</span>
                    <span class="c1">;; Don&#39;t use orderless for initial candidate gathering.</span>
                    <span class="p">(</span><span class="nb">and</span> <span class="nv">completion-in-region-mode-predicate</span>
                         <span class="p">(</span><span class="nv">not</span> <span class="p">(</span><span class="nf">minibufferp</span><span class="p">))</span>
                         <span class="p">(</span><span class="nf">equal</span> <span class="o">&#39;</span><span class="p">(</span><span class="nv">orderless</span><span class="p">)</span> <span class="nv">completion-styles</span><span class="p">)</span>
                         <span class="o">&#39;</span><span class="p">(</span><span class="nv">basic</span> <span class="nv">partial-completion</span> <span class="nv">emacs22</span><span class="p">)))))</span>

  <span class="c1">;; Minibuffer-actions with embark</span>

  <span class="c1">;; You should bind embark commands like embark-act, embark-act-noexit</span>
  <span class="c1">;; and embark-export in minibuffer-local-map (as embark commands are not selectrum specific).</span>
  <span class="c1">;; For available commands and other embark configurations see the embark documentation and its wiki.</span>

  <span class="p">(</span><span class="nb">defun</span> <span class="nv">current-candidate+category</span> <span class="p">()</span>
    <span class="p">(</span><span class="nb">when</span> <span class="nv">selectrum-is-active</span>
      <span class="p">(</span><span class="nf">cons</span> <span class="p">(</span><span class="nv">selectrum--get-meta</span> <span class="ss">&#39;category</span><span class="p">)</span>
            <span class="p">(</span><span class="nv">selectrum-get-current-candidate</span><span class="p">))))</span>

  <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;embark-target-finders</span> <span class="nf">#&#39;</span><span class="nv">current-candidate+category</span><span class="p">)</span>

  <span class="p">(</span><span class="nb">defun</span> <span class="nv">current-candidates+category</span> <span class="p">()</span>
    <span class="p">(</span><span class="nb">when</span> <span class="nv">selectrum-is-active</span>
      <span class="p">(</span><span class="nf">cons</span> <span class="p">(</span><span class="nv">selectrum--get-meta</span> <span class="ss">&#39;category</span><span class="p">)</span>
            <span class="p">(</span><span class="nv">selectrum-get-current-candidates</span>
             <span class="c1">;; Pass relative file names for dired.</span>
             <span class="nv">minibuffer-completing-file-name</span><span class="p">))))</span>

  <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;embark-candidate-collectors</span> <span class="nf">#&#39;</span><span class="nv">current-candidates+category</span><span class="p">)</span>
  <span class="c1">;; No unnecessary computation delay after injection.</span>
  <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;embark-setup-hook</span> <span class="ss">&#39;selectrum-set-selected-candidate</span><span class="p">)</span>

  <span class="c1">;; The following is not selectrum specific but included here for convenience.</span>
  <span class="c1">;; If you don&#39;t want to use which-key as a key prompter skip the following code.</span>

  <span class="p">(</span><span class="nb">setq</span> <span class="nv">embark-action-indicator</span>
        <span class="p">(</span><span class="nb">lambda</span> <span class="p">(</span><span class="nv">map</span><span class="p">)</span> <span class="p">(</span><span class="nv">which-key--show-keymap</span> <span class="s">&#34;Embark&#34;</span> <span class="nv">map</span> <span class="no">nil</span> <span class="no">nil</span> <span class="ss">&#39;no-paging</span><span class="p">)</span>
          <span class="nf">#&#39;</span><span class="nv">which-key--hide-popup-ignore-command</span><span class="p">)</span>
        <span class="nv">embark-become-indicator</span> <span class="nv">embark-action-indicator</span><span class="p">)</span>

  <span class="c1">;; to save your command history on disk, so the sorting gets more</span>
  <span class="c1">;; intelligent over time</span>
  <span class="p">(</span><span class="nv">prescient-persist-mode</span> <span class="mi">+1</span><span class="p">))</span>

<span class="c1">;; Example configuration for Consult</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">consult</span>
  <span class="c1">;; Replace bindings. Lazily loaded due by `use-package&#39;.</span>
  <span class="nb">:bind</span> <span class="p">((</span><span class="s">&#34;C-x M-:&#34;</span> <span class="o">.</span> <span class="nv">consult-complex-command</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-c h&#34;</span> <span class="o">.</span> <span class="nv">consult-history</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-c m&#34;</span> <span class="o">.</span> <span class="nv">consult-mode-command</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-x b&#34;</span> <span class="o">.</span> <span class="nv">consult-buffer</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-x 4 b&#34;</span> <span class="o">.</span> <span class="nv">consult-buffer-other-window</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-x 5 b&#34;</span> <span class="o">.</span> <span class="nv">consult-buffer-other-frame</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-x r x&#34;</span> <span class="o">.</span> <span class="nv">consult-register</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;C-x r b&#34;</span> <span class="o">.</span> <span class="nv">consult-bookmark</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;M-g g&#34;</span> <span class="o">.</span> <span class="nv">consult-goto-line</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;M-g M-g&#34;</span> <span class="o">.</span> <span class="nv">consult-goto-line</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;M-g o&#34;</span> <span class="o">.</span> <span class="nv">consult-outline</span><span class="p">)</span>       <span class="c1">;; &#34;M-s o&#34; is a good alternative.</span>
         <span class="p">(</span><span class="s">&#34;M-g l&#34;</span> <span class="o">.</span> <span class="nv">consult-line</span><span class="p">)</span>          <span class="c1">;; &#34;M-s l&#34; is a good alternative.</span>
         <span class="p">(</span><span class="s">&#34;M-g m&#34;</span> <span class="o">.</span> <span class="nv">consult-mark</span><span class="p">)</span>          <span class="c1">;; I recommend to bind Consult navigation</span>
         <span class="p">(</span><span class="s">&#34;M-g k&#34;</span> <span class="o">.</span> <span class="nv">consult-global-mark</span><span class="p">)</span>   <span class="c1">;; commands under the &#34;M-g&#34; prefix.</span>
         <span class="p">(</span><span class="s">&#34;M-g r&#34;</span> <span class="o">.</span> <span class="nv">consult-ripgrep</span><span class="p">)</span>      <span class="c1">;; or consult-grep, consult-ripgrep</span>
         <span class="p">(</span><span class="s">&#34;M-g f&#34;</span> <span class="o">.</span> <span class="nv">consult-find</span><span class="p">)</span>          <span class="c1">;; or consult-locate, my-fdfind</span>
         <span class="p">(</span><span class="s">&#34;M-g i&#34;</span> <span class="o">.</span> <span class="nv">consult-project-imenu</span><span class="p">)</span> <span class="c1">;; or consult-imenu</span>
         <span class="p">(</span><span class="s">&#34;M-g e&#34;</span> <span class="o">.</span> <span class="nv">consult-error</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;M-s m&#34;</span> <span class="o">.</span> <span class="nv">consult-multi-occur</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;M-y&#34;</span> <span class="o">.</span> <span class="nv">consult-yank-pop</span><span class="p">)</span>
         <span class="p">(</span><span class="s">&#34;&lt;help&gt; a&#34;</span> <span class="o">.</span> <span class="nv">consult-apropos</span><span class="p">))</span>

  <span class="c1">;; The :init configuration is always executed (Not lazy!)</span>
  <span class="nb">:init</span>

  <span class="c1">;; Custom command wrappers. It is generally encouraged to write your own</span>
  <span class="c1">;; commands based on the Consult commands. Some commands have arguments which</span>
  <span class="c1">;; allow tweaking. Furthermore global configuration variables can be set</span>
  <span class="c1">;; locally in a let-binding.</span>
  <span class="p">(</span><span class="nb">defun</span> <span class="nv">my-fdfind</span> <span class="p">(</span><span class="kp">&amp;optional</span> <span class="nv">dir</span><span class="p">)</span>
    <span class="p">(</span><span class="nb">interactive</span> <span class="s">&#34;P&#34;</span><span class="p">)</span>
    <span class="p">(</span><span class="nb">let</span> <span class="p">((</span><span class="nv">consult-find-command</span> <span class="o">&#39;</span><span class="p">(</span><span class="s">&#34;fdfind&#34;</span> <span class="s">&#34;--color=never&#34;</span> <span class="s">&#34;--full-path&#34;</span><span class="p">)))</span>
      <span class="p">(</span><span class="nv">consult-find</span> <span class="nv">dir</span><span class="p">)))</span>

  <span class="c1">;; Replace `multi-occur&#39; with `consult-multi-occur&#39;, which is a drop-in replacement.</span>
  <span class="p">(</span><span class="nf">fset</span> <span class="ss">&#39;multi-occur</span> <span class="nf">#&#39;</span><span class="nv">consult-multi-occur</span><span class="p">)</span>

  <span class="c1">;; Configure other variables and modes in the :config section, after lazily loading the package</span>
  <span class="nb">:config</span>

  <span class="c1">;; Configure preview. Note that the preview-key can also be configured on a</span>
  <span class="c1">;; per-command basis via `consult-config&#39;.</span>
  <span class="c1">;; (setq consult-preview-key &#39;any) ;; any key triggers preview, the default</span>

  <span class="c1">;; Optionally configure narrowing key.</span>
  <span class="c1">;; Both &lt; and C-+ work reasonably well.</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">consult-narrow-key</span> <span class="s">&#34;&lt;&#34;</span><span class="p">)</span> <span class="c1">;; (kbd &#34;C-+&#34;)</span>
  <span class="c1">;; Optionally make narrowing help available in the minibuffer.</span>
  <span class="c1">;; Probably not needed if you are using which-key.</span>
  <span class="c1">;; (define-key consult-narrow-map (vconcat consult-narrow-key &#34;?&#34;) #&#39;consult-narrow-help)</span>

  <span class="c1">;; Optional configure a view library to be used by `consult-buffer&#39;.</span>
  <span class="c1">;; The view library must provide two functions, one to open the view by name,</span>
  <span class="c1">;; and one function which must return a list of views as strings.</span>
  <span class="c1">;; Example: https://github.com/minad/bookmark-view/</span>
  <span class="c1">;; (setq consult-view-open-function #&#39;bookmark-jump</span>
  <span class="c1">;;       consult-view-list-function #&#39;bookmark-view-names)</span>

  <span class="c1">;; Optionally configure a function which returns the project root directory</span>
  <span class="c1">;; (autoload &#39;projectile-project-root &#34;projectile&#34;)</span>
  <span class="c1">;; (setq consult-project-root-function #&#39;projectile-project-root)</span>
  <span class="p">)</span>

<span class="c1">;; Optionally add the `consult-flycheck&#39; command.</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">consult-flycheck</span>
  <span class="nb">:bind</span> <span class="p">(</span><span class="nb">:map</span> <span class="nv">flycheck-command-map</span>
              <span class="p">(</span><span class="s">&#34;!&#34;</span> <span class="o">.</span> <span class="nv">consult-flycheck</span><span class="p">)))</span>

<span class="c1">;; Optionally enable richer annotations using the Marginalia package</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">marginalia</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="c1">;; The :init configuration is always executed (Not lazy!)</span>
  <span class="nb">:init</span>
  <span class="c1">;; Must be in the :init section of use-package such that the mode gets</span>
  <span class="c1">;; enabled right away. Note that this forces loading the package.</span>
  <span class="p">(</span><span class="nv">marginalia-mode</span><span class="p">))</span>

<span class="p">(</span><span class="nb">use-package</span> <span class="nv">embark</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:bind</span>
  <span class="p">(</span><span class="s">&#34;C-S-a&#34;</span> <span class="o">.</span> <span class="nv">embark-act</span><span class="p">)</span>               <span class="c1">; pick some comfortable binding</span>
  <span class="nb">:config</span>
  <span class="c1">;; For Selectrum users:</span>
  <span class="p">(</span><span class="nb">defun</span> <span class="nv">current-candidate+category</span> <span class="p">()</span>
    <span class="p">(</span><span class="nb">when</span> <span class="nv">selectrum-is-active</span>
      <span class="p">(</span><span class="nf">cons</span> <span class="p">(</span><span class="nv">selectrum--get-meta</span> <span class="ss">&#39;category</span><span class="p">)</span>
            <span class="p">(</span><span class="nv">selectrum-get-current-candidate</span><span class="p">))))</span>

  <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;embark-target-finders</span> <span class="nf">#&#39;</span><span class="nv">current-candidate+category</span><span class="p">)</span>

  <span class="p">(</span><span class="nb">defun</span> <span class="nv">current-candidates+category</span> <span class="p">()</span>
    <span class="p">(</span><span class="nb">when</span> <span class="nv">selectrum-is-active</span>
      <span class="p">(</span><span class="nf">cons</span> <span class="p">(</span><span class="nv">selectrum--get-meta</span> <span class="ss">&#39;category</span><span class="p">)</span>
            <span class="p">(</span><span class="nv">selectrum-get-current-candidates</span>
             <span class="c1">;; Pass relative file names for dired.</span>
             <span class="nv">minibuffer-completing-file-name</span><span class="p">))))</span>

  <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;embark-candidate-collectors</span> <span class="nf">#&#39;</span><span class="nv">current-candidates+category</span><span class="p">)</span>

  <span class="c1">;; No unnecessary computation delay after injection.</span>
  <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;embark-setup-hook</span> <span class="ss">&#39;selectrum-set-selected-candidate</span><span class="p">))</span>

<span class="c1">;; org-roam-rg-search - this is a much faster way to search Org-roam notes:</span>
<span class="c1">;; requires the Selectrum+Consult setup immediately preceding.</span>
<span class="c1">;; Use C-c r r to search notes via consult&#39;s ripgrep interface</span>
<span class="p">(</span><span class="nb">defun</span> <span class="nv">bms/org-roam-rg-search</span> <span class="p">()</span>
  <span class="s">&#34;Search org-roam directory using consult-ripgrep. With live-preview.&#34;</span>
  <span class="p">(</span><span class="nb">interactive</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">let</span> <span class="p">((</span><span class="nv">consult-ripgrep</span> <span class="s">&#34;rg --null --ignore-case --type org --line-buffered --color=always --max-columns=500 --no-heading --line-number . -e ARG OPTS&#34;</span><span class="p">))</span>
    <span class="p">(</span><span class="nv">consult-ripgrep</span> <span class="nv">org-roam-directory</span><span class="p">)))</span>

<span class="p">(</span><span class="nv">global-set-key</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">&#34;C-c rr&#34;</span><span class="p">)</span> <span class="ss">&#39;bms/org-roam-rg-search</span><span class="p">)</span>

<span class="c1">;; speed-keys - see https://github.com/alhassy/emacs.d#manipulating-sections</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">org-use-speed-commands</span> <span class="no">t</span><span class="p">)</span>

<span class="c1">;; On an org-heading, C-a goes to after the star, heading markers. To use speed keys, run C-a C-a to get to the star markers.</span>
<span class="c1">;; C-e goes to the end of the heading, not including the tags.</span>
<span class="p">(</span><span class="nb">setq</span> <span class="nv">org-special-ctrl-a/e</span> <span class="no">t</span><span class="p">)</span>

<span class="c1">;;drag images into orgmode</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">org-download</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:config</span>
  <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;dired-mode-hook</span> <span class="ss">&#39;org-download-enable</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">global-set-key</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">&#34;C-c o i&#34;</span><span class="p">)</span> <span class="nf">#&#39;</span><span class="nv">org-download-yank</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">org-download-method</span> <span class="ss">&#39;attach</span><span class="p">))</span>

<span class="p">(</span><span class="nb">defun</span> <span class="nv">bms/org-attach-insert-link</span> <span class="p">(</span><span class="kp">&amp;optional</span> <span class="nv">in-emacs</span><span class="p">)</span>
  <span class="s">&#34;Insert attachment from list.&#34;</span>
  <span class="p">(</span><span class="nb">interactive</span> <span class="s">&#34;P&#34;</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">let</span> <span class="p">((</span><span class="nv">attach-dir</span> <span class="p">(</span><span class="nv">org-attach-dir</span><span class="p">)))</span>
    <span class="p">(</span><span class="nb">if</span> <span class="nv">attach-dir</span>
        <span class="p">(</span><span class="nb">let*</span> <span class="p">((</span><span class="nv">file</span> <span class="p">(</span><span class="nb">pcase</span> <span class="p">(</span><span class="nv">org-attach-file-list</span> <span class="nv">attach-dir</span><span class="p">)</span>
                       <span class="p">(</span><span class="o">`</span><span class="p">(</span><span class="o">,</span><span class="nv">file</span><span class="p">)</span> <span class="nv">file</span><span class="p">)</span>
                       <span class="p">(</span><span class="nv">files</span> <span class="p">(</span><span class="nf">completing-read</span> <span class="s">&#34;Insert attachment: &#34;</span>
                                               <span class="p">(</span><span class="nf">mapcar</span> <span class="nf">#&#39;list</span> <span class="nv">files</span><span class="p">)</span> <span class="no">nil</span> <span class="no">t</span><span class="p">))))</span>
               <span class="p">(</span><span class="nv">path</span> <span class="p">(</span><span class="nf">expand-file-name</span> <span class="nv">file</span> <span class="nv">attach-dir</span><span class="p">))</span>
               <span class="p">(</span><span class="nv">desc</span> <span class="p">(</span><span class="nf">file-name-nondirectory</span> <span class="nv">path</span><span class="p">)))</span>
          <span class="p">(</span><span class="nb">let</span> <span class="p">((</span><span class="nv">initial-input</span>
                 <span class="p">(</span><span class="nb">cond</span>
                  <span class="p">((</span><span class="nv">not</span> <span class="nv">org-link-make-description-function</span><span class="p">)</span> <span class="nv">desc</span><span class="p">)</span>
                  <span class="p">(</span><span class="no">t</span> <span class="p">(</span><span class="nb">condition-case</span> <span class="no">nil</span>
                         <span class="p">(</span><span class="nf">funcall</span> <span class="nv">org-link-make-description-function</span> <span class="nv">link</span> <span class="nv">desc</span><span class="p">)</span>
                       <span class="p">(</span><span class="ne">error</span>
                        <span class="p">(</span><span class="nf">message</span> <span class="s">&#34;Can&#39;t get link description from %S&#34;</span>
                                 <span class="p">(</span><span class="nf">symbol-name</span> <span class="nv">org-link-make-description-function</span><span class="p">))</span>
                        <span class="p">(</span><span class="nv">sit-for</span> <span class="mi">2</span><span class="p">)</span>
                        <span class="no">nil</span><span class="p">))))))</span>
            <span class="p">(</span><span class="nb">setq</span> <span class="nv">desc</span> <span class="p">(</span><span class="nb">if</span> <span class="p">(</span><span class="nv">called-interactively-p</span> <span class="ss">&#39;any</span><span class="p">)</span>
                           <span class="p">(</span><span class="nf">read-string</span> <span class="s">&#34;Description: &#34;</span> <span class="nv">initial-input</span><span class="p">)</span>
                         <span class="nv">initial-input</span><span class="p">))</span>
            <span class="p">(</span><span class="nv">org-insert-link</span> <span class="no">nil</span> <span class="nv">path</span> <span class="p">(</span><span class="nf">concat</span> <span class="s">&#34;attachment:&#34;</span> <span class="nv">desc</span><span class="p">))))</span>
      <span class="p">(</span><span class="ne">error</span> <span class="s">&#34;No attachment directory exist&#34;</span><span class="p">))))</span>
<span class="p">(</span><span class="nf">define-key</span> <span class="nv">org-mode-map</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">&#34;C-c o l&#34;</span><span class="p">)</span> <span class="nf">#&#39;</span><span class="nv">bms/org-attach-insert-link</span><span class="p">)</span>

<span class="c1">;; in case you want some things not in melpa</span>
<span class="c1">;; you&#39;ll need it for the remaining things below</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">quelpa</span>
  <span class="nb">:ensure</span> <span class="no">t</span><span class="p">)</span>

<span class="p">(</span><span class="nb">use-package</span> <span class="nv">quelpa-use-package</span>
  <span class="nb">:ensure</span> <span class="no">t</span><span class="p">)</span>

<span class="c1">;; A bit of sugar for the visual appearance of Org syntax</span>
<span class="c1">;; Use if you like.</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">org-appear</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:quelpa</span> <span class="p">(</span><span class="nv">org-appear</span> <span class="nb">:fetcher</span> <span class="nv">github</span> <span class="nb">:repo</span> <span class="s">&#34;awth13/org-appear&#34;</span><span class="p">)</span>
  <span class="nb">:config</span>
  <span class="p">(</span><span class="nb">setq</span> <span class="nv">org-hide-emphasis-markers</span> <span class="no">t</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;org-mode-hook</span> <span class="ss">&#39;org-appear-mode</span><span class="p">))</span>

<span class="c1">;; You don&#39;t need this, but it&#39;s cool and it does work on Android:</span>
<span class="c1">;; see https://github.com/org-roam/org-roam-ui for features</span>
<span class="p">(</span><span class="nb">use-package</span> <span class="nv">org-roam-ui</span>
  <span class="nb">:ensure</span> <span class="no">t</span>
  <span class="nb">:quelpa</span> <span class="p">(</span><span class="nv">org-roam-ui</span> <span class="nb">:fetcher</span> <span class="nv">github</span> <span class="nb">:repo</span> <span class="s">&#34;org-roam/org-roam-ui&#34;</span> <span class="nb">:branch</span> <span class="s">&#34;main&#34;</span> <span class="nb">:files</span> <span class="p">(</span><span class="s">&#34;*.el&#34;</span> <span class="s">&#34;out&#34;</span><span class="p">))</span>
  <span class="nb">:after</span> <span class="nv">org-roam</span>
  <span class="nb">:hook</span> <span class="p">(</span><span class="nv">org-roam</span> <span class="o">.</span> <span class="nv">org-roam-ui-mode</span><span class="p">))</span>
</code></pre></div><p>An excellent way of keeping Org notes (and files more generally) in
sync between desktop, laptop, and mobile devices is <a href="https://syncthing.net/">Syncthing</a>. On
Android I recommend using the <a href="https://f-droid.org/en/packages/com.github.catfriend1.syncthingandroid/">Syncthing-Fork</a> app (via F-Droid), which has various improvements over the default Syncthing app on Android, including better file-access features. (On iOS there is now a third-party solution for syncing via Syncthing: <a href="https://www.mobiussync.com/">Möbius-Sync</a>. I have no idea how to use Emacs/Org-mode on iOS though, but I recall hearing about some ways of running a Linux shell on iOS like <a href="https://ish.app/">iSH</a>, so possibly there&rsquo;s some way.)</p>
<p>I have Syncthing sync my Org files to a directory in my main &ldquo;home&rdquo;
directory on Android <code>Documents/Org</code> and then in Termux created a
<code>Documents</code> directory and inside of that directory created a symlink to
my actual Org directory via <code>ln -s storage/shared/Documents/Org Org</code>. I&rsquo;ve found that is easier for allowing Syncthing to have access
to the files in order to keep them in sync. (And having my Org files
live at <code>~/Documents/Org</code> in Termux mimics the directory structure on my
Linux boxes, which makes lots of things easier in terms of sharing
configurations.)</p>
]]></content>
            
                 
                    
                         
                        
                            
                             
                                <category scheme="https://babbagefiles.xyz/categories/emacs" term="emacs" label="emacs" />
                             
                                <category scheme="https://babbagefiles.xyz/categories/org" term="org" label="org" />
                            
                        
                    
                 
                    
                 
                    
                         
                        
                            
                             
                                <category scheme="https://babbagefiles.xyz/tags/orgroam" term="orgroam" label="orgroam" />
                             
                                <category scheme="https://babbagefiles.xyz/tags/android" term="android" label="android" />
                            
                        
                    
                
            
        </entry>
    
</feed>
