This commit is contained in:
SqrtMinusOne 2022-06-26 19:05:55 +00:00
parent aea172d278
commit 8c0426e440
17 changed files with 1787 additions and 600 deletions

View file

@ -58,10 +58,13 @@
</div>
<hr>
<div id="content">
<div class="container">
<h1>Console</h1>
<h2 id="dot-profile"><code>.profile</code></h2>
<h3 id="environment">Environment</h3>
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<div class="root">
<h1 id="title-small-screen">Console</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen">Console</h1>
<h2 id="60f878"><code>.profile</code></h2>
<h3 id="0ba29c">Environment</h3>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">QT_QPA_PLATFORMTHEME</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;qt5ct&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">QT_AUTO_SCREEN_SCALE_FACTOR</span><span style="color:#666">=</span><span style="color:#666">0</span>
</span></span></code></pre></div><p>Set ripgrep config path</p>
@ -73,7 +76,7 @@
</span></span><span style="display:flex;"><span> <span style="color:#008000">export</span> <span style="color:#19177c">IS_ANDROID</span><span style="color:#666">=</span><span style="color:#008000">true</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">[[</span> -f ~/.android_profile <span style="color:#666">]]</span> <span style="color:#666">&amp;&amp;</span> . ~/.android_profile
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><h3 id="my-paths">My paths</h3>
</span></span></code></pre></div><h3 id="15fb95">My paths</h3>
<p>My script folders</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -d <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/bin&#34;</span> <span style="color:#666">]</span> ; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">export</span> <span style="color:#19177c">PATH</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/bin:</span><span style="color:#19177c">$PATH</span><span style="color:#ba2121">&#34;</span>
@ -83,7 +86,7 @@
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -d <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/.local/bin&#34;</span> <span style="color:#666">]</span> ; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">export</span> <span style="color:#19177c">PATH</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/.local/bin:</span><span style="color:#19177c">$PATH</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><h3 id="guix-settings">Guix settings</h3>
</span></span></code></pre></div><h3 id="0680f7">Guix settings</h3>
<p>Enable extra profiles</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -z <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$IS_ANDROID</span><span style="color:#ba2121">&#34;</span> <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">GUIX_EXTRA_PROFILES</span><span style="color:#666">=</span><span style="color:#19177c">$HOME</span>/.guix-extra-profiles
@ -103,7 +106,7 @@
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">GUIX_PACKAGE_PATH</span><span style="color:#666">=</span>~/guix-packages
</span></span></code></pre></div><p>Locale settings</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">GUIX_LOCPATH</span><span style="color:#666">=</span><span style="color:#19177c">$HOME</span>/.guix-extra-profiles/console/console/lib/locale
</span></span></code></pre></div><h3 id="other-package-managers">Other package managers</h3>
</span></span></code></pre></div><h3 id="e2bff3">Other package managers</h3>
<p>Using other package managers with Guix requires some extra work.</p>
<p>Cask</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -d <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/.cask&#34;</span> <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
@ -125,19 +128,19 @@
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -d <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/.nix-profile&#34;</span> <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">export</span> <span style="color:#19177c">XDG_DATA_DIRS</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$XDG_DATA_DIRS</span><span style="color:#ba2121">:</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/.nix-profile/share/applications&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><h4 id="npm">npm</h4>
</span></span></code></pre></div><h4 id="bb30e8">npm</h4>
<p>npm is especially cumbersome, for instance because by default it tries to install packages to <code>/gnu/store/</code>.</p>
<p>In principle, one can set a prefix like this:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cfg" data-lang="cfg"><span style="display:flex;"><span><span style="color:#7d9029">prefix</span><span style="color:#666">=</span><span style="color:#ba2121">/home/pavel/.npm-packages</span>
</span></span></code></pre></div><p>But I also want to use node from conda occasionally, where prefix is already set correctly. So instead of tangling the above to the <code>~/.npmrc</code> directly, I set an environment variable in the profile:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">NPM_CONFIG_USERCONFIG</span><span style="color:#666">=</span><span style="color:#19177c">$HOME</span>/._npmrc
</span></span></code></pre></div><p>The variable is unset in a script in <a href="/configs/guix/#conda">Guix.org</a>.</p>
</span></span></code></pre></div><p>The variable is unset in a script in <a href="/configs/guix/#19d07b">Guix.org</a>.</p>
<p>Set PATH &amp; MANPATH</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#19177c">NPM_PACKAGES</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">HOME</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">/.npm-packages&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">PATH</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$PATH</span><span style="color:#ba2121">:</span><span style="color:#19177c">$NPM_PACKAGES</span><span style="color:#ba2121">/bin&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">MANPATH</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">MANPATH</span>-<span style="color:#008000;font-weight:bold">$(</span>manpath<span style="color:#008000;font-weight:bold">)</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">:</span><span style="color:#19177c">$NPM_PACKAGES</span><span style="color:#ba2121">/share/man&#34;</span>
</span></span></code></pre></div><h3 id="xresources">XResources</h3>
</span></span></code></pre></div><h3 id="465f2b">XResources</h3>
<table>
<thead>
<tr>
@ -153,7 +156,7 @@
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -z <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$IS_ANDROID</span><span style="color:#ba2121">&#34;</span> <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> xrdb ~/.Xresources
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><h3 id="off--package-manager-paths"><span class="org-todo done OFF">OFF</span> (OFF) Package manager paths</h3>
</span></span></code></pre></div><h3 id="2d9222"><span class="org-todo done OFF">OFF</span> (OFF) Package manager paths</h3>
<p>Turned off for now, because probably it won&rsquo;t be necessary in Guix.</p>
<p>LaTeX</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -d <span style="color:#ba2121">&#34;/usr/local/texlive/2020&#34;</span> <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
@ -186,14 +189,14 @@
</span></span><span style="display:flex;"><span> <span style="color:#19177c">PERL_MB_OPT</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;--install_base \&#34;/home/pavel/perl5\&#34;&#34;</span>; <span style="color:#008000">export</span> PERL_MB_OPT;
</span></span><span style="display:flex;"><span> <span style="color:#19177c">PERL_MM_OPT</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;INSTALL_BASE=/home/pavel/perl5&#34;</span>; <span style="color:#008000">export</span> PERL_MM_OPT;
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><h2 id="bash">Bash</h2>
<h3 id="dot-bash-profile"><code>.bash_profile</code></h3>
</span></span></code></pre></div><h2 id="7024ff">Bash</h2>
<h3 id="dfd3ae"><code>.bash_profile</code></h3>
<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><span style="color:#666">[[</span> -f ~/.profile <span style="color:#666">]]</span> <span style="color:#666">&amp;&amp;</span> . ~/.profile
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#666">[[</span> -f ~/.bashrc <span style="color:#666">]]</span> <span style="color:#666">&amp;&amp;</span> . ~/.bashrc
</span></span></code></pre></div><h3 id="dot-bashrc"><code>.bashrc</code></h3>
</span></span></code></pre></div><h3 id="411240"><code>.bashrc</code></h3>
<p>My <code>.bashrc</code>, which has pieces from the default ones in Guix &amp; Manjaro, as well some mine settings.</p>
<h4 id="startup-and-environment">Startup &amp; environment</h4>
<h4 id="9d3a4f">Startup &amp; environment</h4>
<p>Export &lsquo;SHELL&rsquo; to child processes. Programs such as &lsquo;screen&rsquo; honor it and otherwise use /bin/sh.</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><span style="color:#008000">export</span> SHELL
</span></span></code></pre></div><p>We are being invoked from a non-interactive shell. If this is an SSH session (as in &ldquo;ssh host command&rdquo;), source /etc/profile so we get PATH and other essential variables.</p>
@ -228,7 +231,7 @@
<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>xhost +local:root &gt; /dev/null 2&gt;&amp;<span style="color:#666">1</span>
</span></span></code></pre></div><p>Set manpager to bat</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><span style="color:#008000">export</span> <span style="color:#19177c">MANPAGER</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;sh -c &#39;sed -e s/.\\\\x08//g | bat -l man -p&#39;&#34;</span>
</span></span></code></pre></div><h4 id="launch-fish">Launch fish</h4>
</span></span></code></pre></div><h4 id="c56fde">Launch fish</h4>
<p>Launch fish shell unless bash itself is launched from fish.</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><span style="color:#19177c">use_fish</span><span style="color:#666">=</span><span style="color:#008000">true</span>
</span></span><span style="display:flex;"><span>
@ -237,7 +240,7 @@
</span></span><span style="display:flex;"><span> <span style="color:#008000">exec</span> fish
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><p>The rest of <code>.bashrc</code> is not executed if fish was launched.</p>
<h4 id="colors">Colors</h4>
<h4 id="5d5088">Colors</h4>
<p>Setting for colors, packed in the default <code>.bashrc</code> in Manjaro</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><span style="color:#19177c">use_color</span><span style="color:#666">=</span><span style="color:#008000">true</span>
</span></span><span style="display:flex;"><span>
@ -285,7 +288,7 @@
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000">unset</span> use_color safe_term match_lhs sh
</span></span></code></pre></div><h4 id="settings">Settings</h4>
</span></span></code></pre></div><h4 id="f4f707">Settings</h4>
<p>Some general bash settings.</p>
<p>References:</p>
<ul>
@ -308,7 +311,7 @@
</span></span><span style="display:flex;"><span> <span style="color:#008000">source</span> /usr/share/fzf/completion.bash
</span></span><span style="display:flex;"><span> <span style="color:#008000">source</span> /usr/share/fzf/key-bindings.bash
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><h4 id="aliases">Aliases</h4>
</span></span></code></pre></div><h4 id="9ab81f">Aliases</h4>
<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><span style="color:#008000">alias</span> <span style="color:#19177c">v</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;vim&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000">alias</span> <span style="color:#19177c">gg</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;lazygit&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000">alias</span> <span style="color:#19177c">ls</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;exa --icons&#34;</span>
@ -322,7 +325,7 @@
</span></span><span style="display:flex;"><span> <span style="color:#008000">unalias</span> ls
</span></span><span style="display:flex;"><span> <span style="color:#008000">alias</span> <span style="color:#19177c">ll</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;ls -lah&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><h4 id="anaconda">Anaconda</h4>
</span></span></code></pre></div><h4 id="853f30">Anaconda</h4>
<blockquote>
<p>managed by &lsquo;conda init&rsquo; !!!</p>
</blockquote>
@ -345,11 +348,11 @@
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[[</span> ! -z <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$INIT_CONDA</span><span style="color:#ba2121">&#34;</span> <span style="color:#666">]]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> init_conda
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><h4 id="starship">Starship</h4>
</span></span></code></pre></div><h4 id="1c8232">Starship</h4>
<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><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[[</span> -z <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$SIMPLE</span><span style="color:#ba2121">&#34;</span> <span style="color:#666">]]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">eval</span> <span style="color:#ba2121">&#34;</span><span style="color:#008000;font-weight:bold">$(</span>starship init bash<span style="color:#008000;font-weight:bold">)</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><h2 id="fish">Fish</h2>
</span></span></code></pre></div><h2 id="071642">Fish</h2>
<table>
<thead>
<tr>
@ -390,7 +393,7 @@
</span></span></span><span style="display:flex;"><span><span style="color:#008000"></span><span style="color:#008000;font-weight:bold">end</span>
</span></span></code></pre></div><p>Suppress fish greeting</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fish" data-lang="fish"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">set</span> <span style="color:#008000">fish_greeting</span>
</span></span></code></pre></div><h3 id="anaconda">Anaconda</h3>
</span></span></code></pre></div><h3 id="853f30">Anaconda</h3>
<p>First, a function to initialize anaconda.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fish" data-lang="fish"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">function</span> <span style="color:#00f">init_conda</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">eval</span> /home/pavel/.guix-extra-profiles/dev/dev/bin/conda <span style="color:#ba2121">&#34;shell.fish&#34;</span> <span style="color:#ba2121">&#34;hook&#34;</span> <span style="color:#19177c">$argv</span> <span style="color:#666">|</span> <span style="color:#008000">source
@ -403,7 +406,7 @@
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fish" data-lang="fish"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#008000;font-weight:bold">test</span> <span style="color:#7d9029">-n</span> <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$EMACS_CONDA_ENV</span><span style="color:#ba2121">&#34;</span>;
</span></span><span style="display:flex;"><span> <span style="color:#00f">conda</span> activate <span style="color:#19177c">$EMACS_CONDA_ENV</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">end</span>
</span></span></code></pre></div><h3 id="colors">Colors</h3>
</span></span></code></pre></div><h3 id="5d5088">Colors</h3>
<p>Fish seems to have hardcoded colorcodes in some color settings. I set these to base16 colors so they would match Xresources.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fish" data-lang="fish"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">set</span> <span style="color:#19177c">fish_color_command</span> cyan
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">set</span> <span style="color:#19177c">fish_color_comment</span> green
@ -414,19 +417,19 @@
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">set</span> <span style="color:#19177c">fish_color_param</span> magenta
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">set</span> <span style="color:#19177c">fish_color_quote</span> brwhite
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">set</span> <span style="color:#19177c">fish_color_redirection</span> yellow
</span></span></code></pre></div><h3 id="keybindings">Keybindings</h3>
</span></span></code></pre></div><h3 id="cbebf7">Keybindings</h3>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fish" data-lang="fish"><span style="display:flex;"><span><span style="color:#008000">bind</span> <span style="color:#7d9029">-M</span> insert <span style="color:#b62;font-weight:bold">\e</span>l forward-char
</span></span><span style="display:flex;"><span><span style="color:#008000">bind</span> <span style="color:#7d9029">-M</span> insert <span style="color:#b62;font-weight:bold">\e</span>h backward-char
</span></span><span style="display:flex;"><span><span style="color:#008000">bind</span> <span style="color:#7d9029">-M</span> insert <span style="color:#b62;font-weight:bold">\e</span>w forward-word
</span></span><span style="display:flex;"><span><span style="color:#008000">bind</span> <span style="color:#7d9029">-M</span> insert <span style="color:#b62;font-weight:bold">\e</span>b backward-word
</span></span></code></pre></div><h3 id="functions">Functions</h3>
</span></span></code></pre></div><h3 id="e93acb">Functions</h3>
<p>A small function to open the file with <code>$EDITOR</code>.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fish" data-lang="fish"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">function</span> <span style="color:#00f">e</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">eval</span> <span style="color:#19177c">$EDITOR</span> <span style="color:#19177c">$argv</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">end</span>
</span></span></code></pre></div><h3 id="direnv">direnv</h3>
</span></span></code></pre></div><h3 id="f1fd9d">direnv</h3>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fish" data-lang="fish"><span style="display:flex;"><span><span style="color:#00f">direnv</span> hook <span style="color:#008000">fish</span> <span style="color:#666">|</span> <span style="color:#008000">source</span>
</span></span></code></pre></div><h2 id="nushell">Nushell</h2>
</span></span></code></pre></div><h2 id="172b53">Nushell</h2>
<table>
<thead>
<tr>
@ -465,7 +468,7 @@
</span></span><span style="display:flex;"><span>primitive_date=<span style="color:#ba2121">&#34;r&#34;</span>
</span></span><span style="display:flex;"><span>primitive_int=<span style="color:#ba2121">&#34;c&#34;</span>
</span></span><span style="display:flex;"><span>primitive_decimal=<span style="color:#ba2121">&#34;c&#34;</span>
</span></span></code></pre></div><h2 id="starship-prompt">Starship prompt</h2>
</span></span></code></pre></div><h2 id="e37bf0">Starship prompt</h2>
<table>
<thead>
<tr>
@ -561,7 +564,7 @@
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>[rust]
</span></span><span style="display:flex;"><span>symbol = <span style="color:#ba2121">&#34;&#34;</span>
</span></span></code></pre></div><h2 id="tmux">Tmux</h2>
</span></span></code></pre></div><h2 id="705762">Tmux</h2>
<table>
<thead>
<tr>
@ -579,13 +582,13 @@
</table>
<p><a href="https://github.com/tmux/tmux">tmux</a> is my terminal multiplexer of choice.</p>
<p>It provides pretty sane defaults, so the config is not too large. I rebind the prefix to <code>C-a</code> though.</p>
<h3 id="term-settings">Term settings</h3>
<h3 id="c7d1aa">Term settings</h3>
<p>I have no idea how and why these two work.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-vim" data-lang="vim"><span style="display:flex;"><span>set -g default-terminal <span style="color:#ba2121">&#34;screen-256color&#34;</span><span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span>set -ga terminal-overrides <span style="color:#ba2121">&#34;,*256col*:Tc&#34;</span><span style="">
</span></span></span></code></pre></div><p>History limit.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-vim" data-lang="vim"><span style="display:flex;"><span>set -g history-limit <span style="color:#666">20000</span><span style="">
</span></span></span></code></pre></div><h3 id="keybindings">Keybindings</h3>
</span></span></span></code></pre></div><h3 id="cbebf7">Keybindings</h3>
<p>Enable vi keys and mouse.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-vim" data-lang="vim"><span style="display:flex;"><span>set-window-option -g mode-keys vi<span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span>set-option -g xterm-keys on<span style="">
@ -609,7 +612,7 @@
</span></span></span><span style="display:flex;"><span><span style=""></span>bind-key T previous-window<span style="">
</span></span></span></code></pre></div><p>Reload the config.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-vim" data-lang="vim"><span style="display:flex;"><span>bind r source-file ~/.tmux.conf<span style="">
</span></span></span></code></pre></div><h3 id="copy-to-clipboard">Copy to clipboard</h3>
</span></span></span></code></pre></div><h3 id="a61278">Copy to clipboard</h3>
<table>
<thead>
<tr>
@ -625,7 +628,7 @@
<p>Make tmux copying copy to clipboard as well</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-vim" data-lang="vim"><span style="display:flex;"><span>bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel <span style="color:#ba2121">&#34;xclip -selection clipboard -i&#34;</span><span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span>bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel <span style="color:#ba2121">&#34;xclip -selection clipboard -i&#34;</span><span style="">
</span></span></span></code></pre></div><h3 id="ui">UI</h3>
</span></span></span></code></pre></div><h3 id="71ff71">UI</h3>
<p>I generated the following with <a href="https://github.com/edkolev/tmuxline.vim">tmuxline.vim</a> plugin and palenight theme for <a href="https://github.com/vim-airline/vim-airline">vim-airline</a></p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-vim" data-lang="vim"><span style="display:flex;"><span># This tmux statusbar config was created by tmuxline.vim<span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span># on Wed, <span style="color:#666">22</span> Jan <span style="color:#666">2020</span><span style="">
@ -650,7 +653,7 @@
</span></span></span><span style="display:flex;"><span><span style=""></span>setw -g window-status-current-format <span style="color:#ba2121">&#34;#[fg=#333747,bg=#474b59,nobold,nounderscore,noitalics]#[fg=#bfc7d5,bg=#474b59] #I #W #[fg=#474b59,bg=#333747,nobold,nounderscore,noitalics]&#34;</span><span style="">
</span></span></span></code></pre></div><p>Source the line config:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-vim" data-lang="vim"><span style="display:flex;"><span>source ~/.tmux.line.conf<span style="">
</span></span></span></code></pre></div><h2 id="alacritty">Alacritty</h2>
</span></span></span></code></pre></div><h2 id="6ca94e">Alacritty</h2>
<table>
<thead>
<tr>
@ -741,7 +744,7 @@
</span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- {<span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">key: NumpadAdd, mods: Control, action</span>:<span style="color:#bbb"> </span>IncreaseFontSize }<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- {<span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">key: Minus, mods: Control, action</span>:<span style="color:#bbb"> </span>DecreaseFontSize }<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- {<span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">key: NumpadSubtract, mods: Control, action</span>:<span style="color:#bbb"> </span>DecreaseFontSize }<span style="color:#bbb">
</span></span></span></code></pre></div><h2 id="various-console-applications">Various console applications</h2>
</span></span></span></code></pre></div><h2 id="936ac8">Various console applications</h2>
<table>
<thead>
<tr>
@ -824,14 +827,14 @@
</tr>
</tbody>
</table>
<h3 id="ripgrep-config">ripgrep config</h3>
<h3 id="aaf9af">ripgrep config</h3>
<p>Occasionally I can&rsquo;t exclude certain files from ripgrep via the VCS settings, so here is a simple config to ignore certain files globally.</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>--ignore-file=/home/pavel/.config/ripgrep/ripgrepignore
</span></span></code></pre></div><p>The corresponding ignore file:</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>*.ts.snap
</span></span></code></pre></div><p>By default ripgrep doesn&rsquo;t read any configs, so it is necessary to set the <code>RIPGREP_CONFIG_PATH</code> variable in the <a href="#environment">.profile.</a></p>
<h2 id="misc-scripts">Misc scripts</h2>
<h3 id="nt-exec-command-with-a-finished-notification"><code>nt</code> - exec command with a finished notification</h3>
</span></span></code></pre></div><p>By default ripgrep doesn&rsquo;t read any configs, so it is necessary to set the <code>RIPGREP_CONFIG_PATH</code> variable in the <a href="#0ba29c">.profile.</a></p>
<h2 id="1a647e">Misc scripts</h2>
<h3 id="13f94e"><code>nt</code> - exec command with a finished notification</h3>
<p>Usage:</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>nt &lt;command&gt;
</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-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#19177c">command</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$@</span><span style="color:#ba2121">&#34;</span>
@ -844,7 +847,7 @@
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">else</span>
</span></span><span style="display:flex;"><span> notify-send <span style="color:#ba2121">&#34;Terminal&#34;</span> <span style="color:#ba2121">&#34;Command execution complete&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><h3 id="autocommit"><code>autocommit</code></h3>
</span></span></code></pre></div><h3 id="fd308f"><code>autocommit</code></h3>
<p>A script to autocommit files in a repository. I use it to sync my org directory and password store. I guess it&rsquo;s not how git is intended to be used, but it works for me.</p>
<p>Usage:</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>autocommit &lt;repository&gt; [-F]
@ -937,13 +940,13 @@
</span></span></code></pre></div><p><code>mcron</code> job:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#00f">job</span> <span style="color:#ba2121">&#34;0 * * * *&#34;</span> <span style="color:#ba2121">&#34;autocommit ~/Documents/org-mode&#34;</span>)
</span></span><span style="display:flex;"><span>(<span style="color:#00f">job</span> <span style="color:#ba2121">&#34;0,15,30,45 * * * *&#34;</span> <span style="color:#ba2121">&#34;autocommit ~/.password-store&#34;</span>)
</span></span></code></pre></div><h2 id="guix-settings">Guix settings</h2>
</span></span></code></pre></div><h2 id="0680f7">Guix settings</h2>
<p><a id="code-snippet--packages"></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:#19177c">my/format-guix-dependencies</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-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#00f">specifications-&gt;manifest</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">&#39;</span>(
</span></span><span style="display:flex;"><span> <span style="color:#19177c">&lt;&lt;packages</span>()<span style="color:#19177c">&gt;&gt;</span>))
</span></span></code></pre></div><h2 id="android-notes">Android notes</h2>
</span></span></code></pre></div><h2 id="3f6fdc">Android notes</h2>
<p>SSH instructions: <a href="https://wiki.termux.com/wiki/Remote_Access">https://wiki.termux.com/wiki/Remote_Access</a></p>
<p>Don&rsquo;t forget to install the following termux packages:</p>
<table>
@ -981,7 +984,7 @@
<li>cleanup <code>$PREFIX/etc/motd</code> to remove hello message.</li>
<li>copy the required font at <code>$HOME/.termux/font.ttf</code> and run <code>termux-reload-settings</code>.</li>
</ul>
<h3 id="installation-of-dt-s-colorscripts">Installation of <a href="https://gitlab.com/dwt1/shell-color-scripts">DT&rsquo;s colorscripts</a>:</h3>
<h3 id="0145b1">Installation of <a href="https://gitlab.com/dwt1/shell-color-scripts">DT&rsquo;s colorscripts</a>:</h3>
<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>git clone https://gitlab.com/dwt1/shell-color-scripts.git
</span></span><span style="display:flex;"><span><span style="color:#008000">cd</span> shell-color-scripts
</span></span></code></pre></div><p>Apply a patch:</p>
@ -1000,6 +1003,85 @@
</span></span><span style="display:flex;"><span>sudo cp -rf colorscripts/* <span style="color:#19177c">$PREFIX</span>/opt/shell-color-scripts/colorscripts
</span></span><span style="display:flex;"><span>sudo cp colorscript.sh <span style="color:#19177c">$PREFIX</span>/bin/colorscript
</span></span></code></pre></div>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#60f878"><code>.profile</code></a>
<ul>
<li><a href="#0ba29c">Environment</a></li>
<li><a href="#15fb95">My paths</a></li>
<li><a href="#0680f7">Guix settings</a></li>
<li><a href="#e2bff3">Other package managers</a>
<ul>
<li><a href="#bb30e8">npm</a></li>
</ul>
</li>
<li><a href="#465f2b">XResources</a></li>
<li><a href="#2d9222"><span class="org-todo done OFF">OFF</span> (OFF) Package manager paths</a></li>
</ul>
</li>
<li><a href="#7024ff">Bash</a>
<ul>
<li><a href="#dfd3ae"><code>.bash_profile</code></a></li>
<li><a href="#411240"><code>.bashrc</code></a>
<ul>
<li><a href="#9d3a4f">Startup &amp; environment</a></li>
<li><a href="#c56fde">Launch fish</a></li>
<li><a href="#5d5088">Colors</a></li>
<li><a href="#f4f707">Settings</a></li>
<li><a href="#9ab81f">Aliases</a></li>
<li><a href="#853f30">Anaconda</a></li>
<li><a href="#1c8232">Starship</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#071642">Fish</a>
<ul>
<li><a href="#853f30">Anaconda</a></li>
<li><a href="#5d5088">Colors</a></li>
<li><a href="#cbebf7">Keybindings</a></li>
<li><a href="#e93acb">Functions</a></li>
<li><a href="#f1fd9d">direnv</a></li>
</ul>
</li>
<li><a href="#172b53">Nushell</a></li>
<li><a href="#e37bf0">Starship prompt</a></li>
<li><a href="#705762">Tmux</a>
<ul>
<li><a href="#c7d1aa">Term settings</a></li>
<li><a href="#cbebf7">Keybindings</a></li>
<li><a href="#a61278">Copy to clipboard</a></li>
<li><a href="#71ff71">UI</a></li>
</ul>
</li>
<li><a href="#6ca94e">Alacritty</a></li>
<li><a href="#936ac8">Various console applications</a>
<ul>
<li><a href="#aaf9af">ripgrep config</a></li>
</ul>
</li>
<li><a href="#1a647e">Misc scripts</a>
<ul>
<li><a href="#13f94e"><code>nt</code> - exec command with a finished notification</a></li>
<li><a href="#fd308f"><code>autocommit</code></a></li>
</ul>
</li>
<li><a href="#0680f7">Guix settings</a></li>
<li><a href="#3f6fdc">Android notes</a>
<ul>
<li><a href="#0145b1">Installation of <a href="https://gitlab.com/dwt1/shell-color-scripts">DT&rsquo;s colorscripts</a>:</a></li>
</ul>
</li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -58,9 +58,12 @@
</div>
<hr>
<div id="content">
<div class="container">
<h1>Guix</h1>
<p><a href="https://guix.gnu.org/">GNU Guix</a> is (1) a transactional package manager and (2) a GNU/Linux distribution.</p>
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<div class="root">
<h1 id="title-small-screen">Guix</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen">Guix</h1>
<p><a href="https://guix.gnu.org/">GNU Guix</a> is (1) a transactional package manager and (2) a GNU/Linux distribution.</p>
<p>My personal selling points are declarative package configuration and transactional upgrades.</p>
<p>References:</p>
<ul>
@ -69,13 +72,13 @@
<li><a href="https://gitlab.com/pjotrp/guix-notes">Pjotr Prins&rsquo; Guix notes</a></li>
<li><a href="https://www.youtube.com/watch?v=iBaqOK75cho&amp;list=PLEoMzSkcN8oNxnj7jm5V2ZcGc52002pQU">Davil Wilson&rsquo;s YouTube series</a></li>
</ul>
<h2 id="profiles">Profiles</h2>
<h2 id="d0f251">Profiles</h2>
<p>A profile is a way to group Guix packages. Amongst its advantages, profiles can be defined by manifests, which in turn can be stored in VCS.</p>
<p>References:</p>
<ul>
<li><a href="https://guix.gnu.org/en/cookbook/en/html_node/Guix-Profiles-in-Practice.html">Guix Profiles in Practice</a></li>
</ul>
<h3 id="activate-profiles">Activate profiles</h3>
<h3 id="15df6a">Activate profiles</h3>
<p>A script to activate guix profiles. Usage:</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>activate-profiles [profile1] [profile2] ...
</span></span></code></pre></div><p>Source: <a href="https://github.com/daviwil/dotfiles/blob/master/Systems.org#activating-profiles">David Wilson&rsquo;s config</a></p>
@ -115,7 +118,7 @@
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;No profile found at path&#34;</span> <span style="color:#19177c">$profilePath</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">fi</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">done</span>
</span></span></code></pre></div><h3 id="update-profiles">Update profiles</h3>
</span></span></code></pre></div><h3 id="2563a1">Update profiles</h3>
<p>A script to update Guix profiles. Usage:</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>update-profiles [profile1] [profile2] ...
</span></span></code></pre></div><p>Source: once again, <a href="https://github.com/daviwil/dotfiles/blob/master/Systems.org#updating-profiles">David Wilson&rsquo;s config</a>.</p>
@ -138,7 +141,7 @@
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> guix package --profile<span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$profilePath</span><span style="color:#ba2121">/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">&#34;</span> --manifest<span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/.config/guix/manifests/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">.scm&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">done</span>
</span></span></code></pre></div><h3 id="run-guix-package-in-profile">Run <code>guix package</code> in profile</h3>
</span></span></code></pre></div><h3 id="6563af">Run <code>guix package</code> in profile</h3>
<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><span style="color:#19177c">GUIX_EXTRA_PROFILES</span><span style="color:#666">=</span><span style="color:#19177c">$HOME</span>/.guix-extra-profiles
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">profileName</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>basename <span style="color:#19177c">$1</span><span style="color:#008000;font-weight:bold">)</span>
@ -150,7 +153,7 @@
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">else</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> -e <span style="color:#ba2121">&#34;No profile found at path: &#34;</span> <span style="color:#19177c">$profilePath</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><h2 id="channels">Channels</h2>
</span></span></code></pre></div><h2 id="14cb42">Channels</h2>
<p>Specifying additional channels.</p>
<p><a href="https://github.com/SqrtMinusOne/channel-q">channel-q</a> is my Guix channel. Don&rsquo;t use it at home.</p>
<p>References:</p>
@ -191,10 +194,10 @@
</span></span><span style="display:flex;"><span> (<span style="color:#00f">openpgp-fingerprint</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;50F3 3E2E 5B0C 3D90 0424 ABE8 9BDC F497 A4BB CC7F&#34;</span>))))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%default-channels</span>)
</span></span></code></pre></div><h2 id="systems">Systems</h2>
</span></span></code></pre></div><h2 id="d68564">Systems</h2>
<p>Configuring systems with Guix.</p>
<p>Yes, all my machines are named after colors I like.</p>
<h3 id="base-configuration">Base configuration</h3>
<h3 id="496778">Base configuration</h3>
<p>The base configuration is shared between all the machines.</p>
<p>While it&rsquo;s possible to make a single <code>.scm</code> file with base configuration and load it, I noticed that it produces more cryptic error messages whenever there is an error in the base file, so I opt-in for noweb.</p>
<p><code>guix system</code> invocation is as follows:</p>
@ -307,7 +310,7 @@
</span></span><span style="display:flex;"><span> (<span style="color:#00f">network-manager-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">inherit</span> <span style="color:#19177c">config</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">vpn-plugins</span> (<span style="color:#008000">list </span><span style="color:#19177c">network-manager-openvpn</span>)))))))
</span></span></code></pre></div><h3 id="indigo">indigo</h3>
</span></span></code></pre></div><h3 id="8a99d2">indigo</h3>
<p><code>indigo</code> is my desktop PC.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span><span style="color:#19177c">&lt;&lt;system-common&gt;&gt;</span>
</span></span><span style="display:flex;"><span>
@ -340,7 +343,7 @@
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> <span style="color:#ba2121">&#34;/dev/sda1&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">&#34;vfat&#34;</span>))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%base-file-systems</span>)))
</span></span></code></pre></div><h3 id="eminence">eminence</h3>
</span></span></code></pre></div><h3 id="bc75fa">eminence</h3>
<p><code>eminence</code> is a HP 15s laptop.</p>
<p><code>%backlight-udev-rule</code> should enable members of <code>video</code> group change the display backlight. See the relevant page at <a href="https://wiki.archlinux.org/title/Backlight">Arch Wiki</a>.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span><span style="color:#19177c">&lt;&lt;system-common&gt;&gt;</span>
@ -396,7 +399,7 @@
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> (<span style="color:#00f">uuid</span> <span style="color:#ba2121">&#34;0031-3784&#34;</span> <span style="color:#19177c">&#39;fat32</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">&#34;vfat&#34;</span>))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%base-file-systems</span>)))
</span></span></code></pre></div><h3 id="azure">azure</h3>
</span></span></code></pre></div><h3 id="cf04a0">azure</h3>
<p><code>azure</code> is a Lenovo Ideapad 330 laptop.</p>
<p><code>%backlight-udev-rule</code> should enable members of <code>video</code> group change the display backlight. See the relevant page at <a href="https://wiki.archlinux.org/title/Backlight">Arch Wiki</a>.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span><span style="color:#19177c">&lt;&lt;system-common&gt;&gt;</span>
@ -446,17 +449,17 @@
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> <span style="color:#ba2121">&#34;/dev/sda1&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">&#34;vfat&#34;</span>))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%base-file-systems</span>)))
</span></span></code></pre></div><h2 id="system-installation">System installation</h2>
<h3 id="preparation">Preparation</h3>
</span></span></code></pre></div><h2 id="edf355">System installation</h2>
<h3 id="9a5f09">Preparation</h3>
<p>In my case, the provided ISO doesn&rsquo;t work because of the Libre kernel.</p>
<p>Fortunately, David Wilson has made <a href="https://github.com/SystemCrafters/guix-installer">a repository</a> with a toolchain to make an ISO with the full kernel. In case it won&rsquo;t be an option, the <a href="https://gitlab.com/nonguix/nonguix">nonguix repo</a> also has instructions on how to do that.</p>
<p>When an ISO is there, we have to write it on a USB stick. Run <code>sudo fdisk -l</code> to get a list of disks.</p>
<p>The approach given in the official instruction is to create a bootable USB with <code>dd</code>:</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>sudo dd of=/dev/sdxX if=&lt;path-to-iso&gt; status=progress &amp;&amp; sync
</span></span></code></pre></div><p>However, I couldn&rsquo;t make it work for some strange reason. Fortunately, <code>gnome-disk-utility</code> was able to produce a bootable USB.</p>
<h3 id="installation">Installation</h3>
<h3 id="7cd8fb">Installation</h3>
<p>Going further, the official instructions for installation &amp; SystemCrafters wiki entry are pretty good, so it&rsquo;s not necessary to repeat them here.</p>
<h3 id="after-installation">After installation</h3>
<h3 id="b0cbc9">After installation</h3>
<p>After the installation, the strategy is as follows.</p>
<p>Set a password for the main user (pavel). Login with openbox to get a tolerable interface because i3&rsquo;s default config is horrible.</p>
<p><a href="https://guix.gnu.org/en/manual/en/html_node/Keyboard-Layout-and-Networking-and-Partitioning.html#Keyboard-Layout-and-Networking-and-Partitioning">Connect to the internet</a>.</p>
@ -472,7 +475,7 @@
</span></span><span style="display:flex;"><span>guix clone https://github.com/SqrtMinusOne/dotfiles.git
</span></span></code></pre></div><p>And activate the required profiles. Again, downloading &amp; building Emacs, Starship and stuff will take a while.</p>
<p>Don&rsquo;t forget to install <code>JetBrainsMono Nerd Font</code>.</p>
<h2 id="misc-software-and-notes">Misc software &amp; notes</h2>
<h2 id="0956fe">Misc software &amp; notes</h2>
<table>
<thead>
<tr>
@ -494,7 +497,7 @@
</tr>
</tbody>
</table>
<h3 id="vpn">VPN</h3>
<h3 id="eaef85">VPN</h3>
<table>
<thead>
<tr>
@ -574,7 +577,7 @@
</span></span><span style="display:flex;"><span><span style="color:#19177c">$IP</span> route del 128.0.0.0/1 via <span style="color:#19177c">$route_vpn_gateway</span>
</span></span></code></pre></div></li>
</ul>
<h4 id="vpn-start">vpn-start</h4>
<h4 id="12bfab">vpn-start</h4>
<p>As of now, CyberGhost doesn&rsquo;t provide ipv6, so we have to disable it.</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><span style="color:#008000">export</span> <span style="color:#19177c">DISPLAY</span><span style="color:#666">=</span>:0
</span></span><span style="display:flex;"><span><span style="color:#19177c">CONN</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>nmcli -f NAME con show --active | grep -Ev <span style="color:#ba2121">&#34;(.*docker.*|NAME|br-.*|veth.*|tun.*|vnet.*|virbr.*)&#34;</span> | sed <span style="color:#ba2121">&#39;s/ *$//g&#39;</span><span style="color:#008000;font-weight:bold">)</span>
@ -593,16 +596,16 @@
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># nmcli connection up &#34;$CONN&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># fi</span>
</span></span><span style="display:flex;"><span>pkexec openvpn --config ~/.vpn/mullvad_openvpn_linux_lv_rix/mullvad_lv_rix.conf
</span></span></code></pre></div><h4 id="vpn-stop">vpn-stop</h4>
</span></span></code></pre></div><h4 id="d61dae">vpn-stop</h4>
<p>Also a script to reverse the changes.</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><span style="color:#19177c">CONN</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>nmcli -f NAME con show --active | grep -Ev <span style="color:#ba2121">&#34;(.*docker.*|NAME|br-.*|veth.*|tun.*)&#34;</span> | sed <span style="color:#ba2121">&#39;s/ *$//g&#39;</span><span style="color:#008000;font-weight:bold">)</span>
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Connection: </span><span style="color:#19177c">$CONN</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>pkexec nmcli con modify <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$CONN</span><span style="color:#ba2121">&#34;</span> ipv6.method auto
</span></span><span style="display:flex;"><span>nmcli connection up <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$CONN</span><span style="color:#ba2121">&#34;</span>
</span></span></code></pre></div><h3 id="flatpak">flatpak</h3>
</span></span></code></pre></div><h3 id="9cb6e3">flatpak</h3>
<p>As for now, the easiest way to install most of proprietary software is via flatpak. See the relevant section in <a href="/configs/desktop/">Desktop.org</a>.</p>
<h3 id="conda">conda</h3>
<h3 id="19d07b">conda</h3>
<p><a href="https://docs.conda.io/en/latest/">conda</a> is a package manager, which I use for managing various versions of Python &amp; Node.js.</p>
<p>It is packaged for GNU Guix, although the definition has its fair share of workarounds. It is almost surprising to see it work with all the C libraries and stuff. But there are still some problems.</p>
<p>First, it&rsquo;s impossible to perform <code>conda init</code> to patch files like <code>.bashrc</code>, because the command is hell-bent on modifying <code>/gnu/store/</code>. So I do this manually, look for the <code>init_conda</code> procedures in <a href="/configs/console/">Console.org</a>.</p>
@ -646,7 +649,7 @@
</span></span><span style="display:flex;"><span> rm -rf <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/deactivate.d/conda.sh&#34;</span> <span style="color:#666">||</span> <span style="color:#008000">true</span>
</span></span><span style="display:flex;"><span> rm -rf <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/deactivate.d/conda.fish&#34;</span> <span style="color:#666">||</span> <span style="color:#008000">true</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">done</span>
</span></span></code></pre></div><h3 id="slack">Slack</h3>
</span></span></code></pre></div><h3 id="3561f3">Slack</h3>
<p>What a nonsense of a program.</p>
<p>I was able to launch the nix version with the following wrapper script:</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><span style="color:#008000">export</span> <span style="color:#19177c">PATH</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/bin/dummies:</span><span style="color:#19177c">$PATH</span><span style="color:#ba2121">&#34;</span>
@ -658,12 +661,12 @@
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Description: But GNU Guix doesn&#39;t have one.&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Release: 42.2&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Codename: n/a&#34;</span>
</span></span></code></pre></div><h3 id="virt-manager">virt-manager</h3>
</span></span></code></pre></div><h3 id="655ec7">virt-manager</h3>
<p>Run the following to fix the network:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>sudo virsh net-define /run/current-system/profile/etc/libvirt/qemu/networks/default.xml
</span></span><span style="display:flex;"><span>sudo virsh net-start default
</span></span><span style="display:flex;"><span>sudo herd restart libvirtd
</span></span></code></pre></div><h3 id="wakatime-cli">wakatime-cli</h3>
</span></span></code></pre></div><h3 id="9a15fb">wakatime-cli</h3>
<table>
<thead>
<tr>
@ -684,7 +687,7 @@
<li>Run <code>go build</code></li>
<li>Copy the binary to the <code>~/bin</code> folder</li>
</ul>
<h3 id="manifest">Manifest</h3>
<h3 id="76c3e0">Manifest</h3>
<p><a id="code-snippet--packages"></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:#19177c">my/format-guix-dependencies</span> <span style="color:#19177c">category</span>)
</span></span></code></pre></div><p>System</p>
@ -692,6 +695,57 @@
</span></span><span style="display:flex;"><span> <span style="color:#666">&#39;</span>(
</span></span><span style="display:flex;"><span> <span style="color:#19177c">&lt;&lt;packages</span>(<span style="color:#ba2121">&#34;system&#34;</span>)<span style="color:#19177c">&gt;&gt;</span>))
</span></span></code></pre></div>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#d0f251">Profiles</a>
<ul>
<li><a href="#15df6a">Activate profiles</a></li>
<li><a href="#2563a1">Update profiles</a></li>
<li><a href="#6563af">Run <code>guix package</code> in profile</a></li>
</ul>
</li>
<li><a href="#14cb42">Channels</a></li>
<li><a href="#d68564">Systems</a>
<ul>
<li><a href="#496778">Base configuration</a></li>
<li><a href="#8a99d2">indigo</a></li>
<li><a href="#bc75fa">eminence</a></li>
<li><a href="#cf04a0">azure</a></li>
</ul>
</li>
<li><a href="#edf355">System installation</a>
<ul>
<li><a href="#9a5f09">Preparation</a></li>
<li><a href="#7cd8fb">Installation</a></li>
<li><a href="#b0cbc9">After installation</a></li>
</ul>
</li>
<li><a href="#0956fe">Misc software &amp; notes</a>
<ul>
<li><a href="#eaef85">VPN</a>
<ul>
<li><a href="#12bfab">vpn-start</a></li>
<li><a href="#d61dae">vpn-stop</a></li>
</ul>
</li>
<li><a href="#9cb6e3">flatpak</a></li>
<li><a href="#19d07b">conda</a></li>
<li><a href="#3561f3">Slack</a></li>
<li><a href="#655ec7">virt-manager</a></li>
<li><a href="#9a15fb">wakatime-cli</a></li>
<li><a href="#76c3e0">Manifest</a></li>
</ul>
</li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">

View file

@ -58,9 +58,12 @@
</div>
<hr>
<div id="content">
<div class="container">
<h1>Mail</h1>
<p>:TOC: :include all :depth 3</p>
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<div class="root">
<h1 id="title-small-screen">Mail</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen">Mail</h1>
<p>:TOC: :include all :depth 3</p>
<p>My email configration. Currently I use <a href="https://github.com/gauteh/lieer">lieer</a> to fetch emails from Gmail, <a href="http://davmail.sourceforge.net/">davmail</a> &amp; <a href="http://www.offlineimap.org/">offlineimap</a> to fetch emails from MS Exchange, <a href="https://notmuchmail.org/">notmuch</a> to index, <a href="https://marlam.de/msmtp/">msmtp</a> to send emails. Also using notmuch frontend from Emacs.</p>
<p>My problem with any particular mail setup was that I use Gmail labels quite extensively, and handling these over IMAP is rather awkward. Notmuch seems to be the only software that provides the same first-class support for labels.</p>
<p>But I also have an Exchange account, with which I communicate via IMAP/SMTP adapter, and in this case, I synchronize notmuch tags and IMAP folders.</p>
@ -68,7 +71,7 @@
<ul>
<li><a href="https://sqrtminusone.xyz/posts/2021-02-27-gmail/">My post</a> about email configuration. I wrote it some time ago, but the general idea remains.</li>
</ul>
<h2 id="lieer">Lieer</h2>
<h2 id="3e7475">Lieer</h2>
<table>
<thead>
<tr>
@ -89,7 +92,7 @@
<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>gmi set --replace-slash-with-dot
</span></span><span style="display:flex;"><span>gmi set --ignore-tags-local new
</span></span></code></pre></div><p>Running <code>gmi sync</code> in the required directory performs the synchronization. The first sync takes a while, the subsequent syncs are pretty fast.</p>
<h2 id="davmail">DavMail</h2>
<h2 id="0abc7d">DavMail</h2>
<p>is a gateway between MS Exchange and the rest of the world, which uses IMAP/SMTP/LDAP/etc. As I have one corporate MS Exchange address, this is just the program I need. As of yet, it isn&rsquo;t packaged for Guix, but it&rsquo;s easy enough to download.</p>
<p>It has a GUI mode, but I prefer headless config.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#7d9029">davmail.server</span><span style="color:#666">=</span><span style="color:#ba2121">true</span>
@ -109,8 +112,8 @@
</span></span></code></pre></div><p>Also it&rsquo;s a bit of problem to get it launched as it looks for its jars in the pwd, so here is a script.</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><span style="color:#008000">cd</span> <span style="color:#19177c">$HOME</span>/bin/davmail-6.0.0-3375
</span></span><span style="display:flex;"><span>./davmail davmail.properties
</span></span></code></pre></div><p>Shepherd service is defined in <a href="/configs/desktop/#davmail">Desktop.org</a>.</p>
<h2 id="offlineimap">OfflineIMAP</h2>
</span></span></code></pre></div><p>Shepherd service is defined in <a href="/configs/desktop/#56f1ce">Desktop.org</a>.</p>
<h2 id="aecb75">OfflineIMAP</h2>
<table>
<thead>
<tr>
@ -151,7 +154,7 @@
</span></span><span style="display:flex;"><span><span style="color:#7d9029">starttls</span> <span style="color:#666">=</span> <span style="color:#ba2121">no</span>
</span></span><span style="display:flex;"><span><span style="color:#7d9029">ssl</span> <span style="color:#666">=</span> <span style="color:#ba2121">no</span>
</span></span><span style="display:flex;"><span><span style="color:#7d9029">sslcacertfile</span> <span style="color:#666">=</span> <span style="color:#ba2121">/etc/ssl/certs/ca-certificates.crt</span>
</span></span></code></pre></div><h2 id="notmuch">Notmuch</h2>
</span></span></code></pre></div><h2 id="65a69a">Notmuch</h2>
<table>
<thead>
<tr>
@ -168,7 +171,7 @@
</tbody>
</table>
<p>Notmuch is an email indexer program, which handles labels in a way somewhat similar to Gmail. It also provides a frontend for Emacs, but it&rsquo;s not the only one available.</p>
<h3 id="config">Config</h3>
<h3 id="fa535f">Config</h3>
<p>Not much is going on here.</p>
<p>First, the database path.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">[database]</span>
@ -188,7 +191,7 @@
</span></span></code></pre></div><p>Maildir compatibility.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">[maildir]</span>
</span></span><span style="display:flex;"><span><span style="color:#7d9029">synchronize_flags</span><span style="color:#666">=</span><span style="color:#ba2121">true</span>
</span></span></code></pre></div><h3 id="hooks">Hooks</h3>
</span></span></code></pre></div><h3 id="35ad48">Hooks</h3>
<p>Now we have to link up lieer &amp; davmail&rsquo;s maildir and with notmuch. This is done via the notmuch hook system, which allows running custom scripts before and after any command.</p>
<p>With lieer and Gmail, it is enough to simply run the program, because Gmail has first-class support for tags. Maildir does not, so I decide to synchronize notmuch tags and IMAP folders. In essence, the idea is to:</p>
<ul>
@ -306,7 +309,7 @@ Remove <code>TAG</code> from emails which are outside the matching <code>PATH</c
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">&#34; | xargs -I ! mv ! %s/%s/%s/cur/&#34;</span> <span style="color:#19177c">my/maildir-root</span> <span style="color:#19177c">root</span> <span style="color:#19177c">archive_root</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">string-join</span> <span style="color:#19177c">rules</span> <span style="color:#ba2121">&#34;\n&#34;</span>))
</span></span></code></pre></div><h4 id="pre-new"><code>pre_new</code></h4>
</span></span></code></pre></div><h4 id="0641ad"><code>pre_new</code></h4>
<p>This hook runs fetch from Gmail &amp; offlineimap in parallel before the <code>notmuch new</code> command. The <code>parallel</code> command is provided by <a href="https://www.gnu.org/software/parallel/">GNU Parallel</a>.</p>
<p>It isn&rsquo;t necessary to run <code>cd</code> for offlineimap, but it&rsquo;s easier to write that way.</p>
<p><a id="code-snippet--pre-new-pvkorytov-tags"></a></p>
@ -319,7 +322,7 @@ Remove <code>TAG</code> from emails which are outside the matching <code>PATH</c
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">echo &#34;Pre-new filters done&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">parallel --link -j0 &#34;(cd /home/pavel/Mail/{1}/ &amp;&amp; {2} {3})&#34; ::: thexcloud progin6304 pvkorytov_etu ::: &#34;$GMI&#34; &#34;$GMI&#34; &#34;offlineima</span>p<span style="color:#ba2121">&#34; ::: sync sync &#34;&#34;
</span></span></span></code></pre></div><h4 id="post-new"><code>post_new</code></h4>
</span></span></span></code></pre></div><h4 id="36877e"><code>post_new</code></h4>
<p>And this hook tags different mailboxes with different tags.</p>
<p><a id="code-snippet--post-new-pvkorytov-tags"></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:#19177c">my/mail-format-tags-rules</span> <span style="color:#19177c">tags</span> <span style="color:#ba2121">&#34;pvkorytov_etu&#34;</span> <span style="color:#ba2121">&#34;pvkorytov&#34;</span> <span style="color:#800">t</span> <span style="color:#800">t</span>)
@ -331,7 +334,7 @@ Remove <code>TAG</code> from emails which are outside the matching <code>PATH</c
</span></span><span style="display:flex;"><span><span style="color:#ba2121">&lt;&lt;mail-tags(ma</span>ke_tag<span style="color:#666">=</span><span style="color:#ba2121">&#34;t&#34;</span>,remove<span style="color:#666">=</span><span style="color:#ba2121">&#34;t&#34;</span><span style="color:#666">)</span>&gt;&gt;
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Post-new filters done&#34;</span>
</span></span><span style="display:flex;"><span>notmuch tag -new <span style="color:#ba2121">&#34;tag:new&#34;</span>
</span></span></code></pre></div><h2 id="sync-script">Sync script</h2>
</span></span></code></pre></div><h2 id="cb67a8">Sync script</h2>
<p>A script to run <code>notmuch new</code> and push a notification if there is new mail.</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><span style="color:#008000">export</span> <span style="color:#19177c">DISPLAY</span><span style="color:#666">=</span>:0
</span></span><span style="display:flex;"><span><span style="color:#19177c">CHECK_FILE</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;/home/pavel/Mail/.last_check&#34;</span>
@ -363,7 +366,7 @@ Remove <code>TAG</code> from emails which are outside the matching <code>PATH</c
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;</span><span style="color:#008000;font-weight:bold">$(</span>date +%s<span style="color:#008000;font-weight:bold">)</span><span style="color:#ba2121">&#34;</span> &gt; <span style="color:#19177c">$CHECK_FILE</span>
</span></span></code></pre></div><p>The script is ran via GNU Mcron every 5 minutes.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#00f">job</span> <span style="color:#ba2121">&#34;*/5 * * * * &#34;</span> <span style="color:#ba2121">&#34;~/bin/scripts/check-email&#34;</span>)
</span></span></code></pre></div><h2 id="msmtp">MSMTP</h2>
</span></span></code></pre></div><h2 id="dc254f">MSMTP</h2>
<table>
<thead>
<tr>
@ -405,7 +408,7 @@ Remove <code>TAG</code> from emails which are outside the matching <code>PATH</c
</span></span></span><span style="display:flex;"><span><span style=""></span>from pvkorytov@etu.ru<span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span>user pvkorytov<span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span>passwordeval <span style="color:#ba2121">&#34;pass show Job/Digital/Email/pvkorytov@etu.ru | head -n 1&#34;</span><span style="">
</span></span></span></code></pre></div><h2 id="emacs">Emacs</h2>
</span></span></span></code></pre></div><h2 id="169baf">Emacs</h2>
<table>
<thead>
<tr>
@ -465,7 +468,7 @@ Remove <code>TAG</code> from emails which are outside the matching <code>PATH</c
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">add-hook</span> <span style="color:#19177c">&#39;notmuch-hello-mode-hook</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">lambda</span> () (<span style="color:#19177c">display-line-numbers-mode</span> <span style="color:#666">0</span>))))
</span></span></code></pre></div><p>The file to which this is tangled is read in the init.el.</p>
<h3 id="saved-filters-and-keybindings">Saved filters and keybindings</h3>
<h3 id="4eb489">Saved filters and keybindings</h3>
<p>I want to have the saved filters available in both notmuch interface as as keybindings. So a bit more of abusing org tables.</p>
<p>Root keybindings:</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:#19177c">my-leader-def</span>
@ -575,7 +578,7 @@ Remove <code>TAG</code> from emails which are outside the matching <code>PATH</c
</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">:infix</span> <span style="color:#ba2121">&#34;am&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">&lt;&lt;format-notmuch-keybindings</span>()<span style="color:#19177c">&gt;&gt;</span>)
</span></span></code></pre></div><h3 id="signing-messages">Signing messages</h3>
</span></span></code></pre></div><h3 id="0f17c4">Signing messages</h3>
<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">with-eval-after-load</span> <span style="color:#19177c">&#39;notmuch</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">add-hook</span> <span style="color:#19177c">&#39;message-setup-hook</span> <span style="color:#19177c">&#39;mml-secure-sign-pgpmime</span>))
</span></span><span style="display:flex;"><span>
@ -587,7 +590,7 @@ Remove <code>TAG</code> from emails which are outside the matching <code>PATH</c
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">CMS</span>
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">sign</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">encrypt</span>))))
</span></span></code></pre></div><h2 id="mailcap">mailcap</h2>
</span></span></code></pre></div><h2 id="40a27a">mailcap</h2>
<p>mailcap file is a file which defines how to read to different MIME types. Notmuch also uses it, so why not keep it here.</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>audio/*; mpc add %s
</span></span><span style="display:flex;"><span>
@ -598,13 +601,49 @@ Remove <code>TAG</code> from emails which are outside the matching <code>PATH</c
</span></span><span style="display:flex;"><span>application/postscript ; zathura %s
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>text/html; firefox %s
</span></span></code></pre></div><h2 id="guix-settings">Guix settings</h2>
</span></span></code></pre></div><h2 id="0680f7">Guix settings</h2>
<p><a id="code-snippet--packages"></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:#19177c">my/format-guix-dependencies</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-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#00f">specifications-&gt;manifest</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">&#39;</span>(
</span></span><span style="display:flex;"><span> <span style="color:#19177c">&lt;&lt;packages</span>()<span style="color:#19177c">&gt;&gt;</span>))
</span></span></code></pre></div>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#3e7475">Lieer</a></li>
<li><a href="#0abc7d">DavMail</a></li>
<li><a href="#aecb75">OfflineIMAP</a></li>
<li><a href="#65a69a">Notmuch</a>
<ul>
<li><a href="#fa535f">Config</a></li>
<li><a href="#35ad48">Hooks</a>
<ul>
<li><a href="#0641ad"><code>pre_new</code></a></li>
<li><a href="#36877e"><code>post_new</code></a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#cb67a8">Sync script</a></li>
<li><a href="#dc254f">MSMTP</a></li>
<li><a href="#169baf">Emacs</a>
<ul>
<li><a href="#4eb489">Saved filters and keybindings</a></li>
<li><a href="#0f17c4">Signing messages</a></li>
</ul>
</li>
<li><a href="#40a27a">mailcap</a></li>
<li><a href="#0680f7">Guix settings</a></li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">

View file

@ -58,9 +58,12 @@
</div>
<hr>
<div id="content">
<div class="container">
<h1>My dotfiles</h1>
<figure><img src="https://forthebadge.com/images/badges/works-on-my-machine.svg"/>
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<div class="root">
<h1 id="title-small-screen">My dotfiles</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen">My dotfiles</h1>
<figure><img src="https://forthebadge.com/images/badges/works-on-my-machine.svg"/>
</figure>
<p>These are my GNU/Linux configuration files. <a href="https://github.com/SqrtMinusOne/dotfiles">View at GitHub</a>.</p>
@ -77,20 +80,20 @@
</li>
<li><a href="/configs/desktop/">Desktop.org</a>
<ul>
<li><em>Active</em>: <a href="/configs/desktop/#exwm">EXWM</a>, <a href="/configs/desktop/#polybar">Polybar</a>, <a href="/configs/desktop/#rofi">Rofi</a>, <a href="/configs/desktop/#flameshot">Flameshot</a>, <a href="/configs/desktop/#dunst">dunst</a>, <a href="/configs/desktop/#picom">Picom</a>, <a href="/configs/desktop/#zathura">Zathura</a></li>
<li><em>In Limbo</em>: <a href="/configs/desktop/#i3wm">i3wm</a>, <a href="/configs/desktop/#keynav">keynav</a></li>
<li><em>Active</em>: <a href="/configs/desktop/#3d569f">EXWM</a>, <a href="/configs/desktop/#4e2cf9">Polybar</a>, <a href="/configs/desktop/#da7107">Rofi</a>, <a href="/configs/desktop/#4c5c77">Flameshot</a>, <a href="/configs/desktop/#026722">dunst</a>, <a href="/configs/desktop/#b779d2">Picom</a>, <a href="/configs/desktop/#af7e75">Zathura</a></li>
<li><em>In Limbo</em>: <a href="/configs/desktop/#f1b3aa">i3wm</a>, <a href="/configs/desktop/#563987">keynav</a></li>
</ul>
</li>
<li><a href="/configs/console/">Console.org</a>
<ul>
<li><em>Active</em>: <a href="/configs/console/#dot-profile">.profile</a>, <a href="/configs/console/#bash">Bash</a>, <a href="/configs/console/#fish">Fish</a>, <a href="/configs/console/#starship-prompt">Starship</a>, <a href="/configs/console/#tmux">Tmux</a>, <a href="/configs/console/#alacritty">Alacritty</a></li>
<li><em>In Limbo</em>: <a href="/configs/console/#nushell">Nushell</a></li>
<li><em>Active</em>: <a href="/configs/console/#8969c9">.profile</a>, <a href="/configs/console/#7024ff">Bash</a>, <a href="/configs/console/#071642">Fish</a>, <a href="/configs/console/#e37bf0">Starship</a>, <a href="/configs/console/#705762">Tmux</a>, <a href="/configs/console/#6ca94e">Alacritty</a></li>
<li><em>In Limbo</em>: <a href="/configs/console/#172b53">Nushell</a></li>
</ul>
</li>
<li><a href="/configs/guix/">Guix.org</a></li>
<li><a href="/configs/mail/">Mail.org</a>
<ul>
<li><em>Active</em>: <a href="/configs/mail/#lieer">Lieer</a>, <a href="/configs/mail/#davmail">DavMail</a>, <a href="/configs/mail/#offlineimap">OfflineIMAP</a>, <a href="/configs/mail/#notmuch">Notmuch</a></li>
<li><em>Active</em>: <a href="/configs/mail/#3e7475">Lieer</a>, <a href="/configs/mail/#0abc7d">DavMail</a>, <a href="/configs/mail/#aecb75">OfflineIMAP</a>, <a href="/configs/mail/#65a69a">Notmuch</a></li>
</ul>
</li>
</ul>
@ -122,7 +125,7 @@
<li><a href="https://sqrtminusone.xyz/posts/2021-05-01-org-python/">Replacing Jupyter Notebook with Org Mode</a></li>
<li><a href="https://sqrtminusone.xyz/posts/2021-02-27-gmail/">Multiple Gmail accounts &amp; labels with Emacs</a></li>
</ul>
<h2 id="some-statistics">Some statistics</h2>
<h2 id="54b1db">Some statistics</h2>
<figure><img src="https://sqrtminusone.xyz/stats/all.png"/>
</figure>
@ -132,21 +135,40 @@
<figure><img src="https://sqrtminusone.xyz/stats/literate-config.png"/>
</figure>
<h2 id="misc">Misc</h2>
<h3 id="notes">Notes</h3>
<h2 id="74248c">Misc</h2>
<h3 id="f4c6f8">Notes</h3>
<ul>
<li><code>M-u C-c C-v t</code> to tangle a particular block</li>
<li><code>M-u M-u C-c C-v t</code> to tangle a particular file</li>
<li><code>C-c C-v d</code> to demarcate a block</li>
</ul>
<p>Uses yadm&rsquo;s <code>post_alt</code> hook to create symlinks</p>
<h3 id="encrypted-files">Encrypted files</h3>
<h3 id="9aeb26">Encrypted files</h3>
<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>Mail/thexcloud/.credentials.gmailieer.json
</span></span><span style="display:flex;"><span>Mail/progin6304/.credentials.gmailieer.json
</span></span><span style="display:flex;"><span>.emacs.d/private.org
</span></span><span style="display:flex;"><span>.emacs.d/private.el
</span></span><span style="display:flex;"><span>.emacs.d/.trello/sqrtminusone.el
</span></span></code></pre></div>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#54b1db">Some statistics</a></li>
<li><a href="#74248c">Misc</a>
<ul>
<li><a href="#f4c6f8">Notes</a></li>
<li><a href="#9aeb26">Encrypted files</a></li>
</ul>
</li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">

121
js/dynamic-toc.js Normal file
View file

@ -0,0 +1,121 @@
const tocId = "TableOfContents";
const actualContentId = "actual-content";
let showAll = false;
let currentActiveLinkId = null;
let elemsToHide = [];
let linksById = {};
let headerObserver = null;
function observeHeadings() {
const links = document.querySelectorAll(`#${tocId} a`);
const headings = document.querySelectorAll(`${actualContentId} h1,h2,h3,h4`);
for (const link of links) {
linksById[link.getAttribute("href")] = link;
}
for (const elem of document.querySelectorAll(`#${tocId} ul`)) {
if (elem.parentElement.id !== tocId) {
elemsToHide.push(elem);
}
}
headerObserver = new IntersectionObserver(
(entries) => {
for (const entry of entries) {
if (entry.isIntersecting && linksById[`#${entry.target.id}`]) {
currentActiveLinkId = `#${entry.target.id}`;
break;
}
}
if (currentActiveLinkId) {
for (const link of links) {
link.classList.remove("active");
}
linksById[currentActiveLinkId].classList.add("active");
if (!showAll) {
hideHeadings();
}
}
},
{
threshold: 0.1,
root: document.querySelector(`${actualContentId}`),
}
);
for (const heading of headings) {
headerObserver.observe(heading);
}
hideHeadings();
}
function observeButtons() {
const unhideButton = document.getElementById("unhide-all-button");
const hideButton = document.getElementById("hide-all-button");
unhideButton.addEventListener("click", () => {
showAll = true;
showHeadings();
unhideButton.classList.add("hidden");
hideButton.classList.remove("hidden");
});
hideButton.addEventListener("click", () => {
showAll = false;
hideHeadings();
hideButton.classList.add("hidden");
unhideButton.classList.remove("hidden");
});
unhideButton.classList.remove("hidden");
}
function hideHeadings() {
for (const elem of elemsToHide) {
elem.classList.add("hidden");
}
if (!currentActiveLinkId) {
return;
}
for (
let elem = linksById[currentActiveLinkId];
(elem = elem.parentElement);
elem.id !== tocId
) {
elem.classList.remove("hidden");
}
for (const elem of linksById[currentActiveLinkId].parentElement.children) {
elem.classList.remove("hidden");
}
}
function showHeadings() {
for (const elem of elemsToHide) {
elem.classList.remove("hidden");
}
}
function setUpObserver() {
if (document.documentElement.clientWidth >= (750 + 350 + 25)) {
if (headerObserver === null) {
observeHeadings();
observeButtons();
}
} else {
if (headerObserver !== null) {
headerObserver.disconnect();
headerObserver = null;
showHeadings();
}
}
}
window.addEventListener("load", (event) => {
if ("IntersectionObserver" in window) {
setUpObserver();
window.addEventListener("resize", setUpObserver);
}
});
window.addEventListener("unload", (event) => {
headerObserver.disconnect();
});

BIN
ox-hugo/lisp_cycles.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View file

@ -58,9 +58,12 @@
</div>
<hr>
<div id="content">
<div class="container">
<h1>Multiple Gmail accounts &amp; labels with Emacs</h1>
<h2 id="intro">Intro</h2>
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<div class="root">
<h1 id="title-small-screen">Multiple Gmail accounts &amp; labels with Emacs</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen">Multiple Gmail accounts &amp; labels with Emacs</h1>
<h2 id="intro">Intro</h2>
<p>For quite some time, e-mail seemed like an anomaly in my workflow. I am a long time Gmail user, and my decade-old account has a somewhat formidable quantity of labels and filters. My messages are often assigned multiple labels, and I also like to keep only a bunch of messages in the inbox.</p>
<p>Although, in my opinion, Gmail web UI was and still is leagues ahead of many of its competitors and even allows keyboard-centric workflow, it&rsquo;s awkward to use with a keyboard-driven browser, and for no money on Earth I would enable browser notifications.</p>
<p>Any classical IMAP/SMTP client is hard to use in my case, because a message with multiple labels is copied to IMAP folders for each of the label plus the inbox folder, and the copies look like different messages from the client-side. For example, a message can be read in one label and unread in another.</p>
@ -297,6 +300,38 @@
<li>A sent email is being downloaded again on the next sync. Not a great deal, but it is somewhat annoying to download recently sent attachments.</li>
</ul>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#intro">Intro</a></li>
<li><a href="#setting-up">Setting up</a>
<ul>
<li><a href="#gmail">Gmail</a></li>
<li><a href="#lieer">lieer</a></li>
<li><a href="#notmuch">Notmuch</a></li>
<li><a href="#add-an-account">Add an account</a></li>
<li><a href="#emacs">Emacs</a></li>
<li><a href="#reading-mail">Reading mail</a></li>
<li><a href="#sending-mail">Sending mail</a></li>
</ul>
</li>
<li><a href="#another-account">Another account</a>
<ul>
<li><a href="#adding-an-account">Adding an account</a></li>
<li><a href="#emacs">Emacs</a></li>
</ul>
</li>
<li><a href="#notification-for-new-messages">Notification for new messages</a></li>
<li><a href="#caveats">Caveats</a></li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">

View file

@ -58,9 +58,12 @@
</div>
<hr>
<div id="content">
<div class="container">
<h1>Replacing Jupyter Notebook with Org Mode</h1>
<figure><img src="/images/org-python/org-python-screenshot.png"/>
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<div class="root">
<h1 id="title-small-screen">Replacing Jupyter Notebook with Org Mode</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen">Replacing Jupyter Notebook with Org Mode</h1>
<figure><img src="/images/org-python/org-python-screenshot.png"/>
</figure>
<h2 id="why">Why?</h2>
@ -413,6 +416,49 @@
</span></span><span style="display:flex;"><span> <span style="color:#008000">:after</span> <span style="color:#19177c">ox</span>)
</span></span></code></pre></div><p>To (try to) do export, run <code>M-x ox-ipynb-export-org-file-ipynb-file</code>.</p>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#why">Why?</a></li>
<li><a href="#basic-setup">Basic setup</a></li>
<li><a href="#environments">Environments</a>
<ul>
<li><a href="#anaconda">Anaconda</a></li>
<li><a href="#switching-an-environment">Switching an environment</a></li>
</ul>
</li>
<li><a href="#programming">Programming</a></li>
<li><a href="#code-output">Code output</a>
<ul>
<li><a href="#images">Images</a></li>
<li><a href="#basic-tables">Basic tables</a></li>
<li><a href="#html-and-other-rich-output">HTML &amp; other rich output</a></li>
<li><a href="#dataframes">DataFrames</a></li>
</ul>
</li>
<li><a href="#remote-kernels">Remote kernels</a>
<ul>
<li><a href="#using-a-remote-kernel">Using a &ldquo;remote&rdquo; kernel</a></li>
<li><a href="#some-automation">Some automation</a></li>
<li><a href="#cleaning-up">Cleaning up</a></li>
</ul>
</li>
<li><a href="#export">Export</a>
<ul>
<li><a href="#html">HTML</a></li>
<li><a href="#latex-pdf">LaTeX -&gt; pdf</a></li>
<li><a href="#ipynb">ipynb</a></li>
</ul>
</li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">

View file

@ -58,9 +58,12 @@
</div>
<hr>
<div id="content">
<div class="container">
<h1>My EMMS and elfeed setup</h1>
<h2 id="intro">Intro</h2>
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<div class="root">
<h1 id="title-small-screen">My EMMS and elfeed setup</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen">My EMMS and elfeed setup</h1>
<h2 id="intro">Intro</h2>
<figure><img src="/images/emms/emms-screenshot.png"/>
</figure>
@ -290,6 +293,45 @@
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">elfeed-show-refresh</span>))
</span></span></code></pre></div><p>Now, calling <code>M-x my/elfeed-add-emms-youtube</code> in the <code>*elfeed-show*</code> buffer will add the correct URL to the playlist and tag the entry with <code>+watched</code>. I&rsquo;ve bound the function to <code>gm</code>.</p>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#intro">Intro</a></li>
<li><a href="#mpd">MPD</a>
<ul>
<li><a href="#music-directory">Music directory</a></li>
</ul>
</li>
<li><a href="#emms">EMMS</a>
<ul>
<li><a href="#setup-and-mpd-integration">Setup &amp; MPD integration</a></li>
<li><a href="#usage">Usage</a></li>
<li><a href="#fetching-lyrics">Fetching lyrics</a></li>
<li><a href="#album-covers">Album covers</a></li>
</ul>
</li>
<li><a href="#mpv-and-youtube">MPV and YouTube</a>
<ul>
<li><a href="#mpv-and-youtube-dl">MPV and youtube-dl</a></li>
<li><a href="#cleanup-emms-cache">Cleanup EMMS cache</a></li>
</ul>
</li>
<li><a href="#youtube-rss">YouTube RSS</a>
<ul>
<li><a href="#where-to-get-urls">Where to get URLs?</a></li>
<li><a href="#elfeed">Elfeed</a></li>
<li><a href="#integrating-with-emms">Integrating with EMMS</a></li>
</ul>
</li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">

View file

@ -58,9 +58,12 @@
</div>
<hr>
<div id="content">
<div class="container">
<h1>Getting a consistent set of keybindings between i3 and Emacs</h1>
<h2 id="intro">Intro</h2>
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<div class="root">
<h1 id="title-small-screen">Getting a consistent set of keybindings between i3 and Emacs</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen">Getting a consistent set of keybindings between i3 and Emacs</h1>
<h2 id="intro">Intro</h2>
<p>One advantage of EXWM for an Emacs user is that EXWM gives one set of keybindings to manage both Emacs windows and X windows. In every other WM, like my preferred <a href="https://i3wm.org">i3wm</a>, two orthogonal keymaps seem to be necessary. But, as both programs are quite customizable, I want to see whether I can replicate at least some part of the EXWM goodness in i3.</p>
<p>But why not just use EXWM? One key reason is that to my taste (and perhaps on my hardware) EXWM didn&rsquo;t feel snappy enough. Also, I really like i3&rsquo;s tree-based layout structure; I feel like it fits my workflow much better than anything else I tried, including the master/stack paradigm of <a href="https://xmonad.org/">XMonad</a>, for instance.</p>
<p>One common point of criticism of i3 is that it is not extensible enough, especially compared to WMs that are configured in an actual programing language, like the mentioned XMonad, <a href="http://www.qtile.org/">Qtile</a>, <a href="https://awesomewm.org/">Awesome</a>, etc. But I think i3&rsquo;s extensibility is underappreciated, although the contents of this article may lie closer to the limits of how far one can go there.</p>
@ -251,6 +254,31 @@
<p>So, how does all of that feel? Actually, I got used to that setup pretty quickly. Using <code>&lt;s-Q&gt;</code> to quit windows and the <code>&lt;s-r&gt;</code> submode to resize them is particularly nice. I&rsquo;ve seen people making hydras in Emacs to do the latter.</p>
<p>All of that would probably be easier to do in a WM which is configured in a programming language rather than in a self-cooked DSL, so I may try to replicate that somewhere else in an unknown time in the future. Meanwhile, it&rsquo;s pretty good.</p>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#intro">Intro</a></li>
<li><a href="#emacs-integration">Emacs integration</a></li>
<li><a href="#handling-i3-commands">Handling i3 commands</a>
<ul>
<li><a href="#focus"><code>focus</code></a></li>
<li><a href="#move"><code>move</code></a></li>
<li><a href="#resize-and-balance-windows"><code>resize</code> and balance windows</a></li>
<li><a href="#layout-toggle-split"><code>layout toggle split</code></a></li>
<li><a href="#the-entrypoint">The entrypoint</a></li>
<li><a href="#switching-i3-tabs">Switching i3 tabs</a></li>
</ul>
</li>
<li><a href="#conclusion">Conclusion</a></li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">

View file

@ -58,9 +58,12 @@
</div>
<hr>
<div id="content">
<div class="container">
<h1>Using EXWM and perspective.el on multi-monitor setup</h1>
<p>I wrote about <a href="https://sqrtminusone.xyz/posts/2021-10-04-emacs-i3/">Emacs and i3</a> integration around two months ago. Shortly after however, I decided to give EXWM another try, mainly because my largest reservation - lack of performance - seems to have been resolved by updates to the native compilation since my first attempt. Or I may have lost some sensitivity to that issue. Regardless, the second dive into EXWM thus far feels successful, and I think it&rsquo;s the right time to share some of my thoughts on the subject.</p>
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<div class="root">
<h1 id="title-small-screen">Using EXWM and perspective.el on multi-monitor setup</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen">Using EXWM and perspective.el on multi-monitor setup</h1>
<p>I wrote about <a href="https://sqrtminusone.xyz/posts/2021-10-04-emacs-i3/">Emacs and i3</a> integration around two months ago. Shortly after however, I decided to give EXWM another try, mainly because my largest reservation - lack of performance - seems to have been resolved by updates to the native compilation since my first attempt. Or I may have lost some sensitivity to that issue. Regardless, the second dive into EXWM thus far feels successful, and I think it&rsquo;s the right time to share some of my thoughts on the subject.</p>
<p>Before we start though, I&rsquo;ll point out that I won&rsquo;t go into detail about the initial setup. I think David Wilson&rsquo;s &ldquo;<a href="https://systemcrafters.net/emacs-desktop-environment/">Emacs Desktop Environment</a>&rdquo; series describes this part pretty well, so I don&rsquo;t feel the need to repeat much of that.</p>
<p>This post is a sort of a snapshot of the path from the baseline of <a href="https://github.com/daviwil/emacs-from-scratch/blob/master/Desktop.org">Emacs From Scratch</a> to my image of a perfect window manager, and it may or may not be coincidental that the latter resembles i3 in many aspects.</p>
<p>After all, I was using i3 for more than two years, so it&rsquo;s not something I can easily let go of. But I think (or would like to think) that&rsquo;s because the ideas are good, not because I&rsquo;m overly conservative in my workflow choices.</p>
@ -437,6 +440,44 @@
<h2 id="p-dot-s-dot">P.S.</h2>
<p>The way how characters aligned in my keybinding for EMMS is coincidental and does not carry any semantic value. The <code>a</code> is for &ldquo;app&rdquo;, <code>s</code> is because <code>e</code> and <code>m</code> were already taken by elfeed and notmuch, and the second <code>s</code> is because it&rsquo;s faster to press the same character twice.</p>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#perspective-dot-el">perspective.el</a>
<ul>
<li><a href="#initial-perspective-names">Initial perspective names</a></li>
<li><a href="#assigning-apps-to-workspaces-and-perspectives">Assigning apps to workspaces and perspectives</a></li>
<li><a href="#some-workflow-notes">Some workflow notes</a></li>
</ul>
</li>
<li><a href="#workspaces-on-multiple-monitors">Workspaces on multiple monitors</a>
<ul>
<li><a href="#tracking-recently-used-workspaces">Tracking recently used workspaces</a></li>
<li><a href="#the-monitor-list">The monitor list</a></li>
<li><a href="#switch-to-another-monitor">Switch to another monitor</a></li>
<li><a href="#move-the-workspace-to-another-monitor">Move the workspace to another monitor</a></li>
<li><a href="#windmove-between-monitors">Windmove between monitors</a></li>
</ul>
</li>
<li><a href="#managing-windows">Managing windows</a>
<ul>
<li><a href="#moving-windows">Moving windows</a></li>
<li><a href="#resizing-windows">Resizing windows</a></li>
<li><a href="#splitting-windows">Splitting windows</a></li>
</ul>
</li>
<li><a href="#notes-on-floating-windows">Notes on floating windows</a></li>
<li><a href="#what-else-not-to-do">What else not to do</a></li>
<li><a href="#p-dot-s-dot">P.S.</a></li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">

View file

@ -58,9 +58,12 @@
</div>
<hr>
<div id="content">
<div class="container">
<h1>A few cases of literate configuration</h1>
<p>A post that arose from the discussion of literate configuration on the <a href="https://systemcrafters.net/">System Crafters</a> Discord.</p>
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<div class="root">
<h1 id="title-small-screen">A few cases of literate configuration</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen">A few cases of literate configuration</h1>
<p>A post that arose from the discussion of literate configuration on the <a href="https://systemcrafters.net/">System Crafters</a> Discord.</p>
<p>I am using the <a href="https://leanpub.com/lit-config">literate configuration</a> strategy (based on <a href="https://orgmode.org/">Emacs&rsquo; Org Mode</a>) to manage most of my configuration files. A piece of such a configuration can be as simple as an Org file, which is tangled to one or many plain-text configuration files, but it can be more.</p>
<p>In my opinion, a literate configuration can be more straightforward and concise than a &ldquo;normal&rdquo; one, thanks to Org Mode&rsquo;s capabilities of <a href="https://orgmode.org/manual/Working-with-Source-Code.html">working with source code</a>. So here I present a few examples from my configuration where I think this is the case:</p>
<ul>
@ -561,6 +564,33 @@
</span></span></code></pre></div><p>(The full script has a lot of stuff that is not relevant to this post, but you can <a href="https://github.com/SqrtMinusOne/dotfiles/blob/master/Desktop.org#launch-script-1">check here</a> if you are interested.)</p>
<p>So, in the case of polybar, literate configuration allows for implementing a sort of logic that wouldn&rsquo;t be available with the base configuration (also a promise of projects like Guix Home, by the way). Maintaining this configuration, e.g. changing the order of modules, is much easier this way than it would be if everything was hardcoded in the polybar config itself.</p>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#colors">Colors</a></li>
<li><a href="#guix-dependencies">Guix dependencies</a></li>
<li><a href="#polybar">Polybar</a>
<ul>
<li><a href="#colors">Colors</a></li>
<li><a href="#module-decorations">Module decorations</a>
<ul>
<li><a href="#defining-modules">Defining modules</a></li>
<li><a href="#generating-glyphs">Generating glyphs</a></li>
<li><a href="#individual-modules">Individual modules</a></li>
<li><a href="#global-polybar-configuration">Global polybar configuration</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">

View file

@ -58,9 +58,12 @@
</div>
<hr>
<div id="content">
<div class="container">
<h1>Extending elfeed with PDF viewer and subtitles fetcher</h1>
<h2 id="intro">Intro</h2>
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<div class="root">
<h1 id="title-small-screen">Extending elfeed with PDF viewer and subtitles fetcher</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen">Extending elfeed with PDF viewer and subtitles fetcher</h1>
<h2 id="intro">Intro</h2>
<p><a href="https://github.com/skeeto/elfeed">elfeed</a> is one of the most popular Emacs packages, and it&rsquo;s also one in which I ended up investing a lot of effort. I wrote about the <a href="https://sqrtminusone.xyz/posts/2021-09-07-emms/">EMMS integration</a> and even made a <a href="https://github.com/SqrtMinusOne/elfeed-summary">custom frontpage</a> to my liking.</p>
<p>However, sites frequently limit the amount of information shipped in the RSS feed. Oftentimes the entry doesn&rsquo;t include the entire content (of which, by the way, this blog was guilty).</p>
<p>Also, there&rsquo;s non-textual content, of which in this post I consider YouTube subscriptions. It&rsquo;s possible to watch YouTube from elfeed, for instance with the aforementioned EMMS integration, but we can do more.</p>
@ -633,6 +636,40 @@
<img src="/images/pdf-subed.png" alt=""></p>
<p>Keep in mind that this function has to be launched inside the buffer opened by the <code>my/elfeed-youtube-subtitles</code> function.</p>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#intro">Intro</a></li>
<li><a href="#rdrview">rdrview</a>
<ul>
<li><a href="#integrating-rdrview-with-emacs">Integrating rdrview with Emacs</a></li>
<li><a href="#using-rdrview-from-elfeed">Using rdrview from elfeed</a></li>
<li><a href="#how-well-does-it-work">How well does it work?</a></li>
</ul>
</li>
<li><a href="#latex-and-pandoc">LaTeX and pandoc</a>
<ul>
<li><a href="#template">Template</a></li>
<li><a href="#invoking-pandoc">Invoking pandoc</a></li>
<li><a href="#opening-elfeed-entries">Opening elfeed entries</a></li>
<li><a href="#opening-arbitrary-sites">Opening arbitrary sites</a></li>
</ul>
</li>
<li><a href="#youtube-transcripts">YouTube transcripts</a>
<ul>
<li><a href="#getting-subtitles">Getting subtitles</a></li>
<li><a href="#elfeed-and-subed">elfeed and subed</a></li>
</ul>
</li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">

View file

@ -58,14 +58,30 @@
</div>
<hr>
<div id="content">
<div class="container">
<h1>Hello, world!</h1>
<h2 id="hello-world">Hello, world!</h2>
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<div class="root">
<h1 id="title-small-screen">Hello, world!</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen">Hello, world!</h1>
<h2 id="hello-world">Hello, world!</h2>
<p>Eventually, there will be something interesting here. Or not.</p>
<p>Regradless, I&rsquo;ll check if I can write some Python here</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">print</span>(<span style="color:#ba2121">&#34;Hello, world&#34;</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-text" data-lang="text"><span style="display:flex;"><span>Hello, world
</span></span></code></pre></div>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#hello-world">Hello, world!</a></li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">

View file

@ -1 +1 @@
#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;line-height:1.2}.container{max-width:750px}.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 .avatar>img{border-radius:50%;float:right;margin:-8px 0 0 16px;height:90px;width:90px}#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 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:inconsolata!important}#content pre code{all:unset;font-size:110%}#content .highlight{margin:1rem auto;border:1px solid #ccc}#content .highlight>pre{padding:8px;margin-bottom:0}
#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;line-height:1.2}.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 .avatar>img{border-radius:50%;float:right;margin:-8px 0 0 16px;height:90px;width:90px}#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 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:inconsolata!important}#content pre code{all:unset;font-size:110%}#content .highlight{margin:1rem auto;border:1px solid #ccc}#content .highlight>pre{padding:8px;margin-bottom:0}