deploy: 98978673ac
7
404.html
|
|
@ -54,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -55,6 +55,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,10 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<title>https://sqrtminusone.xyz/configs/readme/</title>
|
||||
<link rel="canonical" href="https://sqrtminusone.xyz/configs/readme/">
|
||||
<meta name="robots" content="noindex">
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="refresh" content="0; url=https://sqrtminusone.xyz/configs/readme/">
|
||||
</head>
|
||||
</html>
|
||||
10310
configs/emacs/index.html
|
|
@ -1,880 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang=""><head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
|
||||
<title>Guix</title>
|
||||
<meta name="description" content="Freedom is a state of mind">
|
||||
<meta name="author" content='SqrtMinusOne'>
|
||||
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;700&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" integrity="sha512-iBBXm8fW90+nuLcSKlbmrPcLa0OT92xO1BIsZ+ywDWZCvqsWgccV3gFoRBv0z+8dLJgyAHIhR35VZc2oM/gI1w==" crossorigin="anonymous">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="/sass/researcher.min.css">
|
||||
|
||||
|
||||
<link rel="icon" type="image/ico" href="https://sqrtminusone.xyz/favicon.ico">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer data-domain="sqrtminusone.xyz" src="https://plausible.sqrtminusone.xyz/js/plausible.js"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body><div class="container mt-5">
|
||||
<nav class="navbar navbar-expand-sm flex-column flex-sm-row text-nowrap p-0">
|
||||
<a class="navbar-brand mx-0 mr-sm-auto" href="https://sqrtminusone.xyz/" title="SqrtMinusOne">
|
||||
|
||||
SqrtMinusOne
|
||||
</a>
|
||||
<div class="navbar-nav flex-row flex-wrap justify-content-center">
|
||||
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/" title="Index">
|
||||
Index
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/posts/" title="Posts">
|
||||
Posts
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/configs/readme" title="Configs">
|
||||
Configs
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
<hr>
|
||||
<div id="content">
|
||||
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
|
||||
<div class="root">
|
||||
<h1 id="title-small-screen">
|
||||
Guix
|
||||
<iframe src="https://ghbtns.com/github-btn.html?user=SqrtMinusOne&repo=dotfiles&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe>
|
||||
</h1>
|
||||
<div class="container" id="actual-content">
|
||||
<h1 id="title-large-screen" class="dotfiles-title">
|
||||
Guix
|
||||
<iframe src="https://ghbtns.com/github-btn.html?user=SqrtMinusOne&repo=dotfiles&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe>
|
||||
</h1>
|
||||
<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>
|
||||
<li><a href="https://guix.gnu.org/en/help/">Official help</a></li>
|
||||
<li><a href="https://wiki.systemcrafters.cc/guix">System Crafters wiki</a></li>
|
||||
<li><a href="https://gitlab.com/pjotrp/guix-notes">Pjotr Prins’ Guix notes</a></li>
|
||||
<li><a href="https://www.youtube.com/watch?v=iBaqOK75cho&list=PLEoMzSkcN8oNxnj7jm5V2ZcGc52002pQU">Davil Wilson’s YouTube series</a></li>
|
||||
</ul>
|
||||
<h2 id="profiles">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>
|
||||
<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’s config</a></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">GREEN</span><span style="color:#666">=</span><span style="color:#ba2121">'\033[1;32m'</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">RED</span><span style="color:#666">=</span><span style="color:#ba2121">'\033[1;30m'</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">NC</span><span style="color:#666">=</span><span style="color:#ba2121">'\033[0m'</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
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">profiles</span><span style="color:#666">=</span><span style="color:#19177c">$*</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[[</span> <span style="color:#19177c">$#</span> -eq <span style="color:#666">0</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">profiles</span><span style="color:#666">=</span><span style="color:#ba2121">"</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/.config/guix/manifests/*.scm"</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></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> profile in <span style="color:#19177c">$profiles</span>; <span style="color:#008000;font-weight:bold">do</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic"># Remove the path and file extension, if any</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">$profile</span><span style="color:#008000;font-weight:bold">)</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">profileName</span><span style="color:#666">=</span><span style="color:#ba2121">"</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">profileName</span>%.*<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">profilePath</span><span style="color:#666">=</span><span style="color:#ba2121">"</span><span style="color:#19177c">$GUIX_EXTRA_PROFILES</span><span style="color:#ba2121">/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">manifestPath</span><span style="color:#666">=</span><span style="color:#19177c">$HOME</span>/.config/guix/manifests/<span style="color:#19177c">$profileName</span>.scm
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -f <span style="color:#19177c">$manifestPath</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">echo</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> -e <span style="color:#ba2121">"</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">GREEN</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">Activating profile:"</span> <span style="color:#19177c">$manifestPath</span> <span style="color:#ba2121">"</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">NC</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> mkdir -p <span style="color:#19177c">$profilePath</span>
|
||||
</span></span><span style="display:flex;"><span> guix package --manifest<span style="color:#666">=</span><span style="color:#19177c">$manifestPath</span> --profile<span style="color:#666">=</span><span style="color:#ba2121">"</span><span style="color:#19177c">$profilePath</span><span style="color:#ba2121">/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">"</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic"># Source the new profile</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">GUIX_PROFILE</span><span style="color:#666">=</span><span style="color:#ba2121">"</span><span style="color:#19177c">$profilePath</span><span style="color:#ba2121">/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -f <span style="color:#19177c">$GUIX_PROFILE</span>/etc/profile <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
|
||||
</span></span><span style="display:flex;"><span> . <span style="color:#ba2121">"</span><span style="color:#19177c">$GUIX_PROFILE</span><span style="color:#ba2121">"</span>/etc/profile
|
||||
</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">"</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">RED</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">Couldn't find profile:"</span> <span style="color:#19177c">$GUIX_PROFILE</span>/etc/profile <span style="color:#ba2121">"</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">NC</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">"</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">else</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">"No profile found at path"</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>
|
||||
<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’s config</a>.</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">GREEN</span><span style="color:#666">=</span><span style="color:#ba2121">'\033[1;32m'</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">NC</span><span style="color:#666">=</span><span style="color:#ba2121">'\033[0m'</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
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">profiles</span><span style="color:#666">=</span><span style="color:#19177c">$*</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[[</span> <span style="color:#19177c">$#</span> -eq <span style="color:#666">0</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">profiles</span><span style="color:#666">=</span><span style="color:#ba2121">"</span><span style="color:#19177c">$GUIX_EXTRA_PROFILES</span><span style="color:#ba2121">/*"</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></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> profile in <span style="color:#19177c">$profiles</span>; <span style="color:#008000;font-weight:bold">do</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">$profile</span><span style="color:#008000;font-weight:bold">)</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">profilePath</span><span style="color:#666">=</span><span style="color:#19177c">$GUIX_EXTRA_PROFILES</span>/<span style="color:#19177c">$profileName</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> -e <span style="color:#ba2121">"</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">GREEN</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">Updating profile:"</span> <span style="color:#19177c">$profilePath</span> <span style="color:#ba2121">"</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">NC</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span>
|
||||
</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">"</span><span style="color:#19177c">$profilePath</span><span style="color:#ba2121">/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">"</span> --manifest<span style="color:#666">=</span><span style="color:#ba2121">"</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"</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>
|
||||
<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>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">profileName</span><span style="color:#666">=</span><span style="color:#ba2121">"</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">profileName</span>%.*<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">"</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">profilePath</span><span style="color:#666">=</span><span style="color:#ba2121">"</span><span style="color:#19177c">$GUIX_EXTRA_PROFILES</span><span style="color:#ba2121">/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">"</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -d <span style="color:#19177c">$profilePath</span> <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
|
||||
</span></span><span style="display:flex;"><span> guix package --profile<span style="color:#666">=</span><span style="color:#ba2121">"</span><span style="color:#19177c">$profilePath</span><span style="color:#ba2121">/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">"</span> <span style="color:#b68;font-weight:bold">${</span>@:<span style="color:#19177c">2</span><span style="color:#b68;font-weight:bold">}</span>
|
||||
</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">"No profile found at path: "</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>
|
||||
<p>Specifying additional channels.</p>
|
||||
<p><a href="https://github.com/SqrtMinusOne/channel-q">channel-q</a> is my Guix channel. Don’t use it at home.</p>
|
||||
<p>References:</p>
|
||||
<ul>
|
||||
<li><a href="https://gitlab.com/nonguix/nonguix">nonguix channel repo</a></li>
|
||||
<li><a href="https://guix.gnu.org/manual/en/html_node/Channels.html">Guix channels reference</a></li>
|
||||
</ul>
|
||||
<!--listend-->
|
||||
<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">cons*</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">channel</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#19177c">'channel-q</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">url</span> <span style="color:#ba2121">"file:///home/pavel/_channel-q"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">channel</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#19177c">'flat</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">url</span> <span style="color:#ba2121">"https://github.com/flatwhatson/guix-channel.git"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">introduction</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">make-channel-introduction</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"33f86a4b48205c0dc19d7c036c85393f0766f806"</span>
|
||||
</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">"736A C00E 1254 378B A982 7AF6 9DBE 8265 81B6 4490"</span>))))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">channel</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#19177c">'nonguix</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">url</span> <span style="color:#ba2121">"https://gitlab.com/nonguix/nonguix"</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; (commit "d54973e47b89fe5772a5b6e2d0c0b86acb089e27")</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">introduction</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">make-channel-introduction</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"897c1a470da759236cc11798f4e0a5f7d4d59fbc"</span>
|
||||
</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">"2A39 3FFF 68F4 EF7A 3D29 12AF 6F51 20A0 22FB B2D5"</span>))))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">channel</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; What can possibly go wrong, huh</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#19177c">'guix-gaming-games</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">url</span> <span style="color:#ba2121">"https://gitlab.com/guix-gaming-channels/games.git"</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; Enable signature verification:</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">introduction</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">make-channel-introduction</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"c23d64f1b8cc086659f8781b27ab6c7314c5cca5"</span>
|
||||
</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">"50F3 3E2E 5B0C 3D90 0424 ABE8 9BDC F497 A4BB CC7F"</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>
|
||||
<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>
|
||||
<p>The base configuration is shared between all the machines.</p>
|
||||
<p>While it’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>
|
||||
<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 -E guix system reconfigure ~/.config/guix/systems/[system].scm
|
||||
</span></span></code></pre></div><p>Common modules:</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">use-modules</span> (<span style="color:#00f">gnu</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">system</span> <span style="color:#19177c">nss</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">bash</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> ((<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">base</span>) <span style="color:#666">#</span><span style="color:#19177c">:select</span> (<span style="color:#00f">coreutils</span> <span style="color:#19177c">glibc</span>)))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">certs</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">version-control</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">vim</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">gnome</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">xorg</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">wm</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">openbox</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">services</span> <span style="color:#19177c">docker</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">services</span> <span style="color:#19177c">cups</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">services</span> <span style="color:#19177c">virtualization</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">srfi</span> <span style="color:#19177c">srfi-1</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">guix</span> <span style="color:#19177c">channels</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">guix</span> <span style="color:#19177c">inferior</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">nongnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">linux</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">nongnu</span> <span style="color:#19177c">system</span> <span style="color:#19177c">linux-initrd</span>))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-service-modules</span> <span style="color:#19177c">desktop</span> <span style="color:#19177c">networking</span> <span style="color:#19177c">ssh</span> <span style="color:#19177c">xorg</span> <span style="color:#19177c">nix</span>)
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-package-modules</span> <span style="color:#19177c">ssh</span>)
|
||||
</span></span></code></pre></div><p>In principle, we could define a variable called <code>base-operating-system</code> and extend it in ancestors. However, then we would have to define mandatory fields like <code>host-name</code>, <code>bootloader</code> with dummy values. Since I’m already using noweb, there is little point.</p>
|
||||
<p>The following code will be inserted at the top of the <code>operating-system</code> definition.</p>
|
||||
<p>Use the full Linux kernel. I hope I’ll be able to use Libre kernel somewhere later.</p>
|
||||
<p>Inferior in the kernel is used to avoid recompilation. It looks like I can pin these to different commits than in my <code>channels.scm</code></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">kernel</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">let*</span>
|
||||
</span></span><span style="display:flex;"><span> ((<span style="color:#00f">channels</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">list </span>(<span style="color:#00f">channel</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#19177c">'nonguix</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">url</span> <span style="color:#ba2121">"https://gitlab.com/nonguix/nonguix"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">commit</span> <span style="color:#ba2121">"213be7ee6676fc4a3db0e3ac9ce5cd79e2ed209e"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">channel</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#19177c">'guix</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">url</span> <span style="color:#ba2121">"https://git.savannah.gnu.org/git/guix.git"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">commit</span> <span style="color:#ba2121">"6311493d7a6271bfbc51f4693857f9a12fe9965d"</span>))))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">inferior</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">inferior-for-channels</span> <span style="color:#19177c">channels</span>)))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">first</span> (<span style="color:#00f">lookup-inferior-packages</span> <span style="color:#19177c">inferior</span> <span style="color:#ba2121">"linux"</span> <span style="color:#ba2121">"6.2.9"</span>))))
|
||||
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic">;; (kernel linux)</span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">initrd</span> <span style="color:#19177c">microcode-initrd</span>)
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">firmware</span> (<span style="color:#008000">list </span><span style="color:#19177c">linux-firmware</span>))
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">locale</span> <span style="color:#ba2121">"en_US.utf8"</span>)
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">timezone</span> <span style="color:#ba2121">"Europe/Moscow"</span>)
|
||||
</span></span></code></pre></div><p>US/RU keyboard layout, switch with Alt+Shift.</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">keyboard-layout</span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#ba2121">"us,ru"</span> <span style="color:#666">#</span><span style="color:#19177c">:options</span> <span style="color:#666">'</span>(<span style="color:#ba2121">"grp:alt_shift_toggle"</span>)))
|
||||
</span></span></code></pre></div><p>User accounts.</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">users</span> (<span style="color:#00f">cons*</span> (<span style="color:#00f">user-account</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#ba2121">"pavel"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">comment</span> <span style="color:#ba2121">"Pavel"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">group</span> <span style="color:#ba2121">"users"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">home-directory</span> <span style="color:#ba2121">"/home/pavel"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">supplementary-groups</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#666">'</span>(<span style="color:#ba2121">"wheel"</span> <span style="color:#408080;font-style:italic">;; sudo</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"netdev"</span> <span style="color:#408080;font-style:italic">;; network devices</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"audio"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"video"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"input"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"tty"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"docker"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"scanner"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"libvirt"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"lp"</span>)))
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%base-user-accounts</span>))
|
||||
</span></span></code></pre></div><p>Base packages, necessary right after the installation.</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">packages</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">append</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">list </span><span style="color:#19177c">nss-certs</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">git</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">i3-gaps</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">i3lock</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">openbox</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">xterm</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">vim</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%base-packages</span>))
|
||||
</span></span></code></pre></div><p>Default services for each machine:</p>
|
||||
<ul>
|
||||
<li>override the default <code>%desktop-services</code> to add OpenVPN support</li>
|
||||
<li>add nix service</li>
|
||||
<li>add docker service</li>
|
||||
<li>add CUPS service</li>
|
||||
<li>add libvirt service</li>
|
||||
<li>add a symlink to ELF interpreter to where most Linux binaries expect it</li>
|
||||
</ul>
|
||||
<!--listend-->
|
||||
<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:#008000;font-weight:bold">define </span><span style="color:#19177c">%my-base-services</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">cons*</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">service</span> <span style="color:#19177c">openssh-service-type</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">screen-locker-service</span> <span style="color:#19177c">i3lock</span> <span style="color:#ba2121">"i3lock"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">extra-special-file</span> <span style="color:#ba2121">"/lib64/ld-linux-x86-64.so.2"</span> (<span style="color:#00f">file-append</span> <span style="color:#19177c">glibc</span> <span style="color:#ba2121">"/lib/ld-linux-x86-64.so.2"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">service</span> <span style="color:#19177c">nix-service-type</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">service</span> <span style="color:#19177c">cups-service-type</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">cups-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">web-interface?</span> <span style="color:#800">#t</span>)))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">service</span> <span style="color:#19177c">docker-service-type</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">service</span> <span style="color:#19177c">libvirt-service-type</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">libvirt-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">unix-sock-group</span> <span style="color:#ba2121">"libvirt"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">tls-port</span> <span style="color:#ba2121">"16555"</span>)))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">service</span> <span style="color:#19177c">virtlog-service-type</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bluetooth-service</span> <span style="color:#666">#</span><span style="color:#19177c">:auto-enable?</span> <span style="color:#800">#f</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">modify-services</span> <span style="color:#19177c">%desktop-services</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">network-manager-service-type</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">config</span> <span style="color:#19177c">=></span>
|
||||
</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><span style="display:flex;"><span> (<span style="color:#00f">guix-service-type</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">config</span> <span style="color:#19177c">=></span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">guix-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">substitute-urls</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">append </span>(<span style="color:#008000">list </span><span style="color:#ba2121">"https://substitutes.nonguix.org"</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%default-substitute-urls</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">authorized-keys</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">append </span>(<span style="color:#008000">list </span>(<span style="color:#00f">local-file</span> <span style="color:#ba2121">"./signing-key.pub"</span>))
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%default-authorized-guix-keys</span>)))))))
|
||||
</span></span></code></pre></div><h3 id="indigo">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"><<system-common>></span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">operating-system</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c"><<system-base>></span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">host-name</span> <span style="color:#ba2121">"indigo"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">services</span> (<span style="color:#00f">cons*</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">set-xorg-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">xorg-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%my-base-services</span>))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span> <span style="color:#19177c">grub-efi-bootloader</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">target</span> <span style="color:#ba2121">"/boot/efi"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">swap-devices</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">list </span>(<span style="color:#00f">uuid</span> <span style="color:#ba2121">"3a77c542-7d24-46ff-8123-f7398d1c2677"</span>)))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-systems</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">cons*</span> (<span style="color:#00f">file-system</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">"/"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> (<span style="color:#00f">file-system-label</span> <span style="color:#ba2121">"my-root"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">"ext4"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-system</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">"/boot/efi"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> <span style="color:#ba2121">"/dev/sda1"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">"vfat"</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>
|
||||
<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"><<system-common>></span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#008000;font-weight:bold">define </span><span style="color:#19177c">%backlight-udev-rule</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-rule</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"90-backlight.rules"</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">string-append </span><span style="color:#ba2121">"ACTION==\"add\", SUBSYSTEM==\"backlight\", "</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"RUN+=\"/run/current-system/profile/bin/chgrp video /sys/class/backlight/%k/brightness\""</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"\n"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"ACTION==\"add\", SUBSYSTEM==\"backlight\", "</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"RUN+=\"/run/current-system/profile/bin/chmod g+w /sys/class/backlight/%k/brightness\""</span>)))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">operating-system</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c"><<system-base>></span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">host-name</span> <span style="color:#ba2121">"eminence"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">services</span> (<span style="color:#00f">cons*</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">set-xorg-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">xorg-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">modify-services</span> <span style="color:#19177c">%my-base-services</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">elogind-service-type</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">config</span> <span style="color:#19177c">=></span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">elogind-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">handle-lid-switch-external-power</span> <span style="color:#19177c">'suspend</span>)))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-service-type</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">config</span> <span style="color:#19177c">=></span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-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">rules</span> (<span style="color:#008000">cons </span><span style="color:#19177c">%backlight-udev-rule</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-configuration-rules</span> <span style="color:#19177c">config</span>))))))))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span> <span style="color:#19177c">grub-efi-bootloader</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">target</span> <span style="color:#ba2121">"/boot/efi"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">swap-devices</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">list </span>(<span style="color:#00f">uuid</span> <span style="color:#ba2121">"f93cf3f6-7ee7-42ec-8ee2-f3d896fdf9b5"</span>)))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-systems</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">cons*</span> (<span style="color:#00f">file-system</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">"/"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">uuid</span> <span style="color:#ba2121">"1d937704-bbeb-43b5-bc63-453886c426af"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">'ext4</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">"ext4"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-system</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">"/boot/efi"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> (<span style="color:#00f">uuid</span> <span style="color:#ba2121">"0031-3784"</span> <span style="color:#19177c">'fat32</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">"vfat"</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>
|
||||
<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"><<system-common>></span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#008000;font-weight:bold">define </span><span style="color:#19177c">%backlight-udev-rule</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-rule</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"90-backlight.rules"</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">string-append </span><span style="color:#ba2121">"ACTION==\"add\", SUBSYSTEM==\"backlight\", "</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"RUN+=\"/run/current-system/profile/bin/chgrp video /sys/class/backlight/%k/brightness\""</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"\n"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"ACTION==\"add\", SUBSYSTEM==\"backlight\", "</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"RUN+=\"/run/current-system/profile/bin/chmod g+w /sys/class/backlight/%k/brightness\""</span>)))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">operating-system</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c"><<system-base>></span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">host-name</span> <span style="color:#ba2121">"azure"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">services</span> (<span style="color:#00f">cons*</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">set-xorg-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">xorg-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">modify-services</span> <span style="color:#19177c">%my-base-services</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">elogind-service-type</span> <span style="color:#19177c">config</span> <span style="color:#19177c">=></span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">elogind-configuration</span> (<span style="color:#00f">inherit</span> <span style="color:#19177c">config</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">handle-lid-switch-external-power</span> <span style="color:#19177c">'suspend</span>)))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-service-type</span> <span style="color:#19177c">config</span> <span style="color:#19177c">=></span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-configuration</span> (<span style="color:#00f">inherit</span> <span style="color:#19177c">config</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">rules</span> (<span style="color:#008000">cons </span><span style="color:#19177c">%backlight-udev-rule</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-configuration-rules</span> <span style="color:#19177c">config</span>))))))))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span> <span style="color:#19177c">grub-efi-bootloader</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">target</span> <span style="color:#ba2121">"/boot/efi"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">swap-devices</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">list </span>(<span style="color:#00f">uuid</span> <span style="color:#ba2121">"4b2dedb3-b111-4e69-8c05-6daa2b072c76"</span>)))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-systems</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">cons*</span> (<span style="color:#00f">file-system</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">"/"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> (<span style="color:#00f">file-system-label</span> <span style="color:#ba2121">"my-root"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">"ext4"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-system</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">"/boot/efi"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> <span style="color:#ba2121">"/dev/sda1"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">"vfat"</span>))
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%base-file-systems</span>)))
|
||||
</span></span></code></pre></div><h3 id="iris">iris</h3>
|
||||
<p><code>iris</code> is my work machine.</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"><<system-common>></span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#00f">operating-system</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c"><<system-base>></span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">host-name</span> <span style="color:#ba2121">"iris"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">services</span> (<span style="color:#00f">cons*</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">set-xorg-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">xorg-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%my-base-services</span>))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span> (<span style="color:#00f">bootloader-configuration</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span> <span style="color:#19177c">grub-bootloader</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">targets</span> (<span style="color:#008000">list </span><span style="color:#ba2121">"/dev/sdb"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">swap-devices</span> (<span style="color:#008000">list </span>(<span style="color:#00f">swap-space</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">target</span> (<span style="color:#00f">uuid</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"bc284384-ff00-4fbc-abda-1c46f69c0505"</span>)))))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mapped-devices</span> (<span style="color:#008000">list </span>(<span style="color:#00f">mapped-device</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">source</span> (<span style="color:#00f">uuid</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"21876acb-e05a-4731-8df0-ba5761910ca8"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">target</span> <span style="color:#ba2121">"cryptroot"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#19177c">luks-device-mapping</span>))))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-systems</span> (<span style="color:#00f">cons*</span> (<span style="color:#00f">file-system</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">"/"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> <span style="color:#ba2121">"/dev/mapper/cryptroot"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">"ext4"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">dependencies</span> <span style="color:#19177c">mapped-devices</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-system</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">"/boot/efi"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> (<span style="color:#00f">uuid</span> <span style="color:#ba2121">"782E-F6D3"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">'fat32</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">"vfat"</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>
|
||||
<p>In my case, the provided ISO doesn’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’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=<path-to-iso> status=progress && sync
|
||||
</span></span></code></pre></div><p>However, I couldn’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>
|
||||
<p>Going further, the official instructions for installation & SystemCrafters wiki entry are pretty good, so it’s not necessary to repeat them here.</p>
|
||||
<h3 id="after-installation">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’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>
|
||||
<p>Clone the dotfiles repo:</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>mkdir Code
|
||||
</span></span><span style="display:flex;"><span>cd Code
|
||||
</span></span><span style="display:flex;"><span>git clone https://github.com/SqrtMinusOne/dotfiles.git
|
||||
</span></span></code></pre></div><p>Copy the channels file and run guix pull:</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>cp ~/Code/dotfiles/.config/guix/channels.scm ~/.config/guix
|
||||
</span></span><span style="display:flex;"><span>guix pull
|
||||
</span></span></code></pre></div><p>The first pull usually takes a while. After that install yadm and pull dotfiles:</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>guix install yadm
|
||||
</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 & building Emacs, Starship and stuff will take a while.</p>
|
||||
<p>Don’t forget to install <code>JetBrainsMono Nerd Font</code>.</p>
|
||||
<h2 id="misc-software-and-notes">Misc software & notes</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Category</th>
|
||||
<th>Guix dependency</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>system</td>
|
||||
<td>patchelf</td>
|
||||
<td>A program to modify existsing ELF executables</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>system</td>
|
||||
<td>glibc</td>
|
||||
<td>A lot of stuff, including ELF interpeter and <code>ldd</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>system</td>
|
||||
<td>tor-client</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>system</td>
|
||||
<td>torsocks</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>system</td>
|
||||
<td>vnstat</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="openvpn">OpenVPN</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Category</th>
|
||||
<th>Guix dependency</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>system</td>
|
||||
<td>openvpn</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>system</td>
|
||||
<td>openvpn-update-resolve-conf</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>system</td>
|
||||
<td>openresolv</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>system</td>
|
||||
<td>vpnc</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Update <span class="timestamp-wrapper"><span class="timestamp">[2023-06-29 Thu]</span></span>: My censors seem to be putting sticks in the wheels of OpenVPN… Switched to Wireguard for now. It can be configured with Network Manager.</p>
|
||||
<p>I’m not sure how to properly spin up VPN on Guix, so here is what ended I’m doing after some trial and error.</p>
|
||||
<p>I’m using Mullvad VPN. The <code>~/.vpn</code> folder stores its OpenVPN config (<code>openvpn.ovpn</code>), modified as follows:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>paths to <code>ca</code>, <code>cert</code> and <code>key</code> are made absolute</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>ca <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.vpn/</span>ca.crt
|
||||
</span></span><span style="display:flex;"><span>cert <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.vpn/</span>client.crt
|
||||
</span></span><span style="display:flex;"><span>key <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.vpn/</span>client.key
|
||||
</span></span></code></pre></div></li>
|
||||
<li>
|
||||
<p>added <code>auth-user-pass</code> with a link to login info</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>auth-user-pass <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.vpn/</span>auth.conf
|
||||
</span></span></code></pre></div><p><code>auth.conf</code> looks like this:</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>login
|
||||
</span></span><span style="display:flex;"><span>password
|
||||
</span></span></code></pre></div></li>
|
||||
<li>
|
||||
<p>Run <a href="https://github.com/alfredopalhares/openvpn-update-resolv-conf">openvpn-update-resolv-conf</a> script to prevent DNS leaks. <code>openvpn-update-resolve-conf</code> originates in my <a href="https://github.com/SqrtMinusOne/channel-q">channel-q</a>.</p>
|
||||
<p>Edit <span class="timestamp-wrapper"><span class="timestamp"><2022-04-07 Thu></span></span>: Looks like this doesn’t work on some connections. See the next option in that case</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>setenv PATH <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.guix-extra-profiles/</span>system<span style="color:#b68">/system/</span>bin:<span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.guix-extra-profiles/</span>system<span style="color:#b68">/system/</span>sbin:<span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.guix-extra-profiles/</span>console<span style="color:#b68">/console/</span>bin:<span style="color:#b68">/run/</span>current-system<span style="color:#b68">/profile/</span>bin:<span style="color:#b68">/run/</span>current-system<span style="color:#b68">/profile/</span>sbin
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>up <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.guix-extra-profiles/</span>system<span style="color:#b68">/system/</span>bin/update-resolv-conf.sh
|
||||
</span></span><span style="display:flex;"><span>down <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.guix-extra-profiles/</span>system<span style="color:#b68">/system/</span>bin/update-resolv-conf.sh
|
||||
</span></span></code></pre></div><p><code>setenv PATH</code> is necessary because both <code>resolvconf</code> (openresolve) and <code>update-resolv-conf.sh</code> are shell scripts which need GNU coreutils and stuff, and OpenVPN clears PATH by default.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Manually fix <code>etc/resolv.conf</code> to prevent DNS leaks</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>/home/pavel/.guix-extra-profiles/console/console/bin/cp /etc/resolv.conf /etc/resolv.conf-bak
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">"nameserver 8.8.8.8"</span> > /etc/resolv.conf
|
||||
</span></span></code></pre></div><p>Restore <code>resolv.conf</code></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>resolveconf -u
|
||||
</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-vim" data-lang="vim"><span style="display:flex;"><span>up <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/bin/</span>scripts/fix-resolve-conf
|
||||
</span></span><span style="display:flex;"><span>down <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/bin/</span>scripts/restore-resolve-conf
|
||||
</span></span></code></pre></div></li>
|
||||
<li>
|
||||
<p>run a script to fix Docker routes</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>route-up <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/bin/</span>scripts/vpn-fix-routes
|
||||
</span></span></code></pre></div><p>References:</p>
|
||||
<ul>
|
||||
<li><a href="https://github.com/moby/libnetwork/issues/779">Github issue</a></li>
|
||||
</ul>
|
||||
<p>The script itself:</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">echo</span> <span style="color:#ba2121">"Adding default route to </span><span style="color:#19177c">$route_vpn_gateway</span><span style="color:#ba2121"> with /0 mask..."</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">IP</span><span style="color:#666">=</span>/run/current-system/profile/sbin/ip
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">$IP</span> route add default via <span style="color:#19177c">$route_vpn_gateway</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">"Removing /1 routes..."</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">$IP</span> route del 0.0.0.0/1 via <span style="color:#19177c">$route_vpn_gateway</span>
|
||||
</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>
|
||||
<p><del>As of now, CyberGhost doesn’t provide ipv6, so we have to disable it.</del></p>
|
||||
<p>Mullvad seems to provide it, so the script just launches <code>openvpn</code> with <code>pkexec</code>.</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">"(.*docker.*|NAME|br-.*|veth.*|tun.*|vnet.*|virbr.*)"</span> | sed <span style="color:#ba2121">'s/ *$//g'</span><span style="color:#008000;font-weight:bold">)</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -z <span style="color:#ba2121">"</span><span style="color:#19177c">$CONN</span><span style="color:#ba2121">"</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">echo</span> <span style="color:#ba2121">"No connection!"</span>
|
||||
</span></span><span style="display:flex;"><span> notify-send <span style="color:#ba2121">"VPN"</span> <span style="color:#ba2121">"No connection for VPN to run"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">exit</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></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># if [[ "$CONN" != *"Wired"* ]]; then</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># echo "Connection: $CONN"</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># notify-send "VPN" "Initializing for connection: $CONN"</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># pkexec nmcli con modify "$CONN" ipv6.method ignore</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># nmcli connection up "$CONN"</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># fi</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">VPN_FILE</span><span style="color:#666">=</span>~/.vpn/sqrtminusone-<span style="color:#008000;font-weight:bold">$(</span>hostname<span style="color:#008000;font-weight:bold">)</span>.ovpn
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[[</span> <span style="color:#008000;font-weight:bold">$(</span>hostname<span style="color:#008000;font-weight:bold">)</span> <span style="color:#666">==</span> <span style="color:#ba2121">'iris'</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">VPN_FILE</span><span style="color:#666">=</span>~/.vpn/mullvad_openvpn_linux_se_all/mullvad_se_all.conf
|
||||
</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">echo</span> <span style="color:#19177c">$VPN_FILE</span>
|
||||
</span></span><span style="display:flex;"><span>pkexec openvpn --config <span style="color:#19177c">$VPN_FILE</span>
|
||||
</span></span></code></pre></div><h4 id="377cab"><del>vpn-stop</del></h4>
|
||||
<p><del>Also a script to reverse the changes</del>
|
||||
Also not necessary now. Just <code>herd stop vpn</code> and <code>sudo pkill vpn</code>.</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">"(.*docker.*|NAME|br-.*|veth.*|tun.*)"</span> | sed <span style="color:#ba2121">'s/ *$//g'</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">"Connection: </span><span style="color:#19177c">$CONN</span><span style="color:#ba2121">"</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>pkexec nmcli con modify <span style="color:#ba2121">"</span><span style="color:#19177c">$CONN</span><span style="color:#ba2121">"</span> ipv6.method auto
|
||||
</span></span><span style="display:flex;"><span>nmcli connection up <span style="color:#ba2121">"</span><span style="color:#19177c">$CONN</span><span style="color:#ba2121">"</span>
|
||||
</span></span></code></pre></div><h3 id="wireguard">Wireguard</h3>
|
||||
<p>So, yeah, wireguard can be configured with <code>NetworkManager</code> just fine.</p>
|
||||
<p>The issue with DNS leaks remains, but fortunately <code>NetworkManager</code> runs all scripts in <code>/etc/NetworkManager/dispatcher.d/</code> when a connection changes, provided that scripts are:</p>
|
||||
<ul>
|
||||
<li>owned by root</li>
|
||||
<li>exectuable</li>
|
||||
<li>not readable by other users</li>
|
||||
<li>not setuid.</li>
|
||||
</ul>
|
||||
<p>See <a href="https://askubuntu.com/questions/13963/call-script-after-connecting-to-a-wireless-network">this answer</a> on StackExchange, and <a href="https://networkmanager.dev/docs/api/latest/NetworkManager-dispatcher.html">NetworkManager-dispatcher man page</a>.</p>
|
||||
<p><a id="code-snippet--get-nmcli"></a></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">echo</span> <span style="color:#008000;font-weight:bold">$(</span>guix build network-manager | grep -ve <span style="color:#ba2121">'-doc$'</span><span style="color:#008000;font-weight:bold">)</span>/bin/nmcli
|
||||
</span></span></code></pre></div><p>So, here’s the 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:#bc7a00">#!/bin/sh
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#bc7a00"></span><span style="color:#19177c">GREP</span><span style="color:#666">=</span>/run/current-system/profile/bin/grep
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">NMCLI</span><span style="color:#666">=</span><span style="color:#ba2121"><<get-nmcli()>>
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121"># Run only if wireg</span>uard is active
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#19177c">$NMCLI</span> connection show --active | <span style="color:#19177c">$GREP</span> -q wireguard; <span style="color:#008000;font-weight:bold">then</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">"nameserver 8.8.8.8"</span> > /etc/resolv.conf
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
|
||||
</span></span></code></pre></div><p>Expand the noweb with <code>C-c C-v v</code>, put it in <code>dispatcher.d</code> and run <code>chmod 700</code>.</p>
|
||||
<h3 id="flatpak">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="micromamba">micromamba</h3>
|
||||
<p><del><a href="https://docs.conda.io/en/latest/">conda</a></del> <a href="https://github.com/mamba-org/mamba">mamba</a> is a package manager that I use for managing various versions of Python & Node.js.</p>
|
||||
<p><code>mamba</code> is a reimplementation of <code>conda</code> in C++. <code>mamba</code> is notably much faster and mostly compatible with <code>conda</code>, and <code>micromamba</code> is a tiny version of <code>mamba</code> that is contained in one statically linked exectuable. I’ve migrated to <code>micromamba</code> mostly because of speed.</p>
|
||||
<p><code>conda</code> is packaged for Guix with its fair share of quirks, mostly concerning the impossibility of changing the base environment in <code>/gnu/store/</code>. <code>micromamba</code> has none of that because it doesn’t ship with a base environment. It’s not packaged for Guix yet, so I’ve made a definition with <code>binary-build-system</code> in my channel.</p>
|
||||
<p>You may need to unset <code>$PYTHONPATH</code> if you have any global packages installed, otherwise Python from the environemnt will try to import them instead of the conda versions.</p>
|
||||
<p>I also want to have an ability to use global npm. Some settings for that are located in <a href="Console">Console.org</a>. Here we want to unset <code>NPM_CONFIG_USERCONFIG</code> if there is npm available in the environment.</p>
|
||||
<p>So here is a script to set up conda hooks:</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:#408080;font-style:italic"># Get writable conda envs with npm & without it</span>
|
||||
</span></span><span style="display:flex;"><span>readarray -t CONDA_ENVS_ALL <span style="color:#666"><<<</span> <span style="color:#008000;font-weight:bold">$(</span>micromamba env list --json | jq <span style="color:#ba2121">'.envs[]'</span><span style="color:#008000;font-weight:bold">)</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">CONDA_ENVS_NPM</span><span style="color:#666">=()</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">CONDA_ENVS_NO_NPM</span><span style="color:#666">=()</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> env in <span style="color:#ba2121">"</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">CONDA_ENVS_ALL</span>[@]<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">"</span>; <span style="color:#008000;font-weight:bold">do</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">env</span><span style="color:#666">=</span><span style="color:#ba2121">"</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">env</span>:<span style="color:#19177c">1</span>:<span style="color:#b68;font-weight:bold">${#</span><span style="color:#19177c">env</span><span style="color:#b68;font-weight:bold">}</span>-2<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -w <span style="color:#ba2121">"</span><span style="color:#19177c">$env</span><span style="color:#ba2121">"</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;font-weight:bold">if</span> <span style="color:#666">[</span> -f <span style="color:#ba2121">"</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/bin/npm"</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">CONDA_ENVS_NPM</span><span style="color:#666">+=(</span><span style="color:#19177c">$env</span><span style="color:#666">)</span>
|
||||
</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:#19177c">CONDA_ENVS_NO_NPM</span><span style="color:#666">+=(</span><span style="color:#19177c">$env</span><span style="color:#666">)</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">fi</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">done</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> env in <span style="color:#ba2121">"</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">CONDA_ENVS_NPM</span>[@]<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">"</span>; <span style="color:#008000;font-weight:bold">do</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">"Found npm in </span><span style="color:#19177c">$env</span><span style="color:#ba2121">"</span>
|
||||
</span></span><span style="display:flex;"><span> mkdir -p <span style="color:#ba2121">"</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/activate.d"</span>
|
||||
</span></span><span style="display:flex;"><span> mkdir -p <span style="color:#ba2121">"</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/deactivate.d"</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">"unset NPM_CONFIG_USERCONFIG"</span> > <span style="color:#ba2121">"</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/activate.d/conda.sh"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">"set -e NPM_CONFIG_USERCONFIG"</span> > <span style="color:#ba2121">"</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/activate.d/conda.fish"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">"export NPM_CONFIG_USERCONFIG=</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/._npmrc"</span> > <span style="color:#ba2121">"</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/deactivate.d/conda.sh"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">"export NPM_CONFIG_USERCONFIG=</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/._npmrc"</span> > <span style="color:#ba2121">"</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/deactivate.d/conda.fish"</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">done</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> env in <span style="color:#ba2121">"</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">CONDA_ENVS_NO_NPM</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">"</span>; <span style="color:#008000;font-weight:bold">do</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">"Did not found npm in </span><span style="color:#19177c">$env</span><span style="color:#ba2121">"</span>
|
||||
</span></span><span style="display:flex;"><span> rm -rf <span style="color:#ba2121">"</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/activate.d/conda.sh"</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">"</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/activate.d/conda.fish"</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">"</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/deactivate.d/conda.sh"</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">"</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/deactivate.d/conda.fish"</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>
|
||||
<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">"</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/bin/dummies:</span><span style="color:#19177c">$PATH</span><span style="color:#ba2121">"</span>
|
||||
</span></span><span style="display:flex;"><span>mkdir -p ~/.cache/slack
|
||||
</span></span><span style="display:flex;"><span>slack -r ~/.cache/slack
|
||||
</span></span></code></pre></div><p>Also, it requires a <code>lsb_release</code> in the PATH, so here is one:</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">echo</span> <span style="color:#ba2121">"LSB Version: Hey. I spent an hour figuring out why Slack doesn't launch."</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">"Distributor ID: It seems like it requires an lsb_release."</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">"Description: But GNU Guix doesn't have one."</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">"Release: 42.2"</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">"Codename: n/a"</span>
|
||||
</span></span></code></pre></div><h3 id="virt-manager">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>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Note</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>TODO</td>
|
||||
<td>Package this for Guix</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Before I figure out how to package this for Guix:</p>
|
||||
<ul>
|
||||
<li>Clone <a href="https://github.com/wakatime/wakatime-cli">the repo</a></li>
|
||||
<li>Run <code>go build</code></li>
|
||||
<li>Copy the binary to the <code>~/bin</code> folder</li>
|
||||
</ul>
|
||||
<h3 id="docker">Docker</h3>
|
||||
<p>Docker Compose plugin v2 isn’t yet available on Guix, but can be installed as follows:</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>curl -SL https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64 -o <span style="color:#19177c">$HOME</span>/.docker/cli-plugins/docker-compose
|
||||
</span></span><span style="display:flex;"><span>sudo chmod +x <span style="color:#19177c">$HOME</span>/.docker/cli-plugins/docker-compose
|
||||
</span></span></code></pre></div><h3 id="manifest">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>
|
||||
<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->manifest</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#666">'</span>(
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c"><<packages</span>(<span style="color:#ba2121">"system"</span>)<span style="color:#19177c">>></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="#profiles">Profiles</a>
|
||||
<ul>
|
||||
<li><a href="#activate-profiles">Activate profiles</a></li>
|
||||
<li><a href="#update-profiles">Update profiles</a></li>
|
||||
<li><a href="#run-guix-package-in-profile">Run <code>guix package</code> in profile</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#channels">Channels</a></li>
|
||||
<li><a href="#systems">Systems</a>
|
||||
<ul>
|
||||
<li><a href="#base-configuration">Base configuration</a></li>
|
||||
<li><a href="#indigo">indigo</a></li>
|
||||
<li><a href="#eminence">eminence</a></li>
|
||||
<li><a href="#azure">azure</a></li>
|
||||
<li><a href="#iris">iris</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#system-installation">System installation</a>
|
||||
<ul>
|
||||
<li><a href="#preparation">Preparation</a></li>
|
||||
<li><a href="#installation">Installation</a></li>
|
||||
<li><a href="#after-installation">After installation</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#misc-software-and-notes">Misc software & notes</a>
|
||||
<ul>
|
||||
<li><a href="#openvpn">OpenVPN</a>
|
||||
<ul>
|
||||
<li><a href="#vpn-start">vpn-start</a></li>
|
||||
<li><a href="#377cab">vpn-stop</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#wireguard">Wireguard</a></li>
|
||||
<li><a href="#flatpak">flatpak</a></li>
|
||||
<li><a href="#micromamba">micromamba</a></li>
|
||||
<li><a href="#slack">Slack</a></li>
|
||||
<li><a href="#virt-manager">virt-manager</a></li>
|
||||
<li><a href="#wakatime-cli">wakatime-cli</a></li>
|
||||
<li><a href="#docker">Docker</a></li>
|
||||
<li><a href="#manifest">Manifest</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
<a id="unhide-all-button" class="hidden"><Expand></a>
|
||||
<a id="hide-all-button" class="hidden"><Collapse></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><div id="footer" class="mb-5">
|
||||
<hr>
|
||||
<div class="container text-center">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="container text-center">
|
||||
|
||||
|
||||
<a href="https://creativecommons.org/licenses/by/4.0/legalcode" title="Licensed under CC-BY 4.0"><small>Licensed under CC-BY 4.0</small></a>
|
||||
|
||||
|
|
||||
|
||||
|
||||
<a href="https://plausible.io/" title="Uses Plausible Analytics"><small>Uses Plausible Analytics</small></a>
|
||||
|
||||
|
||||
<br>
|
||||
|
||||
<a href="https://sqrtminusone.xyz/" title="Pavel Korytov, 2023"><small>Pavel Korytov, 2023</small></a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Configs on SqrtMinusOne</title>
|
||||
<link>https://sqrtminusone.xyz/configs/</link>
|
||||
<description>Recent content in Configs on SqrtMinusOne</description>
|
||||
<generator>Hugo -- gohugo.io</generator>
|
||||
<language>en-us</language>
|
||||
<atom:link href="https://sqrtminusone.xyz/configs/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Console</title>
|
||||
<link>https://sqrtminusone.xyz/configs/console/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
<guid>https://sqrtminusone.xyz/configs/console/</guid>
|
||||
<description>No matter from which side you approach penguins, more always come from behind
A friend of mine Colors Noweb function to get colors.
(let ((color (or (my/color-value name)))) (if (&gt; quote 0) (concat &#34;\&#34;&#34; color &#34;\&#34;&#34;) color)) (let ((val (if (ct-light-p (my/color-value name)) (my/color-value &#39;black) (my/color-value &#39;white)))) (if (eq quote 1) (concat &#34;\&#34;&#34; val &#34;\&#34;&#34;) val)) (setq-local org-confirm-babel-evaluate nil) .profile Environment export QT_QPA_PLATFORMTHEME=&#34;qt5ct&#34; export QT_AUTO_SCREEN_SCALE_FACTOR=0 Set ripgrep config path</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Desktop</title>
|
||||
<link>https://sqrtminusone.xyz/configs/desktop/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
<guid>https://sqrtminusone.xyz/configs/desktop/</guid>
|
||||
<description>My general desktop environment configuration.
Parts prefixed with (OFF) are not used, but kept for historic purposes. For some reason GitHub&rsquo;s org renderer ignores TODO status, hence such a prefix. Round brackets instead of square ones to prevent GitHub&rsquo;s org renderer from screwing up.
References:
A few cases of literate configuration. A few interesting ways in which literate configuration is used in this file. Some remarks Removed features:
Feature Last commit rofi-buku e22476b0cc6315e104e5ce4de5559a61c830c429 Global customization Colors I used to define color codes here (see previous version of the file), now I just get colors from the current Emacs theme.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Emacs config</title>
|
||||
<link>https://sqrtminusone.xyz/configs/emacs/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
<guid>https://sqrtminusone.xyz/configs/emacs/</guid>
|
||||
<description>One day we won&rsquo;t hate one another, no young boy will march to war and I will clean up my Emacs config. But that day isn&rsquo;t today.
Me, &lt;2021-05-27 Thu 17:35&gt; in commit 93a0573. Adapted from The Dark Element - &ldquo;The Pallbearer Walks Alone&rdquo;. T_T Introduction My configuration of GNU Emacs, an awesome text editor piece of software that can do almost anything.
At the moment of writing this, that &ldquo;almost anything&rdquo; includes:</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Guix</title>
|
||||
<link>https://sqrtminusone.xyz/configs/guix/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
<guid>https://sqrtminusone.xyz/configs/guix/</guid>
|
||||
<description>GNU Guix is (1) a transactional package manager and (2) a GNU/Linux distribution.
My personal selling points are declarative package configuration and transactional upgrades.
References:
Official help System Crafters wiki Pjotr Prins&rsquo; Guix notes Davil Wilson&rsquo;s YouTube series Profiles 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.
References:
Guix Profiles in Practice Activate profiles A script to activate guix profiles.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Mail</title>
|
||||
<link>https://sqrtminusone.xyz/configs/mail/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
<guid>https://sqrtminusone.xyz/configs/mail/</guid>
|
||||
<description>:TOC: :include all :depth 3
My email configration. Currently I use lieer to fetch emails from Gmail, davmail &amp; offlineimap to fetch emails from MS Exchange, notmuch to index, msmtp to send emails. Also using notmuch frontend from Emacs.
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.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>My dotfiles</title>
|
||||
<link>https://sqrtminusone.xyz/configs/readme/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
<guid>https://sqrtminusone.xyz/configs/readme/</guid>
|
||||
<description>These are my GNU/Linux configuration files. View at GitHub.
I use the literate configuration strategy via Emacs&rsquo; Org Mode wherever possible. It has its pros and cons, but I find it pretty nice to keep the configs interweaved with comments in a handful of files.
The files themselves are managed and deployed via yadm, although I use Org Mode for things like config templating.
My current GNU/Linux distribution is GNU Guix.</description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
|
@ -1,764 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang=""><head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
|
||||
<title>Mail</title>
|
||||
<meta name="description" content="Freedom is a state of mind">
|
||||
<meta name="author" content='SqrtMinusOne'>
|
||||
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;700&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" integrity="sha512-iBBXm8fW90+nuLcSKlbmrPcLa0OT92xO1BIsZ+ywDWZCvqsWgccV3gFoRBv0z+8dLJgyAHIhR35VZc2oM/gI1w==" crossorigin="anonymous">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="/sass/researcher.min.css">
|
||||
|
||||
|
||||
<link rel="icon" type="image/ico" href="https://sqrtminusone.xyz/favicon.ico">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer data-domain="sqrtminusone.xyz" src="https://plausible.sqrtminusone.xyz/js/plausible.js"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body><div class="container mt-5">
|
||||
<nav class="navbar navbar-expand-sm flex-column flex-sm-row text-nowrap p-0">
|
||||
<a class="navbar-brand mx-0 mr-sm-auto" href="https://sqrtminusone.xyz/" title="SqrtMinusOne">
|
||||
|
||||
SqrtMinusOne
|
||||
</a>
|
||||
<div class="navbar-nav flex-row flex-wrap justify-content-center">
|
||||
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/" title="Index">
|
||||
Index
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/posts/" title="Posts">
|
||||
Posts
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/configs/readme" title="Configs">
|
||||
Configs
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
<hr>
|
||||
<div id="content">
|
||||
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
|
||||
<div class="root">
|
||||
<h1 id="title-small-screen">
|
||||
Mail
|
||||
<iframe src="https://ghbtns.com/github-btn.html?user=SqrtMinusOne&repo=dotfiles&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe>
|
||||
</h1>
|
||||
<div class="container" id="actual-content">
|
||||
<h1 id="title-large-screen" class="dotfiles-title">
|
||||
Mail
|
||||
<iframe src="https://ghbtns.com/github-btn.html?user=SqrtMinusOne&repo=dotfiles&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe>
|
||||
</h1>
|
||||
<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> & <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>
|
||||
<p>References:</p>
|
||||
<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>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Guix dependency</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>python-lieer</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Lieer is a program to link up Gmail and notmuch. Basically, it downloads mail from Gmail via API, stores them in Maildir, and synchronizes labels with notmuch.</p>
|
||||
<p>I have a separate directory in my <code>~/Mail</code> for each address. To init lieer, run the following command in the directory:</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>gmi init <address>
|
||||
</span></span></code></pre></div><p>After which the settings will be stored in <code>gmailieer.json</code> and the credentials in <code>.credentials.gmailieer.json</code>. The latter file is stored encrypted.</p>
|
||||
<p>My preferred settings:</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>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>
|
||||
<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’t packaged for Guix, but it’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>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">davmail.mode</span><span style="color:#666">=</span><span style="color:#ba2121">Auto</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">davmail.url</span><span style="color:#666">=</span><span style="color:#ba2121">https://mail.etu.ru/owa/</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">davmail.server.certificate.hash</span><span style="color:#666">=</span><span style="color:#ba2121">0C:9E:CF:D3:62:26:DB:FA:F1:EE:36:9D:60:E7:31:71:CF:1F:92:85</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">davmail.caldavPort</span><span style="color:#666">=</span><span style="color:#ba2121">1080</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">davmail.imapPort</span><span style="color:#666">=</span><span style="color:#ba2121">1143</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">davmail.ldapPort</span><span style="color:#666">=</span><span style="color:#ba2121">1389</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">davmail.popPort</span><span style="color:#666">=</span><span style="color:#ba2121">1110</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">davmail.smtpPort</span><span style="color:#666">=</span><span style="color:#ba2121">1025</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">davmail.imapAutoExpunge</span><span style="color:#666">=</span><span style="color:#ba2121">false</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">davmail.enableKeepalive</span><span style="color:#666">=</span><span style="color:#ba2121">false</span>
|
||||
</span></span></code></pre></div><p>Also it’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>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Guix dependency</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>offlineimap</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p><a href="https://github.com/OfflineIMAP/offlineimap">OfflineIMAP</a> is a program that can synchronize IMAP mailbox and Maildir. Lieer does everything by itself, but my pirate Exchange IMAP needs this program. There is also <a href="https://isync.sourceforge.io/">isync</a>, but there I had some weird issues with duplicate UIDs, which don’t occur for OfflineIMAP.</p>
|
||||
<p>I have a few options for setting a username and password. First, I can run <code>pass</code> in <code>remotepasswordeval</code>, and while this will work, it will keep my keyring unlocked because I want to run <code>offlineimap</code> every couple of minutes.</p>
|
||||
<p>Another option is to use noweb and not push the file below to the version control. Then I have a plaintext password of email on my computer, but I think it’s a lesser evil than the entire keyring.</p>
|
||||
<p>I would use <code>password-store-get</code> from password-store.el, but I want this to be able to run without any 3rd party packages, so it’s just bash.</p>
|
||||
<p><a id="code-snippet--mail-username"></a></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>pass show Job/Digital/Email/pvkorytov@etu.ru | sed -n <span style="color:#ba2121">'s/username: //;2p'</span>
|
||||
</span></span></code></pre></div><p><a id="code-snippet--mail-password"></a></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>pass show Job/Digital/Email/pvkorytov@etu.ru | head -n <span style="color:#666">1</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-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">[general]</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">accounts</span> <span style="color:#666">=</span> <span style="color:#ba2121">pvkorytov</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">[Account pvkorytov]</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">localrepository</span> <span style="color:#666">=</span> <span style="color:#ba2121">pvkorytov-local</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">remoterepository</span> <span style="color:#666">=</span> <span style="color:#ba2121">pvkorytov-remote</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">[Repository pvkorytov-local]</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">type</span> <span style="color:#666">=</span> <span style="color:#ba2121">Maildir</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">localfolders</span> <span style="color:#666">=</span> <span style="color:#ba2121">~/Mail/pvkorytov_etu/</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">[Repository pvkorytov-remote]</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">type</span> <span style="color:#666">=</span> <span style="color:#ba2121">IMAP</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">remotehost</span> <span style="color:#666">=</span> <span style="color:#ba2121">localhost</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">remoteuser</span> <span style="color:#666">=</span> <span style="color:#ba2121"><<mail-username()>></span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">remotepass</span> <span style="color:#666">=</span> <span style="color:#ba2121"><<mail-password()>></span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">remoteport</span> <span style="color:#666">=</span> <span style="color:#ba2121">1143</span>
|
||||
</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>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Guix dependency</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>notmuch</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>parallel</td>
|
||||
</tr>
|
||||
</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’s not the only one available.</p>
|
||||
<h3 id="config">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>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">path</span><span style="color:#666">=</span><span style="color:#ba2121">/home/pavel/Mail</span>
|
||||
</span></span></code></pre></div><p>My name and list of emails. It’s not like it’s a secret anyhow.</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">[user]</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">name</span><span style="color:#666">=</span><span style="color:#ba2121">Pavel Korytov</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">primary_email</span><span style="color:#666">=</span><span style="color:#ba2121">thexcloud@gmail.com</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">other_email</span><span style="color:#666">=</span><span style="color:#ba2121">progin6304@gmail.com;pvkorytov@etu.ru</span>
|
||||
</span></span></code></pre></div><p>A list of tags which will be added by <code>notmuch new</code> and directory names which will be ignored by <code>notmuch new</code>.</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">[new]</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">tags</span><span style="color:#666">=</span><span style="color:#ba2121">new;</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">ignore</span><span style="color:#666">=</span><span style="color:#ba2121">.osync_workdir;.mbsyncstate;.uidvalidity;.lock;/.*gmailieer\.json.*/</span>
|
||||
</span></span></code></pre></div><p>Exclude these tags from search by default.</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">[search]</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#7d9029">exclude_tags</span><span style="color:#666">=</span><span style="color:#ba2121">trash;spam;</span>
|
||||
</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>
|
||||
<p>Now we have to link up lieer & davmail’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>
|
||||
<li>move emails to their folders by tags <em>before</em> the synchronization</li>
|
||||
<li>tag mails by their folders <em>after</em> the synchronization</li>
|
||||
</ul>
|
||||
<p>The problem is that with that approach one email can have only one tag, but it’s better than nothing.</p>
|
||||
<p>So, here are the rules which match tags & folders:</p>
|
||||
<p><a id="table--pvkorytov-tags"></a></p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>tag</th>
|
||||
<th>folder</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>inbox</td>
|
||||
<td>INBOX</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>sent</td>
|
||||
<td>Sent</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>spam</td>
|
||||
<td>Junk</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>trash</td>
|
||||
<td>Trash</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>job.digital</td>
|
||||
<td>Job_Digital</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>job.digital.docs</td>
|
||||
<td>Job_Digital.Docs</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>job.digital.support</td>
|
||||
<td>Job_Digital.Support</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>job.digital.superservice</td>
|
||||
<td>Job_Digital.Superservice</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>job.digital.applicants</td>
|
||||
<td>Job_Digital.Applicants</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>job.moevm</td>
|
||||
<td>Job_Moevm</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>etu</td>
|
||||
<td>Etu</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>And below is a noweb function, which generates the following commands for notmuch to execute:</p>
|
||||
<ul>
|
||||
<li><em>before</em> sync:
|
||||
<ul>
|
||||
<li><code>notmuch search --output files "NOT path:[PATH] AND tag:[TAG] AND tag:[ROOT_TAG]" | xargs -I ! mv ! [PATH]</code>
|
||||
Move emails with <code>TAG</code> but outside the matching <code>PATH</code> to the latter</li>
|
||||
<li><code>notmuch search --output=files "NOT path:[ARCHIVE_PATH] AND tag:[ROOT_TAG] AND NOT tag:[TAG1] ... AND NOT tag:[TAGN]" | xargs -I ! mv ! [ARCHIVE_PATH]</code>
|
||||
Move untagged emails to the <code>ARCHIVE_PATH</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><em>after</em> sync:
|
||||
<ul>
|
||||
<li><code>notmuch tag +[TAG] "path:[PATH] AND NOT tag:[TAG]"</code>
|
||||
Tag emails in <code>PATH</code> which do not yet have the matching <code>TAG</code></li>
|
||||
<li><code>notmuch tag -[TAG] "NOT path:[PATH] AND tag:[TAG] AND tag:[ROOT_TAG]"</code>
|
||||
Remove <code>TAG</code> from emails which are outside the matching <code>PATH</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>These rules are getting included in the respective hooks.</p>
|
||||
<p><a id="code-snippet--mail-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:#008000">setq</span> <span style="color:#19177c">my/maildir-root</span> <span style="color:#ba2121">"~/Mail"</span>)
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#008000">let</span> ((<span style="color:#19177c">rules</span> <span style="color:#666">'</span>()))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">dolist</span> (<span style="color:#19177c">row</span> <span style="color:#19177c">tags</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let</span> ((<span style="color:#19177c">tag</span> (<span style="color:#00f">nth</span> <span style="color:#666">0</span> <span style="color:#19177c">row</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">folder</span> (<span style="color:#00f">nth</span> <span style="color:#666">1</span> <span style="color:#19177c">row</span>)))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">unless</span> (<span style="color:#19177c">string-empty-p</span> <span style="color:#19177c">make_tag</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">add-to-list</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">'rules</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">"notmuch tag +%s \"path:%s/%s/cur/** AND NOT tag:%s\""</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">tag</span> <span style="color:#19177c">root</span> <span style="color:#19177c">folder</span> <span style="color:#19177c">tag</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#800">t</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">unless</span> (<span style="color:#19177c">string-empty-p</span> <span style="color:#19177c">remove</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">add-to-list</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">'rules</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">"notmuch tag -%s \"NOT path:%s/%s/cur/** AND tag:%s AND tag:%s\""</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">tag</span> <span style="color:#19177c">root</span> <span style="color:#19177c">folder</span> <span style="color:#19177c">tag</span> <span style="color:#19177c">root_tag</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#800">t</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">unless</span> (<span style="color:#19177c">string-empty-p</span> <span style="color:#19177c">move</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">add-to-list</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">'rules</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">concat</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">"notmuch search --output=files \"NOT path:%s/%s/cur/** AND tag:%s AND tag:%s\""</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">root</span> <span style="color:#19177c">folder</span> <span style="color:#19177c">tag</span> <span style="color:#19177c">root_tag</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">" | xargs -I ! mv ! %s/%s/%s/cur/"</span> <span style="color:#19177c">my/maildir-root</span> <span style="color:#19177c">root</span> <span style="color:#19177c">folder</span>))
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#800">t</span>))))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">unless</span> (<span style="color:#19177c">string-empty-p</span> <span style="color:#19177c">archive_root</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">add-to-list</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">'rules</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">concat</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">"notmuch search --output=files \"NOT path:%s/%s/cur/** AND %s AND tag:%s\""</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">root</span> <span style="color:#19177c">archive_root</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mapconcat</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">lambda</span> (<span style="color:#19177c">row</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">"NOT tag:%s"</span> (<span style="color:#00f">car</span> <span style="color:#19177c">row</span>)))
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">tags</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">" AND "</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">root_tag</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">" | xargs -I ! mv ! %s/%s/%s/cur/"</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">"\n"</span>))
|
||||
</span></span></code></pre></div><h4 id="pre-new"><code>pre_new</code></h4>
|
||||
<p>This hook runs fetch from Gmail & 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’t necessary to run <code>cd</code> for offlineimap, but it’s easier to write that way.</p>
|
||||
<p><a id="code-snippet--pre-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">"pvkorytov_etu"</span> <span style="color:#ba2121">"pvkorytov"</span> <span style="color:#800">nil</span> <span style="color:#800">nil</span> <span style="color:#800">t</span> <span style="color:#ba2121">"Archive"</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-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># GMI="/home/pavel/Programs/miniconda3/envs/mail/bin/gmi"</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">GMI</span><span style="color:#666">=</span><span style="color:#ba2121">"gmi"</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">"Running pre-new filters"</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#ba2121"><<mail-tags(move="t",archive_root="Archive")>>
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">echo "Pre-new filters done"
|
||||
</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 "(cd /home/pavel/Mail/{1}/ && {2} {3})" ::: thexcloud progin6304 pvkorytov_etu ::: "$GMI" "$GMI" "offlineima</span>p<span style="color:#ba2121">" ::: sync sync ""
|
||||
</span></span></span></code></pre></div><h4 id="post-new"><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">"pvkorytov_etu"</span> <span style="color:#ba2121">"pvkorytov"</span> <span style="color:#800">t</span> <span style="color:#800">t</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-bash" data-lang="bash"><span style="display:flex;"><span>notmuch tag +main <span style="color:#ba2121">"path:thexcloud/** AND tag:new"</span>
|
||||
</span></span><span style="display:flex;"><span>notmuch tag +progin <span style="color:#ba2121">"path:progin6304/** AND tag:new"</span>
|
||||
</span></span><span style="display:flex;"><span>notmuch tag +pvkorytov <span style="color:#ba2121">"path:pvkorytov_etu/** AND tag:new"</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">"Running post-new filters"</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#ba2121"><<mail-tags(ma</span>ke_tag<span style="color:#666">=</span><span style="color:#ba2121">"t"</span>,remove<span style="color:#666">=</span><span style="color:#ba2121">"t"</span><span style="color:#666">)</span>>>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">"Post-new filters done"</span>
|
||||
</span></span><span style="display:flex;"><span>notmuch tag -new <span style="color:#ba2121">"tag:new"</span>
|
||||
</span></span></code></pre></div><h2 id="sync-script">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">"/home/pavel/Mail/.last_check"</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">QUERY</span><span style="color:#666">=</span><span style="color:#ba2121">"tag:unread"</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">ALL_QUERY</span><span style="color:#666">=</span><span style="color:#ba2121">"tag:unread"</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -f <span style="color:#ba2121">"</span><span style="color:#19177c">$CHECK_FILE</span><span style="color:#ba2121">"</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">DATE</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>cat <span style="color:#ba2121">"</span><span style="color:#19177c">$CHECK_FILE</span><span style="color:#ba2121">"</span><span style="color:#008000;font-weight:bold">)</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">QUERY</span><span style="color:#666">=</span><span style="color:#ba2121">"</span><span style="color:#19177c">$QUERY</span><span style="color:#ba2121"> and date:@</span><span style="color:#19177c">$DATE</span><span style="color:#ba2121">.."</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></span><span style="display:flex;"><span>notmuch new
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">NEW_UNREAD</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>notmuch count <span style="color:#ba2121">"</span><span style="color:#19177c">$QUERY</span><span style="color:#ba2121">"</span><span style="color:#008000;font-weight:bold">)</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#19177c">ALL_UNREAD</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>notmuch count <span style="color:#ba2121">"</span><span style="color:#19177c">$ALL_QUERY</span><span style="color:#ba2121">"</span><span style="color:#008000;font-weight:bold">)</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> <span style="color:#19177c">$NEW_UNREAD</span> -gt <span style="color:#666">0</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">MAIN_UNREAD</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>notmuch count <span style="color:#ba2121">"tag:unread AND tag:main"</span><span style="color:#008000;font-weight:bold">)</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">PROGIN_UNREAD</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>notmuch count <span style="color:#ba2121">"tag:unread AND tag:progin"</span><span style="color:#008000;font-weight:bold">)</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">ETU_UNREAD</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>notmuch count <span style="color:#ba2121">"tag:unread AND tag:pvkorytov"</span><span style="color:#008000;font-weight:bold">)</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">read</span> -r -d <span style="color:#ba2121">''</span> NOTIFICATION <span style="color:#ba2121"><<EOM
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">$NEW_UNREAD new messages
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">$MAIN_UNREAD thexcloud@gmail.com
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">$PROGIN_UNREAD progin6304@gmail.com
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">$ETU_UNREAD pvkorytov@etu.ru
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">$ALL_UNREAD total
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">EOM</span>
|
||||
</span></span><span style="display:flex;"><span> notify-send <span style="color:#ba2121">"New Mail"</span> <span style="color:#ba2121">"</span><span style="color:#19177c">$NOTIFICATION</span><span style="color:#ba2121">"</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></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">"</span><span style="color:#008000;font-weight:bold">$(</span>date +%s<span style="color:#008000;font-weight:bold">)</span><span style="color:#ba2121">"</span> > <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">"*/5 * * * * "</span> <span style="color:#ba2121">"~/bin/scripts/check-email"</span>)
|
||||
</span></span></code></pre></div><h2 id="msmtp">MSMTP</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Guix dependency</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>msmtp</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Sending emails can be done with MSMTP. It automatially chooses the email address and server based on the contents of the message, which is handy if there are multiple mailboxes to be managed.</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>defaults
|
||||
</span></span><span style="display:flex;"><span>auth on
|
||||
</span></span><span style="display:flex;"><span>tls on
|
||||
</span></span><span style="display:flex;"><span>tls_trust_file <span style="color:#b68">/etc/</span>ssl<span style="color:#b68">/certs/</span>ca-certificates.crt
|
||||
</span></span><span style="display:flex;"><span>logfile ~/.msmtp.log
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>account main
|
||||
</span></span><span style="display:flex;"><span>host smtp.gmail.com
|
||||
</span></span><span style="display:flex;"><span>port <span style="color:#666">587</span>
|
||||
</span></span><span style="display:flex;"><span>from thexcloud@gmail.com
|
||||
</span></span><span style="display:flex;"><span>user thexcloud@gmail.com
|
||||
</span></span><span style="display:flex;"><span>passwordeval <span style="color:#ba2121">"pass show My_Online/APIs/google-main-app-password | head -n 1"</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>account progin
|
||||
</span></span><span style="display:flex;"><span>host smtp.gmail.com
|
||||
</span></span><span style="display:flex;"><span>port <span style="color:#666">587</span>
|
||||
</span></span><span style="display:flex;"><span>from progin6304@gmail.com
|
||||
</span></span><span style="display:flex;"><span>user progin6304@gmail.com
|
||||
</span></span><span style="display:flex;"><span>passwordeval <span style="color:#ba2121">"pass show My_Online/ETU/progin6304@gmail.com | head -n 1"</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>account pvkorytov
|
||||
</span></span><span style="display:flex;"><span>tls off
|
||||
</span></span><span style="display:flex;"><span>auth plain
|
||||
</span></span><span style="display:flex;"><span>host localhost
|
||||
</span></span><span style="display:flex;"><span>port <span style="color:#666">1025</span>
|
||||
</span></span><span style="display:flex;"><span>from pvkorytov@etu.ru
|
||||
</span></span><span style="display:flex;"><span>user pvkorytov
|
||||
</span></span><span style="display:flex;"><span>passwordeval <span style="color:#ba2121">"pass show Job/Digital/Email/pvkorytov@etu.ru | head -n 1"</span>
|
||||
</span></span></code></pre></div><h2 id="emacs">Emacs</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Guix dependency</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>emacs-notmuch</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Finally, Emacs configuration. Let’s start with some variables:</p>
|
||||
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">user-mail-address</span> <span style="color:#ba2121">"thexcloud@gmail.com"</span>)
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#00f">user-full-name</span> <span style="color:#ba2121">"Pavel Korytov"</span>)
|
||||
</span></span></code></pre></div><p>Then, the problem with my Guix setup is that Emacs by default doesn’t see the elisp files of notmuch, so here is a small workaround:</p>
|
||||
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">let</span> ((<span style="color:#19177c">default-directory</span> <span style="color:#ba2121">"/home/pavel/.guix-extra-profiles/mail/mail/share/emacs/site-lisp"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">normal-top-level-add-subdirs-to-load-path</span>))
|
||||
</span></span></code></pre></div><p>Some functions to toggle tags:</p>
|
||||
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/notmuch-toggle-trash</span> ()
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">interactive</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">evil-collection-notmuch-toggle-tag</span> <span style="color:#ba2121">"trash"</span> <span style="color:#ba2121">"search"</span> <span style="color:#00f">#'</span><span style="color:#19177c">ignore</span>))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/notmuch-toggle-inbox</span> ()
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">interactive</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">evil-collection-notmuch-toggle-tag</span> <span style="color:#ba2121">"inbox"</span> <span style="color:#ba2121">"search"</span> <span style="color:#00f">#'</span><span style="color:#19177c">ignore</span>))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/notmuch-toggle-unread</span> ()
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">interactive</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">evil-collection-notmuch-toggle-tag</span> <span style="color:#ba2121">"unread"</span> <span style="color:#ba2121">"search"</span> <span style="color:#00f">#'</span><span style="color:#19177c">ignore</span>))
|
||||
</span></span></code></pre></div><p>And notmuch settings:</p>
|
||||
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">use-package</span> <span style="color:#19177c">notmuch</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; :ensure nil</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">:commands</span> (<span style="color:#19177c">notmuch</span> <span style="color:#19177c">notmuch-search</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">:init</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">my/use-colors</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">notmuch-wash-cited-text</span> <span style="color:#008000">:foreground</span> (<span style="color:#19177c">doom-color</span> <span style="color:#19177c">'yellow</span>)))
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">:config</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">mail-specify-envelope-from</span> <span style="color:#800">t</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">message-sendmail-envelope-from</span> <span style="color:#19177c">'header</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">mail-envelope-from</span> <span style="color:#19177c">'header</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">notmuch-always-prompt-for-sender</span> <span style="color:#800">t</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">message-send-mail-function</span> <span style="color:#00f">#'</span><span style="color:#19177c">message-send-mail-with-sendmail</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">sendmail-program</span> (<span style="color:#19177c">executable-find</span> <span style="color:#ba2121">"msmtp"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">send-mail-function</span> <span style="color:#00f">#'</span><span style="color:#19177c">sendmail-send-it</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">mml-secure-openpgp-sign-with-sender</span> <span style="color:#800">t</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">notmuch-mua-user-agent-function</span> <span style="color:#19177c">'notmuch-mua-user-agent-full</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">general-define-key</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">:keymaps</span> <span style="color:#19177c">'notmuch-search-mode-map</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">:states</span> <span style="color:#666">'</span>(<span style="color:#19177c">normal</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"d"</span> <span style="color:#00f">#'</span><span style="color:#19177c">my/notmuch-toggle-trash</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"i"</span> <span style="color:#00f">#'</span><span style="color:#19177c">my/notmuch-toggle-inbox</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"u"</span> <span style="color:#00f">#'</span><span style="color:#19177c">my/notmuch-toggle-unread</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; Use org-contacts for completion</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">require</span> <span style="color:#19177c">'org-contacts</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">notmuch-address-command</span> <span style="color:#19177c">'as-is</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">add-hook</span> <span style="color:#19177c">'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 is read in <code>init.el</code>.</p>
|
||||
<h3 id="keybindings">Keybindings</h3>
|
||||
<p>I used to have a more complicated keybinding system here, but that seemed to go against the Dao.</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>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"am"</span> (<span style="color:#19177c">my/command-in-persp</span> <span style="color:#ba2121">"notmuch"</span> <span style="color:#ba2121">"mail"</span> <span style="color:#666">0</span> (<span style="color:#19177c">notmuch</span>)))
|
||||
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#19177c">my/persp-add-rule</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">notmuch-hello-mode</span> <span style="color:#666">0</span> <span style="color:#ba2121">"mail"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">notmuch-search-mode</span> <span style="color:#666">0</span> <span style="color:#ba2121">"mail"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">notmuch-tree-mode</span> <span style="color:#666">0</span> <span style="color:#ba2121">"mail"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">notmuch-message-mode</span> <span style="color:#666">0</span> <span style="color:#ba2121">"mail"</span>)
|
||||
</span></span></code></pre></div><p><a id="table--root-tags"></a></p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Root tag</th>
|
||||
<th>Prefix</th>
|
||||
<th>Keybinding description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>main</td>
|
||||
<td>m</td>
|
||||
<td><a href="mailto:thexcloud@gmail.com">thexcloud@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>progin</td>
|
||||
<td>p</td>
|
||||
<td><a href="mailto:progin6304@gmail.com">progin6304@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>pvkorytov</td>
|
||||
<td>v</td>
|
||||
<td><a href="mailto:pvkorytov@etu.ru">pvkorytov@etu.ru</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p><a id="table--filter-tags"></a></p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Tag</th>
|
||||
<th>Prefix</th>
|
||||
<th>Name</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>inbox</td>
|
||||
<td>i</td>
|
||||
<td>inbox</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>unread</td>
|
||||
<td>u</td>
|
||||
<td>unread</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>sent</td>
|
||||
<td>s</td>
|
||||
<td>sent</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>a</td>
|
||||
<td>all mail</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>The following formats the tables above to a proper syntax for <code>setq notmuch-saved-searches</code>:</p>
|
||||
<p><a id="code-snippet--format-notmuch-saved-searches"></a></p>
|
||||
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">let</span> ((<span style="color:#19177c">searches</span> <span style="color:#666">'</span>()))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">dolist</span> (<span style="color:#19177c">root_tag</span> <span style="color:#19177c">root_tags</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">dolist</span> (<span style="color:#19177c">tag</span> <span style="color:#19177c">filter_tags</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">add-to-list</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">'searches</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">"(:name \"%s\" :query \"%s\" :key \"%s\")"</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">format</span> <span style="color:#ba2121">"%s (%s)"</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">nth</span> <span style="color:#666">0</span> <span style="color:#19177c">root_tag</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">nth</span> <span style="color:#666">2</span> <span style="color:#19177c">tag</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">concat</span> <span style="color:#ba2121">"tag:"</span> (<span style="color:#00f">nth</span> <span style="color:#666">0</span> <span style="color:#19177c">root_tag</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">unless</span> (<span style="color:#19177c">string-empty-p</span> (<span style="color:#00f">nth</span> <span style="color:#666">0</span> <span style="color:#19177c">tag</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">concat</span> <span style="color:#ba2121">" AND tag:"</span> (<span style="color:#00f">nth</span> <span style="color:#666">0</span> <span style="color:#19177c">tag</span>))))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">concat</span> (<span style="color:#00f">nth</span> <span style="color:#666">1</span> <span style="color:#19177c">root_tag</span>) (<span style="color:#00f">nth</span> <span style="color:#666">1</span> <span style="color:#19177c">tag</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">searches</span> <span style="color:#ba2121">"\n"</span>))
|
||||
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">notmuch-saved-searches</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#666">'</span>((<span style="color:#008000">:name</span> <span style="color:#ba2121">"drafts"</span> <span style="color:#008000">:query</span> <span style="color:#ba2121">"tag:draft"</span> <span style="color:#008000">:key</span> <span style="color:#ba2121">"d"</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c"><<format-notmuch-saved-searches</span>()<span style="color:#19177c">>></span>))
|
||||
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#19177c">general-define-key</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">:states</span> <span style="color:#666">'</span>(<span style="color:#19177c">normal</span> <span style="color:#19177c">visual</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#008000">:keymaps</span> <span style="color:#666">'</span>(<span style="color:#19177c">notmuch-hello-mode-map</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"f"</span> <span style="color:#00f">#'</span><span style="color:#19177c">notmuch-jump-search</span>)
|
||||
</span></span></code></pre></div><h3 id="signing-messages">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">'notmuch</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">add-hook</span> <span style="color:#19177c">'message-setup-hook</span> <span style="color:#19177c">'mml-secure-sign-pgpmime</span>))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#008000">setq</span> <span style="color:#19177c">mml-secure-key-preferences</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#666">'</span>((<span style="color:#19177c">OpenPGP</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">sign</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#ba2121">"thexcloud@gmail.com"</span> <span style="color:#ba2121">"914472A1FD6775C166F96EBEED739ADF81C78160"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">encrypt</span>))
|
||||
</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><h3 id="tuning-signature">Tuning signature</h3>
|
||||
<p>By default, <code>message.el</code> inserts the signature at the bottom of the message, like this:</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><message text>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>Person <person@mail.org> writes:
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>> Stuff
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>--
|
||||
</span></span><span style="display:flex;"><span>Yours,
|
||||
</span></span><span style="display:flex;"><span>me
|
||||
</span></span></code></pre></div><p>This creates issues with certain email clients. For instance, MS Exchange often just cuts the text at <code>Person <person@mail.org>....</code>, so there’s no way to see the signature from the UI.</p>
|
||||
<p>What’s more, MS Exchange, Gmail and other such clients add the signature before the quotation block, like that:</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><message text>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>--
|
||||
</span></span><span style="display:flex;"><span>Yours,
|
||||
</span></span><span style="display:flex;"><span>me
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>Person <person@mail.org> writes:
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>> Stuff
|
||||
</span></span></code></pre></div><p>So here I modifiy the citation function to insert the signature like in the second example for <del>certain cases</del>.</p>
|
||||
<p>Edit <span class="timestamp-wrapper"><span class="timestamp"><2022-10-27 Thu></span></span>: for consistency’s sake, I’ll make the signature on the top for all cases.</p>
|
||||
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/message-insert-signature-need-on-top</span> ()
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#800">t</span>)
|
||||
</span></span></code></pre></div><p>Then advice the <code>notmuch-mua-reply</code> function:</p>
|
||||
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/message-maybe-fix-signature</span> (<span style="color:#008000">&rest</span> <span style="color:#19177c">_</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> (<span style="color:#19177c">my/message-insert-signature-need-on-top</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">save-excursion</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">goto-char</span> (<span style="color:#00f">point-min</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> (<span style="color:#00f">re-search-forward</span> <span style="color:#19177c">message-signature-separator</span> <span style="color:#800">nil</span> <span style="color:#800">t</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">move-beginning-of-line</span> <span style="color:#666">0</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">kill-region</span> (<span style="color:#00f">point</span>) (<span style="color:#00f">point-max</span>)))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">message-goto-body</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">when</span> (<span style="color:#00f">re-search-forward</span> (<span style="color:#008000">rx</span> <span style="color:#ba2121">"sign=pgpmime"</span>) <span style="color:#800">nil</span> <span style="color:#800">t</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">forward-line</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">insert</span> (<span style="color:#19177c">current-kill</span> <span style="color:#666">0</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">insert</span> <span style="color:#ba2121">"\n\n"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">set-buffer-modified-p</span> <span style="color:#800">nil</span>))))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#008000">with-eval-after-load</span> <span style="color:#19177c">'notmuch-mua</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">advice-add</span> <span style="color:#00f">#'</span><span style="color:#19177c">notmuch-mua-reply</span> <span style="color:#008000">:after</span> <span style="color:#00f">#'</span><span style="color:#19177c">my/message-maybe-fix-signature</span>))
|
||||
</span></span></code></pre></div><h3 id="warn-if-no-subject">Warn if no subject</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">defun</span> <span style="color:#19177c">my/message-ensure-subject</span> ()
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">unless</span> (<span style="color:#008000">or</span> (<span style="color:#19177c">message-field-value</span> <span style="color:#ba2121">"Subject"</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">y-or-n-p</span> <span style="color:#ba2121">"No subject. Send? "</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#d2413a;font-weight:bold">user-error</span> <span style="color:#ba2121">"Aborting."</span>)))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#19177c">add-hook</span> <span style="color:#19177c">'notmuch-mua-send-hook</span> <span style="color:#00f">#'</span><span style="color:#19177c">my/message-ensure-subject</span>)
|
||||
</span></span></code></pre></div><h3 id="capitalize-formal-pronous">Capitalize formal pronous</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">defvar</span> <span style="color:#19177c">my/ru-formal-pronous</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#666">'</span>(<span style="color:#ba2121">"вы"</span> <span style="color:#ba2121">"вас"</span> <span style="color:#ba2121">"вам"</span> <span style="color:#ba2121">"вами"</span> <span style="color:#ba2121">"ваш"</span> <span style="color:#ba2121">"ваша"</span> <span style="color:#ba2121">"ваше"</span> <span style="color:#ba2121">"ваши"</span> <span style="color:#ba2121">"вашего"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">"вашей"</span> <span style="color:#ba2121">"вашему"</span> <span style="color:#ba2121">"вашим"</span> <span style="color:#ba2121">"вашем"</span> <span style="color:#ba2121">"вашеми"</span>))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#008000">defvar</span> <span style="color:#19177c">my/ru-formal-pronous-regex</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">regexp-opt</span> <span style="color:#19177c">my/ru-formal-pronous</span> <span style="color:#19177c">'words</span>))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/message-ensure-capitalized-formal-pronouns</span> ()
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">interactive</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">save-excursion</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">message-goto-body</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">cl-block</span> <span style="color:#800">nil</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let</span> ((<span style="color:#19177c">case-fold-search</span> <span style="color:#800">nil</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">confirmed</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">while</span> (<span style="color:#00f">re-search-forward</span> <span style="color:#19177c">my/ru-formal-pronous-regex</span> <span style="color:#800">nil</span> <span style="color:#800">t</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">let*</span> ((<span style="color:#19177c">match</span> (<span style="color:#19177c">match-string</span> <span style="color:#666">0</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">capitalized</span> (<span style="color:#00f">capitalize</span> <span style="color:#19177c">match</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">beg</span> (<span style="color:#00f">match-beginning</span> <span style="color:#666">0</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">end</span> (<span style="color:#00f">match-end</span> <span style="color:#666">0</span>)))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">if</span> (<span style="color:#008000">or</span> <span style="color:#19177c">confirmed</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">y-or-n-p</span> (<span style="color:#00f">format</span> <span style="color:#ba2121">"Replace %s with %s? "</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c">match</span> <span style="color:#19177c">capitalized</span>)))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">progn</span>
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">delete-region</span> <span style="color:#19177c">beg</span> <span style="color:#19177c">end</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#00f">insert</span> <span style="color:#19177c">capitalized</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">setq</span> <span style="color:#19177c">confirmed</span> <span style="color:#800">t</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">cl-return</span>))))))))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#19177c">add-hook</span> <span style="color:#19177c">'notmuch-mua-send-hook</span> <span style="color:#00f">#'</span><span style="color:#19177c">my/message-ensure-capitalized-formal-pronouns</span>)
|
||||
</span></span></code></pre></div><h3 id="ensure-password-is-loaded">Ensure password is loaded</h3>
|
||||
<p>Otherwise <code>msmtp</code> may call <code>pinentry</code> while Emacs is locked, which means EXWM can’t process the password window.</p>
|
||||
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#008000">defun</span> <span style="color:#19177c">my/ensure-password</span> ()
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#008000">interactive</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#19177c">my/password-store-get</span> <span style="color:#ba2121">"Job/Digital/Email/pvkorytov@etu.ru"</span>))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>(<span style="color:#19177c">add-hook</span> <span style="color:#19177c">'notmuch-mua-send-hook</span> <span style="color:#00f">#'</span><span style="color:#19177c">my/ensure-password</span>)
|
||||
</span></span></code></pre></div><h2 id="mailcap">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>
|
||||
</span></span><span style="display:flex;"><span>image/*; feh %s
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>application/msword; /usr/bin/xdg-open %s
|
||||
</span></span><span style="display:flex;"><span>application/pdf; zathura %s
|
||||
</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>
|
||||
<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->manifest</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#666">'</span>(
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#19177c"><<packages</span>()<span style="color:#19177c">>></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="#lieer">Lieer</a></li>
|
||||
<li><a href="#davmail">DavMail</a></li>
|
||||
<li><a href="#offlineimap">OfflineIMAP</a></li>
|
||||
<li><a href="#notmuch">Notmuch</a>
|
||||
<ul>
|
||||
<li><a href="#config">Config</a></li>
|
||||
<li><a href="#hooks">Hooks</a>
|
||||
<ul>
|
||||
<li><a href="#pre-new"><code>pre_new</code></a></li>
|
||||
<li><a href="#post-new"><code>post_new</code></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#sync-script">Sync script</a></li>
|
||||
<li><a href="#msmtp">MSMTP</a></li>
|
||||
<li><a href="#emacs">Emacs</a>
|
||||
<ul>
|
||||
<li><a href="#keybindings">Keybindings</a></li>
|
||||
<li><a href="#signing-messages">Signing messages</a></li>
|
||||
<li><a href="#tuning-signature">Tuning signature</a></li>
|
||||
<li><a href="#warn-if-no-subject">Warn if no subject</a></li>
|
||||
<li><a href="#capitalize-formal-pronous">Capitalize formal pronous</a></li>
|
||||
<li><a href="#ensure-password-is-loaded">Ensure password is loaded</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#mailcap">mailcap</a></li>
|
||||
<li><a href="#guix-settings">Guix settings</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
<a id="unhide-all-button" class="hidden"><Expand></a>
|
||||
<a id="hide-all-button" class="hidden"><Collapse></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><div id="footer" class="mb-5">
|
||||
<hr>
|
||||
<div class="container text-center">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="container text-center">
|
||||
|
||||
|
||||
<a href="https://creativecommons.org/licenses/by/4.0/legalcode" title="Licensed under CC-BY 4.0"><small>Licensed under CC-BY 4.0</small></a>
|
||||
|
||||
|
|
||||
|
||||
|
||||
<a href="https://plausible.io/" title="Uses Plausible Analytics"><small>Uses Plausible Analytics</small></a>
|
||||
|
||||
|
||||
<br>
|
||||
|
||||
<a href="https://sqrtminusone.xyz/" title="Pavel Korytov, 2023"><small>Pavel Korytov, 2023</small></a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,201 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang=""><head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
|
||||
<title>My dotfiles</title>
|
||||
<meta name="description" content="Freedom is a state of mind">
|
||||
<meta name="author" content='SqrtMinusOne'>
|
||||
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;700&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" integrity="sha512-iBBXm8fW90+nuLcSKlbmrPcLa0OT92xO1BIsZ+ywDWZCvqsWgccV3gFoRBv0z+8dLJgyAHIhR35VZc2oM/gI1w==" crossorigin="anonymous">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="/sass/researcher.min.css">
|
||||
|
||||
|
||||
<link rel="icon" type="image/ico" href="https://sqrtminusone.xyz/favicon.ico">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer data-domain="sqrtminusone.xyz" src="https://plausible.sqrtminusone.xyz/js/plausible.js"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body><div class="container mt-5">
|
||||
<nav class="navbar navbar-expand-sm flex-column flex-sm-row text-nowrap p-0">
|
||||
<a class="navbar-brand mx-0 mr-sm-auto" href="https://sqrtminusone.xyz/" title="SqrtMinusOne">
|
||||
|
||||
SqrtMinusOne
|
||||
</a>
|
||||
<div class="navbar-nav flex-row flex-wrap justify-content-center">
|
||||
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/" title="Index">
|
||||
Index
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/posts/" title="Posts">
|
||||
Posts
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/configs/readme" title="Configs">
|
||||
Configs
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
<hr>
|
||||
<div id="content">
|
||||
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
|
||||
<div class="root">
|
||||
<h1 id="title-small-screen">
|
||||
My dotfiles
|
||||
<iframe src="https://ghbtns.com/github-btn.html?user=SqrtMinusOne&repo=dotfiles&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe>
|
||||
</h1>
|
||||
<div class="container" id="actual-content">
|
||||
<h1 id="title-large-screen" class="dotfiles-title">
|
||||
My dotfiles
|
||||
<iframe src="https://ghbtns.com/github-btn.html?user=SqrtMinusOne&repo=dotfiles&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe>
|
||||
</h1>
|
||||
<figure><img src="/ox-hugo/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>
|
||||
<p>I use the <a href="https://leanpub.com/lit-config/read">literate configuration</a> strategy via Emacs’ <a href="https://orgmode.org/">Org Mode</a> wherever possible. It has its pros and cons, but I find it pretty nice to keep the configs interweaved with comments in a handful of files.</p>
|
||||
<p>The files themselves are managed and deployed via <a href="https://yadm.io/">yadm</a>, although I use Org Mode for things like config templating.</p>
|
||||
<p>My current GNU/Linux distribution is <a href="https://guix.gnu.org/">GNU Guix</a>. I like Guix because, among other things, it allows <a href="https://guix.gnu.org/cookbook/en/html_node/Advanced-package-management.html#Advanced-package-management">to declare the required software</a> in configuration files, so I can have the same set of programs across multiple machines (look for tables with “Guix dependency” in the header).</p>
|
||||
<p>The central program to all of that is, of course, <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a>. At the time of this writing, it takes ~50% of my screen time and has the largest share of configuration here.</p>
|
||||
<p>Table of contents and software:</p>
|
||||
<ul>
|
||||
<li><a href="/configs/emacs/">Emacs.org</a>
|
||||
<ul>
|
||||
<li><a href="/configs/emacs/">GNU Emacs</a></li>
|
||||
</ul>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>(<em>Apparently, links on the second level work only in Emacs 🙁</em>)</p>
|
||||
<p>A few other repositories I may consider a part of my config:</p>
|
||||
<ul>
|
||||
<li><a href="https://github.com/SqrtMinusOne/channel-q">channel-q</a> is my Guix channel</li>
|
||||
<li><a href="https://github.com/SqrtMinusOne/sqrt-data">sqrt-data</a> is a home for my statistics gathering effort</li>
|
||||
<li>Emacs packages that I wrote (some of them originated in my Emacs config):
|
||||
<ul>
|
||||
<li><a href="https://github.com/SqrtMinusOne/lyrics-fetcher.el">lyrics-fetcher.el</a></li>
|
||||
<li><a href="https://github.com/SqrtMinusOne/pomm.el">pomm.el</a></li>
|
||||
<li><a href="https://github.com/SqrtMinusOne/perspective-exwm.el">perspective-exwm.el</a></li>
|
||||
<li><a href="https://github.com/SqrtMinusOne/exwm-modeline">exwm-modeline.el</a></li>
|
||||
<li><a href="https://github.com/SqrtMinusOne/org-journal-tags">org-journal-tags</a></li>
|
||||
<li><a href="https://github.com/SqrtMinusOne/elfeed-summary">elfeed-summary</a></li>
|
||||
<li><a href="https://github.com/SqrtMinusOne/password-store-ivy">password-store-ivy</a></li>
|
||||
<li><a href="https://github.com/SqrtMinusOne/elfeed-sync">elfeed-sync</a></li>
|
||||
<li><a href="https://github.com/SqrtMinusOne?tab=repositories&q=&type=&language=emacs+lisp&sort=">…</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>See also <a href="https://sqrtminusone.xyz/posts/">my blog posts</a>.</p>
|
||||
<h2 id="some-statistics">Some statistics</h2>
|
||||
<figure><img src="https://sqrtminusone.xyz/stats/all.png"/>
|
||||
</figure>
|
||||
|
||||
<figure><img src="https://sqrtminusone.xyz/stats/emacs-vim.png"/>
|
||||
</figure>
|
||||
|
||||
<figure><img src="https://sqrtminusone.xyz/stats/literate-config.png"/>
|
||||
</figure>
|
||||
|
||||
<h2 id="misc">Misc</h2>
|
||||
<h3 id="notes">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’s <code>post_alt</code> hook to create symlinks</p>
|
||||
<h3 id="encrypted-files">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><span style="display:flex;"><span>.emacs.d/gnus/*
|
||||
</span></span><span style="display:flex;"><span>./.vpn/*
|
||||
</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="#some-statistics">Some statistics</a></li>
|
||||
<li><a href="#misc">Misc</a>
|
||||
<ul>
|
||||
<li><a href="#notes">Notes</a></li>
|
||||
<li><a href="#encrypted-files">Encrypted files</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
<a id="unhide-all-button" class="hidden"><Expand></a>
|
||||
<a id="hide-all-button" class="hidden"><Collapse></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><div id="footer" class="mb-5">
|
||||
<hr>
|
||||
<div class="container text-center">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="container text-center">
|
||||
|
||||
|
||||
<a href="https://creativecommons.org/licenses/by/4.0/legalcode" title="Licensed under CC-BY 4.0"><small>Licensed under CC-BY 4.0</small></a>
|
||||
|
||||
|
|
||||
|
||||
|
||||
<a href="https://plausible.io/" title="Uses Plausible Analytics"><small>Uses Plausible Analytics</small></a>
|
||||
|
||||
|
||||
<br>
|
||||
|
||||
<a href="https://sqrtminusone.xyz/" title="Pavel Korytov, 2023"><small>Pavel Korytov, 2023</small></a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
|
||||
<title>Configs</title>
|
||||
<title>My Emacs packages</title>
|
||||
<meta name="description" content="Freedom is a state of mind">
|
||||
<meta name="author" content='SqrtMinusOne'>
|
||||
|
||||
|
|
@ -18,7 +18,6 @@
|
|||
<link rel="icon" type="image/ico" href="https://sqrtminusone.xyz/favicon.ico">
|
||||
|
||||
|
||||
<link rel="alternate" type="application/rss+xml" href="https://sqrtminusone.xyz/configs/index.xml" title="SqrtMinusOne" />
|
||||
|
||||
|
||||
|
||||
|
|
@ -55,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
@ -62,23 +68,25 @@
|
|||
</div>
|
||||
<hr>
|
||||
<div id="content">
|
||||
<div class="container">
|
||||
<h1>Configs</h1>
|
||||
<ul>
|
||||
|
||||
<li><a href="https://sqrtminusone.xyz/configs/console/">0001-01-01 | Console</a></li>
|
||||
|
||||
<li><a href="https://sqrtminusone.xyz/configs/desktop/">0001-01-01 | Desktop</a></li>
|
||||
|
||||
<li><a href="https://sqrtminusone.xyz/configs/emacs/">0001-01-01 | Emacs config</a></li>
|
||||
|
||||
<li><a href="https://sqrtminusone.xyz/configs/guix/">0001-01-01 | Guix</a></li>
|
||||
|
||||
<li><a href="https://sqrtminusone.xyz/configs/mail/">0001-01-01 | Mail</a></li>
|
||||
|
||||
<li><a href="https://sqrtminusone.xyz/configs/readme/">0001-01-01 | My dotfiles</a></li>
|
||||
|
||||
</ul>
|
||||
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
|
||||
|
||||
<div class="root">
|
||||
<h1 id="title-small-screen">My Emacs packages</h1>
|
||||
<div class="container" id="actual-content">
|
||||
<h1 id="title-large-screen">My Emacs packages</h1>
|
||||
<ul>
|
||||
<li><a href="/packages/lyrics-fetcher">Lyrics Fetcher</a></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"></nav>
|
||||
</div>
|
||||
<a id="unhide-all-button" class="hidden"><Expand></a>
|
||||
<a id="hide-all-button" class="hidden"><Collapse></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><div id="footer" class="mb-5">
|
||||
|
|
@ -56,6 +56,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,48 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="works_on_my_machine" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
x="0px" y="0px" viewBox="0 0 240.4 35" style="enable-background:new 0 0 240.4 35;" xml:space="preserve" width="147.1" height="21.3">
|
||||
<style type="text/css">
|
||||
.st0{fill:#C1282D;}
|
||||
.st1{fill:#EF4041;}
|
||||
.st2{fill:#FFFFFF;}
|
||||
</style>
|
||||
<path class="st0" d="M112.5,0h127.8v35H112.5V0z"/>
|
||||
<path class="st1" d="M0,0h112.5v35H0V0z"/>
|
||||
<g>
|
||||
<path class="st2" d="M22.7,19.7L22.7,19.7l1.3-6.2h1.5l-2,8.5h-1.3L20.4,16h0L18.7,22h-1.3l-2-8.5h1.5l1.3,6.1h0l1.6-6.1h1.3
|
||||
L22.7,19.7z"/>
|
||||
<path class="st2" d="M35.9,18.6c0,1-0.3,1.9-1,2.6s-1.5,1-2.6,1c-1,0-1.8-0.3-2.5-1s-1-1.5-1-2.6V17c0-1,0.3-1.9,1-2.6s1.5-1,2.5-1
|
||||
c1,0,1.9,0.3,2.5,1s1,1.6,1,2.6V18.6z M34.5,17c0-0.7-0.2-1.3-0.6-1.8s-0.9-0.7-1.5-0.7c-0.6,0-1.1,0.2-1.5,0.7s-0.5,1-0.5,1.8v1.5
|
||||
c0,0.7,0.2,1.3,0.5,1.8s0.9,0.7,1.5,0.7c0.7,0,1.2-0.2,1.5-0.7s0.6-1,0.6-1.8V17z"/>
|
||||
<path class="st2" d="M41.5,18.5V22H40v-8.5H43c0.9,0,1.7,0.2,2.2,0.6s0.8,1,0.8,1.8c0,0.4-0.1,0.8-0.3,1.1s-0.6,0.6-1,0.8
|
||||
c0.5,0.2,0.8,0.4,1,0.7s0.3,0.8,0.3,1.3v0.7c0,0.3,0,0.5,0.1,0.7s0.2,0.4,0.3,0.5V22h-1.5c-0.2-0.1-0.3-0.3-0.3-0.6
|
||||
s-0.1-0.5-0.1-0.8v-0.7c0-0.4-0.1-0.8-0.4-1s-0.6-0.4-1-0.4H41.5z M41.5,17.4h1.4c0.6,0,1-0.1,1.2-0.3s0.4-0.6,0.4-1
|
||||
c0-0.4-0.1-0.8-0.4-1s-0.7-0.4-1.2-0.4h-1.5V17.4z"/>
|
||||
<path class="st2" d="M52.4,18.4h-0.7V22h-1.4v-8.5h1.4v3.6h0.6l2.8-3.6h1.7l0,0l-3.2,4L57,22h-1.8L52.4,18.4z"/>
|
||||
<path class="st2" d="M65.1,19.9c0-0.4-0.1-0.6-0.4-0.9s-0.7-0.4-1.3-0.6c-0.9-0.3-1.6-0.6-2.1-1s-0.7-1-0.7-1.6
|
||||
c0-0.7,0.3-1.3,0.8-1.7s1.3-0.7,2.1-0.7c0.9,0,1.7,0.2,2.2,0.7s0.8,1.1,0.8,1.8l0,0h-1.4c0-0.4-0.1-0.8-0.4-1.1s-0.7-0.4-1.2-0.4
|
||||
c-0.5,0-0.9,0.1-1.1,0.3s-0.4,0.5-0.4,0.9c0,0.3,0.1,0.6,0.4,0.8s0.8,0.4,1.4,0.6c0.9,0.3,1.6,0.6,2,1s0.7,1,0.7,1.7
|
||||
c0,0.7-0.3,1.3-0.8,1.7s-1.3,0.6-2.2,0.6c-0.9,0-1.6-0.2-2.3-0.7s-1-1.1-0.9-2l0,0h1.4c0,0.5,0.2,0.9,0.5,1.2S63,21,63.5,21
|
||||
c0.5,0,0.9-0.1,1.2-0.3S65.1,20.2,65.1,19.9z"/>
|
||||
<path class="st2" d="M82.9,18.6c0,1-0.3,1.9-1,2.6s-1.5,1-2.6,1c-1,0-1.8-0.3-2.5-1s-1-1.5-1-2.6V17c0-1,0.3-1.9,1-2.6s1.5-1,2.5-1
|
||||
c1,0,1.9,0.3,2.5,1s1,1.6,1,2.6V18.6z M81.5,17c0-0.7-0.2-1.3-0.6-1.8s-0.9-0.7-1.5-0.7c-0.6,0-1.1,0.2-1.5,0.7s-0.5,1-0.5,1.8v1.5
|
||||
c0,0.7,0.2,1.3,0.5,1.8s0.9,0.7,1.5,0.7c0.7,0,1.2-0.2,1.5-0.7s0.6-1,0.6-1.8V17z"/>
|
||||
<path class="st2" d="M93.8,22h-1.4l-3.8-6.1l0,0V22h-1.4v-8.5h1.4l3.8,6.1l0,0v-6.1h1.4V22z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st2" d="M129.5,21.8l0-4.5l-2.2,3.6h-1.1l-2.1-3.5v4.3h-2.2v-8.4h2l3,4.8l2.9-4.8h2l0,8.4H129.5z"/>
|
||||
<path class="st2" d="M140.5,18.8v3h-2.4v-3l-3.2-5.4h2.5l2,3.3l2-3.3h2.3L140.5,18.8z"/>
|
||||
<path class="st2" d="M160.6,21.8l0-4.5l-2.2,3.6h-1.1l-2.1-3.5v4.3H153v-8.4h2l3,4.8l2.9-4.8h2l0,8.4H160.6z"/>
|
||||
<path class="st2" d="M172.8,20.2h-3.6l-0.7,1.6h-2.4l3.7-8.4h2.3l3.7,8.4h-2.5L172.8,20.2z M172.1,18.4l-1.1-2.7l-1.1,2.7H172.1z"
|
||||
/>
|
||||
<path class="st2" d="M180.9,21.4c-0.7-0.4-1.3-0.9-1.7-1.6s-0.6-1.4-0.6-2.3s0.2-1.6,0.6-2.3s1-1.2,1.7-1.6
|
||||
c0.7-0.4,1.5-0.6,2.4-0.6c0.8,0,1.5,0.1,2.1,0.4c0.6,0.3,1.1,0.7,1.5,1.2l-1.5,1.4c-0.5-0.7-1.2-1-2-1c-0.5,0-0.9,0.1-1.2,0.3
|
||||
c-0.4,0.2-0.6,0.5-0.8,0.8c-0.2,0.4-0.3,0.8-0.3,1.3c0,0.5,0.1,0.9,0.3,1.3c0.2,0.4,0.5,0.6,0.8,0.8c0.4,0.2,0.8,0.3,1.2,0.3
|
||||
c0.8,0,1.4-0.3,2-1l1.5,1.4c-0.4,0.5-0.9,0.9-1.5,1.2c-0.6,0.3-1.3,0.4-2.1,0.4C182.4,22,181.6,21.8,180.9,21.4z"/>
|
||||
<path class="st2" d="M198.6,13.4v8.4h-2.4v-3.3H193v3.3h-2.4v-8.4h2.4v3.2h3.2v-3.2H198.6z"/>
|
||||
<path class="st2" d="M202.9,13.4h2.4v8.4h-2.4V13.4z"/>
|
||||
<path class="st2" d="M217.6,13.4v8.4h-2l-3.7-4.5v4.5h-2.3v-8.4h2l3.7,4.5v-4.5H217.6z"/>
|
||||
<path class="st2" d="M228.7,19.9v1.8h-6.7v-8.4h6.6v1.8h-4.2v1.4h3.7v1.8h-3.7v1.5H228.7z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.7 KiB |
|
|
@ -54,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -55,6 +55,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
2
sass/researcher.min.css
vendored
|
|
@ -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}.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:monospace!important}#content code span{font-family:monospace}#content pre code{all:unset;font-size:95%}#content .highlight{margin:1rem auto;border:1px solid #ccc}#content .highlight>pre{padding:8px;margin-bottom:0}#content .abstract{margin-top:12px;margin-bottom:12px;padding-left:72px;padding-right:72px}#content .abstract p:first-of-type::before{content:"Abstract: ";font-weight:700}
|
||||
#content 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 a>img{margin:1rem 4px 1rem 0!important}#content .avatar>img{border-radius:50%;float:right;margin:-8px 0 0 16px;height:90px;width:90px}#content 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:monospace!important}#content code span{font-family:monospace}#content pre code{all:unset;font-size:95%}#content .highlight{margin:1rem auto;border:1px solid #ccc}#content .highlight>pre{padding:8px;margin-bottom:0}#content .abstract{margin-top:12px;margin-bottom:12px;padding-left:72px;padding-right:72px}#content .abstract p:first-of-type::before{content:"Abstract: ";font-weight:700}
|
||||
14
sitemap.xml
|
|
@ -76,18 +76,6 @@
|
|||
</url><url>
|
||||
<loc>https://sqrtminusone.xyz/categories/</loc>
|
||||
</url><url>
|
||||
<loc>https://sqrtminusone.xyz/configs/</loc>
|
||||
</url><url>
|
||||
<loc>https://sqrtminusone.xyz/configs/console/</loc>
|
||||
</url><url>
|
||||
<loc>https://sqrtminusone.xyz/configs/desktop/</loc>
|
||||
</url><url>
|
||||
<loc>https://sqrtminusone.xyz/configs/emacs/</loc>
|
||||
</url><url>
|
||||
<loc>https://sqrtminusone.xyz/configs/guix/</loc>
|
||||
</url><url>
|
||||
<loc>https://sqrtminusone.xyz/configs/mail/</loc>
|
||||
</url><url>
|
||||
<loc>https://sqrtminusone.xyz/configs/readme/</loc>
|
||||
<loc>https://sqrtminusone.xyz/emacs-packages/</loc>
|
||||
</url>
|
||||
</urlset>
|
||||
|
|
|
|||
BIN
stats/all.png
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
|
|
@ -55,6 +55,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -55,6 +55,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -55,6 +55,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -55,6 +55,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -55,6 +55,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -55,6 +55,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -55,6 +55,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -55,6 +55,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -55,6 +55,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -55,6 +55,13 @@
|
|||
Configs
|
||||
</a>
|
||||
|
||||
<span class="nav-item navbar-text mx-1">/</span>
|
||||
|
||||
|
||||
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
|
||||
Emacs packages
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
|||