main
   1<!DOCTYPE html>
   2<html lang="en">
   3<head>
   4<!-- Sep 03, 2024 -->
   5<meta charset="utf-8" />
   6<meta name="viewport" content="width=device-width, initial-scale=1" />
   7<title>My Emacs System</title>
   8<meta name="author" content="Vincent Demeester" />
   9<meta name="keywords" content="post" />
  10<meta name="generator" content="Org Mode" />
  11<link rel="stylesheet" type="text/css" href="/css/2022.css" />
  12<link rel="stylesheet" type="text/css" href="/css/syntax.css" />
  13<link rel='icon' type='image/x-icon' href='/images/favicon.ico'/>
  14<meta name='viewport' content='width=device-width, initial-scale=1'>
  15</head>
  16<body>
  17<main id="content" class="content">
  18<header>
  19<h1 class="title">My Emacs System</h1>
  20<p class="subtitle" role="doc-subtitle">A attempt to document my emacs setup 🙃</p>
  21</header><p>
  22Emacs is the best editor possible, at least for me, especially with the killer <a href="org_mode.html">org-mode</a>
  23module.
  24</p>
  25
  26<p>
  27I do all in a lot in Emacs:
  28</p>
  29<ul class="org-ul">
  30<li>task and calendar management using <a href="org_mode.html">org-mode</a>.</li>
  31<li>mail using <a href="gnus.html">gnus</a>.</li>
  32<li>programming in different languages (<a href="elisp.html">elisp</a>, <a href="go.html">go</a>, <a href="bash.html">bash</a>, …)</li>
  33<li>interactive shell using either <a href="eshell.html">eshell</a> or <a href="vterm.html">vterm</a>.</li>
  34</ul>
  35
  36<p>
  37This is my attempt to document my Emacs setup, inspired by <a href="https://writequit.org/eos/eos.html">The Emacs Operating System
  38(EOS)</a> or <a href="http://doc.rix.si/cce/cce.html">Complete Computing Environment</a> and other litterate configurations, see
  39<a href="#Inspirations">Inspirations</a>. In a gist, this is the litterate version of the <a href="config_configurations.html">configurations</a> available in
  40my <a href="https://git.sr.ht/~vdemeester/home">monorepo</a>.
  41</p>
  42
  43<nav id="table-of-contents" role="doc-toc">
  44<h2>Table of Contents</h2>
  45<div id="text-table-of-contents" role="doc-toc">
  46<ul>
  47<li><a href="#What%20is%20this">What is this</a></li>
  48<li><a href="#Why%20using%20GNU%2FEmacs%20%3F">Why using GNU/Emacs ?</a></li>
  49<li><a href="#Assumptions">Assumptions</a></li>
  50<li><a href="#Keybinding">Keybinding</a></li>
  51<li><a href="#COPYING">COPYING</a></li>
  52<li><a href="#Base%20settings">Base settings</a></li>
  53<li><a href="#Configurations">Configurations</a></li>
  54<li><a href="#Nix%28eries%29">Nix(eries)</a></li>
  55<li><a href="#Inspirations">Inspirations</a></li>
  56<li><a href="#Links">Links</a></li>
  57</ul>
  58</div>
  59</nav>
  60<section id="outline-container-What%20is%20this" class="outline-2">
  61<h2 id="What%20is%20this">What is this</h2>
  62<div class="outline-text-2" id="text-What%20is%20this">
  63<p>
  64The present document, referred to in the source code version as <code>emacs.org</code>, contains the
  65bulk of my configurations for GNU Emacs. It is designed using principles of &ldquo;literate
  66programming&rdquo;: a combination of ordinary language and inline code blocks. Emacs knows how
  67to parse this file properly so as to evaluate only the elisp (&ldquo;Emacs Lisp&rdquo;) included
  68herein. The rest is for humans to make sense of my additions and their underlying
  69rationale.
  70</p>
  71
  72<blockquote>
  73<p>
  74Literate programming allows us to be more expressive and deliberate. Not only we can use
  75typography to its maximum potential, but can also employ techniques such as internal links
  76between sections. This makes the end product much better for end users, than a terse
  77script.
  78</p>
  79</blockquote>
  80
  81<p>
  82I switched back and forth on using <code>org-mode</code> and literate programming, so why re-using
  83it. First, I think I went for it the wrong way the first time. I copied part of the
  84configuration from elsewhere, sometimes without really needing what I was copying. for
  85some reason I think this is a common pattern when configuring Emacs. You start by using a
  86distribution (Doom Emacs, Spacemacs, …) or by copying configuration from all over the
  87place. Slowly but surely you realize this was a mistake as you didn&rsquo;t learn anything, so
  88you <b>reboot</b> your configuration.
  89</p>
  90</div>
  91</section>
  92<section id="outline-container-Why%20using%20GNU%2FEmacs%20%3F" class="outline-2">
  93<h2 id="Why%20using%20GNU%2FEmacs%20%3F">Why using GNU/Emacs ?</h2>
  94<div class="outline-text-2" id="text-Why%20using%20GNU%2FEmacs%20%3F">
  95<p>
  96This is a question I thought I needed to answer, or at least, document why I am choosing
  97GNU/Emacs as my primary editor. <a href="https://protesilaos.com/">Protesilaos Stavrou</a> has a <a href="https://protesilaos.com/codelog/2019-12-20-vlog-switch-emacs/">video</a> about it, really
  98interesting.
  99</p>
 100
 101<p>
 102There is a lot of reasons but for me, the following are the main ones:
 103</p>
 104<ul class="org-ul">
 105<li><b>Open Source</b>: this is a &ldquo;of course&rdquo;, but my editor <span class="underline">has to be</span> open-sourced. This seems
 106to be the norm these days anyway (and for a long time, with <code>vim</code>).</li>
 107<li><b>Lightweight</b>: the editor should be relatively lightweight. I don&rsquo;t want a full browser
 108loaded to edit files, and I want to be able to run it in a terminal, on a server. <code>vim</code>
 109can do that (and sometimes, <code>vim</code> or <code>vi</code> is enough 👼).</li>
 110<li><b>Extensible</b>: to be honest, this is the most important reason. I want to be able to
 111extend my editor as much as possible.</li>
 112</ul>
 113
 114<p>
 115GNU/Emacs checks all the boxes for me. Even though GNU/Emacs is probably not as
 116lightweight as <code>vim</code>, it is definitely lightweight compared to all the Electron-based
 117editors (vscode, …). It is of course open-source, and since ages (almost as old as I am
 118😅). And best of all, GNU/Emacs is extensible as you couldn&rsquo;t dream of. Emacs is a lisp
 119interpreter, and it is designed to be extended in order to meet the user&rsquo;s
 120needs. <i>Extensibility</i> is the quintessential Emacs quality. You can modify any piece of
 121elisp <i>in real time</i>.
 122</p>
 123
 124<p>
 125I&rsquo;m also a huge fan of <i>text-based</i> software, a.k.a. do whatever you can using text :
 126reading mails, news, organizing notes and todos, all can be done in text. And GNU/Emacs
 127shines at this. For emails and news, you&rsquo;ve got Gnus built-in, for notes and todos, the
 128wonderful <code>org-mode</code> is the best thing on earth (seriously, this is the <b>one</b> mode that
 129made me switch from <code>vim</code>).
 130</p>
 131</div>
 132</section>
 133<section id="outline-container-Assumptions" class="outline-2">
 134<h2 id="Assumptions">Assumptions</h2>
 135<div class="outline-text-2" id="text-Assumptions">
 136<p>
 137I&rsquo;ll make a few assumption in the following document (that may or may not be true):
 138</p>
 139
 140<ul class="org-ul">
 141<li><a href="https://nixos.org/nix/"><code>nix</code></a> is available, either from <a href="https://nixos.org">NixOS</a> or via an install of nix. I&rsquo;ll try my best to
 142support non-nix environment, but it&rsquo;s definitely not my current focus.
 143<ul class="org-ul">
 144<li>As I am making the assumption that <code>nix</code> is available, I am also making the assumption
 145that all the library required are already present (in my <a href="https://github.com/vdemeester/home"><code>home</code></a>, there is a file
 146called <a href="https://github.com/vdemeester/home/blob/master/modules/profiles/emacs.nix"><code>emacs.nix</code></a> that encapsulate those dependencies). This is why, by default
 147<b>use-package</b> doesn&rsquo;t use the <code>ensure</code> option in 99% of the configuration.</li>
 148</ul></li>
 149<li>Any function I wrote is going to be prefixed by <code>vde/</code> so that it doesn&rsquo;t conflicts with
 150function that would have been defined elsewhere.</li>
 151<li>Any function imported from another configuration, without any change, should be kept as
 152is and/or prefixed by an unique id. I&rsquo;ll try to make sure to link to the configuration
 153too.</li>
 154</ul>
 155</div>
 156</section>
 157<section id="outline-container-Keybinding" class="outline-2">
 158<h2 id="Keybinding">Keybinding</h2>
 159<div class="outline-text-2" id="text-Keybinding">
 160<p>
 161As it is detailed in each part of this configuration, I am trying to setup keybinding in a
 162<i>mnemonics</i> way so it&rsquo;s easy to remember (and use). This is what <a href="https://www.spacemacs.org/">spacemacs</a> does with evil
 163keybindings (aka vim-like keybindings). I am staying with the <i>standard</i> emacs keybinding
 164as much as possible (as there is already some mnemonics in there).
 165</p>
 166
 167<p>
 168There are countless jokes and comics on Emacs’s seemingly ridiculous keybindings. Good
 169laughs indeed, but at the end of day, it’s not incomprehensible. It has well-defined
 170conventions listed at <a href="https://www.gnu.org/software/emacs/manual/html%5Fnode/elisp/Key-Binding-Conventions.html">Emacs Key Bindings Convention</a>. In summary, the general rules are:
 171</p>
 172
 173<ul class="org-ul">
 174<li><code>C-x</code> reserved for Emacs native essential keybindings: buffer, window, frame, file, directory, etc…</li>
 175<li><code>C-c</code> reserved for user and major mode:
 176<ul class="org-ul">
 177<li><code>C-c letter</code> reserved for user. <code>&lt;F5&gt;</code>-<code>&lt;F9&gt;</code> reserved for user.</li>
 178<li><code>C-c C-letter</code> reserved for major mode.</li>
 179</ul></li>
 180<li>Don’t rebind <code>C-g</code>, <code>C-h</code> and <code>ESC</code>.</li>
 181</ul>
 182
 183<p>
 184To give a small example, most of my personal <code>org-mode</code> keybinding will start with <code>C-c
 185o</code>, as it is reserved for user, and <code>o</code> is for <code>org-mode</code>. For version control, it&rsquo;s gonna
 186be <code>C-c v</code>, for projects it&rsquo;s gonna be <code>C-c p</code>, etc…
 187</p>
 188
 189<table>
 190
 191
 192<colgroup>
 193<col  class="org-left">
 194
 195<col  class="org-left">
 196</colgroup>
 197<thead>
 198<tr>
 199<th scope="col" class="org-left">prefix</th>
 200<th scope="col" class="org-left">&ldquo;mode&rdquo;</th>
 201</tr>
 202</thead>
 203<tbody>
 204<tr>
 205<td class="org-left">&lt;F1&gt;</td>
 206<td class="org-left">&#xa0;</td>
 207</tr>
 208
 209<tr>
 210<td class="org-left">&lt;F2&gt;</td>
 211<td class="org-left">&#xa0;</td>
 212</tr>
 213
 214<tr>
 215<td class="org-left">&lt;F3&gt;</td>
 216<td class="org-left"><i>built-in</i> Register macro(s)</td>
 217</tr>
 218
 219<tr>
 220<td class="org-left">&lt;F4&gt;</td>
 221<td class="org-left"><i>built-in</i> Plays macro(s)</td>
 222</tr>
 223
 224<tr>
 225<td class="org-left">&lt;F5&gt;</td>
 226<td class="org-left"><code>revert-buffer</code></td>
 227</tr>
 228
 229<tr>
 230<td class="org-left">&lt;F6&gt;</td>
 231<td class="org-left">&#xa0;</td>
 232</tr>
 233
 234<tr>
 235<td class="org-left">&lt;F7&gt;</td>
 236<td class="org-left">&#xa0;</td>
 237</tr>
 238
 239<tr>
 240<td class="org-left">&lt;F8&gt;</td>
 241<td class="org-left">&#xa0;</td>
 242</tr>
 243
 244<tr>
 245<td class="org-left">&lt;F9&gt;</td>
 246<td class="org-left">&#xa0;</td>
 247</tr>
 248
 249<tr>
 250<td class="org-left">&lt;F10&gt;</td>
 251<td class="org-left">&#xa0;</td>
 252</tr>
 253
 254<tr>
 255<td class="org-left">&lt;F11&gt;</td>
 256<td class="org-left">&#xa0;</td>
 257</tr>
 258
 259<tr>
 260<td class="org-left">&lt;F12&gt;</td>
 261<td class="org-left">&#xa0;</td>
 262</tr>
 263
 264<tr>
 265<td class="org-left"><code>C-c b</code></td>
 266<td class="org-left">Bookmarks (<code>bookmark-plus</code>)</td>
 267</tr>
 268
 269<tr>
 270<td class="org-left"><code>C-c h</code></td>
 271<td class="org-left">Help (<code>helpful</code>, …)</td>
 272</tr>
 273
 274<tr>
 275<td class="org-left"><code>C-c n</code></td>
 276<td class="org-left">Navigation (<code>avy</code>, …)</td>
 277</tr>
 278
 279<tr>
 280<td class="org-left"><code>C-c o</code></td>
 281<td class="org-left">Org mode</td>
 282</tr>
 283
 284<tr>
 285<td class="org-left"><code>C-c p</code></td>
 286<td class="org-left">Projects (<code>projectile</code>, …)</td>
 287</tr>
 288
 289<tr>
 290<td class="org-left"><code>C-c v</code></td>
 291<td class="org-left">Version control (<code>vc</code>, <code>magit</code>, …)</td>
 292</tr>
 293
 294<tr>
 295<td class="org-left"><code>C-c w</code></td>
 296<td class="org-left">Window management (<code>ace-window</code>, …)</td>
 297</tr>
 298
 299<tr>
 300<td class="org-left"><code>C-x p</code></td>
 301<td class="org-left">Bookmarks (<code>bookmark-plus</code>, …)</td>
 302</tr>
 303</tbody>
 304</table>
 305
 306<p>
 307This table is not complete and I don&rsquo;t intend to keep it complete here. Instead, there
 308should be a table like this on each configuration file to describe what this config brings
 309as keybinding.
 310</p>
 311
 312<p>
 313See also:
 314</p>
 315<ul class="org-ul">
 316<li><a href="https://karl-voit.at/2018/07/08/emacs-key-bindings/">https://karl-voit.at/2018/07/08/emacs-key-bindings/</a></li>
 317<li><a href="https://www.masteringemacs.org/article/mastering-key-bindings-emacs">https://www.masteringemacs.org/article/mastering-key-bindings-emacs</a></li>
 318<li><a href="http://www.wilfred.me.uk/blog/2018/01/06/the-emacs-guru-guide-to-key-bindings/">http://www.wilfred.me.uk/blog/2018/01/06/the-emacs-guru-guide-to-key-bindings/</a></li>
 319</ul>
 320</div>
 321</section>
 322<section id="outline-container-COPYING" class="outline-2">
 323<h2 id="COPYING">COPYING</h2>
 324<div class="outline-text-2" id="text-COPYING">
 325<p>
 326Copyright (c) 2013-2020 Vincent Demeester &lt;vincent@sbr.pm&gt;
 327</p>
 328
 329<p>
 330This file is free software: you can redistribute it and/or modify it
 331under the terms of the GNU General Public License as published by the
 332Free Software Foundation, either version 3 of the License, or (at
 333your option) any later version.
 334</p>
 335
 336<p>
 337This file is distributed in the hope that it will be useful, but
 338WITHOUT ANY WARRANTY; without even the implied warranty of
 339MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 340General Public License for more details.
 341</p>
 342
 343<p>
 344You should have received a copy of the GNU General Public License
 345along with this file.  If not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
 346</p>
 347</div>
 348</section>
 349<section id="outline-container-Base%20settings" class="outline-2">
 350<h2 id="Base%20settings">Base settings</h2>
 351<div class="outline-text-2" id="text-Base%20settings">
 352<p>
 353This section contains configurations that are needed prior to the setup of everything
 354else. Anything that needs to be configured first should be in there, this includes the
 355<code>init.el</code> and <code>early-init.el</code> files content.
 356</p>
 357</div>
 358<div id="outline-container-Early%20initialization" class="outline-3">
 359<h3 id="Early%20initialization">Early initialization</h3>
 360<div class="outline-text-3" id="text-Early%20initialization">
 361<p>
 362Starting with Emacs 27, an <code>early-init.el</code> file can be used to do early configuration
 363and optimization.
 364</p>
 365
 366<blockquote>
 367<p>
 368Emacs can now be configured using an early init file. The file is called <code>early-init.el</code>,
 369in <code>user-emacs-directory</code>. It is loaded very early in the startup process: before
 370graphical elements such as the tool bar are initialized, and before the package manager is
 371initialized. The primary purpose is to allow customizing how the package system is
 372initialized given that initialization now happens before loading the regular init file
 373(see below).
 374</p>
 375
 376<p>
 377We recommend against putting any customizations in this file that don&rsquo;t need to be set up
 378before initializing installed add-on packages, because the early init file is read too
 379early into the startup process, and some important parts of the Emacs session, such as
 380&rsquo;window-system&rsquo; and other GUI features, are not yet set up, which could make some
 381customization fail to work.
 382</p>
 383</blockquote>
 384
 385<p>
 386We can use this to our advantage and optimize the initial loading of emacs.
 387</p>
 388
 389<ul class="org-ul">
 390<li><p>
 391Before Emacs 27, the init file was responsible for initializing the package manager by
 392calling `package-initialize&rsquo;.  Emacs 27 changed the default behavior: It now calls
 393`package-initialize&rsquo; before loading the init file.
 394</p>
 395
 396<div class="org-src-container">
 397<pre class="src src-emacs-lisp">(<span class="org-keyword">setq</span> package-enable-at-startup nil)
 398</pre>
 399</div></li>
 400
 401<li><p>
 402Let&rsquo;s inhibit resizing the frame at early stage.
 403</p>
 404
 405<div class="org-src-container">
 406<pre class="src src-emacs-lisp">(<span class="org-keyword">setq</span> frame-inhibit-implied-resize t)
 407</pre>
 408</div></li>
 409
 410<li><p>
 411I never use the <i>menu-bar</i>, or the <i>tool-bar</i> or even the <i>scroll-bar</i>, so we can safely
 412disable those very very early.
 413</p>
 414
 415<div class="org-src-container">
 416<pre class="src src-emacs-lisp">(menu-bar-mode -1)
 417(tool-bar-mode -1)
 418(scroll-bar-mode -1)
 419(horizontal-scroll-bar-mode -1)
 420</pre>
 421</div></li>
 422
 423<li><p>
 424Finally we can try to avoid garbage collection at startup. The garbage collector can
 425easily double startup time, so we suppress it at startup by turning up <code>gc-cons-threshold</code>
 426(and perhaps <code>gc-cons-percentage</code>) temporarily.
 427</p>
 428
 429<div class="org-src-container">
 430<pre class="src src-emacs-lisp">(<span class="org-keyword">setq</span> gc-cons-threshold 402653184
 431      gc-cons-percentage 0.6)
 432</pre>
 433</div></li>
 434
 435<li><p>
 436Another small optimization concerns on <code>file-name-handler-alist</code> : on every .el and .elc
 437file loaded during start up, it has to runs those regexps against the filename ; setting
 438it to <code>nil</code> and after initialization finished put the value back make the initialization
 439process quicker.
 440</p>
 441
 442<div class="org-src-container">
 443<pre class="src src-emacs-lisp">(<span class="org-keyword">defvar</span> <span class="org-variable-name">file-name-handler-alist-original</span> file-name-handler-alist)
 444(<span class="org-keyword">setq</span> file-name-handler-alist nil)
 445</pre>
 446</div>
 447
 448<p>
 449However, it is important to reset it eventually. Not doing so will cause garbage
 450collection freezes during long-term interactive use. Conversely, a <code>gc-cons-threshold</code>
 451that is too small will cause stuttering. This will be done at the end.
 452</p></li>
 453
 454<li><p>
 455It&rsquo;s also possible to put the theme <b>and</b> the font in <code>early-init.el</code> to speed the
 456start.
 457</p>
 458
 459<div class="org-src-container">
 460<pre class="src src-emacs-lisp">(<span class="org-keyword">defvar</span> <span class="org-variable-name">contrib/after-load-theme-hook</span> nil
 461  <span class="org-doc">"Hook run after a color theme is loaded using `</span><span class="org-doc"><span class="org-constant">load-theme</span></span><span class="org-doc">'."</span>)
 462
 463(<span class="org-keyword">defun</span> <span class="org-function-name">contrib/run-after-load-theme-hook</span> (<span class="org-type">&amp;rest</span> _)
 464  <span class="org-doc">"Run `</span><span class="org-doc"><span class="org-constant">contrib/after-load-theme-hook</span></span><span class="org-doc">'."</span>
 465  (run-hooks 'contrib/after-load-theme-hook))
 466
 467(advice-add #'load-theme <span class="org-builtin">:after</span> #'contrib/run-after-load-theme-hook)
 468(<span class="org-keyword">require</span> '<span class="org-constant">modus-operandi-theme</span>)
 469
 470(<span class="org-keyword">defun</span> <span class="org-function-name">vde/modus-operandi</span> ()
 471  <span class="org-doc">"Enable some Modus Operandi variables and load the theme.</span>
 472<span class="org-doc">This is used internally by `</span><span class="org-doc"><span class="org-constant">vde/modus-themes-toggle</span></span><span class="org-doc">'."</span>
 473  (<span class="org-keyword">setq</span> modus-operandi-theme-slanted-constructs t
 474        modus-operandi-theme-bold-constructs t
 475        modus-operandi-theme-subtle-diffs t
 476        modus-operandi-theme-rainbow-headings t
 477        modus-operandi-theme-section-headings nil
 478        modus-operandi-theme-scale-headings nil
 479        modus-operandi-theme-fringes 'subtle <span class="org-comment-delimiter">; </span><span class="org-comment">{nil,'subtle,'intense}</span>
 480        modus-operandi-theme-mode-line '3d <span class="org-comment-delimiter">; </span><span class="org-comment">{nil,'3d,'moody}</span>
 481        modus-operandi-theme-3d-modeline t
 482        modus-operandi-theme-faint-syntax nil
 483        modus-operandi-theme-intense-hl-line t
 484        modus-operandi-theme-intense-paren-match t
 485        modus-operandi-theme-prompts 'subtle <span class="org-comment-delimiter">; </span><span class="org-comment">{nil,'subtle,'intense}</span>
 486        modus-operandi-theme-completions 'opinionated <span class="org-comment-delimiter">; </span><span class="org-comment">{nil,'moderate,'opinionated}</span>
 487        modus-operandi-theme-diffs 'desaturated <span class="org-comment-delimiter">; </span><span class="org-comment">{nil,'desaturated,'fg-only}</span>
 488        modus-operandi-theme-org-blocks 'greyscale <span class="org-comment-delimiter">; </span><span class="org-comment">{nil,'greyscale,'rainbow}</span>
 489        modus-operandi-theme-variable-pitch-headings nil
 490        modus-operandi-theme-rainbow-headings t
 491        modus-operandi-theme-section-headings nil
 492        modus-operandi-theme-scale-headings t
 493        modus-operandi-theme-scale-1 1.05
 494        modus-operandi-theme-scale-2 1.1
 495        modus-operandi-theme-scale-3 1.15
 496        modus-operandi-theme-scale-4 1.2)
 497  (load-theme 'modus-operandi t))
 498
 499(<span class="org-keyword">defun</span> <span class="org-function-name">vde/modus-operandi-custom</span> ()
 500  <span class="org-doc">"Customize modus-operandi theme"</span>
 501  (<span class="org-keyword">if</span> (member 'modus-operandi custom-enabled-themes)
 502      (modus-operandi-theme-with-color-variables <span class="org-comment-delimiter">; </span><span class="org-comment">this macro allows us to access the colour palette</span>
 503        (custom-theme-set-faces
 504         'modus-operandi
 505         `(whitespace-tab ((,class (<span class="org-builtin">:background</span> <span class="org-string">"#ffffff"</span> <span class="org-builtin">:foreground</span> <span class="org-string">"#cccccc"</span>))))
 506         `(whitespace-space ((,class (<span class="org-builtin">:background</span> <span class="org-string">"#ffffff"</span> <span class="org-builtin">:foreground</span> <span class="org-string">"#cccccc"</span>))))
 507         `(whitespace-hspace ((,class (<span class="org-builtin">:background</span> <span class="org-string">"#ffffff"</span> <span class="org-builtin">:foreground</span> <span class="org-string">"#cccccc"</span>))))
 508         `(whitespace-newline ((,class (<span class="org-builtin">:background</span> <span class="org-string">"#ffffff"</span> <span class="org-builtin">:foreground</span> <span class="org-string">"#cccccc"</span>))))
 509         `(whitespace-indentation ((,class (<span class="org-builtin">:background</span> <span class="org-string">"#ffffff"</span> <span class="org-builtin">:foreground</span> <span class="org-string">"#cccccc"</span>))))
 510         ))))
 511
 512(add-hook 'contrib/after-load-theme-hook 'vde/modus-operandi-custom)
 513(vde/modus-operandi)
 514
 515(<span class="org-keyword">defconst</span> <span class="org-variable-name">font-height</span> 130
 516  <span class="org-doc">"Default font-height to use."</span>)
 517(<span class="org-keyword">defconst</span> <span class="org-variable-name">font-family-mono</span> <span class="org-string">"Ubuntu Mono"</span>
 518  <span class="org-doc">"Default monospace font-family to use."</span>)
 519(<span class="org-keyword">defconst</span> <span class="org-variable-name">font-family-sans</span> <span class="org-string">"Ubuntu Sans"</span>
 520  <span class="org-doc">"Default sans font-family to use."</span>)
 521<span class="org-comment-delimiter">;; </span><span class="org-comment">Middle/Near East: &#1513;&#1500;&#1493;&#1501;, &#1575;&#1604;&#1587;&#1617;&#1604;&#1575;&#1605; &#1593;&#1604;&#1610;&#1603;&#1605;</span>
 522(<span class="org-keyword">when</span> (member <span class="org-string">"Noto Sans Arabic"</span> (font-family-list))
 523  (set-fontset-font t 'arabic <span class="org-string">"Noto Sans Arabic"</span>))
 524(<span class="org-keyword">when</span> (member <span class="org-string">"Noto Sans Hebrew"</span> (font-family-list))
 525  (set-fontset-font t 'arabic <span class="org-string">"Noto Sans Hebrew"</span>))
 526<span class="org-comment-delimiter">;; </span><span class="org-comment">Africa: &#4640;&#4619;&#4637;</span>
 527(<span class="org-keyword">when</span> (member <span class="org-string">"Noto Sans Ethiopic"</span> (font-family-list))
 528  (set-fontset-font t 'ethiopic <span class="org-string">"Noto Sans Ethiopic"</span>))
 529
 530<span class="org-comment-delimiter">;; </span><span class="org-comment">If font-family-mono or font-family-sans are not available, use the default Emacs face</span>
 531(<span class="org-keyword">when</span> (member font-family-mono (font-family-list))
 532  (set-face-attribute 'default nil
 533                      <span class="org-builtin">:family</span> font-family-mono
 534                      <span class="org-builtin">:height</span> font-height)
 535  (set-face-attribute 'fixed-pitch nil
 536                      <span class="org-builtin">:family</span> font-family-mono))
 537(<span class="org-keyword">when</span> (member font-family-sans (font-family-list))
 538  (set-face-attribute 'variable-pitch nil
 539                      <span class="org-builtin">:family</span> font-family-sans
 540                      <span class="org-builtin">:weight</span> 'regular))
 541
 542<span class="org-comment-delimiter">;; </span><span class="org-comment">Ignore X resources; its settings would be redundant with the other settings</span>
 543<span class="org-comment-delimiter">;; </span><span class="org-comment">in this file and can conflict with later config (particularly where the</span>
 544<span class="org-comment-delimiter">;; </span><span class="org-comment">cursor color is concerned).</span>
 545(advice-add #'x-apply-session-resources <span class="org-builtin">:override</span> #'ignore)
 546</pre>
 547</div></li>
 548
 549<li><p>
 550Reseting garbage collection and file-name-handler values.
 551</p>
 552
 553<div class="org-src-container">
 554<pre class="src src-emacs-lisp">(add-hook 'after-init-hook
 555          `(<span class="org-keyword">lambda</span> ()
 556             (<span class="org-keyword">setq</span> gc-cons-threshold 67108864 <span class="org-comment-delimiter">; </span><span class="org-comment">64mb</span>
 557                   gc-cons-percentage 0.1
 558                   file-name-handler-alist file-name-handler-alist-original)
 559             (garbage-collect)) <span class="org-warning">t)</span>
 560</pre>
 561</div></li>
 562</ul>
 563</div>
 564</div>
 565<div id="outline-container-Initialization" class="outline-3">
 566<h3 id="Initialization">Initialization</h3>
 567<div class="outline-text-3" id="text-Initialization">
 568<p>
 569I am using the <a href="https://archive.casouri.cat/note/2020/painless-transition-to-portable-dumper/index.html">portable dump</a> feature (<i>to speed things up</i>) <b>but</b> I want to also start
 570without <code>pdump</code>, so I need to take both cases into account.
 571</p>
 572
 573<div class="org-src-container">
 574<pre class="src src-emacs-lisp">(<span class="org-keyword">defvar</span> <span class="org-variable-name">sbr-dumped</span> nil
 575  <span class="org-doc">"non-nil when a dump file is loaded (because dump.el sets this variable)."</span>)
 576
 577(<span class="org-keyword">defmacro</span> <span class="org-function-name">sbr-if-dump</span> (then <span class="org-type">&amp;rest</span> else)
 578  <span class="org-doc">"Evaluate IF if running with a dump file, else evaluate ELSE."</span>
 579  (<span class="org-keyword">declare</span> (indent 1))
 580  `(<span class="org-keyword">if</span> sbr-dumped
 581       ,then
 582     ,@else))
 583
 584(sbr-if-dump
 585    (<span class="org-keyword">progn</span>
 586      (global-font-lock-mode)
 587      (transient-mark-mode)
 588      (<span class="org-keyword">setq</span> load-path sbr-dumped-load-path))
 589  <span class="org-comment-delimiter">;; </span><span class="org-comment">add load-path&#8217;s and load autoload files</span>
 590  (package-initialize))
 591</pre>
 592</div>
 593
 594<p>
 595First thing first, let&rsquo;s define a <code>emacs-start-time</code> constant to be able to compute the
 596time Emacs took to start.
 597</p>
 598
 599<div class="org-src-container">
 600<pre class="src src-emacs-lisp">(<span class="org-keyword">defconst</span> <span class="org-variable-name">emacs-start-time</span> (current-time))
 601</pre>
 602</div>
 603
 604<p>
 605My configuration do not support Emacs version lower than 26.
 606</p>
 607
 608<div class="org-src-container">
 609<pre class="src src-emacs-lisp">(<span class="org-keyword">let</span> ((minver 26))
 610  (<span class="org-keyword">unless</span> (&gt;= emacs-major-version minver)
 611    (<span class="org-warning">error</span> <span class="org-string">"Your Emacs is too old -- this configuration requires v%s or higher"</span> minver)))
 612</pre>
 613</div>
 614
 615<p>
 616One thing though, I am currently not necessarily running Emacs 27, so I am going to need
 617to have the same configuration in <code>init.el</code> for a little bit of time.
 618</p>
 619
 620<p>
 621<i>Note: the lowest emacs version I wanna support is 26 (as of today, might evolve)</i>
 622</p>
 623
 624<div class="org-src-container">
 625<pre class="src src-emacs-lisp"><span class="org-comment-delimiter">;; </span><span class="org-comment">load early-init.el before Emacs 27.0</span>
 626(<span class="org-keyword">unless</span> (&gt;= emacs-major-version 27)
 627  (message <span class="org-string">"Early init: Emacs Version &lt; 27.0"</span>)
 628  (load (expand-file-name <span class="org-string">"early-init.el"</span> user-emacs-directory)))
 629</pre>
 630</div>
 631
 632<p>
 633We also want our configuration to be working the same on any computer, this means we want
 634to define every option by ourselves, not relying on default files (<code>default.el</code>) that
 635would be set by our distribution. This is where <code>inhibit-default-init</code> comes into play,
 636setting it to non-nil inhibit loading the <code>default</code> library.
 637</p>
 638
 639<p>
 640We also want to inhibit some initial default start messages and screen. The default screen
 641will be as bare as possible.
 642</p>
 643
 644<div class="org-src-container">
 645<pre class="src src-emacs-lisp">(<span class="org-keyword">setq</span> inhibit-default-init t)           <span class="org-comment-delimiter">; </span><span class="org-comment">Disable the site default settings</span>
 646
 647(<span class="org-keyword">setq</span> inhibit-startup-message t
 648      inhibit-startup-screen t)
 649</pre>
 650</div>
 651
 652<p>
 653Let&rsquo;s also use <code>y</code> or <code>n</code> instead of <code>yes</code> and <code>no</code> when exiting Emacs.
 654</p>
 655
 656<div class="org-src-container">
 657<pre class="src src-emacs-lisp">(<span class="org-keyword">setq</span> confirm-kill-emacs #'y-or-n-p)
 658</pre>
 659</div>
 660
 661<p>
 662One last piece to the puzzle is the default mode. Setting it to fundamental-mode means we
 663won&rsquo;t load any <i>heavy</i> mode at startup (like <code>org-mode</code>). We also want this scratch buffer
 664to be empty, so let&rsquo;s set it as well
 665</p>
 666
 667<div class="org-src-container">
 668<pre class="src src-emacs-lisp">(<span class="org-keyword">setq</span> initial-major-mode 'fundamental-mode
 669      initial-scratch-message nil)
 670</pre>
 671</div>
 672</div>
 673</div>
 674<div id="outline-container-Unicode%20all%20the%20way" class="outline-3">
 675<h3 id="Unicode%20all%20the%20way">Unicode all the way</h3>
 676<div class="outline-text-3" id="text-Unicode%20all%20the%20way">
 677<p>
 678By default, all my systems are configured and support <code>utf-8</code>, so let&rsquo;s just make it a
 679default in Emacs ; and handle special case on demand.
 680</p>
 681
 682<div class="org-src-container">
 683<pre class="src src-emacs-lisp">(prefer-coding-system 'utf-8)
 684(set-default-coding-systems 'utf-8)
 685(set-language-environment 'utf-8)
 686(set-selection-coding-system 'utf-8)
 687(set-terminal-coding-system 'utf-8)
 688</pre>
 689</div>
 690</div>
 691</div>
 692<div id="outline-container-Package%20management%20with%20%3Duse-package%3D" class="outline-3">
 693<h3 id="Package%20management%20with%20%3Duse-package%3D">Package management with <code>use-package</code></h3>
 694<div class="outline-text-3" id="text-Package%20management%20with%20%3Duse-package%3D">
 695<p>
 696<code>use-package</code> is a tool that streamlines the configuration of packages. It handles
 697everything from assigning key bindings, setting the value of customisation options,
 698writing hooks, declaring a package as a dependency for another, and so on.
 699</p>
 700
 701<blockquote>
 702<p>
 703The <code>use-package</code> macro allows you to isolate package configuration in your <code>.emacs</code> file
 704in a way that is both performance-oriented and, well, tidy.  I created it because I have
 705over 80 packages that I use in Emacs, and things were getting difficult to manage.  Yet
 706with this utility my total load time is around 2 seconds, with no loss of functionality!
 707</p>
 708</blockquote>
 709
 710<p>
 711With <code>use-package</code> we can improve the start-up performance of Emacs in a few fairly simple
 712ways. Whenever a command is bound to a key it is configured to be loaded only once
 713invoked. Otherwise we can specify which functions should be autoloaded by means of the
 714<code>:commands</code> keyword.
 715</p>
 716
 717<p>
 718We need to setup the emacs package system and install <code>use-package</code> if not present
 719already.
 720</p>
 721
 722<div class="org-src-container">
 723<pre class="src src-emacs-lisp">(<span class="org-keyword">require</span> '<span class="org-constant">package</span>)
 724
 725(<span class="org-keyword">setq</span> package-archives
 726      '((<span class="org-string">"melpa"</span> . <span class="org-string">"http://melpa.org/packages/"</span>)
 727        (<span class="org-string">"org"</span> . <span class="org-string">"https://orgmode.org/elpa/"</span>)
 728        (<span class="org-string">"gnu"</span> . <span class="org-string">"https://elpa.gnu.org/packages/"</span>)))
 729
 730(<span class="org-keyword">setq</span> package-archive-priorities
 731      '((<span class="org-string">"melpa"</span> .  3)
 732        (<span class="org-string">"org"</span> . 2)
 733        (<span class="org-string">"gnu"</span> . 1)))
 734
 735(<span class="org-keyword">require</span> '<span class="org-constant">tls</span>)
 736
 737<span class="org-comment-delimiter">;; </span><span class="org-comment">From https://github.com/hlissner/doom-emacs/blob/5dacbb7cb1c6ac246a9ccd15e6c4290def67757c/core/core-packages.el#L102</span>
 738(<span class="org-keyword">setq</span> gnutls-verify-error (not (getenv <span class="org-string">"INSECURE"</span>)) <span class="org-comment-delimiter">; </span><span class="org-comment">you shouldn't use this</span>
 739      tls-checktrust gnutls-verify-error
 740      tls-program (list <span class="org-string">"gnutls-cli --x509cafile %t -p %p %h"</span>
 741                        <span class="org-comment-delimiter">;; </span><span class="org-comment">compatibility fallbacks</span>
 742                        <span class="org-string">"gnutls-cli -p %p %h"</span>
 743                        <span class="org-string">"openssl s_client -connect %h:%p -no_ssl2 -no_ssl3 -ign_eof"</span>))
 744
 745<span class="org-comment-delimiter">;; </span><span class="org-comment">Initialise the packages, avoiding a re-initialisation.</span>
 746(<span class="org-keyword">unless</span> (<span class="org-keyword">bound-and-true-p</span> package--initialized)
 747  (<span class="org-keyword">setq</span> package-enable-at-startup nil)
 748  (package-initialize))
 749
 750(<span class="org-keyword">setq</span> load-prefer-newer t)              <span class="org-comment-delimiter">; </span><span class="org-comment">Always load newer compiled files</span>
 751(<span class="org-keyword">setq</span> ad-redefinition-action 'accept)   <span class="org-comment-delimiter">; </span><span class="org-comment">Silence advice redefinition warnings</span>
 752
 753<span class="org-comment-delimiter">;; </span><span class="org-comment">Init `</span><span class="org-comment"><span class="org-constant">delight</span></span><span class="org-comment">'</span>
 754(<span class="org-keyword">unless</span> (package-installed-p 'delight)
 755  (package-refresh-contents)
 756  (package-install 'delight))
 757
 758<span class="org-comment-delimiter">;; </span><span class="org-comment">Configure `</span><span class="org-comment"><span class="org-constant">use-package</span></span><span class="org-comment">' prior to loading it.</span>
 759(<span class="org-keyword">eval-and-compile</span>
 760  (<span class="org-keyword">setq</span> use-package-always-ensure nil)
 761  (<span class="org-keyword">setq</span> use-package-always-defer nil)
 762  (<span class="org-keyword">setq</span> use-package-always-demand nil)
 763  (<span class="org-keyword">setq</span> use-package-expand-minimally nil)
 764  (<span class="org-keyword">setq</span> use-package-enable-imenu-support t))
 765
 766(<span class="org-keyword">unless</span> (package-installed-p 'use-package)
 767  (package-refresh-contents)
 768  (package-install 'use-package))
 769
 770(<span class="org-keyword">eval-when-compile</span>
 771  (<span class="org-keyword">require</span> '<span class="org-constant">use-package</span>))
 772</pre>
 773</div>
 774</div>
 775</div>
 776<div id="outline-container-Early%20environment%20setup" class="outline-3">
 777<h3 id="Early%20environment%20setup">Early environment setup</h3>
 778<div class="outline-text-3" id="text-Early%20environment%20setup">
 779<p>
 780I want to <b>force</b> <code>=SSH_AUTH_SOCK</code> in Emacs to use my gpg-agent.
 781</p>
 782
 783<div class="org-src-container">
 784<pre class="src src-emacs-lisp">(setenv <span class="org-string">"SSH_AUTH_SOCK"</span> <span class="org-string">"/run/user/1000/gnupg/S.gpg-agent.ssh"</span>)
 785</pre>
 786</div>
 787</div>
 788</div>
 789<div id="outline-container-%3Dcustom.el%3D" class="outline-3">
 790<h3 id="%3Dcustom.el%3D"><code>custom.el</code></h3>
 791<div class="outline-text-3" id="text-%3Dcustom.el%3D">
 792<p>
 793When you install a package or use the various customisation interfaces to tweak things to
 794your liking, Emacs will append a piece of elisp to your init file. I prefer to have that
 795stored in a separate file.
 796</p>
 797
 798<div class="org-src-container">
 799<pre class="src src-emacs-lisp">(<span class="org-keyword">defconst</span> <span class="org-variable-name">vde/custom-file</span> (locate-user-emacs-file <span class="org-string">"custom.el"</span>)
 800  <span class="org-doc">"File used to store settings from Customization UI."</span>)
 801
 802(<span class="org-keyword">use-package</span> cus-edit
 803  <span class="org-builtin">:config</span>
 804  (<span class="org-keyword">setq</span>
 805   custom-file vde/custom-file
 806   custom-buffer-done-kill nil          <span class="org-comment-delimiter">; </span><span class="org-comment">Kill when existing</span>
 807   custom-buffer-verbose-help nil       <span class="org-comment-delimiter">; </span><span class="org-comment">Remove redundant help text</span>
 808   custom-unlispify-tag-names nil       <span class="org-comment-delimiter">; </span><span class="org-comment">Show me the real variable name</span>
 809   custom-unlispify-menu-entries nil)
 810  (<span class="org-keyword">unless</span> (file-exists-p custom-file)
 811    (write-region <span class="org-string">""</span> nil custom-file))
 812
 813  (load vde/custom-file 'no-error 'no-message))
 814</pre>
 815</div>
 816</div>
 817</div>
 818<div id="outline-container-Remove%20built-in%20%3Dorg-mode%3D" class="outline-3">
 819<h3 id="Remove%20built-in%20%3Dorg-mode%3D">Remove built-in <code>org-mode</code></h3>
 820<div class="outline-text-3" id="text-Remove%20built-in%20%3Dorg-mode%3D">
 821<p>
 822I want to make sure I am using the installed version of <code>orgmode</code> (from my org
 823configuration) instead of the built-in one. To do that safely, let&rsquo;s remove the built-in
 824version out of the load path.
 825</p>
 826
 827<div class="org-src-container">
 828<pre class="src src-emacs-lisp">(<span class="org-keyword">require</span> '<span class="org-constant">cl-seq</span>)
 829(<span class="org-keyword">setq</span> load-path
 830      (cl-remove-if
 831       (<span class="org-keyword">lambda</span> (x)
 832         (string-match-p <span class="org-string">"org$"</span> x))
 833       load-path))
 834</pre>
 835</div>
 836</div>
 837</div>
 838<div id="outline-container-Loading%20configuration%20files" class="outline-3">
 839<h3 id="Loading%20configuration%20files">Loading configuration files</h3>
 840<div class="outline-text-3" id="text-Loading%20configuration%20files">
 841<p>
 842This <code>org-mode</code> document <i>tangles</i> into several files in different folders :
 843</p>
 844<ul class="org-ul">
 845<li><code>config</code> for my configuration</li>
 846<li><code>lisp</code> for imported code or library I&rsquo;ve written and not yet published</li>
 847</ul>
 848
 849<p>
 850I used to load them by hand in the <code>init.el</code> file, which is very cumbersome, so let&rsquo;s try
 851to automatically load them. I want to first load the file in the <code>lisp</code> folder as they are
 852potentially used by my configuration (in <code>config</code>).
 853</p>
 854
 855<p>
 856Let&rsquo;s define some functions that would do the job.
 857</p>
 858
 859<div class="org-src-container">
 860<pre class="src src-emacs-lisp">(<span class="org-keyword">defun</span> <span class="org-function-name">vde/el-load-dir</span> (dir)
 861  <span class="org-doc">"Load el files from the given folder"</span>
 862  (<span class="org-keyword">let</span> ((files (directory-files dir nil <span class="org-string">"</span><span class="org-string"><span class="org-warning">\</span></span><span class="org-string">.el$"</span>)))
 863    (<span class="org-keyword">while</span> files
 864      (load-file (concat dir (<span class="org-keyword">pop</span> files))))))
 865
 866(<span class="org-keyword">defun</span> <span class="org-function-name">vde/short-hostname</span> ()
 867  <span class="org-doc">"Return hostname in short (aka wakasu.local -&gt; wakasu)"</span>
 868  (string-match <span class="org-string">"[0-9A-Za-z-]+"</span> system-name)
 869  (substring system-name (match-beginning 0) (match-end 0)))
 870</pre>
 871</div>
 872
 873<p>
 874Let&rsquo;s define some constants early, based on the system, and the environment, to be able to
 875use those later on to skip some package or change some configuration accordingly.
 876</p>
 877
 878<div class="org-src-container">
 879<pre class="src src-emacs-lisp">(<span class="org-keyword">defconst</span> <span class="org-variable-name">*sys/gui*</span>
 880  (display-graphic-p)
 881  <span class="org-doc">"Are we running on a GUI Emacs ?"</span>)
 882(<span class="org-keyword">defconst</span> <span class="org-variable-name">*sys/linux*</span>
 883  (eq system-type 'gnu/linux)
 884  <span class="org-doc">"Are we running on a GNU/Linux system?"</span>)
 885(<span class="org-keyword">defconst</span> <span class="org-variable-name">*sys/mac*</span>
 886  (eq system-type 'darwin)
 887  <span class="org-doc">"Are we running on a Mac system?"</span>)
 888(<span class="org-keyword">defconst</span> <span class="org-variable-name">*sys/root*</span>
 889  (string-equal <span class="org-string">"root"</span> (getenv <span class="org-string">"USER"</span>))
 890  <span class="org-doc">"Are you a ROOT user?"</span>)
 891(<span class="org-keyword">defconst</span> <span class="org-variable-name">*nix*</span>
 892  (executable-find <span class="org-string">"nix"</span>)
 893  <span class="org-doc">"Do we have nix? (aka are we running in NixOS or a system using nixpkgs)"</span>)
 894(<span class="org-keyword">defconst</span> <span class="org-variable-name">*rg*</span>
 895  (executable-find <span class="org-string">"rg"</span>)
 896  <span class="org-doc">"Do we have ripgrep?"</span>)
 897(<span class="org-keyword">defconst</span> <span class="org-variable-name">*gcc*</span>
 898  (executable-find <span class="org-string">"gcc"</span>)
 899  <span class="org-doc">"Do we have gcc?"</span>)
 900(<span class="org-keyword">defconst</span> <span class="org-variable-name">*git*</span>
 901  (executable-find <span class="org-string">"git"</span>)
 902  <span class="org-doc">"Do we have git?"</span>)
 903
 904(<span class="org-keyword">defvar</span> <span class="org-variable-name">*sys/full*</span>
 905  (member (vde/short-hostname) '(<span class="org-string">"wakasu"</span> <span class="org-string">"naruhodo"</span>)) <span class="org-comment-delimiter">; </span><span class="org-comment">"naruhodo" &lt;- put naruhodo back in</span>
 906  <span class="org-doc">"Is it a full system ?"</span>)
 907(<span class="org-keyword">defvar</span> <span class="org-variable-name">*sys/light*</span>
 908  (not *sys/full*)
 909  <span class="org-doc">"Is it a light system ?"</span>)
 910</pre>
 911</div>
 912
 913<p>
 914Now, in order to load <code>lisp</code> and <code>config</code> files, it&rsquo;s just a matter of calling this
 915function with the right argument.
 916</p>
 917
 918<div class="org-src-container">
 919<pre class="src src-emacs-lisp">(add-to-list 'load-path (concat user-emacs-directory <span class="org-string">"lisp/"</span>))
 920(add-to-list 'load-path (concat user-emacs-directory <span class="org-string">"lisp/vorg"</span>))
 921(<span class="org-keyword">require</span> '<span class="org-constant">init-func</span>)
 922(vde/el-load-dir (concat user-emacs-directory <span class="org-string">"/config/"</span>))
 923</pre>
 924</div>
 925
 926<p>
 927Finally, I want to be able to load files for a specific machine, in case I need it (not
 928entirely sure why yet but…)
 929</p>
 930
 931<div class="org-src-container">
 932<pre class="src src-emacs-lisp">(<span class="org-keyword">if</span> (file-exists-p (downcase (concat user-emacs-directory <span class="org-string">"/hosts/"</span> (vde/short-hostname) <span class="org-string">".el"</span>)))
 933    (load-file (downcase (concat user-emacs-directory <span class="org-string">"/hosts/"</span> (vde/short-hostname) <span class="org-string">".el"</span>))))
 934</pre>
 935</div>
 936</div>
 937</div>
 938<div id="outline-container-Counting%20the%20time%20of%20loading" class="outline-3">
 939<h3 id="Counting%20the%20time%20of%20loading">Counting the time of loading</h3>
 940<div class="outline-text-3" id="text-Counting%20the%20time%20of%20loading">
 941<div class="org-src-container">
 942<pre class="src src-emacs-lisp">(<span class="org-keyword">let</span> ((elapsed (float-time (time-subtract (current-time)
 943                                          emacs-start-time))))
 944  (message <span class="org-string">"Loading %s...done (%.3fs)"</span> load-file-name elapsed))
 945
 946(add-hook 'after-init-hook
 947          `(<span class="org-keyword">lambda</span> ()
 948             (<span class="org-keyword">let</span> ((elapsed
 949                    (float-time
 950                     (time-subtract (current-time) emacs-start-time))))
 951               (message <span class="org-string">"Loading %s...done (%.3fs) [after-init]"</span>
 952                        ,load-file-name elapsed))) <span class="org-warning">t)</span>
 953</pre>
 954</div>
 955</div>
 956</div>
 957</section>
 958<section id="outline-container-Configurations" class="outline-2">
 959<h2 id="Configurations">Configurations</h2>
 960<div class="outline-text-2" id="text-Configurations">
 961<p>
 962As seen above, I split my configurations in a <code>config</code> folder. Each of those configuration
 963has its own documentation, on its own page. Ideally, each module is optional and can be
 964skipped if not desired. In practice though, I load all of them, because this is my
 965config. I haven&rsquo;t really tried loading them all individually to make sure I don&rsquo;t have
 966links between them.
 967</p>
 968
 969<ul class="org-ul">
 970<li>Core System
 971<ul class="org-ul">
 972<li><a href="emacs_keep_it_clean.html">keep emacs clean</a></li>
 973<li><a href="emacs_appearance.html">appearance</a></li>
 974<li>editing</li>
 975<li>navigation</li>
 976<li>buffer and windows</li>
 977<li>files (with dired)</li>
 978</ul></li>
 979<li>Version control</li>
 980<li><a href="emacs_projects.html">Projects</a></li>
 981<li>Programming
 982<ul class="org-ul">
 983<li>emacs-lisp</li>
 984<li>go</li>
 985<li>nix</li>
 986</ul></li>
 987<li>Writing</li>
 988<li>Task management
 989<ul class="org-ul">
 990<li><a href="my_organizational_workflow.html">Org-mode and agenda</a> aka &ldquo;My Organization Workflow&rdquo;</li>
 991</ul></li>
 992<li>Communications
 993<ul class="org-ul">
 994<li><a href="config_email_configuration.html">Email configuration</a>, notably using <a href="gnus.html">Gnus</a> and <a href="notmuch.html">notmuch</a>.</li>
 995</ul></li>
 996</ul>
 997</div>
 998</section>
 999<section id="outline-container-Nix%28eries%29" class="outline-2">
1000<h2 id="Nix%28eries%29">Nix(eries)</h2>
1001<div class="outline-text-2" id="text-Nix%28eries%29">
1002<p>
1003I am using <a href="nixos.html">NixOS</a> and <a href="nix.html">Nix</a>, thus I do have a nix specific setup for Emacs.
1004</p>
1005</div>
1006<div id="outline-container-Scripts" class="outline-3">
1007<h3 id="Scripts">Scripts</h3>
1008<div class="outline-text-3" id="text-Scripts">
1009<p>
1010I have a few scripts and desktop files that I want to get installed in my environment.
1011</p>
1012</div>
1013<div id="outline-container-capture" class="outline-4">
1014<h4 id="capture">capture</h4>
1015<div class="outline-text-4" id="text-capture">
1016<p>
1017The first one is a capture command that starts a new frame using the <code>org</code> daemon so that
1018I can quickly capture something from anywhere.
1019</p>
1020
1021<div class="org-src-container">
1022<pre class="src src-nix" id="org51be9f3"><span class="org-nix-attribute">capture</span> = pkgs.writeScriptBin <span class="org-string">"capture"</span> <span class="org-string">''</span>
1023<span class="org-string">  #!</span><span class="org-nix-antiquote">${</span>pkgs.stdenv.shell<span class="org-nix-antiquote">}</span>
1024<span class="org-string">  emacsclient -s /run/user/1000/emacs/org -n -F '((name . "capture") (width . 150) (height . 90))' -e '(org-capture)'</span>
1025<span class="org-string">''</span>;
1026</pre>
1027</div>
1028</div>
1029</div>
1030<div id="outline-container-emacsclient%20helpers" class="outline-4">
1031<h4 id="emacsclient%20helpers">emacsclient helpers</h4>
1032<div class="outline-text-4" id="text-emacsclient%20helpers">
1033<p>
1034<code>ec</code> will start an emacs &ldquo;window&rdquo; frame from the emacs org server.
1035</p>
1036
1037<div class="org-src-container">
1038<pre class="src src-nix" id="orgd8308b4"><span class="org-nix-attribute">ec</span> = pkgs.writeScriptBin <span class="org-string">"ec"</span> <span class="org-string">''</span>
1039<span class="org-string">  #!</span><span class="org-nix-antiquote">${</span>pkgs.stdenv.shell<span class="org-nix-antiquote">}</span>
1040<span class="org-string">  emacsclient -s /run/user/1000/emacs/org --create-frame $@</span>
1041<span class="org-string">''</span>;
1042</pre>
1043</div>
1044
1045<p>
1046<code>ec</code> will start an emacs termimal frame from the emacs org server.
1047</p>
1048
1049<div class="org-src-container">
1050<pre class="src src-nix" id="org0e23849"><span class="org-nix-attribute">et</span> = pkgs.writeScriptBin <span class="org-string">"et"</span> <span class="org-string">''</span>
1051<span class="org-string">  #!</span><span class="org-nix-antiquote">${</span>pkgs.stdenv.shell<span class="org-nix-antiquote">}</span>
1052<span class="org-string">  emacsclient -s /run/user/1000/emacs/org --tty $@</span>
1053<span class="org-string">''</span>;
1054</pre>
1055</div>
1056</div>
1057</div>
1058<div id="outline-container-portable%20dump%20command" class="outline-4">
1059<h4 id="portable%20dump%20command">portable dump command</h4>
1060<div class="outline-text-4" id="text-portable%20dump%20command">
1061<p>
1062<code>e</code> starts emacs using the portable dump.
1063</p>
1064
1065<div class="org-src-container">
1066<pre class="src src-nix" id="org57c280a"><span class="org-nix-attribute">e</span> = pkgs.writeScriptBin <span class="org-string">"e"</span> <span class="org-string">''</span>
1067<span class="org-string">  #!</span><span class="org-nix-antiquote">${</span>pkgs.stdenv.shell<span class="org-nix-antiquote">}</span>
1068<span class="org-string">  emacs --dump-file=~/.config/emacs/emacs.pdmp $@</span>
1069<span class="org-string">''</span>;
1070</pre>
1071</div>
1072</div>
1073</div>
1074</div>
1075<div id="outline-container-Desktop%20files" class="outline-3">
1076<h3 id="Desktop%20files">Desktop files</h3>
1077<div class="outline-text-3" id="text-Desktop%20files">
1078<ul class="org-ul">
1079<li><p>
1080<code>org-protocol.desktop</code>: this register the org protocol in xdg.
1081</p>
1082<div class="org-src-container">
1083<pre class="src src-conf">[<span class="org-type">Desktop Entry</span>]
1084<span class="org-variable-name">Name</span>=org-protocol
1085<span class="org-variable-name">Exec</span>=emacsclient -s /run/user/1000/emacs/org -n %u
1086<span class="org-variable-name">Type</span>=Application
1087<span class="org-variable-name">Terminal</span>=false
1088<span class="org-variable-name">Categories</span>=System;
1089<span class="org-variable-name">MimeType</span>=x-scheme-handler/org-protocol;
1090</pre>
1091</div></li>
1092<li><p>
1093<code>ec.desktop</code>: this starts a new frame on the <code>org</code> daemon.
1094</p>
1095<div class="org-src-container">
1096<pre class="src src-conf">[<span class="org-type">Desktop Entry</span>]
1097<span class="org-variable-name">Name</span>=Emacs (client)
1098<span class="org-variable-name">Exec</span>=ec
1099<span class="org-variable-name">Type</span>=Application
1100<span class="org-variable-name">Terminal</span>=false
1101<span class="org-variable-name">Categories</span>=System;
1102<span class="org-variable-name">Icon</span>=emacs;
1103</pre>
1104</div></li>
1105<li><p>
1106<code>capture.desktop</code>: this runs the <code>capture</code> script above
1107</p>
1108<div class="org-src-container">
1109<pre class="src src-conf">[<span class="org-type">Desktop Entry</span>]
1110<span class="org-variable-name">Name</span>=Emacs capture
1111<span class="org-variable-name">Exec</span>=capture
1112<span class="org-variable-name">Type</span>=Application
1113<span class="org-variable-name">Terminal</span>=false
1114<span class="org-variable-name">Categories</span>=System;
1115<span class="org-variable-name">Icon</span>=emacs;
1116</pre>
1117</div></li>
1118</ul>
1119
1120<p>
1121And then, we need to link those up :
1122</p>
1123
1124<div class="org-src-container">
1125<pre class="src src-nix" id="orgc2dd4ea">home.file.<span class="org-string">".local/share/applications/org-protocol.desktop"</span>.<span class="org-nix-attribute">source</span> = <span class="org-nix-constant">./emacs/org-protocol.desktop</span>;
1126home.file.<span class="org-string">".local/share/applications/ec.desktop"</span>.<span class="org-nix-attribute">source</span> = <span class="org-nix-constant">./emacs/ec.desktop</span>;
1127home.file.<span class="org-string">".local/share/applications/capture.desktop"</span>.<span class="org-nix-attribute">source</span> = <span class="org-nix-constant">./emacs/capture.desktop</span>;
1128</pre>
1129</div>
1130</div>
1131</div>
1132<div id="outline-container-Home%20packages" class="outline-3">
1133<h3 id="Home%20packages">Home packages</h3>
1134<div class="outline-text-3" id="text-Home%20packages">
1135<p>
1136We need to install a few packages:
1137</p>
1138<ul class="org-ul">
1139<li><code>ditaa</code> and <code>graphiz</code> are there for org-mode and org-babel</li>
1140<li><code>pandoc</code> is for when I when to migrate a document from markdown to org-mode or the opposite</li>
1141<li><code>sqlite</code> is for packages like <code>forge</code></li>
1142<li><code>zip</code> is… always useful</li>
1143<li><code>capture</code> is the script defined abovoe.</li>
1144</ul>
1145
1146<div class="org-src-container">
1147<pre class="src src-nix" id="org510ed39"><span class="org-nix-attribute">home.packages</span> = <span class="org-nix-keyword">with</span> pkgs; [
1148  ditaa
1149  graphviz
1150  pandoc
1151  sqlite
1152  zip
1153  <span class="org-comment"># See if I can hide this under an option</span>
1154  capture
1155  e
1156  ec
1157  et
1158];
1159</pre>
1160</div>
1161</div>
1162</div>
1163<div id="outline-container-%3Dprograms.emacs%3D" class="outline-3">
1164<h3 id="%3Dprograms.emacs%3D"><code>programs.emacs</code></h3>
1165<div class="outline-text-3" id="text-%3Dprograms.emacs%3D">
1166<p>
1167<code>home-manager</code> comes with a modules named <code>programs.emacs</code>, so we are going to use it
1168</p>
1169
1170<div class="org-src-container">
1171<pre class="src src-nix" id="orgbf89d90"><span class="org-nix-attribute">programs.emacs</span> = {
1172  <span class="org-nix-attribute">enable</span> = <span class="org-nix-builtin">true</span>;
1173  <span class="org-nix-attribute">package</span> = pkgs.my.emacs;
1174  <span class="org-nix-attribute">extraPackages</span> = myExtraPackages;
1175};
1176</pre>
1177</div>
1178
1179<div class="org-src-container">
1180<pre class="src src-nix" id="orga8af183"><span class="org-nix-attribute">myExtraPackages</span> = epkgs: <span class="org-nix-keyword">with</span> epkgs; [
1181  ace-window
1182  aggressive-indent
1183  async
1184  avy
1185  bbdb
1186  beginend
1187  color-identifiers-mode
1188  company
1189  company-emoji
1190  company-go
1191  dash
1192  delight
1193  diredfl
1194  dired-collapse
1195  dired-git-info
1196  dired-narrow
1197  dired-quick-sort
1198  dired-rsync
1199  dired-subtree
1200  dockerfile-mode
1201  dumb-jump
1202  easy-kill
1203  edit-indirect
1204  envrc
1205  esh-autosuggest
1206  eshell-prompt-extras
1207  esup
1208  expand-region
1209  flimenu
1210  flycheck
1211  flycheck-golangci-lint
1212  git-annex
1213  git-commit
1214  gitattributes-mode
1215  gitconfig-mode
1216  github-review
1217  gitignore-mode
1218  go-mode
1219  go-stacktracer
1220  gotest
1221  goto-last-change
1222  hardhat
1223  helpful
1224  highlight
1225  highlight-indentation
1226  highlight-numbers
1227  ibuffer-vc
1228  icomplete-vertical
1229  iedit
1230  json-mode
1231  magit
1232  magit-annex
1233  magit-popup
1234  magit-todos
1235  markdown-mode
1236  minions
1237  modus-operandi-theme
1238  moody
1239  mwim
1240  nix-buffer
1241  nix-mode
1242  nixpkgs-fmt
1243  no-littering
1244  ob-async
1245  ob-go
1246  ob-http
1247  olivetti
1248  orderless
1249  org-capture-pop-frame
1250  org-gcal
1251  org-journal
1252  org-plus-contrib
1253  org-ql
1254  org-ref
1255  org-roam
1256  org-super-agenda
1257  org-superstar
1258  org-tree-slide
1259  org-web-tools
1260  orgit
1261  ox-pandoc
1262  pandoc-mode
1263  pdf-tools
1264  pkgs.bookmark-plus
1265  pkgs.dired-plus
1266  projectile
1267  python-mode
1268  rainbow-delimiters
1269  rainbow-mode
1270  rg
1271  ripgrep
1272  scratch
1273  shr-tag-pre-highlight
1274  smartparens
1275  symbol-overlay
1276  trashed
1277  try
1278  undo-tree
1279  use-package
1280  visual-fill-column
1281  visual-regexp
1282  vterm
1283  web-mode
1284  wgrep
1285  whole-line-or-region
1286  with-editor
1287  xterm-color
1288  yaml-mode
1289];
1290</pre>
1291</div>
1292</div>
1293</div>
1294<div id="outline-container-Emacs%20%2Fserver%2F" class="outline-3">
1295<h3 id="Emacs%20%2Fserver%2F">Emacs <i>server</i></h3>
1296<div class="outline-text-3" id="text-Emacs%20%2Fserver%2F">
1297<div class="org-src-container">
1298<pre class="src src-nix" id="orgd367796"><span class="org-nix-attribute">services.emacs-server</span> = {
1299  <span class="org-nix-attribute">enable</span> = <span class="org-nix-builtin">true</span>;
1300  <span class="org-nix-attribute">package</span> = pkgs.my.emacs;
1301  <span class="org-nix-attribute">name</span> = <span class="org-string">"org"</span>;
1302  <span class="org-nix-attribute">shell</span> = pkgs.zsh + <span class="org-string">"/bin/zsh -i -c"</span>;
1303  <span class="org-comment"># FIXME do this in the derivation :)</span>
1304  <span class="org-comment"># extraOptions = "--dump-file=${config.home.homeDirectory}/.config/emacs/emacs.pdmp";</span>
1305};
1306</pre>
1307</div>
1308</div>
1309</div>
1310<div id="outline-container-Commands%20and%20sessions%20variables" class="outline-3">
1311<h3 id="Commands%20and%20sessions%20variables">Commands and sessions variables</h3>
1312<div class="outline-text-3" id="text-Commands%20and%20sessions%20variables">
1313<p>
1314Let&rsquo;s define some useful <i>commands</i> that can be used
1315</p>
1316
1317<p>
1318Let&rsquo;s define some
1319</p>
1320</div>
1321</div>
1322<div id="outline-container-Legacy" class="outline-3">
1323<h3 id="Legacy">Legacy</h3>
1324<div class="outline-text-3" id="text-Legacy">
1325<div class="org-src-container">
1326<pre class="src src-nix" id="org094b625"><span class="org-nix-attribute">home.sessionVariables</span> = {
1327  <span class="org-nix-attribute">EDITOR</span> = <span class="org-string">"et"</span>;
1328  <span class="org-nix-attribute">ALTERNATE_EDITOR</span> = <span class="org-string">"et"</span>;
1329};
1330</pre>
1331</div>
1332</div>
1333</div>
1334<div id="outline-container-Configuration%20layout" class="outline-3">
1335<h3 id="Configuration%20layout">Configuration layout</h3>
1336<div class="outline-text-3" id="text-Configuration%20layout">
1337<p>
1338Here we define the <code>emacs.nix</code> file that gets generated by the source blocks in our Org
1339document. This is the file that actually gets loaded on startup. The placeholders in
1340angled brackets correspond to the <code>NAME</code> directives above the <code>SRC</code> blocks throughout this
1341document.
1342</p>
1343
1344<div class="org-src-container">
1345<pre class="src src-nix"><span class="org-comment-delimiter"># </span><span class="org-comment">Note: this file is autogenerated from an org-mode file.</span>
1346{ config, lib, pkgs, ... }:
1347
1348<span class="org-nix-keyword">with</span> lib;
1349<span class="org-nix-keyword">let</span>
1350  &lt;<span class="org-nix-constant">&lt;script-capture&gt;</span>&gt;
1351  &lt;<span class="org-nix-constant">&lt;script-e&gt;</span>&gt;
1352  &lt;<span class="org-nix-constant">&lt;script-et&gt;</span>&gt;
1353  &lt;<span class="org-nix-constant">&lt;script-ec&gt;</span>&gt;
1354  &lt;<span class="org-nix-constant">&lt;myExtraPackages&gt;</span>&gt;
1355<span class="org-nix-keyword">in</span>
1356{
1357  &lt;<span class="org-nix-constant">&lt;desktop-files&gt;</span>&gt;
1358  &lt;<span class="org-nix-constant">&lt;packages&gt;</span>&gt;
1359  &lt;<span class="org-nix-constant">&lt;programs.emacs&gt;</span>&gt;
1360  &lt;<span class="org-nix-constant">&lt;emacs-server&gt;</span>&gt;
1361  &lt;<span class="org-nix-constant">&lt;legacy&gt;</span>&gt;
1362}
1363</pre>
1364</div>
1365</div>
1366</div>
1367</section>
1368<section id="outline-container-Inspirations" class="outline-2">
1369<h2 id="Inspirations">Inspirations</h2>
1370<div class="outline-text-2" id="text-Inspirations">
1371<p>
1372This is inspired by a crazy amount of configurations (litterate or note):
1373</p>
1374
1375<ul class="org-ul">
1376<li><a href="https://protesilaos.com/dotemacs/">Protesilaos Stravou&rsquo;s dotemacs</a></li>
1377<li><a href="https://tecosaur.github.io/emacs-config/config.html">Doom Emacs Configuration</a> from <a href="https://github.com/tecosaur">tecosaur</a></li>
1378<li><a href="https://gitlab.com/ndw/dotfiles">https://gitlab.com/ndw/dotfiles</a></li>
1379<li><a href="https://github.com/MatthewZMD/.emacs.d">https://github.com/MatthewZMD/.emacs.d</a></li>
1380<li><a href="https://github.com/alhassy/emacs.d">https://github.com/alhassy/emacs.d</a></li>
1381<li><a href="https://github.com/chmouel/emacs-config">https://github.com/chmouel/emacs-config</a></li>
1382<li><a href="https://github.com/seagle0128/.emacs.d">https://github.com/seagle0128/.emacs.d</a></li>
1383<li><a href="https://github.com/hlissner/doom-emacs">https://github.com/hlissner/doom-emacs</a></li>
1384<li><a href="http://doc.norang.ca/org-mode.html">http://doc.norang.ca/org-mode.html</a></li>
1385</ul>
1386
1387<p>
1388And also:
1389</p>
1390
1391<ul class="org-ul">
1392<li><a href="https://sriramkswamy.github.io/dotemacs/">Emacs configuration file</a></li>
1393<li><a href="https://blog.d46.us/advanced-emacs-startup/">Advanced Techniques for Reducing Emacs Startup Time</a></li>
1394<li><a href="https://www.bartuka.com/posts/emacs-config/index.html">@bartuka: emacs.d</a></li>
1395<li><a href="http://www.howardism.org/Technical/Emacs/getting-boxes-done.html">Getting Boxes Done</a></li>
1396<li><a href="https://idiocy.org/emacs-fonts-and-fontsets.html">Emacs, fonts and fontsets</a></li>
1397<li><a href="https://spin.atomicobject.com/2016/05/27/write-emacs-package/">A Simple Guide to Writing &amp; Publishing Emacs Packages</a></li>
1398<li><a href="https://alphapapa.github.io/emacs-package-dev-handbook/">The Emacs Package Developer&rsquo;s Handbook</a></li>
1399<li><a href="https://tecosaur.github.io/emacs-config/config.html">Doom Emacs Configuration</a></li>
1400</ul>
1401</div>
1402</section>
1403<section id="outline-container-Links" class="outline-2">
1404<h2 id="Links">Links</h2>
1405<div class="outline-text-2" id="text-Links">
1406<p>
1407Here is a compilation of <i>random</i> articles around GNU/Emacs that I found interesting to
1408share. I may add comment on those too.
1409</p>
1410</div>
1411<div id="outline-container-%5B%5Bhttps%3A%2F%2Faliquote.org%2Fpost%2Fminimalist-emacs%2F%5D%5BMinimalist%20Emacs%20-%20aliquot%EF%A3%BF%5D%5D" class="outline-3">
1412<h3 id="%5B%5Bhttps%3A%2F%2Faliquote.org%2Fpost%2Fminimalist-emacs%2F%5D%5BMinimalist%20Emacs%20-%20aliquot%EF%A3%BF%5D%5D"><a href="https://aliquote.org/post/minimalist-emacs/">Minimalist Emacs - aliquot</a></h3>
1413<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Faliquote.org%2Fpost%2Fminimalist-emacs%2F%5D%5BMinimalist%20Emacs%20-%20aliquot%EF%A3%BF%5D%5D">
1414<p>
1415<span class="timestamp-wrapper"><span class="timestamp">[2020-09-17 Thu 17:55]</span></span>
1416</p>
1417</div>
1418</div>
1419<div id="outline-container-%5B%5Bhttps%3A%2F%2Fgithub.com%2Fkensanata%2Fggg%23gmail-gnus-gpg-guide-gggg%5D%5Bkensanata%2Fggg%3A%20Gmail%2C%20Gnus%20and%20GPG%5D%5D" class="outline-3">
1420<h3 id="%5B%5Bhttps%3A%2F%2Fgithub.com%2Fkensanata%2Fggg%23gmail-gnus-gpg-guide-gggg%5D%5Bkensanata%2Fggg%3A%20Gmail%2C%20Gnus%20and%20GPG%5D%5D"><a href="https://github.com/kensanata/ggg#gmail-gnus-gpg-guide-gggg">kensanata/ggg: Gmail, Gnus and GPG</a></h3>
1421<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fgithub.com%2Fkensanata%2Fggg%23gmail-gnus-gpg-guide-gggg%5D%5Bkensanata%2Fggg%3A%20Gmail%2C%20Gnus%20and%20GPG%5D%5D">
1422<p>
1423<span class="timestamp-wrapper"><span class="timestamp">[2020-07-08 Wed 07:37]</span></span>
1424</p>
1425</div>
1426</div>
1427<div id="outline-container-%5B%5Bhttps%3A%2F%2Fwww.greghendershott.com%2F2017%2F02%2Femacs-themes.html%5D%5BEmacs%20Themes%5D%5D" class="outline-3">
1428<h3 id="%5B%5Bhttps%3A%2F%2Fwww.greghendershott.com%2F2017%2F02%2Femacs-themes.html%5D%5BEmacs%20Themes%5D%5D"><a href="https://www.greghendershott.com/2017/02/emacs-themes.html">Emacs Themes</a></h3>
1429<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fwww.greghendershott.com%2F2017%2F02%2Femacs-themes.html%5D%5BEmacs%20Themes%5D%5D">
1430<p>
1431<span class="timestamp-wrapper"><span class="timestamp">[2020-06-02 Tue 18:07]</span></span>
1432</p>
1433</div>
1434</div>
1435<div id="outline-container-%5B%5Bhttps%3A%2F%2Fdegruchy.org%2F2020%2F05%2F26%2Fbinding-emacs%2F%5D%5BBinding%20Emacs%20%E2%80%93%20Verily%5D%5D" class="outline-3">
1436<h3 id="%5B%5Bhttps%3A%2F%2Fdegruchy.org%2F2020%2F05%2F26%2Fbinding-emacs%2F%5D%5BBinding%20Emacs%20%E2%80%93%20Verily%5D%5D"><a href="https://degruchy.org/2020/05/26/binding-emacs/">Binding Emacs – Verily</a></h3>
1437<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fdegruchy.org%2F2020%2F05%2F26%2Fbinding-emacs%2F%5D%5BBinding%20Emacs%20%E2%80%93%20Verily%5D%5D">
1438<p>
1439<span class="timestamp-wrapper"><span class="timestamp">[2020-06-02 Tue 18:04]</span></span>
1440</p>
1441</div>
1442</div>
1443<div id="outline-container-%5B%5Bhttps%3A%2F%2Fmihaiolteanu.me%2Feshell-toggle%2F%5D%5BHow%20to%20create%20and%20jump%20to%20eshell%20buffers%20with%20a%20single%20command%5D%5D" class="outline-3">
1444<h3 id="%5B%5Bhttps%3A%2F%2Fmihaiolteanu.me%2Feshell-toggle%2F%5D%5BHow%20to%20create%20and%20jump%20to%20eshell%20buffers%20with%20a%20single%20command%5D%5D"><a href="https://mihaiolteanu.me/eshell-toggle/">How to create and jump to eshell buffers with a single command</a></h3>
1445<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fmihaiolteanu.me%2Feshell-toggle%2F%5D%5BHow%20to%20create%20and%20jump%20to%20eshell%20buffers%20with%20a%20single%20command%5D%5D">
1446<p>
1447<span class="timestamp-wrapper"><span class="timestamp">[2020-05-29 Fri 15:05]</span></span>
1448</p>
1449</div>
1450</div>
1451<div id="outline-container-%5B%5Bhttps%3A%2F%2Fwww.reddit.com%2Fr%2Femacs%2Fcomments%2Ffk7p49%2Fpiping_stdout_to_emacs%2F%5D%5BPiping%20stdout%20to%20Emacs%20%3A%20emacs%5D%5D" class="outline-3">
1452<h3 id="%5B%5Bhttps%3A%2F%2Fwww.reddit.com%2Fr%2Femacs%2Fcomments%2Ffk7p49%2Fpiping_stdout_to_emacs%2F%5D%5BPiping%20stdout%20to%20Emacs%20%3A%20emacs%5D%5D"><a href="https://www.reddit.com/r/emacs/comments/fk7p49/piping_stdout_to_emacs/">Piping stdout to Emacs : emacs</a>&#xa0;&#xa0;&#xa0;<span class="tag"><span class="emacs">emacs</span></span></h3>
1453<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fwww.reddit.com%2Fr%2Femacs%2Fcomments%2Ffk7p49%2Fpiping_stdout_to_emacs%2F%5D%5BPiping%20stdout%20to%20Emacs%20%3A%20emacs%5D%5D">
1454<p>
1455<span class="timestamp-wrapper"><span class="timestamp">[2020-03-24 Tue 07:54]</span></span>
1456</p>
1457</div>
1458</div>
1459<div id="outline-container-%5B%5Bhttps%3A%2F%2Fexplog.in%2Fnotes%2Fpoet.html%5D%5BMaking%20Poet%2C%20an%20Emacs%20theme%5D%5D" class="outline-3">
1460<h3 id="%5B%5Bhttps%3A%2F%2Fexplog.in%2Fnotes%2Fpoet.html%5D%5BMaking%20Poet%2C%20an%20Emacs%20theme%5D%5D"><a href="https://explog.in/notes/poet.html">Making Poet, an Emacs theme</a>&#xa0;&#xa0;&#xa0;<span class="tag"><span class="emacs">emacs</span></span></h3>
1461<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fexplog.in%2Fnotes%2Fpoet.html%5D%5BMaking%20Poet%2C%20an%20Emacs%20theme%5D%5D">
1462<p>
1463<span class="timestamp-wrapper"><span class="timestamp">[2020-03-25 Wed 16:58]</span></span>
1464</p>
1465</div>
1466</div>
1467<div id="outline-container-%5B%5Bhttps%3A%2F%2Fwillschenk.com%2Farticles%2F2020%2Ftramp_tricks%2F%5D%5BEmacs%20Tramp%20tricks%5D%5D" class="outline-3">
1468<h3 id="%5B%5Bhttps%3A%2F%2Fwillschenk.com%2Farticles%2F2020%2Ftramp_tricks%2F%5D%5BEmacs%20Tramp%20tricks%5D%5D"><a href="https://willschenk.com/articles/2020/tramp_tricks/">Emacs Tramp tricks</a>&#xa0;&#xa0;&#xa0;<span class="tag"><span class="emacs">emacs</span></span></h3>
1469<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fwillschenk.com%2Farticles%2F2020%2Ftramp_tricks%2F%5D%5BEmacs%20Tramp%20tricks%5D%5D">
1470<p>
1471<span class="timestamp-wrapper"><span class="timestamp">[2020-03-08 Sun 16:44]</span></span>
1472</p>
1473</div>
1474</div>
1475<div id="outline-container-%5B%5Bhttps%3A%2F%2Fazzamsa.com%2Fn%2Fscripts-el%2F%5D%5BUseful%20Emacs%20Lisp%20Scripts%C2%A0%F0%9F%8C%B1%20%C2%B7%20AZZAMSA%5D%5D" class="outline-3">
1476<h3 id="%5B%5Bhttps%3A%2F%2Fazzamsa.com%2Fn%2Fscripts-el%2F%5D%5BUseful%20Emacs%20Lisp%20Scripts%C2%A0%F0%9F%8C%B1%20%C2%B7%20AZZAMSA%5D%5D"><a href="https://azzamsa.com/n/scripts-el/">Useful Emacs Lisp Scripts 🌱 · AZZAMSA</a></h3>
1477<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fazzamsa.com%2Fn%2Fscripts-el%2F%5D%5BUseful%20Emacs%20Lisp%20Scripts%C2%A0%F0%9F%8C%B1%20%C2%B7%20AZZAMSA%5D%5D">
1478<p>
1479<span class="timestamp-wrapper"><span class="timestamp">[2020-06-18 Thu 18:41]</span></span>
1480</p>
1481</div>
1482</div>
1483<div id="outline-container-%5B%5Bhttps%3A%2F%2Femacsredux.com%2Fblog%2F2020%2F06%2F10%2Fcomment-commands-redux%2F%5D%5BComment%20Commands%20Redux%20%7C%20Emacs%20Redux%5D%5D" class="outline-3">
1484<h3 id="%5B%5Bhttps%3A%2F%2Femacsredux.com%2Fblog%2F2020%2F06%2F10%2Fcomment-commands-redux%2F%5D%5BComment%20Commands%20Redux%20%7C%20Emacs%20Redux%5D%5D"><a href="https://emacsredux.com/blog/2020/06/10/comment-commands-redux/">Comment Commands Redux | Emacs Redux</a>&#xa0;&#xa0;&#xa0;<span class="tag"><span class="emacs">emacs</span></span></h3>
1485<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Femacsredux.com%2Fblog%2F2020%2F06%2F10%2Fcomment-commands-redux%2F%5D%5BComment%20Commands%20Redux%20%7C%20Emacs%20Redux%5D%5D">
1486<p>
1487<span class="timestamp-wrapper"><span class="timestamp">[2020-06-23 Tue 17:45]</span></span>
1488</p>
1489</div>
1490</div>
1491<div id="outline-container-%5B%5Bhttps%3A%2F%2Fgithub.com%2FMatthewZMD%2F.emacs.d%5D%5BMatthewZMD%2F.emacs.d%3A%20M-EMACS%2C%20a%20full-feature%20GNU%20Emacs%20configuration%20distribution%5D%5D" class="outline-3">
1492<h3 id="%5B%5Bhttps%3A%2F%2Fgithub.com%2FMatthewZMD%2F.emacs.d%5D%5BMatthewZMD%2F.emacs.d%3A%20M-EMACS%2C%20a%20full-feature%20GNU%20Emacs%20configuration%20distribution%5D%5D"><a href="https://github.com/MatthewZMD/.emacs.d">MatthewZMD/.emacs.d: M-EMACS, a full-feature GNU Emacs configuration distribution</a></h3>
1493<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fgithub.com%2FMatthewZMD%2F.emacs.d%5D%5BMatthewZMD%2F.emacs.d%3A%20M-EMACS%2C%20a%20full-feature%20GNU%20Emacs%20configuration%20distribution%5D%5D">
1494<p>
1495<span class="timestamp-wrapper"><span class="timestamp">[2020-06-29 Mon 11:35]</span></span>
1496</p>
1497</div>
1498</div>
1499<div id="outline-container-%5B%5Bhttps%3A%2F%2Fwritequit.org%2Feos%2Feos.html%5D%5BThe%20Emacs%20Operating%20System%20%28EOS%29%5D%5D" class="outline-3">
1500<h3 id="%5B%5Bhttps%3A%2F%2Fwritequit.org%2Feos%2Feos.html%5D%5BThe%20Emacs%20Operating%20System%20%28EOS%29%5D%5D"><a href="https://writequit.org/eos/eos.html">The Emacs Operating System (EOS)</a></h3>
1501<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fwritequit.org%2Feos%2Feos.html%5D%5BThe%20Emacs%20Operating%20System%20%28EOS%29%5D%5D">
1502<p>
1503<span class="timestamp-wrapper"><span class="timestamp">[2020-07-02 Thu 18:20]</span></span>
1504</p>
1505</div>
1506</div>
1507<div id="outline-container-%5B%5Bhttps%3A%2F%2Fjustin.abrah.ms%2Fdotfiles%2Femacs.html%5D%5BMy%20Emacs%20Configuration%5D%5D" class="outline-3">
1508<h3 id="%5B%5Bhttps%3A%2F%2Fjustin.abrah.ms%2Fdotfiles%2Femacs.html%5D%5BMy%20Emacs%20Configuration%5D%5D"><a href="https://justin.abrah.ms/dotfiles/emacs.html">My Emacs Configuration</a></h3>
1509<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fjustin.abrah.ms%2Fdotfiles%2Femacs.html%5D%5BMy%20Emacs%20Configuration%5D%5D">
1510<p>
1511<span class="timestamp-wrapper"><span class="timestamp">[2020-07-15 Wed 12:29]</span></span>
1512</p>
1513</div>
1514</div>
1515<div id="outline-container-%5B%5Bhttps%3A%2F%2Fjakemccrary.com%2Fblog%2F2020%2F11%2F14%2Fspeeding-up-magit%2F%5D%5BSpeeding%20up%20magit%20-%20Jake%20McCrary%5D%5D" class="outline-3">
1516<h3 id="%5B%5Bhttps%3A%2F%2Fjakemccrary.com%2Fblog%2F2020%2F11%2F14%2Fspeeding-up-magit%2F%5D%5BSpeeding%20up%20magit%20-%20Jake%20McCrary%5D%5D"><a href="https://jakemccrary.com/blog/2020/11/14/speeding-up-magit/">Speeding up magit - Jake McCrary</a></h3>
1517<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fjakemccrary.com%2Fblog%2F2020%2F11%2F14%2Fspeeding-up-magit%2F%5D%5BSpeeding%20up%20magit%20-%20Jake%20McCrary%5D%5D">
1518<p>
1519<span class="timestamp-wrapper"><span class="timestamp">[2020-11-17 Tue 18:09]</span></span>
1520</p>
1521</div>
1522</div>
1523<div id="outline-container-%5B%5Bhttps%3A%2F%2Ftech.toryanderson.com%2F2020%2F11%2F13%2Fmigrating-to-a-custom-file-less-setup%2F%5D%5BMigrating%20to%20a%20custom-file-less%20setup%20%7C%20Tech.ToryAnderson.com%5D%5D" class="outline-3">
1524<h3 id="%5B%5Bhttps%3A%2F%2Ftech.toryanderson.com%2F2020%2F11%2F13%2Fmigrating-to-a-custom-file-less-setup%2F%5D%5BMigrating%20to%20a%20custom-file-less%20setup%20%7C%20Tech.ToryAnderson.com%5D%5D"><a href="https://tech.toryanderson.com/2020/11/13/migrating-to-a-custom-file-less-setup/">Migrating to a custom-file-less setup | Tech.ToryAnderson.com</a></h3>
1525<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Ftech.toryanderson.com%2F2020%2F11%2F13%2Fmigrating-to-a-custom-file-less-setup%2F%5D%5BMigrating%20to%20a%20custom-file-less%20setup%20%7C%20Tech.ToryAnderson.com%5D%5D">
1526<p>
1527<span class="timestamp-wrapper"><span class="timestamp">[2020-11-19 Thu 11:00]</span></span>
1528</p>
1529</div>
1530</div>
1531<div id="outline-container-%5B%5Bhttps%3A%2F%2Fwww.philnewton.net%2Fblog%2Fleanpub-with-emacs%2F%5D%5BWriting%20a%20Leanpub%20book%20with%20Emacs%20-%20philnewton.net%5D%5D" class="outline-3">
1532<h3 id="%5B%5Bhttps%3A%2F%2Fwww.philnewton.net%2Fblog%2Fleanpub-with-emacs%2F%5D%5BWriting%20a%20Leanpub%20book%20with%20Emacs%20-%20philnewton.net%5D%5D"><a href="https://www.philnewton.net/blog/leanpub-with-emacs/">Writing a Leanpub book with Emacs - philnewton.net</a></h3>
1533<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fwww.philnewton.net%2Fblog%2Fleanpub-with-emacs%2F%5D%5BWriting%20a%20Leanpub%20book%20with%20Emacs%20-%20philnewton.net%5D%5D">
1534<p>
1535<span class="timestamp-wrapper"><span class="timestamp">[2020-11-19 Thu 11:11]</span></span>
1536</p>
1537</div>
1538</div>
1539<div id="outline-container-%5B%5Bhttps%3A%2F%2Fen.liujiacai.net%2F2020%2F11%2F29%2Fwhy-emacs%2F%5D%5BWhat%20you%20need%20to%20know%20before%20try%20Emacs%20-%20KeepCoding%5D%5D" class="outline-3">
1540<h3 id="%5B%5Bhttps%3A%2F%2Fen.liujiacai.net%2F2020%2F11%2F29%2Fwhy-emacs%2F%5D%5BWhat%20you%20need%20to%20know%20before%20try%20Emacs%20-%20KeepCoding%5D%5D"><a href="https://en.liujiacai.net/2020/11/29/why-emacs/">What you need to know before try Emacs - KeepCoding</a></h3>
1541<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fen.liujiacai.net%2F2020%2F11%2F29%2Fwhy-emacs%2F%5D%5BWhat%20you%20need%20to%20know%20before%20try%20Emacs%20-%20KeepCoding%5D%5D">
1542<p>
1543<span class="timestamp-wrapper"><span class="timestamp">[2020-12-01 Tue 08:02]</span></span>
1544</p>
1545</div>
1546</div>
1547<div id="outline-container-%5B%5Bhttps%3A%2F%2Fgithub.com%2Frougier%2Fnano-emacs%5D%5Brougier%2Fnano-emacs%3A%20GNU%20Emacs%20%2F%20N%20%CE%9B%20N%20O%20-%20Emacs%20made%20simple%5D%5D" class="outline-3">
1548<h3 id="%5B%5Bhttps%3A%2F%2Fgithub.com%2Frougier%2Fnano-emacs%5D%5Brougier%2Fnano-emacs%3A%20GNU%20Emacs%20%2F%20N%20%CE%9B%20N%20O%20-%20Emacs%20made%20simple%5D%5D"><a href="https://github.com/rougier/nano-emacs">rougier/nano-emacs: GNU Emacs / N Λ N O - Emacs made simple</a></h3>
1549<div class="outline-text-3" id="text-%5B%5Bhttps%3A%2F%2Fgithub.com%2Frougier%2Fnano-emacs%5D%5Brougier%2Fnano-emacs%3A%20GNU%20Emacs%20%2F%20N%20%CE%9B%20N%20O%20-%20Emacs%20made%20simple%5D%5D">
1550<p>
1551<span class="timestamp-wrapper"><span class="timestamp">[2020-12-01 Tue 08:12]</span></span>
1552</p>
1553</div>
1554</div>
1555</section>
1556</main>
1557<footer id="postamble" class="status">
1558<footer>
1559     <small><a href="/" rel="history">Index</a> • <a href="/sitemap.html">Sitemap</a> • <a href="https://dl.sbr.pm/">Files</a></small><br/>
1560     <small class='questions'>Questions, comments ? Please use my <a href="https://lists.sr.ht/~vdemeester/public-inbox">public inbox</a> by sending a plain-text email to <a href="mailto:~vdemeester/public-inbox@lists.sr.ht">~vdemeester/public-inbox@lists.sr.ht</a>.</small><br/>
1561     <small class='copyright'>
1562      Content and design by Vincent Demeester
1563      (<a rel='licence' href='http://creativecommons.org/licenses/by-nc-sa/3.0/'>Some rights reserved</a>)
1564    </small><br />
1565</footer>
1566</footer>
1567</body>
1568</html>