This commit is contained in:
SqrtMinusOne 2025-11-06 05:02:31 +00:00
parent 0dc31add04
commit 58aa5ad058
15 changed files with 374 additions and 60 deletions

View file

@ -3,7 +3,6 @@
<head> <head>
<title>https://sqrtminusone.xyz/configs/readme/</title> <title>https://sqrtminusone.xyz/configs/readme/</title>
<link rel="canonical" href="https://sqrtminusone.xyz/configs/readme/"> <link rel="canonical" href="https://sqrtminusone.xyz/configs/readme/">
<meta name="robots" content="noindex">
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=https://sqrtminusone.xyz/configs/readme/"> <meta http-equiv="refresh" content="0; url=https://sqrtminusone.xyz/configs/readme/">
</head> </head>

View file

@ -76,7 +76,8 @@
<iframe src="https://ghbtns.com/github-btn.html?user=SqrtMinusOne&repo=dotfiles&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe> <iframe src="https://ghbtns.com/github-btn.html?user=SqrtMinusOne&repo=dotfiles&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe>
</h1> </h1>
<blockquote> <blockquote>
<p>No matter from which side you approach penguins, more always come from behind</p></blockquote> <p>No matter from which side you approach penguins, more always come from behind</p>
</blockquote>
<ul> <ul>
<li>A friend of mine</li> <li>A friend of mine</li>
</ul> </ul>
@ -411,7 +412,8 @@
</span></span></code></pre></div><h4 id="micromamba">Micromamba</h4> </span></span></code></pre></div><h4 id="micromamba">Micromamba</h4>
<p>I&rsquo;ve moved from conda to <a href="https://github.com/mamba-org/mamba">micromamba</a> because it&rsquo;s faster.</p> <p>I&rsquo;ve moved from conda to <a href="https://github.com/mamba-org/mamba">micromamba</a> because it&rsquo;s faster.</p>
<blockquote> <blockquote>
<p>managed by &lsquo;mamba init&rsquo; !!!</p></blockquote> <p>managed by &lsquo;mamba init&rsquo; !!!</p>
</blockquote>
<p>Yeah, tell this to yourself</p> <p>Yeah, tell this to yourself</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>init_mamba <span style="color:#666">()</span> <span style="color:#666">{</span> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>init_mamba <span style="color:#666">()</span> <span style="color:#666">{</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">export</span> <span style="color:#19177c">MAMBA_EXE</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;/home/pavel/.guix-extra-profiles/dev/dev/bin/micromamba&#34;</span>; </span></span><span style="display:flex;"><span> <span style="color:#008000">export</span> <span style="color:#19177c">MAMBA_EXE</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;/home/pavel/.guix-extra-profiles/dev/dev/bin/micromamba&#34;</span>;
@ -1286,7 +1288,7 @@
<li><a href="#android-notes">Android notes</a> <li><a href="#android-notes">Android notes</a>
<ul> <ul>
<li><a href="#installation">Installation</a></li> <li><a href="#installation">Installation</a></li>
<li><a href="#installation-of-dt-s-colorscripts">Installation of <a href="https://gitlab.com/dwt1/shell-color-scripts">DT&rsquo;s colorscripts</a>:</a></li> <li><a href="#installation-of-dt-s-colorscripts">Installation of DTs colorscripts:</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>

View file

@ -725,8 +725,8 @@
</span></span><span style="display:flex;"><span> (<span style="color:#008000">cl-loop</span> <span style="color:#008000">while</span> (<span style="color:#19177c">windmove-find-other-window</span> <span style="color:#19177c">opposite-dir</span>) </span></span><span style="display:flex;"><span> (<span style="color:#008000">cl-loop</span> <span style="color:#008000">while</span> (<span style="color:#19177c">windmove-find-other-window</span> <span style="color:#19177c">opposite-dir</span>)
</span></span><span style="display:flex;"><span> <span style="color:#008000">do</span> (<span style="color:#19177c">windmove-do-window-select</span> <span style="color:#19177c">opposite-dir</span>)))))) </span></span><span style="display:flex;"><span> <span style="color:#008000">do</span> (<span style="color:#19177c">windmove-do-window-select</span> <span style="color:#19177c">opposite-dir</span>))))))
</span></span></code></pre></div><h4 id="update-the-monitor-list">Update the monitor list</h4> </span></span></code></pre></div><h4 id="update-the-monitor-list">Update the monitor list</h4>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/exwm-refresh-monitors</span> () <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/exwm-refresh-monitors</span> (<span style="color:#008000">&amp;optional</span> <span style="color:#19177c">refresh</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">interactive</span>) </span></span><span style="display:flex;"><span> (<span style="color:#008000">interactive</span> (<span style="color:#00f">list</span> <span style="color:#800">t</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">my/exwm-monitor-list</span> (<span style="color:#19177c">my/exwm-xrandr-monitor-list</span>)) </span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">my/exwm-monitor-list</span> (<span style="color:#19177c">my/exwm-xrandr-monitor-list</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">cl-loop</span> <span style="color:#19177c">for</span> <span style="color:#19177c">i</span> <span style="color:#19177c">from</span> <span style="color:#666">0</span> <span style="color:#19177c">to</span> (<span style="color:#00f">1-</span> <span style="color:#19177c">exwm-workspace-number</span>) </span></span><span style="display:flex;"><span> (<span style="color:#008000">cl-loop</span> <span style="color:#19177c">for</span> <span style="color:#19177c">i</span> <span style="color:#19177c">from</span> <span style="color:#666">0</span> <span style="color:#19177c">to</span> (<span style="color:#00f">1-</span> <span style="color:#19177c">exwm-workspace-number</span>)
</span></span><span style="display:flex;"><span> <span style="color:#19177c">for</span> <span style="color:#19177c">monitor</span> <span style="color:#00f">=</span> (<span style="color:#00f">plist-get</span> <span style="color:#19177c">exwm-randr-workspace-monitor-plist</span> </span></span><span style="display:flex;"><span> <span style="color:#19177c">for</span> <span style="color:#19177c">monitor</span> <span style="color:#00f">=</span> (<span style="color:#00f">plist-get</span> <span style="color:#19177c">exwm-randr-workspace-monitor-plist</span>
@ -735,7 +735,8 @@
</span></span><span style="display:flex;"><span> <span style="color:#008000">do</span> </span></span><span style="display:flex;"><span> <span style="color:#008000">do</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setf</span> (<span style="color:#00f">plist-get</span> <span style="color:#19177c">exwm-randr-workspace-monitor-plist</span> <span style="color:#19177c">i</span>) </span></span><span style="display:flex;"><span> (<span style="color:#008000">setf</span> (<span style="color:#00f">plist-get</span> <span style="color:#19177c">exwm-randr-workspace-monitor-plist</span> <span style="color:#19177c">i</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">car</span> <span style="color:#19177c">my/exwm-monitor-list</span>))) </span></span><span style="display:flex;"><span> (<span style="color:#00f">car</span> <span style="color:#19177c">my/exwm-monitor-list</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">exwm-randr-refresh</span>)) </span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> <span style="color:#19177c">refresh</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">exwm-randr-refresh</span>)))
</span></span></code></pre></div><h3 id="completions">Completions</h3> </span></span></code></pre></div><h3 id="completions">Completions</h3>
<p>Setting up some completion interfaces that fit particularly well to use with EXWM. While rofi also works, I want to use Emacs functionality wherever possible to have one completion interface everywhere.</p> <p>Setting up some completion interfaces that fit particularly well to use with EXWM. While rofi also works, I want to use Emacs functionality wherever possible to have one completion interface everywhere.</p>
<h4 id="ivy-posframe">ivy-posframe</h4> <h4 id="ivy-posframe">ivy-posframe</h4>
@ -4189,7 +4190,7 @@
<tbody> <tbody>
<tr> <tr>
<td>office</td> <td>office</td>
<td>libreoffice</td> <td>libreoffice-fresh</td>
</tr> </tr>
<tr> <tr>
<td>office</td> <td>office</td>

View file

@ -76,7 +76,8 @@
<iframe src="https://ghbtns.com/github-btn.html?user=SqrtMinusOne&repo=dotfiles&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe> <iframe src="https://ghbtns.com/github-btn.html?user=SqrtMinusOne&repo=dotfiles&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe>
</h1> </h1>
<blockquote> <blockquote>
<p>One day we won&rsquo;t hate one another, no young boy will march to war and I will clean up my Emacs config. But that day isn&rsquo;t today.</p></blockquote> <p>One day we won&rsquo;t hate one another, no young boy will march to war and I will clean up my Emacs config. But that day isn&rsquo;t today.</p>
</blockquote>
<ul> <ul>
<li>Me, <span class="timestamp-wrapper"><span class="timestamp">&lt;2021-05-27 Thu 17:35&gt; </span></span> in commit 93a0573. Adapted from <a href="https://www.youtube.com/watch?v=pIdBinlW40E">The Dark Element - &ldquo;The Pallbearer Walks Alone&rdquo;</a>. T_T</li> <li>Me, <span class="timestamp-wrapper"><span class="timestamp">&lt;2021-05-27 Thu 17:35&gt; </span></span> in commit 93a0573. Adapted from <a href="https://www.youtube.com/watch?v=pIdBinlW40E">The Dark Element - &ldquo;The Pallbearer Walks Alone&rdquo;</a>. T_T</li>
</ul> </ul>
@ -892,6 +893,11 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
</span></span><span style="display:flex;"><span> (<span style="color:#00f">message</span> <span style="color:#ba2121">&#34;Processed %s as emacs config module&#34;</span> (<span style="color:#00f">buffer-file-name</span>)))) </span></span><span style="display:flex;"><span> (<span style="color:#00f">message</span> <span style="color:#ba2121">&#34;Processed %s as emacs config module&#34;</span> (<span style="color:#00f">buffer-file-name</span>))))
</span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#19177c">add-hook</span> <span style="color:#19177c">&#39;org-babel-post-tangle-hook</span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">my/modules--post-tangle</span>) </span></span><span style="display:flex;"><span>(<span style="color:#19177c">add-hook</span> <span style="color:#19177c">&#39;org-babel-post-tangle-hook</span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">my/modules--post-tangle</span>)
</span></span></code></pre></div><p>Launch Emacs with the <code>remote</code> env (for TRAMP):</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/emacs-tramp</span> ()
</span></span><span style="display:flex;"><span> (<span style="color:#008000">interactive</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">with-environment-variables</span> ((<span style="color:#ba2121">&#34;EMACS_ENV&#34;</span> <span style="color:#ba2121">&#34;remote&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">start-process</span> <span style="color:#ba2121">&#34;emacs-tramp&#34;</span> <span style="color:#800">nil</span> <span style="color:#ba2121">&#34;emacs&#34;</span>)))
</span></span></code></pre></div><h3 id="performance">Performance</h3> </span></span></code></pre></div><h3 id="performance">Performance</h3>
<h4 id="measure-startup-speed">Measure startup speed</h4> <h4 id="measure-startup-speed">Measure startup speed</h4>
<p>A small function to print out the loading time and number of GCs during the loading. Can be useful as a point of data for optimizing Emacs startup time.</p> <p>A small function to print out the loading time and number of GCs during the loading. Can be useful as a point of data for optimizing Emacs startup time.</p>
@ -987,7 +993,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
<p>I have a problem with <code>emacs-lisp-mode</code> as <code>initial-major-mode</code> because in my config it loads <code>lispy</code>, which loads <code>org-mode</code>.</p> <p>I have a problem with <code>emacs-lisp-mode</code> as <code>initial-major-mode</code> because in my config it loads <code>lispy</code>, which loads <code>org-mode</code>.</p>
<p>So until I&rsquo;ve made a better loading screen, this will do.</p> <p>So until I&rsquo;ve made a better loading screen, this will do.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">initial-major-mode</span> <span style="color:#19177c">&#39;fundamental-mode</span>) <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">initial-major-mode</span> <span style="color:#19177c">&#39;fundamental-mode</span>)
</span></span><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">initial-scratch-message</span> <span style="color:#ba2121">&#34;Hello there &lt;3\n\n&#34;</span>) </span></span><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">initial-scratch-message</span> <span style="color:#ba2121">&#34;Hallo Leben&#34;</span>)
</span></span></code></pre></div><h2 id="general-settings">General settings</h2> </span></span></code></pre></div><h2 id="general-settings">General settings</h2>
<h3 id="keybindings">Keybindings</h3> <h3 id="keybindings">Keybindings</h3>
<h4 id="general-dot-el">general.el</h4> <h4 id="general-dot-el">general.el</h4>
@ -1516,7 +1522,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
</span></span><span style="display:flex;"><span>(<span style="color:#19177c">general-imap</span> <span style="color:#ba2121">&#34;M-TAB&#34;</span> <span style="color:#19177c">&#39;company-yasnippet</span>) </span></span><span style="display:flex;"><span>(<span style="color:#19177c">general-imap</span> <span style="color:#ba2121">&#34;M-TAB&#34;</span> <span style="color:#19177c">&#39;company-yasnippet</span>)
</span></span></code></pre></div><h4 id="input-method">Input Method</h4> </span></span></code></pre></div><h4 id="input-method">Input Method</h4>
<blockquote> <blockquote>
<p>I have to switch layouts all the time, especially in LaTeX documents, because for some reason the Bolsheviks abandoned the idea of replacing Russian Cyrillic letters with Latin ones.</p></blockquote> <p>I have to switch layouts all the time, especially in LaTeX documents, because for some reason the Bolsheviks abandoned the idea of replacing Russian Cyrillic letters with Latin ones.</p>
</blockquote>
<ul> <ul>
<li>Me, <span class="timestamp-wrapper"><span class="timestamp">[2021-04-24 Sat]</span></span>, in a commit to <a href="https://github.com/SystemCrafters/crafter-configs">SystemCrafters/crafter-configs</a>.</li> <li>Me, <span class="timestamp-wrapper"><span class="timestamp">[2021-04-24 Sat]</span></span>, in a commit to <a href="https://github.com/SystemCrafters/crafter-configs">SystemCrafters/crafter-configs</a>.</li>
</ul> </ul>
@ -1644,6 +1651,62 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
</span></span><span style="display:flex;"><span> (<span style="color:#00f">number-to-string</span> <span style="color:#19177c">number</span>) </span></span><span style="display:flex;"><span> (<span style="color:#00f">number-to-string</span> <span style="color:#19177c">number</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">line-beginning-position</span>) </span></span><span style="display:flex;"><span> (<span style="color:#00f">line-beginning-position</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">line-end-position</span>))))) </span></span><span style="display:flex;"><span> (<span style="color:#00f">line-end-position</span>)))))
</span></span></code></pre></div><h5 id="edit-string-a-point">Edit string a point</h5>
<p>A function to edit the string at point in a temporary buffer with chosen major mode. Somewhat like <code>org-edit-special</code>.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defvar</span> <span style="color:#19177c">my/edit-elisp-string--window-config</span> <span style="color:#800">nil</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/edit-elisp-string</span> ()
</span></span><span style="display:flex;"><span> (<span style="color:#008000">interactive</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">if</span> (<span style="color:#19177c">org-src-edit-buffer-p</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">org-edit-src-exit</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let*</span> ((<span style="color:#19177c">bounds</span> (<span style="color:#19177c">bounds-of-thing-at-point</span> <span style="color:#19177c">&#39;string</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">orig-buf</span> (<span style="color:#00f">current-buffer</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">orig-str</span> (<span style="color:#008000">when</span> <span style="color:#19177c">bounds</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">buffer-substring-no-properties</span> (<span style="color:#00f">car</span> <span style="color:#19177c">bounds</span>) (<span style="color:#00f">cdr</span> <span style="color:#19177c">bounds</span>)))))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">unless</span> <span style="color:#19177c">bounds</span>
</span></span><span style="display:flex;"><span> (<span style="color:#d2413a;font-weight:bold">user-error</span> <span style="color:#ba2121">&#34;No string under cursor&#34;</span>))
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; Not sure if there&#39;s a better way</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let*</span> ((<span style="color:#19177c">mode</span> (<span style="color:#00f">intern</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">completing-read</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;Major mode: &#34;</span> <span style="color:#19177c">obarray</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">lambda</span> (<span style="color:#19177c">sym</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">and</span> (<span style="color:#00f">commandp</span> <span style="color:#19177c">sym</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">string-suffix-p</span> <span style="color:#ba2121">&#34;-mode&#34;</span> (<span style="color:#00f">symbol-name</span> <span style="color:#19177c">sym</span>))))
</span></span><span style="display:flex;"><span> <span style="color:#800">t</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">edit-buf</span> (<span style="color:#19177c">generate-new-buffer</span> <span style="color:#ba2121">&#34;*string-edit*&#34;</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">edit-elisp-string--window-config</span> (<span style="color:#00f">current-window-configuration</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">with-current-buffer</span> <span style="color:#19177c">edit-buf</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">insert</span> (<span style="color:#19177c">string-replace</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;\\\&#34;&#34;</span> <span style="color:#ba2121">&#34;\&#34;&#34;</span> (<span style="color:#00f">substring</span> <span style="color:#19177c">orig-str</span> <span style="color:#666">1</span> <span style="color:#666">-1</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">funcall</span> <span style="color:#19177c">mode</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">use-local-map</span> (<span style="color:#00f">copy-keymap</span> (<span style="color:#00f">current-local-map</span>)))
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; Confirm edit</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">local-set-key</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">kbd</span> <span style="color:#ba2121">&#34;C-c &#39;&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">lambda</span> ()
</span></span><span style="display:flex;"><span> (<span style="color:#008000">interactive</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let</span> ((<span style="color:#19177c">new-str</span> (<span style="color:#00f">buffer-substring-no-properties</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">point-min</span>) (<span style="color:#00f">point-max</span>))))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">with-current-buffer</span> <span style="color:#19177c">orig-buf</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">delete-region</span> (<span style="color:#00f">car</span> <span style="color:#19177c">bounds</span>) (<span style="color:#00f">cdr</span> <span style="color:#19177c">bounds</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">goto-char</span> (<span style="color:#00f">car</span> <span style="color:#19177c">bounds</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">insert</span> (<span style="color:#00f">prin1-to-string</span> <span style="color:#19177c">new-str</span>))))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">kill-buffer</span> <span style="color:#19177c">edit-buf</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> <span style="color:#19177c">edit-elisp-string--window-config</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">set-window-configuration</span> <span style="color:#19177c">edit-elisp-string--window-config</span>))))
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; Cancel edit</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">local-set-key</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">kbd</span> <span style="color:#ba2121">&#34;C-c C-k&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">lambda</span> ()
</span></span><span style="display:flex;"><span> (<span style="color:#008000">interactive</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">kill-buffer</span> <span style="color:#19177c">edit-buf</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> <span style="color:#19177c">edit-elisp-string--window-config</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">set-window-configuration</span> <span style="color:#19177c">edit-elisp-string--window-config</span>)))))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">pop-to-buffer</span> <span style="color:#19177c">edit-buf</span>)))))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#19177c">general-define-key</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">:keymaps</span> <span style="color:#666">&#39;</span>(<span style="color:#19177c">emacs-lisp-mode-map</span> <span style="color:#19177c">lisp-interaction-mode-map</span>)
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;C-c &#39;&#34;</span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">my/edit-elisp-string</span>)
</span></span></code></pre></div><h3 id="working-with-projects">Working with projects</h3> </span></span></code></pre></div><h3 id="working-with-projects">Working with projects</h3>
<p>Packages related to managing projects.</p> <p>Packages related to managing projects.</p>
<p>I used to have <a href="https://github.com/Alexander-Miller/treemacs">Treemacs</a> here, but in the end decided that dired with <a href="https://github.com/jojojames/dired-sidebar">dired-sidebar</a> does a better job. Dired has its separate section in &ldquo;Applications&rdquo;.</p> <p>I used to have <a href="https://github.com/Alexander-Miller/treemacs">Treemacs</a> here, but in the end decided that dired with <a href="https://github.com/jojojames/dired-sidebar">dired-sidebar</a> does a better job. Dired has its separate section in &ldquo;Applications&rdquo;.</p>
@ -5132,7 +5195,8 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">my-leader-def</span> </span></span><span style="display:flex;"><span> (<span style="color:#19177c">my-leader-def</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">:keymaps</span> <span style="color:#19177c">&#39;org-mode-map</span> </span></span><span style="display:flex;"><span> <span style="color:#008000">:keymaps</span> <span style="color:#19177c">&#39;org-mode-map</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;SPC b&#34;</span> <span style="color:#666">&#39;</span>(<span style="color:#008000">:wk</span> <span style="color:#ba2121">&#34;org-babel&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;SPC b&#34;</span> <span style="color:#666">&#39;</span>(<span style="color:#008000">:wk</span> <span style="color:#ba2121">&#34;org-babel&#34;</span>)
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;SPC b&#34;</span> <span style="color:#19177c">org-babel-map</span>)) </span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;SPC b&#34;</span> <span style="color:#19177c">org-babel-map</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;SPC h&#34;</span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">consult-org-heading</span>))
</span></span></code></pre></div><h4 id="managing-a-literate-programming-project">Managing a literate programming project</h4> </span></span></code></pre></div><h4 id="managing-a-literate-programming-project">Managing a literate programming project</h4>
<p>A few tricks to do literate programming. I actually have only one (<a href="https://github.com/SqrtMinusOne/sqrt-data">sqrt-data</a>), and I&rsquo;m not convinced in the benefits of the approach&hellip;</p> <p>A few tricks to do literate programming. I actually have only one (<a href="https://github.com/SqrtMinusOne/sqrt-data">sqrt-data</a>), and I&rsquo;m not convinced in the benefits of the approach&hellip;</p>
<p>Anyway, Org files are better off in a separated directory (e.g. <code>org</code>). So I&rsquo;ve come up with the following solution to avoid manually prefixing the <code>:tangle</code> arguments.</p> <p>Anyway, Org files are better off in a separated directory (e.g. <code>org</code>). So I&rsquo;ve come up with the following solution to avoid manually prefixing the <code>:tangle</code> arguments.</p>
@ -6217,21 +6281,6 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
</span></span><span style="display:flex;"><span> (<span style="color:#008000">cl-function</span> (<span style="color:#008000">lambda</span> (<span style="color:#008000">&amp;rest</span> <span style="color:#19177c">args</span> <span style="color:#008000">&amp;key</span> <span style="color:#19177c">error-thrown</span> <span style="color:#008000">&amp;allow-other-keys</span>) </span></span><span style="display:flex;"><span> (<span style="color:#008000">cl-function</span> (<span style="color:#008000">lambda</span> (<span style="color:#008000">&amp;rest</span> <span style="color:#19177c">args</span> <span style="color:#008000">&amp;key</span> <span style="color:#19177c">error-thrown</span> <span style="color:#008000">&amp;allow-other-keys</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">message</span> <span style="color:#ba2121">&#34;Got error: %S&#34;</span> <span style="color:#19177c">error-thrown</span>))))) </span></span><span style="display:flex;"><span> (<span style="color:#00f">message</span> <span style="color:#ba2121">&#34;Got error: %S&#34;</span> <span style="color:#19177c">error-thrown</span>)))))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">my/weather-value</span>) </span></span><span style="display:flex;"><span> <span style="color:#19177c">my/weather-value</span>)
</span></span></code></pre></div><p>Let&rsquo;s also try to log the current mood:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/get-mood</span> ()
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let*</span> ((<span style="color:#19177c">crm-separator</span> <span style="color:#ba2121">&#34; &#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">crm-local-completion-map</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let</span> ((<span style="color:#19177c">map</span> (<span style="color:#00f">make-sparse-keymap</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">set-keymap-parent</span> <span style="color:#19177c">map</span> <span style="color:#19177c">crm-local-completion-map</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">define-key</span> <span style="color:#19177c">map</span> <span style="color:#ba2121">&#34; &#34;</span> <span style="color:#19177c">&#39;self-insert-command</span>)
</span></span><span style="display:flex;"><span> <span style="color:#19177c">map</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">vertico-sort-function</span> <span style="color:#800">nil</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mapconcat</span>
</span></span><span style="display:flex;"><span> <span style="color:#00f">#&#39;identity</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">completing-read-multiple</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;How do you feel: &#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">my/mood-list</span>)
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34; &#34;</span>)))
</span></span></code></pre></div><p>And here&rsquo;s the function that creates a drawer with such information. At the moment, it&rsquo;s:</p> </span></span></code></pre></div><p>And here&rsquo;s the function that creates a drawer with such information. At the moment, it&rsquo;s:</p>
<ul> <ul>
<li>Emacs version</li> <li>Emacs version</li>
@ -6239,7 +6288,6 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
<li>Location</li> <li>Location</li>
<li>Weather</li> <li>Weather</li>
<li>Current EMMS track</li> <li>Current EMMS track</li>
<li>Current mood</li>
</ul> </ul>
<!--listend--> <!--listend-->
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/set-journal-header</span> () <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/set-journal-header</span> ()
@ -6267,9 +6315,7 @@ Emacs is also particularly great at writing Lisp code, e.g. Clojure, Common Lisp
</span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> <span style="color:#19177c">title</span> </span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> <span style="color:#19177c">title</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#00f">string</span> (<span style="color:#00f">concat</span> <span style="color:#00f">string</span> <span style="color:#19177c">title</span>))) </span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#00f">string</span> (<span style="color:#00f">concat</span> <span style="color:#00f">string</span> <span style="color:#19177c">title</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> (<span style="color:#00f">&gt;</span> (<span style="color:#00f">length</span> <span style="color:#00f">string</span>) <span style="color:#666">0</span>) </span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> (<span style="color:#00f">&gt;</span> (<span style="color:#00f">length</span> <span style="color:#00f">string</span>) <span style="color:#666">0</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">org-set-property</span> <span style="color:#ba2121">&#34;EMMS_Track&#34;</span> <span style="color:#00f">string</span>)))))) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">org-set-property</span> <span style="color:#ba2121">&#34;EMMS_Track&#34;</span> <span style="color:#00f">string</span>)))))))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">when-let</span> (<span style="color:#19177c">mood</span> (<span style="color:#19177c">my/get-mood</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">org-set-property</span> <span style="color:#ba2121">&#34;Mood&#34;</span> <span style="color:#19177c">mood</span>)))
</span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#19177c">add-hook</span> <span style="color:#19177c">&#39;org-journal-after-entry-create-hook</span> </span></span><span style="display:flex;"><span>(<span style="color:#19177c">add-hook</span> <span style="color:#19177c">&#39;org-journal-after-entry-create-hook</span>
</span></span><span style="display:flex;"><span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">my/set-journal-header</span>) </span></span><span style="display:flex;"><span> <span style="color:#00f">#&#39;</span><span style="color:#19177c">my/set-journal-header</span>)
@ -6370,7 +6416,8 @@ Didn&rsquo;t work out as I expected, so I&rsquo;ve made <code>org-journal-tags</
<p>About installing the package on Guix (<strong>CREDIT</strong>: thanks @Ashraz on the SystemCrafters discord)</p> <p>About installing the package on Guix (<strong>CREDIT</strong>: thanks @Ashraz on the SystemCrafters discord)</p>
<blockquote> <blockquote>
<p>So, for all those interested: unfortunately, org-roam (or rather emacsql-sqlite) cannot compile the sqlite.c and emacsql.c due to missing headers (linux/falloc.h) on Guix. You would have to properly set all the include paths on Guix, and also adjust the PATH to have gcc actually find as later on in the compilation process.</p> <p>So, for all those interested: unfortunately, org-roam (or rather emacsql-sqlite) cannot compile the sqlite.c and emacsql.c due to missing headers (linux/falloc.h) on Guix. You would have to properly set all the include paths on Guix, and also adjust the PATH to have gcc actually find as later on in the compilation process.</p>
<p>Instead, you should remove all Org-Roam related packages from your Emacs installation (via M-x package-delete org-roam RET and M-x package-autoremove RET y RET) and then use the Guix package called emacs-org-roam.</p></blockquote> <p>Instead, you should remove all Org-Roam related packages from your Emacs installation (via M-x package-delete org-roam RET and M-x package-autoremove RET y RET) and then use the Guix package called emacs-org-roam.</p>
</blockquote>
<p>References:</p> <p>References:</p>
<ul> <ul>
<li><a href="https://github.com/org-roam/org-roam/wiki/Hitchhiker%27s-Rough-Guide-to-Org-roam-V2">Hitchhiker&rsquo;s Rough Guide to Org roam V2</a></li> <li><a href="https://github.com/org-roam/org-roam/wiki/Hitchhiker%27s-Rough-Guide-to-Org-roam-V2">Hitchhiker&rsquo;s Rough Guide to Org roam V2</a></li>
@ -7110,7 +7157,10 @@ Didn&rsquo;t work out as I expected, so I&rsquo;ve made <code>org-journal-tags</
</span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;beamer&#34;</span> <span style="color:#ba2121">&#34;\\documentclass[presentation]{beamer}&#34;</span> </span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;beamer&#34;</span> <span style="color:#ba2121">&#34;\\documentclass[presentation]{beamer}&#34;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;\\section{%s}&#34;</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;\\section*{%s}&#34;</span>) </span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;\\section{%s}&#34;</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;\\section*{%s}&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;\\subsection{%s}&#34;</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;\\subsection*{%s}&#34;</span>) </span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;\\subsection{%s}&#34;</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;\\subsection*{%s}&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;\\subsubsection{%s}&#34;</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;\\subsubsection*{%s}&#34;</span>))))) </span></span><span style="display:flex;"><span> (<span style="color:#ba2121">&#34;\\subsubsection{%s}&#34;</span> <span style="color:#666">.</span> <span style="color:#ba2121">&#34;\\subsubsection*{%s}&#34;</span>))))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">with-eval-after-load</span> <span style="color:#19177c">&#39;ox-beamer</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">add-to-list</span> <span style="color:#19177c">&#39;org-beamer-environments-extra</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">&#39;</span>(<span style="color:#ba2121">&#34;dummy&#34;</span> <span style="color:#ba2121">&#34;d&#34;</span> <span style="color:#ba2121">&#34;\\begin{dummyenv}&#34;</span> <span style="color:#ba2121">&#34;\\end{dummyenv}&#34;</span>))))
</span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic">;; Make sure to eval the function when org-latex-classes list already exists</span> </span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic">;; Make sure to eval the function when org-latex-classes list already exists</span>
</span></span><span style="display:flex;"><span>(<span style="color:#008000">with-eval-after-load</span> <span style="color:#19177c">&#39;ox-latex</span> </span></span><span style="display:flex;"><span>(<span style="color:#008000">with-eval-after-load</span> <span style="color:#19177c">&#39;ox-latex</span>
@ -9657,7 +9707,8 @@ Didn&rsquo;t work out as I expected, so I&rsquo;ve made <code>org-journal-tags</
<p><a href="https://github.com/wallabag/wallabag">wallabag</a> is a self-hosted &ldquo;read it later&rdquo; app.</p> <p><a href="https://github.com/wallabag/wallabag">wallabag</a> is a self-hosted &ldquo;read it later&rdquo; app.</p>
<p>This might be the best online reading advice I&rsquo;ve heard:</p> <p>This might be the best online reading advice I&rsquo;ve heard:</p>
<blockquote> <blockquote>
<p>I have a different approach: waiting periods. Every time I come across something I may want to read/watch, Im totally allowed to. No limits! The only requirement is I have to save it to Pocket, and then choose to consume it at a later time.</p></blockquote> <p>I have a different approach: waiting periods. Every time I come across something I may want to read/watch, Im totally allowed to. No limits! The only requirement is I have to save it to Pocket, and then choose to consume it at a later time.</p>
</blockquote>
<p>Source: <a href="https://fortelabs.com/blog/the-secret-power-of-read-it-later-apps/">Tiago Forte - The Secret Power of Read It Later Apps</a></p> <p>Source: <a href="https://fortelabs.com/blog/the-secret-power-of-read-it-later-apps/">Tiago Forte - The Secret Power of Read It Later Apps</a></p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">use-package</span> <span style="color:#19177c">wallabag</span> <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">use-package</span> <span style="color:#19177c">wallabag</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">:straight</span> (<span style="color:#008000">:host</span> <span style="color:#19177c">github</span> <span style="color:#008000">:repo</span> <span style="color:#ba2121">&#34;chenyanming/wallabag.el&#34;</span> <span style="color:#008000">:files</span> (<span style="color:#008000">:defaults</span> <span style="color:#ba2121">&#34;default.css&#34;</span> <span style="color:#ba2121">&#34;emojis.alist&#34;</span>)) </span></span><span style="display:flex;"><span> <span style="color:#008000">:straight</span> (<span style="color:#008000">:host</span> <span style="color:#19177c">github</span> <span style="color:#008000">:repo</span> <span style="color:#ba2121">&#34;chenyanming/wallabag.el&#34;</span> <span style="color:#008000">:files</span> (<span style="color:#008000">:defaults</span> <span style="color:#ba2121">&#34;default.css&#34;</span> <span style="color:#ba2121">&#34;emojis.alist&#34;</span>))
@ -9802,7 +9853,8 @@ Didn&rsquo;t work out as I expected, so I&rsquo;ve made <code>org-journal-tags</
<p>Scroll to the previous mention.</p> <p>Scroll to the previous mention.</p>
<blockquote> <blockquote>
<p>alphapapa 🐃​&gt; And, yes, that is a currently unsolved problem. As I said, in the future we can try using a different API endpoint to access those notifications similarly to Element. In the meantime, you can load old messages (e.g. &ldquo;C-u 1000 M-v&rdquo; to load 1000 old ones at a time), until you find it, maybe using &ldquo;C-s sqrtm&rdquo; to search for messages mentioning you.</p> <p>alphapapa 🐃​&gt; And, yes, that is a currently unsolved problem. As I said, in the future we can try using a different API endpoint to access those notifications similarly to Element. In the meantime, you can load old messages (e.g. &ldquo;C-u 1000 M-v&rdquo; to load 1000 old ones at a time), until you find it, maybe using &ldquo;C-s sqrtm&rdquo; to search for messages mentioning you.</p>
<p>Or you can load up Element for a moment to see what the mention was, if that&rsquo;s easier.</p></blockquote> <p>Or you can load up Element for a moment to see what the mention was, if that&rsquo;s easier.</p>
</blockquote>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/ement-about-me-p</span> (<span style="color:#19177c">event</span>) <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/ement-about-me-p</span> (<span style="color:#19177c">event</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let</span> ((<span style="color:#19177c">me</span> (<span style="color:#19177c">ement-user-id</span> (<span style="color:#19177c">ement-session-user</span> <span style="color:#19177c">ement-session</span>)))) </span></span><span style="display:flex;"><span> (<span style="color:#008000">let</span> ((<span style="color:#19177c">me</span> (<span style="color:#19177c">ement-user-id</span> (<span style="color:#19177c">ement-session-user</span> <span style="color:#19177c">ement-session</span>))))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">or</span> </span></span><span style="display:flex;"><span> (<span style="color:#008000">or</span>
@ -10651,12 +10703,13 @@ Didn&rsquo;t work out as I expected, so I&rsquo;ve made <code>org-journal-tags</
<p>As I mentioned earlier, my current options to manage a particular node are:</p> <p>As I mentioned earlier, my current options to manage a particular node are:</p>
<ul> <ul>
<li><a href="https://git-scm.com/">git</a>;</li> <li><a href="https://git-scm.com/">git</a>;</li>
<li><a href="https://mega.nz/">MEGA</a> - for files that don&rsquo;t fit into git, such as DOCX documents, photos, etc.;</li> <li><a href="https://mega.nz/">MEGA</a> - for files that don&rsquo;t fit into git, such as DOCX documents, photos, etc. (<strong>UPD 2025.10.22</strong> - MEGA has been banned in Russia, of course&hellip;);</li>
<li><a href="https://owncloud.dev/ocis/">ownCloud Infinite Scale</a> (self-hosted by me) via <a href="https://rclone.org/docs/">rclone</a> - instead of MEGA.</li>
<li>&ldquo;nothing&rdquo; - for something that I don&rsquo;t need to sync across machines, e.g. database dumps.</li> <li>&ldquo;nothing&rdquo; - for something that I don&rsquo;t need to sync across machines, e.g. database dumps.</li>
</ul> </ul>
<p>Another tool I considered was <a href="https://github.com/restic/restic">restic</a>. It&rsquo;s an interesting backup &amp; sync solution with built-in encryption, snapshots, etc.</p> <p><code>rclone</code> is nice because it provides a single interface for multiple services like Google Drive, Dropbox, S3, WebDAV. It also supported MEGA, but it required turning off 2FA, which I didn&rsquo;t want.</p>
<p>However, a challenge I encountered is that its repositories are only accessible via restic. So, even if I use something like MEGA as a backend, I won&rsquo;t be able to use the MEGA file-sharing features, which I occasionally want for document or photo folders. Hence, for now, I&rsquo;m more interested in synchronizing the file tree in MEGA with <a href="https://github.com/meganz/MEGAcmd">MEGAcmd</a> (and also clean up the mess up there).</p> <p>So the MEGA functionality used <a href="https://github.com/meganz/MEGAcmd">MEGAcmd</a>. I&rsquo;ll keep it for now.</p>
<p>Another interesting tool is <a href="https://rclone.org/">rclone</a>, which provides a single interface for multiple services like Google Drive, Dropbox, S3, WebDAV. It also supports MEGA, but it requires turning off the two-factor authentication, which I don&rsquo;t want.</p> <p>Another tool I considered was <a href="https://github.com/restic/restic">restic</a>. It&rsquo;s an interesting backup &amp; sync solution with built-in encryption, snapshots, etc., but the repositories are only accessible via restic, which prevents using file-sharing features.</p>
<h4 id="implementation">Implementation</h4> <h4 id="implementation">Implementation</h4>
<h5 id="dependencies">Dependencies</h5> <h5 id="dependencies">Dependencies</h5>
<p>We&rsquo;ll a package called <a href="https://github.com/daniel-ness/ini.el">ini.el</a> to parse INI files.</p> <p>We&rsquo;ll a package called <a href="https://github.com/daniel-ness/ini.el">ini.el</a> to parse INI files.</p>
@ -10675,7 +10728,7 @@ Didn&rsquo;t work out as I expected, so I&rsquo;ve made <code>org-journal-tags</
</span></span></code></pre></div><p>Each &ldquo;area&rdquo; is an Org header with the <code>folder</code> tag; the Org hierarchy forms the file tree. A header can have the following properties:</p> </span></span></code></pre></div><p>Each &ldquo;area&rdquo; is an Org header with the <code>folder</code> tag; the Org hierarchy forms the file tree. A header can have the following properties:</p>
<ul> <ul>
<li><code>machine</code> - a list of hostnames for which the node is active (or <code>nil</code>)</li> <li><code>machine</code> - a list of hostnames for which the node is active (or <code>nil</code>)</li>
<li><code>kind</code> - <code>mega</code>, <code>git</code>, or <code>dummy</code></li> <li><code>kind</code> - <code>mega</code>, <code>rclone:&lt;remote&gt;</code>, <code>git</code>, or <code>dummy</code>. For now, only one option per node; I&rsquo;ll probably change that in the future.</li>
<li><code>remote</code> - remote URL for <code>git</code></li> <li><code>remote</code> - remote URL for <code>git</code></li>
<li><code>symlink</code> - in case the folder has to be symlinked somewhere else</li> <li><code>symlink</code> - in case the folder has to be symlinked somewhere else</li>
</ul> </ul>
@ -10689,16 +10742,16 @@ Didn&rsquo;t work out as I expected, so I&rsquo;ve made <code>org-journal-tags</
</span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:END:</span> </span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:END:</span>
</span></span><span style="display:flex;"><span><span style="color:#800080;font-weight:bold">****</span> 10.03.A Artifacts </span></span><span style="display:flex;"><span><span style="color:#800080;font-weight:bold">****</span> 10.03.A Artifacts
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic">:PROPERTIES: </span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic">:PROPERTIES:
</span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:kind: mega </span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:kind: rclone:ocis
</span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:END:</span> </span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:END:</span>
</span></span><span style="display:flex;"><span><span style="color:#800080;font-weight:bold">****</span> 10.03.D Documents </span></span><span style="display:flex;"><span><span style="color:#800080;font-weight:bold">****</span> 10.03.D Documents
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic">:PROPERTIES: </span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic">:PROPERTIES:
</span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:kind: mega </span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:kind: rclone:ocis
</span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:END:</span> </span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:END:</span>
</span></span><span style="display:flex;"><span><span style="color:#800080;font-weight:bold">****</span> 10.03.R Repos </span></span><span style="display:flex;"><span><span style="color:#800080;font-weight:bold">****</span> 10.03.R Repos
</span></span><span style="display:flex;"><span><span style="color:#800080;font-weight:bold">*****</span> 10.03.R.00 digital-trajectories-deploy </span></span><span style="display:flex;"><span><span style="color:#800080;font-weight:bold">*****</span> 10.03.R.00 digital-trajectories-deploy
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic">:PROPERTIES: </span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic">:PROPERTIES:
</span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:kind: mega </span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:kind: rclone:ocis
</span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:END:</span> </span></span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"></span><span style="color:#408080;font-style:italic">:END:</span>
</span></span><span style="display:flex;"><span><span style="color:#800080;font-weight:bold">*****</span> 10.03.R.01 digital-trajectories-backend </span></span><span style="display:flex;"><span><span style="color:#800080;font-weight:bold">*****</span> 10.03.R.01 digital-trajectories-backend
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic">:PROPERTIES: </span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic">:PROPERTIES:
@ -10740,14 +10793,17 @@ Didn&rsquo;t work out as I expected, so I&rsquo;ve made <code>org-journal-tags</
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setf</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:symlink</span> <span style="color:#19177c">val</span>) <span style="color:#19177c">symlink</span>)) </span></span><span style="display:flex;"><span> (<span style="color:#008000">setf</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:symlink</span> <span style="color:#19177c">val</span>) <span style="color:#19177c">symlink</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> (<span style="color:#19177c">org-element-property</span> <span style="color:#008000">:PROJECT</span> <span style="color:#19177c">heading</span>) </span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> (<span style="color:#19177c">org-element-property</span> <span style="color:#008000">:PROJECT</span> <span style="color:#19177c">heading</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setf</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:project</span> <span style="color:#19177c">val</span>) <span style="color:#800">t</span>)) </span></span><span style="display:flex;"><span> (<span style="color:#008000">setf</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:project</span> <span style="color:#19177c">val</span>) <span style="color:#800">t</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">when-let*</span> ((<span style="color:#19177c">kind-str</span> (<span style="color:#19177c">org-element-property</span> <span style="color:#008000">:KIND</span> <span style="color:#19177c">heading</span>)) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">when-let*</span> ((<span style="color:#19177c">kind-str</span> (<span style="color:#19177c">org-element-property</span> <span style="color:#008000">:KIND</span> <span style="color:#19177c">heading</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">kind</span> (<span style="color:#00f">intern</span> <span style="color:#19177c">kind-str</span>))) </span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> (<span style="color:#19177c">string-match-p</span> (<span style="color:#008000">rx</span> <span style="color:#19177c">bos</span> <span style="color:#ba2121">&#34;rclone:&#34;</span>) <span style="color:#19177c">kind-str</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setf</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:kind</span> <span style="color:#19177c">val</span>) <span style="color:#19177c">kind</span>) </span></span><span style="display:flex;"><span> (<span style="color:#008000">setf</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:remote</span> <span style="color:#19177c">val</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> (<span style="color:#00f">equal</span> <span style="color:#19177c">kind</span> <span style="color:#19177c">&#39;git</span>) </span></span><span style="display:flex;"><span> (<span style="color:#00f">substring</span> <span style="color:#19177c">kind-str</span> <span style="color:#666">7</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">kind-str</span> <span style="color:#ba2121">&#34;rclone&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> (<span style="color:#00f">equal</span> <span style="color:#19177c">kind-str</span> <span style="color:#ba2121">&#34;git&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let</span> ((<span style="color:#19177c">remote</span> (<span style="color:#19177c">org-element-property</span> <span style="color:#008000">:REMOTE</span> <span style="color:#19177c">heading</span>))) </span></span><span style="display:flex;"><span> (<span style="color:#008000">let</span> ((<span style="color:#19177c">remote</span> (<span style="color:#19177c">org-element-property</span> <span style="color:#008000">:REMOTE</span> <span style="color:#19177c">heading</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">unless</span> <span style="color:#19177c">remote</span> </span></span><span style="display:flex;"><span> (<span style="color:#008000">unless</span> <span style="color:#19177c">remote</span>
</span></span><span style="display:flex;"><span> (<span style="color:#d2413a;font-weight:bold">user-error</span> <span style="color:#ba2121">&#34;No remote for %s&#34;</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:name</span> <span style="color:#19177c">val</span>))) </span></span><span style="display:flex;"><span> (<span style="color:#d2413a;font-weight:bold">user-error</span> <span style="color:#ba2121">&#34;No remote for %s&#34;</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:name</span> <span style="color:#19177c">val</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setf</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:remote</span> <span style="color:#19177c">val</span>) <span style="color:#19177c">remote</span>)))) </span></span><span style="display:flex;"><span> (<span style="color:#008000">setf</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:remote</span> <span style="color:#19177c">val</span>) <span style="color:#19177c">remote</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setf</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:kind</span> <span style="color:#19177c">val</span>) (<span style="color:#00f">intern</span> <span style="color:#19177c">kind-str</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setf</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:name</span> <span style="color:#19177c">val</span>) (<span style="color:#19177c">org-element-property</span> <span style="color:#008000">:raw-value</span> <span style="color:#19177c">heading</span>) </span></span><span style="display:flex;"><span> (<span style="color:#008000">setf</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:name</span> <span style="color:#19177c">val</span>) (<span style="color:#19177c">org-element-property</span> <span style="color:#008000">:raw-value</span> <span style="color:#19177c">heading</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:path</span> <span style="color:#19177c">val</span>) <span style="color:#19177c">new-path</span>) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:path</span> <span style="color:#19177c">val</span>) <span style="color:#19177c">new-path</span>)
</span></span><span style="display:flex;"><span> <span style="color:#19177c">val</span>))) </span></span><span style="display:flex;"><span> <span style="color:#19177c">val</span>)))
@ -11039,6 +11095,258 @@ Didn&rsquo;t work out as I expected, so I&rsquo;ve made <code>org-journal-tags</
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">&#34;mega-sync -d \&#34;%s\&#34;&#34;</span> </span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">&#34;mega-sync -d \&#34;%s\&#34;&#34;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">substring</span> <span style="color:#19177c">path</span> <span style="color:#666">0</span> (<span style="color:#00f">1-</span> (<span style="color:#00f">length</span> <span style="color:#19177c">path</span>)))) </span></span><span style="display:flex;"><span> (<span style="color:#00f">substring</span> <span style="color:#19177c">path</span> <span style="color:#666">0</span> (<span style="color:#00f">1-</span> (<span style="color:#00f">length</span> <span style="color:#19177c">path</span>))))
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;Mega remove sync&#34;</span> <span style="color:#666">4</span>))))) </span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;Mega remove sync&#34;</span> <span style="color:#666">4</span>)))))
</span></span></code></pre></div><h5 id="rclone">rclone</h5>
<p>This section wraps the <a href="https://rclone.org/bisync/">bisync</a> command for rclone, which implements two-way sync.</p>
<p>The general approach is:</p>
<ul>
<li>Consider the directory unsynced if it doesn&rsquo;t have the <code>.rclone-test-&lt;remote&gt;</code> file, which is used with the <a href="https://rclone.org/bisync/#check-access">&ndash;check-access</a> and <a href="https://rclone.org/bisync/#check-filename">&ndash;check-filename</a> path. <code>--check-access</code> prevents rclone from running unless the check file exists in both places (i.e., locally and remotely).</li>
<li>For unsynced directories, run <code>rclone mkdir</code> to create remote directory, <code>touch</code> and <code>rclone touch</code> to create the check file.</li>
<li>For unsynced directories, run the sync command with the <a href="https://rclone.org/bisync/#resync">&ndash;resync</a> flag for initial sync.</li>
<li>For all directories, create a bash script that would run the sync command normally.</li>
</ul>
<p>First, default options for <code>rclone bisync</code>:</p>
<p><a id="code-snippet--rclone-options"></a></p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defconst</span> <span style="color:#19177c">my/index--rclone-options</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">`</span>(<span style="color:#ba2121">&#34;--create-empty-src-dirs&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;--resilient&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;--metadata&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;--filters-file&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">,</span>(<span style="color:#00f">expand-file-name</span> <span style="color:#ba2121">&#34;~/.config/rclone/filters-bisync&#34;</span>)))
</span></span></code></pre></div><p>A <a href="https://rclone.org/bisync/#filtering">filters file</a> for rclone:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>- .*
</span></span><span style="display:flex;"><span>- ~*
</span></span><span style="display:flex;"><span>- .debris
</span></span></code></pre></div><p>Not yet sure what&rsquo;s that supposed to be.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defconst</span> <span style="color:#19177c">my/index--rclone-script-path</span> <span style="color:#ba2121">&#34;~/bin/rclone-scripts/&#34;</span>)
</span></span></code></pre></div><p>First, get folders to be synced from the tree:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/index--rclone-get-folders</span> (<span style="color:#19177c">tree</span>)
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;Get TREE nodes to be synced with rclone.
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">Return a list of alists with the following keys:
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">- `:local-path&#39; - path in the local filesystem
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">- `:remote-path&#39; - path in the remote
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">- `:remote&#39; - name of the remote.&#34;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">cl-loop</span> <span style="color:#19177c">for</span> <span style="color:#19177c">node</span> <span style="color:#19177c">in</span> <span style="color:#19177c">tree</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">if</span> (<span style="color:#00f">eq</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:kind</span> <span style="color:#19177c">node</span>) <span style="color:#19177c">&#39;rclone</span>)
</span></span><span style="display:flex;"><span> <span style="color:#19177c">collect</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">`</span>((<span style="color:#008000">:local-path</span> <span style="color:#666">.</span> <span style="color:#666">,</span>(<span style="color:#00f">file-name-as-directory</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:path</span> <span style="color:#19177c">node</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">:remote-path</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">.</span> <span style="color:#666">,</span>(<span style="color:#00f">concat</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:remote</span> <span style="color:#19177c">node</span>)
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;:&#34;</span> (<span style="color:#19177c">my/index--mega-local-path</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-name-as-directory</span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:path</span> <span style="color:#19177c">node</span>)))))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">:remote</span> <span style="color:#666">.</span> <span style="color:#666">,</span>(<span style="color:#19177c">alist-get</span> <span style="color:#008000">:remote</span> <span style="color:#19177c">node</span>)))
</span></span><span style="display:flex;"><span> <span style="color:#00f">append</span> (<span style="color:#19177c">my/index--rclone-get-folders</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">alist-get</span> <span style="color:#008000">:children</span> <span style="color:#19177c">node</span>))))
</span></span></code></pre></div><p>Then, get the sync command:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/index--rclone-make-command</span> (<span style="color:#19177c">local-path</span> <span style="color:#19177c">remote-path</span> <span style="color:#19177c">remote</span>)
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;Make a bisync command to sync LOCAL-PATH and REMOTE-PATH.
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">REMOTE is the name of the remote.&#34;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">string-join</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">`</span>(<span style="color:#ba2121">&#34;rclone&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;bisync&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">,</span>(<span style="color:#00f">format</span> <span style="color:#ba2121">&#34;\&#34;%s\&#34;&#34;</span> <span style="color:#19177c">local-path</span>)
</span></span><span style="display:flex;"><span> <span style="color:#666">,</span>(<span style="color:#00f">format</span> <span style="color:#ba2121">&#34;\&#34;%s\&#34;&#34;</span> <span style="color:#19177c">remote-path</span>)
</span></span><span style="display:flex;"><span> <span style="color:#666">,@</span><span style="color:#19177c">my/index--rclone-options</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;--check-filename&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">,</span>(<span style="color:#00f">format</span> <span style="color:#ba2121">&#34;.rclone-test-%s&#34;</span> <span style="color:#19177c">remote</span>))
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34; &#34;</span>))
</span></span></code></pre></div><p>A python script to run rclone.</p>
<p><a id="code-snippet--rclone-sync-script"></a></p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">import</span> <span style="color:#00f;font-weight:bold">subprocess</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">import</span> <span style="color:#00f;font-weight:bold">json</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">import</span> <span style="color:#00f;font-weight:bold">sys</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>REMOTE <span style="color:#666">=</span> <span style="color:#ba2121">&#39;&lt;rclone-remote&gt;&#39;</span>
</span></span><span style="display:flex;"><span>FOLDERS <span style="color:#666">=</span> json<span style="color:#666">.</span>loads(<span style="color:#ba2121">&#39;&lt;rclone-folders-json&gt;&#39;</span>)
</span></span><span style="display:flex;"><span>OPTIONS <span style="color:#666">=</span> json<span style="color:#666">.</span>loads(<span style="color:#ba2121">&#39;&lt;rclone-options&gt;&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">def</span> <span style="color:#00f">rclone_make_command</span>(local_path, remote_path, remote):
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">return</span> [
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#39;rclone&#39;</span>,
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#39;bisync&#39;</span>,
</span></span><span style="display:flex;"><span> local_path,
</span></span><span style="display:flex;"><span> remote_path,
</span></span><span style="display:flex;"><span> <span style="color:#666">*</span>OPTIONS,
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#39;--check-filename&#39;</span>,
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;.rclone-test-</span><span style="color:#b68;font-weight:bold">{</span>REMOTE<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#39;</span>,
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#39;--verbose&#39;</span>,
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#39;--color&#39;</span>,
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#39;NEVER&#39;</span>,
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#39;--use-json-log&#39;</span>,
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#39;--stats&#39;</span>,
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#39;9999m&#39;</span>
</span></span><span style="display:flex;"><span> ]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">def</span> <span style="color:#00f">parse_rclone_stats</span>(log_output):
</span></span><span style="display:flex;"><span> log <span style="color:#666">=</span> log_output<span style="color:#666">.</span>splitlines()
</span></span><span style="display:flex;"><span> log<span style="color:#666">.</span>reverse()
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">for</span> line <span style="color:#a2f;font-weight:bold">in</span> log:
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">try</span>:
</span></span><span style="display:flex;"><span> log_entry <span style="color:#666">=</span> json<span style="color:#666">.</span>loads(line)
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> <span style="color:#ba2121">&#39;stats&#39;</span> <span style="color:#a2f;font-weight:bold">in</span> log_entry:
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">return</span> log_entry[<span style="color:#ba2121">&#39;stats&#39;</span>]
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">except</span> json<span style="color:#666">.</span>JSONDecodeError:
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">continue</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">return</span> <span style="color:#008000;font-weight:bold">None</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">def</span> <span style="color:#00f">process_output</span>(output):
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> output <span style="color:#a2f;font-weight:bold">is</span> <span style="color:#008000;font-weight:bold">None</span>:
</span></span><span style="display:flex;"><span> <span style="color:#008000">print</span>(<span style="color:#ba2121">&#39;(empty)&#39;</span>)
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">for</span> line <span style="color:#a2f;font-weight:bold">in</span> output<span style="color:#666">.</span>splitlines():
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">try</span>:
</span></span><span style="display:flex;"><span> datum <span style="color:#666">=</span> json<span style="color:#666">.</span>loads(line)
</span></span><span style="display:flex;"><span> <span style="color:#008000">print</span>(datum[<span style="color:#ba2121">&#39;msg&#39;</span>])
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">except</span> <span style="color:#d2413a;font-weight:bold">Exception</span>:
</span></span><span style="display:flex;"><span> <span style="color:#008000">print</span>(line)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">def</span> <span style="color:#00f">rclone_run</span>(folder):
</span></span><span style="display:flex;"><span> command <span style="color:#666">=</span> rclone_make_command(
</span></span><span style="display:flex;"><span> folder[<span style="color:#ba2121">&#39;local-path&#39;</span>], folder[<span style="color:#ba2121">&#39;remote-path&#39;</span>], folder[<span style="color:#ba2121">&#39;remote&#39;</span>]
</span></span><span style="display:flex;"><span> )
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">try</span>:
</span></span><span style="display:flex;"><span> result <span style="color:#666">=</span> subprocess<span style="color:#666">.</span>run(command, check<span style="color:#666">=</span><span style="color:#008000;font-weight:bold">True</span>, capture_output<span style="color:#666">=</span><span style="color:#008000;font-weight:bold">True</span>, text<span style="color:#666">=</span><span style="color:#008000;font-weight:bold">True</span>)
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">except</span> subprocess<span style="color:#666">.</span>CalledProcessError <span style="color:#008000;font-weight:bold">as</span> e:
</span></span><span style="display:flex;"><span> <span style="color:#008000">print</span>(<span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;=== Error syncing </span><span style="color:#b68;font-weight:bold">{</span>folder[<span style="color:#ba2121">&#39;local-path&#39;</span>]<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121"> ===&#39;</span>)
</span></span><span style="display:flex;"><span> <span style="color:#008000">print</span>(<span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;Command: </span><span style="color:#b68;font-weight:bold">{</span><span style="color:#ba2121">&#39; &#39;</span><span style="color:#666">.</span>join(command)<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#39;</span>)
</span></span><span style="display:flex;"><span> <span style="color:#008000">print</span>(<span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;--- STDOUT ---&#39;</span>)
</span></span><span style="display:flex;"><span> process_output(e<span style="color:#666">.</span>stdout)
</span></span><span style="display:flex;"><span> <span style="color:#008000">print</span>(<span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;--- STDERR ---&#39;</span>)
</span></span><span style="display:flex;"><span> process_output(e<span style="color:#666">.</span>stderr)
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">return</span> {<span style="color:#ba2121">&#39;success&#39;</span>: <span style="color:#008000;font-weight:bold">False</span>, <span style="color:#ba2121">&#39;stats&#39;</span>: {}}
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">return</span> {<span style="color:#ba2121">&#39;success&#39;</span>: <span style="color:#008000;font-weight:bold">True</span>, <span style="color:#ba2121">&#39;stats&#39;</span>: parse_rclone_stats(result<span style="color:#666">.</span>stderr)}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">def</span> <span style="color:#00f">notify</span>(summary, body, level<span style="color:#666">=</span><span style="color:#ba2121">&#39;normal&#39;</span>, expire_time<span style="color:#666">=</span><span style="color:#666">5000</span>):
</span></span><span style="display:flex;"><span> subprocess<span style="color:#666">.</span>run([<span style="color:#ba2121">&#39;notify-send&#39;</span>, <span style="color:#ba2121">&#39;-u&#39;</span>, level, <span style="color:#ba2121">&#39;-t&#39;</span>, <span style="color:#008000">str</span>(expire_time), summary, body])
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># Source: https://stackoverflow.com/questions/1094841/get-a-human-readable-version-of-a-file-size</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">def</span> <span style="color:#00f">sizeof_fmt</span>(num, suffix<span style="color:#666">=</span><span style="color:#ba2121">&#39;B&#39;</span>):
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">for</span> unit <span style="color:#a2f;font-weight:bold">in</span> (<span style="color:#ba2121">&#39;&#39;</span>, <span style="color:#ba2121">&#39;Ki&#39;</span>, <span style="color:#ba2121">&#39;Mi&#39;</span>, <span style="color:#ba2121">&#39;Gi&#39;</span>, <span style="color:#ba2121">&#39;Ti&#39;</span>, <span style="color:#ba2121">&#39;Pi&#39;</span>, <span style="color:#ba2121">&#39;Ei&#39;</span>, <span style="color:#ba2121">&#39;Zi&#39;</span>):
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> <span style="color:#008000">abs</span>(num) <span style="color:#666">&lt;</span> <span style="color:#666">1024.0</span>:
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">return</span> <span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;</span><span style="color:#b68;font-weight:bold">{</span>num<span style="color:#b68;font-weight:bold">:</span><span style="color:#ba2121">3.1f</span><span style="color:#b68;font-weight:bold">}{</span>unit<span style="color:#b68;font-weight:bold">}{</span>suffix<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#39;</span>
</span></span><span style="display:flex;"><span> num <span style="color:#666">/=</span> <span style="color:#666">1024.0</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">return</span> <span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;</span><span style="color:#b68;font-weight:bold">{</span>num<span style="color:#b68;font-weight:bold">:</span><span style="color:#ba2121">.1f</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">Yi</span><span style="color:#b68;font-weight:bold">{</span>suffix<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">def</span> <span style="color:#00f">rclone_run_all</span>(folders):
</span></span><span style="display:flex;"><span> error_folders <span style="color:#666">=</span> []
</span></span><span style="display:flex;"><span> total_bytes <span style="color:#666">=</span> <span style="color:#666">0</span>
</span></span><span style="display:flex;"><span> total_transfers <span style="color:#666">=</span> <span style="color:#666">0</span>
</span></span><span style="display:flex;"><span> total_deleted <span style="color:#666">=</span> <span style="color:#666">0</span>
</span></span><span style="display:flex;"><span> total_renamed <span style="color:#666">=</span> <span style="color:#666">0</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">for</span> folder <span style="color:#a2f;font-weight:bold">in</span> folders:
</span></span><span style="display:flex;"><span> <span style="color:#008000">print</span>(<span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;Running rclone for </span><span style="color:#b68;font-weight:bold">{</span>folder<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#39;</span>)
</span></span><span style="display:flex;"><span> res <span style="color:#666">=</span> rclone_run(folder)
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> <span style="color:#a2f;font-weight:bold">not</span> res[<span style="color:#ba2121">&#39;success&#39;</span>]:
</span></span><span style="display:flex;"><span> error_folders<span style="color:#666">.</span>append(folder[<span style="color:#ba2121">&#39;local-path&#39;</span>])
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">else</span>:
</span></span><span style="display:flex;"><span> total_bytes <span style="color:#666">+=</span> res<span style="color:#666">.</span>get(<span style="color:#ba2121">&#39;stats&#39;</span>, {})<span style="color:#666">.</span>get(<span style="color:#ba2121">&#39;bytes&#39;</span>, <span style="color:#666">0</span>)
</span></span><span style="display:flex;"><span> total_transfers <span style="color:#666">+=</span> res<span style="color:#666">.</span>get(<span style="color:#ba2121">&#39;stats&#39;</span>, {})<span style="color:#666">.</span>get(<span style="color:#ba2121">&#39;transfers&#39;</span>, <span style="color:#666">0</span>)
</span></span><span style="display:flex;"><span> total_deleted <span style="color:#666">+=</span> res<span style="color:#666">.</span>get(<span style="color:#ba2121">&#39;stats&#39;</span>, {})<span style="color:#666">.</span>get(<span style="color:#ba2121">&#39;deletes&#39;</span>, <span style="color:#666">0</span>)
</span></span><span style="display:flex;"><span> total_renamed <span style="color:#666">+=</span> res<span style="color:#666">.</span>get(<span style="color:#ba2121">&#39;stats&#39;</span>, {})<span style="color:#666">.</span>get(<span style="color:#ba2121">&#39;renames&#39;</span>, <span style="color:#666">0</span>)
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> <span style="color:#008000">len</span>(error_folders) <span style="color:#666">&gt;</span> <span style="color:#666">0</span>:
</span></span><span style="display:flex;"><span> error_msg <span style="color:#666">=</span> <span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;Sync error for remote </span><span style="color:#b68;font-weight:bold">{</span>REMOTE<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">!&#39;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">for</span> folder <span style="color:#a2f;font-weight:bold">in</span> error_folders:
</span></span><span style="display:flex;"><span> error_msg <span style="color:#666">+=</span> <span style="color:#ba2121">&#39;&#39;&#39;</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#ba2121">- &#39;&#39;&#39;</span> <span style="color:#666">+</span> folder
</span></span><span style="display:flex;"><span> notify(<span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;rclone sync </span><span style="color:#b68;font-weight:bold">{</span>REMOTE<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#39;</span>, error_msg, level<span style="color:#666">=</span><span style="color:#ba2121">&#39;critical&#39;</span>)
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">else</span>:
</span></span><span style="display:flex;"><span> msg <span style="color:#666">=</span> <span style="color:#ba2121">&#39;&#39;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> total_transfers <span style="color:#666">&gt;</span> <span style="color:#666">0</span>:
</span></span><span style="display:flex;"><span> msg <span style="color:#666">+=</span> <span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;&#39;&#39;Transferred </span><span style="color:#b68;font-weight:bold">{</span>total_transfers<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121"> files (</span><span style="color:#b68;font-weight:bold">{</span>sizeof_fmt(total_bytes)<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">)</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#ba2121">&#39;&#39;&#39;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> total_deleted <span style="color:#666">&gt;</span> <span style="color:#666">0</span>:
</span></span><span style="display:flex;"><span> msg <span style="color:#666">+=</span> <span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;&#39;&#39;Deleted </span><span style="color:#b68;font-weight:bold">{</span>total_transfers<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121"> files</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#ba2121">&#39;&#39;&#39;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> total_renamed <span style="color:#666">&gt;</span> <span style="color:#666">0</span>:
</span></span><span style="display:flex;"><span> msg <span style="color:#666">+=</span> <span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;&#39;&#39;Renamed </span><span style="color:#b68;font-weight:bold">{</span>total_renamed<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121"> files</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#ba2121">&#39;&#39;&#39;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> <span style="color:#008000">len</span>(msg) <span style="color:#666">&gt;</span> <span style="color:#666">0</span>:
</span></span><span style="display:flex;"><span> notify(<span style="color:#ba2121">f</span><span style="color:#ba2121">&#39;rclone sync </span><span style="color:#b68;font-weight:bold">{</span>REMOTE<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#39;</span>, msg)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#19177c">__name__</span> <span style="color:#666">==</span> <span style="color:#ba2121">&#39;__main__&#39;</span>:
</span></span><span style="display:flex;"><span> rclone_run_all(FOLDERS)
</span></span></code></pre></div><p>A function that templates the script above:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/index--rclone-script</span> (<span style="color:#19177c">remote</span> <span style="color:#19177c">folders</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let</span> ((<span style="color:#19177c">script</span> <span style="color:#ba2121">&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">&lt;&lt;rclone-sync-script&gt;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">script</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">thread-last</span> <span style="color:#19177c">script</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">string-trim</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">string-replace</span> <span style="color:#ba2121">&#34;&lt;rclone-remote&gt;&#34;</span> <span style="color:#19177c">remote</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">string-replace</span> <span style="color:#ba2121">&#34;&lt;rclone-folders-json&gt;&#34;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">json-encode</span> <span style="color:#19177c">folders</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">string-replace</span> <span style="color:#ba2121">&#34;&lt;rclone-options&gt;&#34;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">json-encode</span> <span style="color:#19177c">my/index--rclone-options</span>))))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">script</span>))
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/index--rclone-script-loc</span> (<span style="color:#19177c">remote</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">concat</span> (<span style="color:#00f">file-name-as-directory</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">expand-file-name</span> <span style="color:#19177c">my/index--rclone-script-path</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">&#34;rclone_%s.py&#34;</span> <span style="color:#19177c">remote</span>)))
</span></span></code></pre></div><p>And checks if the script needs to be updated:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/index--rclone-script-saved-p</span> (<span style="color:#19177c">remote</span> <span style="color:#19177c">folders</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let*</span> ((<span style="color:#19177c">script</span> (<span style="color:#19177c">my/index--rclone-script</span> <span style="color:#19177c">remote</span> <span style="color:#19177c">folders</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">script-loc</span> (<span style="color:#19177c">my/index--rclone-script-loc</span> <span style="color:#19177c">remote</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> (<span style="color:#00f">file-exists-p</span> <span style="color:#19177c">script-loc</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">with-temp-buffer</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">insert-file-contents</span> <span style="color:#19177c">script-loc</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">equal</span> (<span style="color:#19177c">string-trim</span> (<span style="color:#00f">buffer-string</span>)) <span style="color:#19177c">script</span>)))))
</span></span></code></pre></div><p>Putting everything together:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/index--rclone-commands</span> (<span style="color:#19177c">tree</span>)
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;Get commands to set up sync with rclone in TREE.
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">TREE is a form a defined by </span><span style="color:#19177c">`my/index--tree-get&#39;</span><span style="color:#ba2121">. This is supposed to
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">be the tree narrowed to the current machine (</span><span style="color:#19177c">`my/index--tree-narrow&#39;</span><span style="color:#ba2121">).
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">The return value is a list of commands as defined by
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121"></span><span style="color:#19177c">`my/index--commands-display&#39;</span><span style="color:#ba2121">.&#34;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let</span> ((<span style="color:#19177c">folders</span> (<span style="color:#19177c">my/index--rclone-get-folders</span> <span style="color:#19177c">tree</span>))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">commands</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">sync-items-per-remote</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">dolist</span> (<span style="color:#19177c">folder</span> <span style="color:#19177c">folders</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">pcase-let*</span>
</span></span><span style="display:flex;"><span> ((<span style="color:#666">`</span>((<span style="color:#008000">:local-path</span> <span style="color:#666">.</span> <span style="color:#666">,</span><span style="color:#19177c">local-path</span>) (<span style="color:#008000">:remote-path</span> <span style="color:#666">.</span> <span style="color:#666">,</span><span style="color:#19177c">remote-path</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">:remote</span> <span style="color:#666">.</span> <span style="color:#666">,</span><span style="color:#19177c">remote</span>))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">folder</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">test-file-name</span> (<span style="color:#00f">format</span> <span style="color:#ba2121">&#34;.rclone-test-%s&#34;</span> <span style="color:#19177c">remote</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">test-file-local</span> (<span style="color:#00f">concat</span> <span style="color:#19177c">local-path</span> <span style="color:#19177c">test-file-name</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">test-file-remote</span> (<span style="color:#00f">concat</span> <span style="color:#19177c">remote-path</span> <span style="color:#19177c">test-file-name</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">unless</span> (<span style="color:#00f">file-exists-p</span> <span style="color:#19177c">test-file-local</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">push</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">list</span> (<span style="color:#00f">format</span> <span style="color:#ba2121">&#34;touch \&#34;%s\&#34;&#34;</span> <span style="color:#19177c">test-file-local</span>) <span style="color:#ba2121">&#34;Create local test files&#34;</span> <span style="color:#666">3</span>)
</span></span><span style="display:flex;"><span> <span style="color:#19177c">commands</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">push</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">list</span> (<span style="color:#00f">format</span> <span style="color:#ba2121">&#34;rclone mkdir \&#34;%s\&#34;&#34;</span> <span style="color:#19177c">remote-path</span>)
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;Create remote directories&#34;</span> <span style="color:#666">3</span>)
</span></span><span style="display:flex;"><span> <span style="color:#19177c">commands</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">push</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">list</span> (<span style="color:#00f">format</span> <span style="color:#ba2121">&#34;rclone touch \&#34;%s\&#34;&#34;</span> <span style="color:#19177c">test-file-remote</span>) <span style="color:#ba2121">&#34;Create remote test-file&#34;</span> <span style="color:#666">4</span>)
</span></span><span style="display:flex;"><span> <span style="color:#19177c">commands</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">push</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">list</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">concat</span> (<span style="color:#19177c">my/index--rclone-make-command</span> <span style="color:#19177c">local-path</span> <span style="color:#19177c">remote-path</span> <span style="color:#19177c">remote</span>)
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34; --resync&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">&#34;Initial sync for %s&#34;</span> <span style="color:#19177c">remote</span>) <span style="color:#666">8</span>)
</span></span><span style="display:flex;"><span> <span style="color:#19177c">commands</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">push</span> <span style="color:#19177c">folder</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">alist-get</span> <span style="color:#19177c">remote</span> <span style="color:#19177c">sync-items-per-remote</span> <span style="color:#800">nil</span> <span style="color:#800">nil</span> <span style="color:#00f">#&#39;equal</span>))))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">unless</span> (<span style="color:#00f">file-exists-p</span> <span style="color:#19177c">my/index--rclone-script-path</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">push</span> (<span style="color:#00f">list</span> (<span style="color:#00f">format</span> <span style="color:#ba2121">&#34;mkdir -p \&#34;%s\&#34;&#34;</span> (<span style="color:#00f">expand-file-name</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">my/index--rclone-script-path</span>))
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;Create rclone sync scripts directory&#34;</span> <span style="color:#666">9</span>)
</span></span><span style="display:flex;"><span> <span style="color:#19177c">commands</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#008000">cl-loop</span> <span style="color:#19177c">for</span> (<span style="color:#19177c">remote</span> <span style="color:#666">.</span> <span style="color:#19177c">folders</span>) <span style="color:#19177c">in</span> <span style="color:#19177c">sync-items-per-remote</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">unless</span> (<span style="color:#19177c">my/index--rclone-script-saved-p</span> <span style="color:#19177c">remote</span> <span style="color:#19177c">folders</span>)
</span></span><span style="display:flex;"><span> <span style="color:#008000">do</span> (<span style="color:#008000">push</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">list</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">&#34;cat &lt;&lt;EOF &gt; %s\n%s\nEOF&#34;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">my/index--rclone-script-loc</span> <span style="color:#19177c">remote</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">my/index--rclone-script</span> <span style="color:#19177c">remote</span> (<span style="color:#00f">nreverse</span> <span style="color:#19177c">folders</span>)))
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;Update rclone sync script&#34;</span> <span style="color:#666">10</span>)
</span></span><span style="display:flex;"><span> <span style="color:#19177c">commands</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">nreverse</span> <span style="color:#19177c">commands</span>)))
</span></span></code></pre></div><h5 id="git-repos">Git repos</h5> </span></span></code></pre></div><h5 id="git-repos">Git repos</h5>
<p>To sync git, we just need to clone the required git repos. Removing the repos is handled by the folder sync commands.</p> <p>To sync git, we just need to clone the required git repos. Removing the repos is handled by the folder sync commands.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/index--git-commands</span> (<span style="color:#19177c">tree</span>) <div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/index--git-commands</span> (<span style="color:#19177c">tree</span>)
@ -11226,13 +11534,14 @@ Didn&rsquo;t work out as I expected, so I&rsquo;ve made <code>org-journal-tags</
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let*</span> ((<span style="color:#19177c">full-tree</span> (<span style="color:#19177c">my/index--tree-retrive</span>))) </span></span><span style="display:flex;"><span> (<span style="color:#008000">let*</span> ((<span style="color:#19177c">full-tree</span> (<span style="color:#19177c">my/index--tree-retrive</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">my/index--tree-verify</span> <span style="color:#19177c">full-tree</span>) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">my/index--tree-verify</span> <span style="color:#19177c">full-tree</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let*</span> ((<span style="color:#19177c">tree</span> (<span style="color:#19177c">my/index--tree-narrow</span> <span style="color:#19177c">full-tree</span>)) </span></span><span style="display:flex;"><span> (<span style="color:#008000">let*</span> ((<span style="color:#19177c">tree</span> (<span style="color:#19177c">my/index--tree-narrow</span> <span style="color:#19177c">full-tree</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">mega-commands</span> (<span style="color:#19177c">my/index--mega-commands</span> <span style="color:#19177c">full-tree</span> <span style="color:#19177c">tree</span>)) </span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; (mega-commands (my/index--mega-commands full-tree tree))</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">rclone-commands</span> (<span style="color:#19177c">my/index--rclone-commands</span> <span style="color:#19177c">tree</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">mapping</span> (<span style="color:#19177c">my/index--filesystem-tree-mapping</span> <span style="color:#19177c">full-tree</span> <span style="color:#19177c">tree</span>)) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">mapping</span> (<span style="color:#19177c">my/index--filesystem-tree-mapping</span> <span style="color:#19177c">full-tree</span> <span style="color:#19177c">tree</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">folder-commands</span> (<span style="color:#19177c">my/index--filesystem-commands</span> <span style="color:#19177c">mapping</span>)) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">folder-commands</span> (<span style="color:#19177c">my/index--filesystem-commands</span> <span style="color:#19177c">mapping</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">git-commands</span> (<span style="color:#19177c">my/index--git-commands</span> <span style="color:#19177c">tree</span>)) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">git-commands</span> (<span style="color:#19177c">my/index--git-commands</span> <span style="color:#19177c">tree</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">waka-commands</span> (<span style="color:#19177c">my/index--wakatime-commands</span> <span style="color:#19177c">tree</span>)) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">waka-commands</span> (<span style="color:#19177c">my/index--wakatime-commands</span> <span style="color:#19177c">tree</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">symlink-commands</span> (<span style="color:#19177c">my/index-get-symlink-commands</span> <span style="color:#19177c">tree</span>))) </span></span><span style="display:flex;"><span> (<span style="color:#19177c">symlink-commands</span> (<span style="color:#19177c">my/index-get-symlink-commands</span> <span style="color:#19177c">tree</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">my/index--commands-display</span> (<span style="color:#00f">append</span> <span style="color:#19177c">mega-commands</span> <span style="color:#19177c">folder-commands</span> <span style="color:#19177c">git-commands</span> </span></span><span style="display:flex;"><span> (<span style="color:#19177c">my/index--commands-display</span> (<span style="color:#00f">append</span> <span style="color:#19177c">rclone-commands</span> <span style="color:#19177c">folder-commands</span> <span style="color:#19177c">git-commands</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">waka-commands</span> <span style="color:#19177c">symlink-commands</span>))))) </span></span><span style="display:flex;"><span> <span style="color:#19177c">waka-commands</span> <span style="color:#19177c">symlink-commands</span>)))))
</span></span></code></pre></div><h4 id="navigation-1">Navigation</h4> </span></span></code></pre></div><h4 id="navigation-1">Navigation</h4>
<p>The last piece is the navigation interface.</p> <p>The last piece is the navigation interface.</p>

File diff suppressed because one or more lines are too long

View file

@ -180,7 +180,7 @@
</span></span><span style="display:flex;"><span><span style="color:#7d9029">remoteuser</span> <span style="color:#666">=</span> <span style="color:#ba2121">&lt;&lt;mail-username()&gt;&gt;</span> </span></span><span style="display:flex;"><span><span style="color:#7d9029">remoteuser</span> <span style="color:#666">=</span> <span style="color:#ba2121">&lt;&lt;mail-username()&gt;&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#7d9029">remotepass</span> <span style="color:#666">=</span> <span style="color:#ba2121">&lt;&lt;mail-password()&gt;&gt;</span> </span></span><span style="display:flex;"><span><span style="color:#7d9029">remotepass</span> <span style="color:#666">=</span> <span style="color:#ba2121">&lt;&lt;mail-password()&gt;&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#7d9029">remoteport</span> <span style="color:#666">=</span> <span style="color:#ba2121">993</span> </span></span><span style="display:flex;"><span><span style="color:#7d9029">remoteport</span> <span style="color:#666">=</span> <span style="color:#ba2121">993</span>
</span></span><span style="display:flex;"><span><span style="color:#7d9029">cert_fingerprint</span> <span style="color:#666">=</span> <span style="color:#ba2121">416b1f7f18d68a65f5e75bb1af5d65ea5e20739e</span> </span></span><span style="display:flex;"><span><span style="color:#7d9029">cert_fingerprint</span> <span style="color:#666">=</span> <span style="color:#ba2121">20bbfdcb617e4695c47a90af96e40d72a57adee4</span>
</span></span></code></pre></div><h2 id="notmuch">Notmuch</h2> </span></span></code></pre></div><h2 id="notmuch">Notmuch</h2>
<table> <table>
<thead> <thead>
@ -460,7 +460,7 @@ Remove <code>TAG</code> from emails which are outside the matching <code>PATH</c
</span></span><span style="display:flex;"><span>port <span style="color:#666">465</span> </span></span><span style="display:flex;"><span>port <span style="color:#666">465</span>
</span></span><span style="display:flex;"><span>tls on </span></span><span style="display:flex;"><span>tls on
</span></span><span style="display:flex;"><span>tls_starttls off </span></span><span style="display:flex;"><span>tls_starttls off
</span></span><span style="display:flex;"><span>tls_fingerprint <span style="color:#666">69</span>:E9:<span style="color:#666">61</span>:A0:DE:<span style="color:#666">8</span>B:AD:F2:C0:<span style="color:#666">90</span>:<span style="color:#666">2</span>F:<span style="color:#666">55</span>:F9:D6:<span style="color:#666">80</span>:<span style="color:#666">7</span>F:<span style="color:#666">0</span>B:AB:<span style="color:#666">7</span>E:<span style="color:#666">1</span>B:FD:<span style="color:#666">56</span>:C0:EE:<span style="color:#666">35</span>:ED:E2:EB:DD:<span style="color:#666">80</span>:AD:C3 </span></span><span style="display:flex;"><span>tls_fingerprint AD:<span style="color:#666">1</span>D:<span style="color:#666">38</span>:<span style="color:#666">93</span>:<span style="color:#666">43</span>:<span style="color:#666">18</span>:F2:DF:<span style="color:#666">0</span>C:<span style="color:#666">62</span>:<span style="color:#666">80</span>:<span style="color:#666">81</span>:<span style="color:#666">55</span>:<span style="color:#666">74</span>:B0:FB:A7:<span style="color:#666">2</span>B:FF:BD:FC:<span style="color:#666">60</span>:<span style="color:#666">05</span>:<span style="color:#666">02</span>:<span style="color:#666">89</span>:AB:F3:C2:<span style="color:#666">33</span>:<span style="color:#666">57</span>:E1:<span style="color:#666">96</span>
</span></span><span style="display:flex;"><span>from pvkorytov@etu.ru </span></span><span style="display:flex;"><span>from pvkorytov@etu.ru
</span></span><span style="display:flex;"><span>user pvkorytov </span></span><span style="display:flex;"><span>user pvkorytov
</span></span><span style="display:flex;"><span>passwordeval <span style="color:#ba2121">&#34;pass show Job/Digital/Email/pvkorytov@etu.ru | head -n 1&#34;</span> </span></span><span style="display:flex;"><span>passwordeval <span style="color:#ba2121">&#34;pass show Job/Digital/Email/pvkorytov@etu.ru | head -n 1&#34;</span>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang=""><head> <html lang=""><head>
<meta name="generator" content="Hugo 0.148.2"> <meta name="generator" content="Hugo 0.152.2">
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

View file

@ -1331,7 +1331,8 @@ Customize the formatting of these records through &lt;code&gt;org-clock-agg-elem
} }
&lt;/style&gt; &lt;/style&gt;
&lt;blockquote&gt; &lt;blockquote&gt;
&lt;p&gt;Poof I made my free-time disappear&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Poof I made my free-time disappear&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p class=&#34;quote-title&#34;&gt;- &lt;a href=&#34;https://elken.dev&#34;&gt;Ellis Kenyő&lt;/a&gt;, on being called an &#34;elisp mage&#34; &lt;p class=&#34;quote-title&#34;&gt;- &lt;a href=&#34;https://elken.dev&#34;&gt;Ellis Kenyő&lt;/a&gt;, on being called an &#34;elisp mage&#34;
&lt;p&gt;Little did I know on the fateful day of &lt;strong&gt;&lt;span class=&#34;timestamp-wrapper&#34;&gt;&lt;span class=&#34;timestamp&#34;&gt;[2020-10-09 Fri]&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;, when I had installed &lt;a href=&#34;https://www.gnu.org/software/emacs/&#34;&gt;GNU Emacs&lt;/a&gt;. I wasn&amp;rsquo;t thinking about the &lt;a href=&#34;https://www.gnu.org/philosophy/philosophy.html&#34;&gt;ethical aspects&lt;/a&gt; of free software, the &lt;a href=&#34;https://www.webofstories.com/play/marvin.minsky/44&#34;&gt;aesthetics of Lisp&lt;/a&gt;, or these other things with which an occasional layperson might explain how an almost &lt;a href=&#34;https://www.jwz.org/doc/emacs-timeline.html&#34;&gt;half a century old&lt;/a&gt; program can still be in &lt;a href=&#34;https://emacsconf.org/2022/talks/survey/&#34;&gt;active use&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Little did I know on the fateful day of &lt;strong&gt;&lt;span class=&#34;timestamp-wrapper&#34;&gt;&lt;span class=&#34;timestamp&#34;&gt;[2020-10-09 Fri]&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;, when I had installed &lt;a href=&#34;https://www.gnu.org/software/emacs/&#34;&gt;GNU Emacs&lt;/a&gt;. I wasn&amp;rsquo;t thinking about the &lt;a href=&#34;https://www.gnu.org/philosophy/philosophy.html&#34;&gt;ethical aspects&lt;/a&gt; of free software, the &lt;a href=&#34;https://www.webofstories.com/play/marvin.minsky/44&#34;&gt;aesthetics of Lisp&lt;/a&gt;, or these other things with which an occasional layperson might explain how an almost &lt;a href=&#34;https://www.jwz.org/doc/emacs-timeline.html&#34;&gt;half a century old&lt;/a&gt; program can still be in &lt;a href=&#34;https://emacsconf.org/2022/talks/survey/&#34;&gt;active use&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes.&lt;/p&gt; &lt;p&gt;In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes.&lt;/p&gt;

View file

@ -84,7 +84,8 @@
} }
</style> </style>
<blockquote> <blockquote>
<p>Poof I made my free-time disappear</p></blockquote> <p>Poof I made my free-time disappear</p>
</blockquote>
<p class="quote-title">- <a href="https://elken.dev">Ellis Kenyő</a>, on being called an "elisp mage" <p class="quote-title">- <a href="https://elken.dev">Ellis Kenyő</a>, on being called an "elisp mage"
<p>Little did I know on the fateful day of <strong><span class="timestamp-wrapper"><span class="timestamp">[2020-10-09 Fri]</span></span></strong>, when I had installed <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a>. I wasn&rsquo;t thinking about the <a href="https://www.gnu.org/philosophy/philosophy.html">ethical aspects</a> of free software, the <a href="https://www.webofstories.com/play/marvin.minsky/44">aesthetics of Lisp</a>, or these other things with which an occasional layperson might explain how an almost <a href="https://www.jwz.org/doc/emacs-timeline.html">half a century old</a> program can still be in <a href="https://emacsconf.org/2022/talks/survey/">active use</a>.</p> <p>Little did I know on the fateful day of <strong><span class="timestamp-wrapper"><span class="timestamp">[2020-10-09 Fri]</span></span></strong>, when I had installed <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a>. I wasn&rsquo;t thinking about the <a href="https://www.gnu.org/philosophy/philosophy.html">ethical aspects</a> of free software, the <a href="https://www.webofstories.com/play/marvin.minsky/44">aesthetics of Lisp</a>, or these other things with which an occasional layperson might explain how an almost <a href="https://www.jwz.org/doc/emacs-timeline.html">half a century old</a> program can still be in <a href="https://emacsconf.org/2022/talks/survey/">active use</a>.</p>
<p>In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes.</p> <p>In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes.</p>

View file

@ -838,7 +838,8 @@
} }
&lt;/style&gt; &lt;/style&gt;
&lt;blockquote&gt; &lt;blockquote&gt;
&lt;p&gt;Poof I made my free-time disappear&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Poof I made my free-time disappear&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p class=&#34;quote-title&#34;&gt;- &lt;a href=&#34;https://elken.dev&#34;&gt;Ellis Kenyő&lt;/a&gt;, on being called an &#34;elisp mage&#34; &lt;p class=&#34;quote-title&#34;&gt;- &lt;a href=&#34;https://elken.dev&#34;&gt;Ellis Kenyő&lt;/a&gt;, on being called an &#34;elisp mage&#34;
&lt;p&gt;Little did I know on the fateful day of &lt;strong&gt;&lt;span class=&#34;timestamp-wrapper&#34;&gt;&lt;span class=&#34;timestamp&#34;&gt;[2020-10-09 Fri]&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;, when I had installed &lt;a href=&#34;https://www.gnu.org/software/emacs/&#34;&gt;GNU Emacs&lt;/a&gt;. I wasn&amp;rsquo;t thinking about the &lt;a href=&#34;https://www.gnu.org/philosophy/philosophy.html&#34;&gt;ethical aspects&lt;/a&gt; of free software, the &lt;a href=&#34;https://www.webofstories.com/play/marvin.minsky/44&#34;&gt;aesthetics of Lisp&lt;/a&gt;, or these other things with which an occasional layperson might explain how an almost &lt;a href=&#34;https://www.jwz.org/doc/emacs-timeline.html&#34;&gt;half a century old&lt;/a&gt; program can still be in &lt;a href=&#34;https://emacsconf.org/2022/talks/survey/&#34;&gt;active use&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Little did I know on the fateful day of &lt;strong&gt;&lt;span class=&#34;timestamp-wrapper&#34;&gt;&lt;span class=&#34;timestamp&#34;&gt;[2020-10-09 Fri]&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;, when I had installed &lt;a href=&#34;https://www.gnu.org/software/emacs/&#34;&gt;GNU Emacs&lt;/a&gt;. I wasn&amp;rsquo;t thinking about the &lt;a href=&#34;https://www.gnu.org/philosophy/philosophy.html&#34;&gt;ethical aspects&lt;/a&gt; of free software, the &lt;a href=&#34;https://www.webofstories.com/play/marvin.minsky/44&#34;&gt;aesthetics of Lisp&lt;/a&gt;, or these other things with which an occasional layperson might explain how an almost &lt;a href=&#34;https://www.jwz.org/doc/emacs-timeline.html&#34;&gt;half a century old&lt;/a&gt; program can still be in &lt;a href=&#34;https://emacsconf.org/2022/talks/survey/&#34;&gt;active use&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes.&lt;/p&gt; &lt;p&gt;In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes.&lt;/p&gt;

View file

@ -1 +1 @@
@font-face{font-family:inconsolata lgc;font-style:normal;font-weight:400;src:local(""),url(fonts/inconsolatalgc-scaled-down.woff2)format("woff2")}#content a,.nav-link{color:#dc3545;text-decoration:none}#content a *,.nav-link *{color:#dc3545}#content a:hover,.nav-link:hover{color:#dc3545;text-decoration:underline}#footer a,.navbar-brand{color:#222;text-decoration:none}#footer a *,.navbar-brand *{color:#222}#footer a:hover,.navbar-brand:hover{color:#222;text-decoration:underline}#content table td,#content table th{border:1px solid #ccc;padding:6px 12px;text-align:left}*{color:#222;font-family:inconsolata,inconsolata lgc;line-height:1.2}.text-ru{font-family:inconsolata lgc,inconsolata}.root{display:flex;flex-direction:column}.table-of-contents{order:0}.table-of-contents ul{padding-left:1rem !important}.table-of-contents ul>li{margin-left:.3em !important}.table-of-contents a.active{font-weight:700}.table-of-contents a:hover{cursor:pointer}@media(max-width:578px){.table-of-contents{align-self:center}}.container{max-width:750px;order:1}#title-large-screen{display:none}#title-small-screen{margin-left:15px !important}@media(max-width:578px){#title-small-screen{align-self:center}}@media(max-width:1125px){.root{margin-right:auto;margin-left:auto;width:100%;max-width:750px}.table-of-contents{padding-left:15px;padding-right:15px}}@media(min-width:1275px){.root{margin-left:calc((100vw - 750px)/2)}#actual-content{margin:0}}@media(min-width:1125px){.root{flex-direction:row}.table-of-contents{width:350px;order:2;position:sticky;top:0;padding:1em;align-self:start;scrollbar-width:thin}.table-of-contents .table-of-contents-text{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 155px)}.table-of-contents .hidden{display:none}#title-small-screen{display:none}#title-large-screen{display:block}}.navbar-brand{font-size:2rem}#content p{margin-bottom:.6rem}#content h1,#content h2,#content h3,#content h4,#content h5,#content h6{font-size:medium;font-weight:700;margin:1rem 0 .6rem}#content h1{font-size:1.8rem}#content h2{font-size:1.6rem}#content h3{font-size:1.4rem}#content h4{font-size:1.2rem}#content img{display:block;margin:1rem auto;max-width:100%}#content a>img{margin:1rem 4px 1rem 0 !important}#content .avatar>img{border-radius:50%;float:right;margin:-8px 0 0 16px;height:90px;width:90px}#content .webbuttons{display:flex;flex-direction:row;gap:5px}#content .webbuttons>figure{margin:0}#content ol{counter-reset:list;list-style:none;padding-left:2rem}#content ol>li{display:table-row}#content ol>li:before{content:"[" counter(list,decimal)"] ";counter-increment:list;display:table-cell;text-align:right;padding-right:.5em}#content .container>ol,#content .footnotes>ol{padding-left:0}#content ul{list-style:inside;padding-left:2rem}#content ul>li{list-style-position:outside;margin-left:1em}#content .container>ul,#content .footnotes>ul{padding-left:0}#content table{margin:1rem auto;width:100%}#content table th{font-weight:700}#content table tr:nth-child(2n){background-color:#f8f8f8}#content .table-no-header th{font-weight:400}#content .table-no-header table{margin:0 0 .5rem}#content blockquote{border-left:4px solid;font-style:italic;margin:1rem 0;padding:8px}#content code{color:#222;background-color:#f8f8f8;border:1px solid #ccc;border-radius:10%;padding:0 4px;font-family:monospace !important}#content code span{font-family:monospace}#content pre code{all:unset;font-size:95%}#content .highlight{margin:1rem auto;border:1px solid #ccc}#content .highlight>pre{padding:8px;margin-bottom:0}#content .abstract{margin-top:12px;margin-bottom:12px;padding-left:72px;padding-right:72px}#content .abstract p:first-of-type::before{content:"Abstract: ";font-weight:700}#content span.underline{text-decoration:underline} @font-face{font-family:inconsolata lgc;font-style:normal;font-weight:400;src:local(""),url(fonts/inconsolatalgc-scaled-down.woff2)format("woff2")}#content a,.nav-link{color:#dc3545;text-decoration:none}#content a *,.nav-link *{color:#dc3545}#content a:hover,.nav-link:hover{color:#dc3545;text-decoration:underline}#footer a,.navbar-brand{color:#222;text-decoration:none}#footer a *,.navbar-brand *{color:#222}#footer a:hover,.navbar-brand:hover{color:#222;text-decoration:underline}#content table td,#content table th{border:1px solid #ccc;padding:6px 12px;text-align:left}*{color:#222;font-family:inconsolata,inconsolata lgc;line-height:1.2}.text-ru{font-family:inconsolata lgc,inconsolata}.root{display:flex;flex-direction:column}.table-of-contents{order:0}.table-of-contents ul{padding-left:1rem!important}.table-of-contents ul>li{margin-left:.3em!important}.table-of-contents a.active{font-weight:700}.table-of-contents a:hover{cursor:pointer}@media(max-width:578px){.table-of-contents{align-self:center}}.container{max-width:750px;order:1}#title-large-screen{display:none}#title-small-screen{margin-left:15px!important}@media(max-width:578px){#title-small-screen{align-self:center}}@media(max-width:1125px){.root{margin-right:auto;margin-left:auto;width:100%;max-width:750px}.table-of-contents{padding-left:15px;padding-right:15px}}@media(min-width:1275px){.root{margin-left:calc((100vw - 750px)/2)}#actual-content{margin:0}}@media(min-width:1125px){.root{flex-direction:row}.table-of-contents{width:350px;order:2;position:sticky;top:0;padding:1em;align-self:start;scrollbar-width:thin}.table-of-contents .table-of-contents-text{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 155px)}.table-of-contents .hidden{display:none}#title-small-screen{display:none}#title-large-screen{display:block}}.navbar-brand{font-size:2rem}#content p{margin-bottom:.6rem}#content h1,#content h2,#content h3,#content h4,#content h5,#content h6{font-size:medium;font-weight:700;margin:1rem 0 .6rem}#content h1{font-size:1.8rem}#content h2{font-size:1.6rem}#content h3{font-size:1.4rem}#content h4{font-size:1.2rem}#content img{display:block;margin:1rem auto;max-width:100%}#content a>img{margin:1rem 4px 1rem 0!important}#content .avatar>img{border-radius:50%;float:right;margin:-8px 0 0 16px;height:90px;width:90px}#content .webbuttons{display:flex;flex-direction:row;gap:5px}#content .webbuttons>figure{margin:0}#content ol{counter-reset:list;list-style:none;padding-left:2rem}#content ol>li{display:table-row}#content ol>li:before{content:"[" counter(list,decimal)"] ";counter-increment:list;display:table-cell;text-align:right;padding-right:.5em}#content .container>ol,#content .footnotes>ol{padding-left:0}#content ul{list-style:inside;padding-left:2rem}#content ul>li{list-style-position:outside;margin-left:1em}#content .container>ul,#content .footnotes>ul{padding-left:0}#content table{margin:1rem auto;width:100%}#content table th{font-weight:700}#content table tr:nth-child(2n){background-color:#f8f8f8}#content .table-no-header th{font-weight:400}#content .table-no-header table{margin:0 0 .5rem}#content blockquote{border-left:4px solid;font-style:italic;margin:1rem 0;padding:8px}#content code{color:#222;background-color:#f8f8f8;border:1px solid #ccc;border-radius:10%;padding:0 4px;font-family:monospace!important}#content code span{font-family:monospace}#content pre code{all:unset;font-size:95%}#content .highlight{margin:1rem auto;border:1px solid #ccc}#content .highlight>pre{padding:8px;margin-bottom:0}#content .abstract{margin-top:12px;margin-bottom:12px;padding-left:72px;padding-right:72px}#content .abstract p:first-of-type::before{content:"Abstract: ";font-weight:700}#content span.underline{text-decoration:underline}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 65 KiB

View file

@ -20,7 +20,7 @@
<link>https://sqrtminusone.xyz/posts/2023-04-13-emacs/</link> <link>https://sqrtminusone.xyz/posts/2023-04-13-emacs/</link>
<pubDate>Thu, 13 Apr 2023 00:00:00 +0000</pubDate> <pubDate>Thu, 13 Apr 2023 00:00:00 +0000</pubDate>
<guid>https://sqrtminusone.xyz/posts/2023-04-13-emacs/</guid> <guid>https://sqrtminusone.xyz/posts/2023-04-13-emacs/</guid>
<description>&lt;style&gt;&#xA; .quote-title {&#xA; margin-left: 24px;&#xA; }&#xA;&lt;/style&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Poof I made my free-time disappear&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p class=&#34;quote-title&#34;&gt;- &lt;a href=&#34;https://elken.dev&#34;&gt;Ellis Kenyő&lt;/a&gt;, on being called an &#34;elisp mage&#34;&#xA;&lt;p&gt;Little did I know on the fateful day of &lt;strong&gt;&lt;span class=&#34;timestamp-wrapper&#34;&gt;&lt;span class=&#34;timestamp&#34;&gt;[2020-10-09 Fri]&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;, when I had installed &lt;a href=&#34;https://www.gnu.org/software/emacs/&#34;&gt;GNU Emacs&lt;/a&gt;. I wasn&amp;rsquo;t thinking about the &lt;a href=&#34;https://www.gnu.org/philosophy/philosophy.html&#34;&gt;ethical aspects&lt;/a&gt; of free software, the &lt;a href=&#34;https://www.webofstories.com/play/marvin.minsky/44&#34;&gt;aesthetics of Lisp&lt;/a&gt;, or these other things with which an occasional layperson might explain how an almost &lt;a href=&#34;https://www.jwz.org/doc/emacs-timeline.html&#34;&gt;half a century old&lt;/a&gt; program can still be in &lt;a href=&#34;https://emacsconf.org/2022/talks/survey/&#34;&gt;active use&lt;/a&gt;.&lt;/p&gt;</description> <description>&lt;style&gt;&#xA; .quote-title {&#xA; margin-left: 24px;&#xA; }&#xA;&lt;/style&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Poof I made my free-time disappear&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p class=&#34;quote-title&#34;&gt;- &lt;a href=&#34;https://elken.dev&#34;&gt;Ellis Kenyő&lt;/a&gt;, on being called an &#34;elisp mage&#34;&#xA;&lt;p&gt;Little did I know on the fateful day of &lt;strong&gt;&lt;span class=&#34;timestamp-wrapper&#34;&gt;&lt;span class=&#34;timestamp&#34;&gt;[2020-10-09 Fri]&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;, when I had installed &lt;a href=&#34;https://www.gnu.org/software/emacs/&#34;&gt;GNU Emacs&lt;/a&gt;. I wasn&amp;rsquo;t thinking about the &lt;a href=&#34;https://www.gnu.org/philosophy/philosophy.html&#34;&gt;ethical aspects&lt;/a&gt; of free software, the &lt;a href=&#34;https://www.webofstories.com/play/marvin.minsky/44&#34;&gt;aesthetics of Lisp&lt;/a&gt;, or these other things with which an occasional layperson might explain how an almost &lt;a href=&#34;https://www.jwz.org/doc/emacs-timeline.html&#34;&gt;half a century old&lt;/a&gt; program can still be in &lt;a href=&#34;https://emacsconf.org/2022/talks/survey/&#34;&gt;active use&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes.&lt;/p&gt;</description>
</item> </item>
<item> <item>
<title>Running Gource with Emacs</title> <title>Running Gource with Emacs</title>