sqrtminusone.github.io/posts/2023-04-13-emacs/index.html
2025-04-20 21:50:25 +00:00

214 lines
19 KiB
HTML

<!DOCTYPE html>
<html lang=""><head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>916 days of Emacs</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>
<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>
</nav>
</div>
<hr>
<div id="content">
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<script src="/js/chart.js"></script>
<script src="/js/chartjs-adapter-date-fns.bundle.min.js"></script>
<script src="/js/chartjs-plugin-datalabels.js"></script>
<script src="/js/2023-04-13-emacs.js"></script>
<div class="root">
<h1 id="title-small-screen">916 days of Emacs</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen">916 days of Emacs</h1>
<style>
.quote-title {
margin-left: 24px;
}
</style>
<blockquote>
<p>Poof I made my free-time disappear</p></blockquote>
<p class="quote-title">- <a href="https://elken.dev">Ellis Kenyő</a>, on being called an "elisp mage"
<p>Little did I know on the fateful day of <strong><span class="timestamp-wrapper"><span class="timestamp">[2020-10-09 Fri]</span></span></strong>, when I had installed <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a>. I wasn&rsquo;t thinking about the <a href="https://www.gnu.org/philosophy/philosophy.html">ethical aspects</a> of free software, the <a href="https://www.webofstories.com/play/marvin.minsky/44">aesthetics of Lisp</a>, or these other things with which an occasional layperson might explain how an almost <a href="https://www.jwz.org/doc/emacs-timeline.html">half a century old</a> program can still be in <a href="https://emacsconf.org/2022/talks/survey/">active use</a>.</p>
<p>In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes.</p>
<p>So over time, Emacs has become my programming environment, email client, window manager, knowledge base, <a href="https://sqrtminusone.xyz/configs/emacs/">and a lot more</a>. I think I ended up using Emacs for almost as many things as possible; I even authored a few packages that implement certain parts of my workflows that weren&rsquo;t readily available.</p>
<p>Among other things, the Emacs community is responsible for my introduction to <a href="https://zettelkasten.de/">Zettelkasten</a>, RSS, Lisps&hellip; Perhaps even my English became slightly less broken because Emacs is so text-centered. A lot has changed over the course of these short 2.5 years.</p>
<p>Anyway, this post is an attempt to quantify some aspects of that story. The numbers mostly come from projects called <a href="https://activitywatch.net/">ActivityWatch</a> and <a href="https://wakatime.com/">WakaTime</a>.</p>
<p>Mostly I&rsquo;m curious myself, but also every now and then I see Emacs people discussing their journeys through the Elisp-land, or a potential convert wondering whether this rabbit hole is worth investigating. If any of this applies to you, you might find something interesting in this document.</p>
<noscript>
Also, I use a lot of JavaScript here, but it's all open source. The only 3rd party library is the MIT-licensed <a href="https://www.chartjs.org/">chart.js</a>. So you need to enable JavaScript if you want to see the charts and some of the numbers that are dynamically calculated.
</noscript>
<h2 id="everything-goes-into-emacs">Everything goes into Emacs</h2>
<p>As I mentioned earlier, I use Emacs for a lot of things, which are described in my <a href="https://sqrtminusone.xyz/configs/emacs/#introduction">Emacs config</a>. Fig. 1 shows how Emacs replaced various programs over time.</p>
<canvas id="chart-emacs-history">
<p>Also, unfortunately this post turned out to be rather inaccessible for those reading that with a screen-reader. I guess, if that applies to you, just mentally skip the figure references.</p>
<p>I did try to describe what's going on in these in the post body.</p>
</canvas>
<p>As you can see, I used Neovim for a little over a year. We&rsquo;ll get into some numbers on that later.</p>
<p>The process of moving from knowing nothing about Emacs to using EXWM took about 13 months.</p>
<p>Fig. 2 shows the dynamics of the direct screen time ratio spent in Emacs per month, i.e. the average number of non-AFK seconds in the Emacs window.</p>
<p><canvas id="chart-emacs-screen-time"></canvas></p>
<p>It&rsquo;s hard to discern any general trend here. It appears that the ratio started at 0.2 in October 2020, oscillated around 0.3 for about 7 months, then moved closer to 0.4 until January 2023, after which jumped to 0.45-0.5.</p>
<p>The three peaks in September 2021 (0.526), January 2022 (0.532), and August 2022 (0.568) may correspond to my vacations, during which I didn&rsquo;t have to spend time in Chrome DevTools (I do web development as my &ldquo;primary&rdquo; job), but I&rsquo;m not entirely sure.</p>
<p>The jump in January 2023 definitely matches my adoption of <a href="https://github.com/zevlg/telega.el">telega.el</a> instead of the official desktop client. The time redistributes rather cleanly in the detailed ActivityWatch data.</p>
<p>It&rsquo;s also interesting that switching from <a href="https://i3wm.org/">i3</a> to <a href="https://github.com/ch11ng/exwm">EXWM</a> didn&rsquo;t seem to have any distinguishable effects.</p>
<p>The mean Emacs screen time ratios are 0.39 since October 2020 and 0.47 since January 2023. So, as you might infer, Emacs is quite prominent in my PC usage.</p>
<h2 id="time-spent-in-emacs">Time spent in Emacs</h2>
<p>Now let&rsquo;s examine the structure of time spent in Emacs. Fig. 3 shows how many Emacs-hours per month I spent on different activities, and Fig. 4 shows the same in stacked form.</p>
<p>Unlike Fig. 2, the time here is calculated with a 15-minute timeout preference, as <a href="https://wakatime.com/faq#timeout">it&rsquo;s done in WakaTime</a>. For instance, if I work on a project in Emacs for 10 minutes, then switch to something else for 10 minutes (i.e. no <a href="https://wakatime.com/developers/#heartbeats">heartbeats</a> recorded during that time), then return to the project another 10 minutes, this will be counted as 30 minutes in that project.</p>
<p>This is mostly so because it&rsquo;s the default format for the <a href="https://wakatime.com/faq#exporting">WakaTime export</a>, but I also believe it&rsquo;s reasonable since I may open package documentation during configuration, experiment in scratch buffers while working on a package, and so on. This time really has to be included in the final tally.</p>
<p>Of course, this will also include all the times I was distracted by the <a href="https://wiki.systemcrafters.net/community/chat-with-us/">System Crafters</a> Discord server, <a href="https://emacs.ch/">emacs.ch</a> Mastodon instance, or whatever else. Therefore, consider the numbers that follow as an upper bound.</p>
<p><canvas id="chart-emacs-time"></canvas></p>
<p><canvas id="chart-emacs-time-stacked"></canvas></p>
<p>The categories are as follows:</p>
<ul>
<li><strong>Config</strong> (<span data-num="config_hours_total">[REDACTED]</span> total hours, <span data-num="config_hours_percent">[REDACTED]</span>% of all time)<br />
Time spent on actual Emacs configuration.</li>
<li><strong>Emacs Packages</strong> (<span data-num="package_hours_total">[REDACTED]</span> total hours, <span data-num="package_hours_percent">[REDACTED]</span>% of all time)<br />
Time spent in other Emacs Lisp files, such as writing my packages or debugging other packages. See the <a href="#emacs-packages">packages</a> section.</li>
<li><strong>Org Mode</strong> (<span data-num="orgmode_hours_total">[REDACTED]</span> total hours, <span data-num="orgmode_hours_percent">[REDACTED]</span>% of all time)<br />
Time spent in my <code>org-mode</code> project, which is mostly <a href="https://github.com/bastibe/org-journal">org-journal</a>, <a href="https://www.orgroam.com/">org-roam</a>, and project management. By the way, guess the month in which I read <a href="https://www.soenkeahrens.de/en/takesmartnotes">Sönke Ahrens&rsquo; book</a> about Zettelkasten.</li>
<li><strong>sqrtminusone.xyz</strong> (<span data-num="sqrt_hours_total">[REDACTED]</span> total hours, <span data-num="sqrt_hours_percent">[REDACTED]</span>% of all time)<br />
Working on this strange little website.</li>
<li><strong>Other Code</strong> (<span data-num="other_code_hours_total">[REDACTED]</span> total hours, <span data-num="other_code_hours_percent">[REDACTED]</span>% of all time)<br />
Doing something marginally useful in Emacs, which is mostly work, education, and a few personal projects unrelated to Emacs.</li>
<li><strong>Misc</strong> (<span data-num="misc_hours_total">[REDACTED]</span> total hours, <span data-num="misc_hours_percent">[REDACTED]</span>% of all time)
Time spent in Emacs but not in an actual project (i.e. accounted by the <a href="https://github.com/ActivityWatch/aw-watcher-window">window watcher</a> of ActivityWatch but not WakaTime, which watches for files). That includes reading RSS, writing emails, using messengers, doing some idle experimentation in scratch buffers, etc.</li>
</ul>
<p>The <span data-num="config_hours_percent">[REDACTED]</span>% of time spent on configuration is actually less than I expected. Unsurprisingly, the first month had the highest value of around 20% (I used Emacs without WakaTime for a few days).</p>
<p>By the way, I spent just 39.0 hours configuring Neovim, although the number is probably not representative anymore because Neovim has changed a lot over these 2 years.</p>
<h2 id="switching-from-neovim">Switching from Neovim</h2>
<p>The period of my transition from Neovim to Emacs seems particularly interesting. Fig 5 zooms in on that, with the switch represented by &ldquo;Other Code (Emacs)&rdquo; replacing &ldquo;Other Code (Vim)&rdquo;.</p>
<p><canvas id="chart-emacs-vim-switch"></canvas></p>
<p>It appears that getting from zero to somewhat productive took me about 11.1 hours over 4 days of just experimenting with Emacs, and one day with 3.8 hours on configuring and 4.4 hours on coding, apparently alternating between the two.</p>
<h2 id="configuration">Configuration</h2>
<p>Now, let&rsquo;s examine where these <span data-num="config_hours_total">[REDACTED]</span> config hours went.</p>
<p>Configuration sizes are a common topic of discussion among Emacs users. I&rsquo;d guess that mine falls into the category of the longest, although maybe I&rsquo;ll do some research on that someday. Fig. 6 shows how my configuration size changed over time.</p>
<p><canvas id="chart-emacs-config-size"></canvas></p>
<p>So, my Emacs.org is <span data-num="emacs_org_length">[REDACTED]</span> lines long, and the resulting init.el is <span data-num="init_el_length">[REDACTED]</span> lines long.</p>
<p>As you can see, I switched to <a href="https://leanpub.com/lit-config">literate configuration</a> pretty early on, and so far, I have not regretted it. It&rsquo;s also interesting to note how the two sizes diverged as I was writing more elaborate commentary.</p>
<p>Also, I never had any substantial issues with maintaining that configuration. Perhaps <a href="https://www.emacswiki.org/emacs/DotEmacsBankruptcy">Emacs Bankruptcies</a> are just not that common nowadays.</p>
<p>For the sake of completeness, let&rsquo;s compare that to my Neovim usage. Fig. 7 shows the dynamics of config size for the first 400 days of using both programs.</p>
<p><canvas id="chart-emacs-vim-config-size"></canvas></p>
<p>As I previously mentioned, Neovim (or rather its ecosystem) seems to have undergone significant changes since I last used it, so my number of <span data-num="init_vim_length">[REDACTED]</span> init.vim lines may no longer be relevant. Nonetheless, it&rsquo;s quite interesting.</p>
<h2 id="emacs-packages">Emacs packages</h2>
<p>Working with Emacs packages was an interesting experience, not least because it was my first experience with Lisp. Fig. 8 shows the breakdown of the <span data-num="package_hours_total">[REDACTED]</span> hours I spent on that.</p>
<p><canvas id="chart-emacs-packages"></canvas></p>
<p>As I expected, my <a href="https://github.com/SqrtMinusOne/org-journal-tags">org-journal-tags</a> tops the chart with <span data-num="org-journal-tags_total">[REDACTED]</span> hours. The most interesting part was implementing set logic on the <a href="https://github.com/bastibe/org-journal">org-journal</a> entities to create a query engine. I&rsquo;m fairly certain that I&rsquo;m the only user of this package, but I use it all the time.</p>
<p>The second place, &ldquo;Unknown project&rdquo;, stands for Emacs Lisp files that didn&rsquo;t belong to any project, which should be mostly built-in Emacs files.</p>
<p>My <a href="https://github.com/SqrtMinusOne/elfeed-summary">elfeed-summary</a> (<span data-num="elfeed-summary_total">[REDACTED]</span> hours), <a href="https://github.com/SqrtMinusOne/lyrics-fetcher.el">lyrics-fetcher</a> (<span data-num="lyrics-fetcher_total">[REDACTED]</span> hours), and <a href="https://github.com/SqrtMinusOne/reverso.el">reverso</a> (<span data-num="reverso_total">[REDACTED]</span> hours) are also among the packages that I use almost daily. Thus, I do not regret investing time in developing any of those.</p>
<h2 id="org-roam"><code>org-roam</code></h2>
<p>It&rsquo;s not directly related to Emacs, but I include it here because it&rsquo;s highly unlikely that I would have heard the term &ldquo;Zettelkasten&rdquo; outside the Emacs space.</p>
<p>I already mentioned <a href="https://www.soenkeahrens.de/en/takesmartnotes">Sönke Ahrens&rsquo; book</a>, but I believe the website <a href="https://zettelkasten.de/posts/overview/">zettelkasten.de</a> would be a better resource if you are curious about that. And I was initially made curious by <a href="https://www.youtube.com/watch?v=-TpWahIzueg">this stream</a> of David Wilson.</p>
<p>Anyway, Fig. 9 shows the dynamics of my <a href="https://github.com/org-roam/org-roam">org-roam</a> node count over time. A significant fraction of my <span data-num="orgmode_hours_total">[REDACTED]</span> hours spent on Org Mode went there. Although I don&rsquo;t have any particular goals in this regard.</p>
<p><canvas id="chart-roam-nodes"></canvas></p>
<h2 id="some-observations">Some observations</h2>
<p>Let&rsquo;s see where all of that leads us.</p>
<p>As I said, I started from the point of zero experience with Lisp. I had a degree in software engineering, but I don&rsquo;t feel like it has helped me in any direct sense. At most, it exposed me to different kinds and concepts of programming, but I am confident that it&rsquo;s anything but a prerequisite, as also shown by the story of <a href="https://protesilaos.com/">Protesilaos</a>.</p>
<p>The number of <span data-num="config_hours_total">[REDACTED]</span> total hours of configuration may seem huge, but I don&rsquo;t think it&rsquo;s that much over 2.5 years and in comparison to the alternatives. For instance, it would take 6th place from the top if placed among my job projects. Also, my <a href="https://antennapod.org/">AntennaPod</a> shows 196.9 hours of podcasts played since December 2021, and some of my friends report having spent thousands of hours on video games.</p>
<p>And keep in mind that I use Emacs almost as extensively as it gets. You might as well spend much less time figuring it out for a more minimal use case. So, at least in my view, this weighs against describing Emacs usage in terms of sunk cost fallacy.</p>
<p>However, my story is consistent with the perception of a <a href="https://stackoverflow.com/questions/10942008/what-does-emacs-learning-curve-actually-look-like">steep learning curve</a> in the Emacs community. 19.3 hours over 5 days to get started is definitely a lot.</p>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#everything-goes-into-emacs">Everything goes into Emacs</a></li>
<li><a href="#time-spent-in-emacs">Time spent in Emacs</a></li>
<li><a href="#switching-from-neovim">Switching from Neovim</a></li>
<li><a href="#configuration">Configuration</a></li>
<li><a href="#emacs-packages">Emacs packages</a></li>
<li><a href="#org-roam"><code>org-roam</code></a></li>
<li><a href="#some-observations">Some observations</a></li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">
<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, 2024"><small>Pavel Korytov, 2024</small></a>
</div>
</div>
</body>
</html>