<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>The Emacs Cat</title>
    <link>https://olddeuteronomy.github.io/</link>
    <description>Recent content on The Emacs Cat</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 04 Mar 2026 09:16:11 +0100</lastBuildDate>
    <atom:link href="https://olddeuteronomy.github.io/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Emacs, Software Development, and LLM</title>
      <link>https://olddeuteronomy.github.io/post/emacs-software-development-and-llm/</link>
      <pubDate>Wed, 04 Mar 2026 09:16:11 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/emacs-software-development-and-llm/</guid>
      <description>&lt;h2 id=&#34;part-1-emacs-and-software-development&#34;&gt;Part 1. Emacs and Software Development&lt;/h2&gt;&#xA;&lt;p&gt;Just a couple of days ago, I published on GitHub my first open-source&#xA;project, the &lt;a href=&#34;https://github.com/olddeuteronomy/tec&#34;&gt;TEC library&lt;/a&gt;, a&#xA;lightweight and fast C++ framework designed for efficient performance&#xA;in resource-constrained concurrent environments.&lt;/p&gt;&#xA;&lt;p&gt;This project marks an important milestone for me as a die-hard Emacs&#xA;user because the entire development was carried out &lt;em&gt;completely&lt;/em&gt; in&#xA;Emacs without using any specialized IDE.&lt;/p&gt;&#xA;&lt;p&gt;The following Emacs packages and tools were used:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Writing code: &lt;code&gt;eglot&lt;/code&gt; for code completion, built-in &lt;code&gt;ibuffer&lt;/code&gt; for&#xA;buffer grouping and navigation, and &lt;code&gt;imenu-list&lt;/code&gt; for code navigation&#xA;in the current buffer (see my post on &lt;a href=&#34;https://olddeuteronomy.github.io/post/cpp-programming-in-emacs/&#34;&gt;C++ Programming in&#xA;Emacs&lt;/a&gt;).&lt;/li&gt;&#xA;&lt;li&gt;Keeping notes, ideas, ToDo lists, and any project-related textual&#xA;information in &lt;a href=&#34;https://orgmode.org/&#34;&gt;Org Mode&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Debugging with&#xA;&lt;a href=&#34;https://emacs-lsp.github.io/dap-mode/page/configuration/#native_debugging&#34;&gt;dap-mode&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Testing samples with tracing output in&#xA;&lt;a href=&#34;https://www.gnu.org/software/emacs/manual/html_mono/eshell.html&#34;&gt;Eshell&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Writing various Markdown documents for publishing on GitHub.&lt;/li&gt;&#xA;&lt;li&gt;Many other things, like planning in&#xA;&lt;a href=&#34;https://orgmode.org/manual/Agenda-Views.html&#34;&gt;Agenda&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This has proved that it is possible to effectively manage &lt;em&gt;all the stages&lt;/em&gt;&#xA;of the software development process without leaving Emacs. I&amp;rsquo;m really happy with that.&lt;/p&gt;&#xA;&lt;h2 id=&#34;part-2-software-development-and-llm&#34;&gt;Part 2. Software Development and LLM&lt;/h2&gt;&#xA;&lt;p&gt;My TEC project announcement at Reddit&amp;rsquo;s &lt;code&gt;r/cpp&lt;/code&gt; has been rejected.&lt;/p&gt;&#xA;&lt;p&gt;The reason: the &lt;em&gt;entire&lt;/em&gt; project is LLM-generated.&lt;/p&gt;&#xA;&lt;p&gt;No doubt, I was using an LLM to generate detailed&#xA;&lt;a href=&#34;https://www.doxygen.nl/&#34;&gt;Doxygen&lt;/a&gt; comments in my &lt;em&gt;existing manually&#xA;written C++ code&lt;/em&gt; for the following reasons: 1) I&amp;rsquo;m too lazy to write&#xA;such detailed comments; 2) I&amp;rsquo;m sure that the API documentation should&#xA;be as detailed as possible because it will be used by other people,&#xA;not just me.&lt;/p&gt;&#xA;&lt;p&gt;I thought it would be obvious that the source code is manually&#xA;crafted—the repository contains 124 commits since 2022 (before the LLM&#xA;epoch) with all my mistakes, bugs, and rejected ideas that anyone can&#xA;trace easily—and it should be clear that no LLM has been used.&lt;/p&gt;&#xA;&lt;p&gt;I was wrong. The &lt;em&gt;entire&lt;/em&gt; project, including the source code, is an&#xA;LLM slop, they say.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m afraid this situation entails unpleasant consequences and raises&#xA;serious questions.&lt;/p&gt;&#xA;&lt;p&gt;Should developers now &lt;em&gt;prove&lt;/em&gt; that their code is not LLM-generated? In what way?&lt;/p&gt;&#xA;&lt;p&gt;LLMs can—and do—get trained on public repositories. How can someone&#xA;prove that their code is manually crafted if an LLM has already been&#xA;trained on it?&lt;/p&gt;&#xA;&lt;p&gt;We are living in tough times.&lt;/p&gt;&#xA;&lt;p&gt;&amp;mdash; The Emacs Cat.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Emacs IBuffer Configuration</title>
      <link>https://olddeuteronomy.github.io/post/emacs-ibuffer-config/</link>
      <pubDate>Thu, 28 Aug 2025 15:11:15 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/emacs-ibuffer-config/</guid>
      <description>&lt;p&gt;I recently came across a Reddit post titled&#xA;&lt;a href=&#34;https://www.reddit.com/r/emacs/comments/1mv5hez/how_to_group_buffers_that_are_important_to_visit/&#34;&gt;How to group buffers that are important to visit later&lt;/a&gt;&#xA;which discusses various methods for buffer grouping in Emacs.&lt;/p&gt;&#xA;&lt;p&gt;In the comments, which are typically engaging, some users&#xA;mentioned using the built-in &lt;code&gt;bookmarks&lt;/code&gt; package, while others&#xA;recommended the &lt;code&gt;easysession&lt;/code&gt; package or alternative approaches for&#xA;effective buffer grouping.&lt;/p&gt;&#xA;&lt;p&gt;Additionally, there were mentions of the built-in &lt;code&gt;ibuffer&lt;/code&gt; package,&#xA;which I personally use for buffer grouping. In this post, I’ll&#xA;share my IBuffer configuration to demonstrate how I leverage it for&#xA;this purpose.&lt;/p&gt;&#xA;&lt;p&gt;Some ideas in my configuration are inspired by an excellent post,&#xA;&lt;a href=&#34;https://protesilaos.com/emacs/dotemacs&#34;&gt;GNU Emacs configuration&lt;/a&gt;&#xA;by &lt;a href=&#34;https://protesilaos.com/about/&#34;&gt;Protesilaos Stavrou&lt;/a&gt;,&#xA;a renowned Emacs expert. All of his posts are well worth reading&#xA;for their insightful and practical Emacs advice.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prettifying-the-ibuffer-window&#34;&gt;Prettifying the IBuffer Window&lt;/h2&gt;&#xA;&lt;p&gt;To make my IBuffer window visually appealing, I use an icon set&#xA;provided by the external&#xA;&lt;a href=&#34;https://github.com/seagle0128/all-the-icons-ibuffer&#34;&gt;&lt;code&gt;all-the-icons-ibuffer&lt;/code&gt;&lt;/a&gt; package.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Prerequisites&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package all-the-icons-ibuffer :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :hook (ibuffer-mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; all-the-icons-ibuffer-mode))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ibuffer-configuration&#34;&gt;IBuffer Configuration&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package ibuffer :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq ibuffer-expert &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq ibuffer-display-summary &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq ibuffer-use-other-window &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq ibuffer-show-empty-filter-groups &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq ibuffer-default-sorting-mode &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;filename/process&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq ibuffer-title-face &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;font-lock-doc-face&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq ibuffer-use-header-line &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq ibuffer-default-shrink-to-minimum-size &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq ibuffer-formats&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;((mark modified read-only locked &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (name &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt; :left :elide)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (size &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;-1&lt;/span&gt; :right)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (mode &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt; :left :elide)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; filename-and-process)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (mark &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (name &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;-1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; filename)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq ibuffer-saved-filter-groups&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Main&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Directories&amp;#34;&lt;/span&gt; (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; dired-mode))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C++&amp;#34;&lt;/span&gt; (or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; c++-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; c++-ts-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; c-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; c-ts-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; c-or-c++-ts-mode)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Python&amp;#34;&lt;/span&gt; (or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; python-ts-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; c-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; python-mode)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Build&amp;#34;&lt;/span&gt; (or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; make-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; makefile-gmake-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (name &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^Makefile$&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; change-log-mode)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Scripts&amp;#34;&lt;/span&gt; (or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; shell-script-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; shell-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; sh-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; lua-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; bat-mode)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Config&amp;#34;&lt;/span&gt; (or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; conf-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; conf-toml-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; toml-ts-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; conf-windows-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (name &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^\\.clangd$&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (name &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^\\.gitignore$&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (name &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^Doxyfile$&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (name &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^config\\.toml$&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; yaml-mode)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Web&amp;#34;&lt;/span&gt; (or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; mhtml-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; html-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; web-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; nxml-mode)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CSS&amp;#34;&lt;/span&gt; (or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; css-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; sass-mode)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;JS&amp;#34;&lt;/span&gt; (or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; js-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; rjsx-mode)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Markup&amp;#34;&lt;/span&gt; (or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; markdown-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; adoc-mode)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Org&amp;#34;&lt;/span&gt; (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; org-mode))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;LaTeX&amp;#34;&lt;/span&gt; (name &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\.tex$&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Magit&amp;#34;&lt;/span&gt; (or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; magit-blame-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; magit-cherry-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; magit-diff-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; magit-log-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; magit-process-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; magit-status-mode)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Apps&amp;#34;&lt;/span&gt; (or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; elfeed-search-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; elfeed-show-mode)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Fundamental&amp;#34;&lt;/span&gt; (or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                           (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; fundamental-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                           (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; text-mode)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Emacs&amp;#34;&lt;/span&gt; (or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; emacs-lisp-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (name &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^\\*Help\\*$&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (name &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^\\*Custom.*&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (name &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^\\*Org Agenda\\*$&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (name &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^\\*info\\*$&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (name &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^\\*scratch\\*$&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (name &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^\\*Backtrace\\*$&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (name &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^\\*Messages\\*$&amp;#34;&lt;/span&gt;))))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :hook&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (ibuffer-mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; (lambda ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    (ibuffer-switch-to-saved-filter-groups &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Main&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/ibuffer.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/ibuffer.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;IBuffer. Click or tap to view the full-size picture.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Since I use the &lt;code&gt;ibuffer&lt;/code&gt; command frequently, I’ve bound it to the &lt;code&gt;&amp;lt;F5&amp;gt;&lt;/code&gt;&#xA;key for quick access.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key [(f5)]  &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;ibuffer)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;casual-ibuffer&#34;&gt;Casual IBuffer&lt;/h2&gt;&#xA;&lt;p&gt;Another valuable resource for enhancing IBuffer is the&#xA;&lt;a href=&#34;https://kickingvegas.github.io/casual/&#34;&gt;Casual&lt;/a&gt; project,&#xA;a suite of excellent Emacs packages developed by&#xA;&lt;a href=&#34;https://mastodon.social/@kickingvegas@sfba.social&#34;&gt;Charles Choi&lt;/a&gt;.&#xA;As outlined in the&#xA;&lt;a href=&#34;https://kickingvegas.github.io/casual/Motivations.html&#34;&gt;Casual User Guide&lt;/a&gt;,&#xA;its goals are to provide a keyboard-driven menu UI toolkit for common Emacs commands, to enable&#xA;casual discovery and use of infrequently used commands, and to serve&#xA;as a frequently used interface for supported modes.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://kickingvegas.github.io/casual/IBuffer.html&#34;&gt;Casual IBuffer&lt;/a&gt;&#xA;package specifically provides an intuitive user interface for Emacs&#xA;IBuffer, enhancing its functionality and ease of use.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Requires `transient&amp;#39; package.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; https://kickingvegas.github.io/casual/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package casual :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; IBuffer&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(keymap-set ibuffer-mode-map &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C-o&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;casual-ibuffer-tmenu)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(keymap-set ibuffer-mode-map &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;F&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;casual-ibuffer-filter-tmenu)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(keymap-set ibuffer-mode-map &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;s&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;casual-ibuffer-sortby-tmenu)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/ibuffer-casual.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/ibuffer-casual.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Casual IBuffer. Click or tap to view the full-size picture.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Happy emacsing!&lt;/p&gt;&#xA;&lt;p&gt;&amp;mdash; The Emacs Cat.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Emacs Org Configuration</title>
      <link>https://olddeuteronomy.github.io/post/emacs-org-config/</link>
      <pubDate>Thu, 24 Jul 2025 10:41:06 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/emacs-org-config/</guid>
      <description>&lt;p&gt;These days, I’ve come across numerous posts and Reddit threads&#xA;praising &lt;a href=&#34;https://orgmode.org/&#34;&gt;Org mode&lt;/a&gt; as one of the most compelling features of Emacs.&#xA;There’s no doubt this is true, and I’m amazed by how many people use&#xA;Emacs &lt;em&gt;solely&lt;/em&gt; for Org-mode. As a software developer, I rely on Org&#xA;every day for note-taking, maintaining my knowledge&#xA;database (&lt;a href=&#34;https://www.orgroam.com/&#34;&gt;org-roam&lt;/a&gt;), agenda management (&lt;a href=&#34;https://orgmode.org/manual/Agenda-Views.html&#34;&gt;org-agenda&lt;/a&gt;, synchronized with&#xA;&lt;em&gt;beorg&lt;/em&gt; on my iPhone and iPad via Dropbox), and, of course, blogging.&lt;/p&gt;&#xA;&lt;p&gt;So, I’ve decided to share my Org configuration in the hope that it&#xA;will be useful to someone.&lt;/p&gt;&#xA;&lt;h2 id=&#34;org-mode&#34;&gt;Org-mode&lt;/h2&gt;&#xA;&lt;p&gt;Org-mode is now included with Emacs, so we don’t need to install it&#xA;separately&amp;mdash;except for &lt;code&gt;org-roam&lt;/code&gt;, which is an external package.&lt;/p&gt;&#xA;&lt;h3 id=&#34;common-settings&#34;&gt;Common Settings&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; When at a URL, pressing the &amp;lt;Enter&amp;gt; opens the link in a browser.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-return-follows-link &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; To prevent M-RET splitting the line.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; https://irreal.org/blog/?p=6297&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-M-RET-may-split-line &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;((item &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; To hide drawers, e.g. PROPERTIES.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-startup-folded &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;fold&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;hide-emphasis-characters&#34;&gt;Hide Emphasis Characters&lt;/h3&gt;&#xA;&lt;p&gt;From &lt;a href=&#34;https://www.howardism.org/Technical/Emacs/orgmode-wordprocessor.html&#34;&gt;Org as a Word Processor&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Non-nil means font-lock should hide&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; the emphasis marker characters.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-hide-emphasis-markers &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Keep in mind that the slash characters (and asterisks for bold, etc)&#xA;are &lt;em&gt;still there&lt;/em&gt;, but aren’t displayed.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Make invisible parts of Org elements appear visible.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package org-appear :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :init&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq org-appear-delay &lt;span style=&#34;color:#ae81ff&#34;&gt;0.2&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :hook&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  org-mode&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;a href=&#34;https://github.com/awth13/org-appear&#34;&gt;org-appear&lt;/a&gt; package is very helpful&#xA;when using &lt;code&gt;org-hide-emphasis-markers&lt;/code&gt;, as described above.&#xA;Hidden element parts appear when the cursor enters an element&#xA;and disappear when it leaves&amp;mdash;with some delay.&lt;/p&gt;&#xA;&lt;h3 id=&#34;better-list-bullets&#34;&gt;Better List Bullets&lt;/h3&gt;&#xA;&lt;p&gt;From &lt;a href=&#34;https://www.howardism.org/Technical/Emacs/orgmode-wordprocessor.html&#34;&gt;Org as a Word Processor&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Better list bullets.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(font-lock-add-keywords&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;org-mode&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^ +\\([-*]\\) &amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; (prog1 () (compose-region (&lt;span style=&#34;color:#a6e22e&#34;&gt;match-beginning&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) (&lt;span style=&#34;color:#a6e22e&#34;&gt;match-end&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;•&amp;#34;&lt;/span&gt;))))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace the initial &lt;code&gt;-&lt;/code&gt; with a Unicode bullet symbol &lt;code&gt;•&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;better-header-bullets&#34;&gt;Better Header Bullets&lt;/h3&gt;&#xA;&lt;p&gt;I prefer using Unicode circled digit symbols as header bullets to&#xA;indicate the header level.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package org-bullets :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;org-mode-hook&lt;/span&gt; (lambda () (org-bullets-mode &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-bullets-bullet-list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;①&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;②&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;③&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;④&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;⑤&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;⑥&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;⑦&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;⑧&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;⑨&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;⑩&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Indent levels.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;org-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;org-indent-mode&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Use this character(s) for ellipsis.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-ellipsis &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;...&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;source-code-blocks&#34;&gt;Source Code Blocks&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Pretty fontification of source code blocks.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-src-fontify-natively &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Use `bash&amp;#39; instead of `sh&amp;#39; in the `shell&amp;#39; code block.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-babel-sh-command &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bash&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Use C++17.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-babel-C++-compiler &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;g++ -std=c++17&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; `org-babel&amp;#39; languages.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(require &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ob-tangle&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(org-babel-do-load-languages&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;org-babel-load-languages&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (shell &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (python &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (C &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)         &lt;span style=&#34;color:#75715e&#34;&gt;; C and C++&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (calc &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (latex &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (gnuplot &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (sqlite &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; No confirmation on block execution.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-confirm-babel-evaluate &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;org-agenda&#34;&gt;Org Agenda&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Open the current agenda.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C-c a&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;org-agenda&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; View the agenda in the current window.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-agenda-window-setup &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;current-window&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; A file to store the agenda. I use Dropbox to be able to view/edit&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; the agenda on other devices (phones, tablets).&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; In particular, I use the `beorg&amp;#39; app on both iPhone and iPad.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-agenda-files &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/Dropbox/org/refile-beorg.org&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; View diary for the current week.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-agenda-include-diary &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Set priority range from A to C with default A.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-highest-priority &lt;span style=&#34;color:#e6db74&#34;&gt;?A&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-lowest-priority &lt;span style=&#34;color:#e6db74&#34;&gt;?C&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-default-priority &lt;span style=&#34;color:#e6db74&#34;&gt;?A&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Optional. Set custom colors for priorities (for Solarized Dark theme).&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Your theme may require a different color set.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-priority-faces&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&#34;color:#e6db74&#34;&gt;?A&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; (:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#F0DFAF&amp;#34;&lt;/span&gt; :weight bold))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#e6db74&#34;&gt;?B&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; (:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;LightSteelBlue&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#e6db74&#34;&gt;?C&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; (:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;OliveDrab&amp;#34;&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Capture items using &amp;lt;C-c c&amp;gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;define-key&lt;/span&gt; global-map (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C-c c&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;org-capture&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-capture-templates&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TODO item in refile-beorg&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         entry (file &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/Dropbox/org/refile-beorg.org&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;* TODO %?\n%U&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Notes in notes.org&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         entry (file &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/Dropbox/org/notes.org&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\n* %T %?\n%i&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         )))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; https://github.com/harrybournis/org-fancy-priorities&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package org-fancy-priorities&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :hook&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (org-mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; org-fancy-priorities-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq org-fancy-priorities-list &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;⚡&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;⏰&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;☕&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; A timestamp or a note will be recorded when an entry has been refiled.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-log-refile &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Add &amp;#34;CLOSED: [timestamp]&amp;#34; when a task is marked as DONE.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq org-log-done &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun my/notes-open ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (switch-to-buffer (find-file-noselect &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/Dropbox/org/notes.org&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C-c n&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;my/notes-open)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;theme-specific-settings&#34;&gt;Theme Specific Settings&lt;/h3&gt;&#xA;&lt;p&gt;I use the Solarized Dark theme; it has some tweaks for Org-mode.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Don&amp;#39;t change size of Org-mode headlines (but keep other size-changes)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq solarized-scale-org-headlines &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Avoid all font-size changes&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq solarized-height-minus-1 &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq solarized-height-plus-1 &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq solarized-height-plus-2 &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq solarized-height-plus-3 &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq solarized-height-plus-4 &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;some-custom-face-settings-for-org-mode&#34;&gt;Some Custom Face Settings for Org-mode&lt;/h4&gt;&#xA;&lt;p&gt;I prefer to have a very dark background in code blocks.&#xA;Your theme may require a different color set.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(custom-set-faces&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(org-block ((&lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt; (:background &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gray10&amp;#34;&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(org-document-title ((&lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt; (:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;red&amp;#34;&lt;/span&gt; :weight bold))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(org-level-1 ((&lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt; (:inherit outline-1 :weight bold))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(org-level-2 ((&lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt; (:inherit outline-2 :weight normal :slant italic))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(org-level-3 ((&lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt; (:inherit outline-3 :slant italic))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(org-level-4 ((&lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt; (:inherit outline-4 :slant italic)))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;screenshots&#34;&gt;Screenshots&lt;/h3&gt;&#xA;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/org-mode.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/org-mode.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Org mode w/ code blocks. Click or tap to view the full-size picture.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/org-agenda.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/org-agenda.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Org agenda w/ diary. Click or tap to view the full-size picture.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Happy emacsing!&lt;/p&gt;&#xA;&lt;p&gt;&amp;mdash; The Emacs Cat.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making a Multiplatform Emacs Configuration</title>
      <link>https://olddeuteronomy.github.io/post/multiplatform-emacs-config/</link>
      <pubDate>Fri, 20 Jun 2025 11:15:16 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/multiplatform-emacs-config/</guid>
      <description>&lt;p&gt;These days, I use three different operating systems at work and home:&#xA;Ubuntu Linux (Dell Latitude 7490 13&amp;quot; laptop), Microsoft Windows (Dell&#xA;Latitude 7400 13&amp;quot; laptop), and macOS (27&amp;quot; iMac). My primary tool&#xA;across these platforms is Emacs, which I use for nearly&#xA;everything—coding (&lt;a href=&#34;https://olddeuteronomy.github.io/post/cpp-programming-in-emacs/&#34;&gt;C++&lt;/a&gt;,&#xA;&lt;a href=&#34;https://olddeuteronomy.github.io/post/python-programming-in-emacs/&#34;&gt;Python&lt;/a&gt;),&#xA;blogging (&lt;a href=&#34;https://olddeuteronomy.github.io/post/elfeed-optimized-blogging/&#34;&gt;Hugo&lt;/a&gt;),&#xA;reading (Elfeed),&#xA;note-taking (&lt;a href=&#34;https://olddeuteronomy.github.io/post/orgmode-for-reproducibility-testing/&#34;&gt;Org Mode&lt;/a&gt;,&#xA;org-roam), diary, and agenda management (beorg on iPhone,&#xA;synchronized via Dropbox across all computers), among other tasks.&lt;/p&gt;&#xA;&lt;p&gt;Naturally, I want a &lt;em&gt;single&lt;/em&gt; Emacs configuration file—&lt;code&gt;.emacs&lt;/code&gt; or, if you&#xA;prefer, &lt;code&gt;init.el&lt;/code&gt;—to work seamlessly across all these platforms.&lt;/p&gt;&#xA;&lt;p&gt;Emacs is arguably the most platform-agnostic software available.&#xA;However, some OS-specific differences must be addressed. These can be&#xA;grouped into several categories:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Paths for external executables, particularly on Windows.&lt;/li&gt;&#xA;&lt;li&gt;OS-specific key bindings, especially on macOS.&lt;/li&gt;&#xA;&lt;li&gt;Various OS-specific tweaks, particularly for Windows.&lt;/li&gt;&#xA;&lt;li&gt;Font sizes, which depend on screen size and resolution.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Below, I explore these issues in greater detail.&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;First, we need to determine the operating system type.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;;;; OS Detection&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar os-windows (&lt;span style=&#34;color:#a6e22e&#34;&gt;string-equal&lt;/span&gt; system-type &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;windows-nt&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Running on Windows.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar os-linux (&lt;span style=&#34;color:#a6e22e&#34;&gt;string-equal&lt;/span&gt; system-type &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gnu/linux&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Running on Linux.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar os-macos (&lt;span style=&#34;color:#a6e22e&#34;&gt;string-equal&lt;/span&gt; system-type &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;darwin&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Running on macOS.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;paths&#34;&gt;Paths&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;;; Environment Variables.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar my/home (getenv &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HOME&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(when os-linux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setenv &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PATH&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a6e22e&#34;&gt;concat&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           my/home &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/lib/grpc/bin&amp;#34;&lt;/span&gt; path-separator &lt;span style=&#34;color:#75715e&#34;&gt;; gRPC binaries&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (getenv &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PATH&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setenv &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PKG_CONFIG_PATH&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a6e22e&#34;&gt;concat&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           my/home &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/lib/grpc/lib/pkgconfig&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Add Cygwin path on Windows.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(when os-windows&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq exec-path (&lt;span style=&#34;color:#a6e22e&#34;&gt;cons&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:/cygwin64/bin&amp;#34;&lt;/span&gt; exec-path)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Clang/clangd compiler on Windows.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(when os-windows&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq exec-path (&lt;span style=&#34;color:#a6e22e&#34;&gt;append&lt;/span&gt; exec-path &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:/bin/LLVM/9.0.0/bin&amp;#34;&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Clang/clangd compiler on macOS.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(when os-macos&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq exec-path (&lt;span style=&#34;color:#a6e22e&#34;&gt;append&lt;/span&gt; exec-path &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/local/Cellar/llvm/11.0.0_1/bin&amp;#34;&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;exec-path&lt;/code&gt; built-in variable contains a list of directories Emacs&#xA;searches to run programs in subprocesses. Each element is either a&#xA;string (directory name) or nil (indicating the default directory).&lt;/p&gt;&#xA;&lt;h2 id=&#34;os-specific-key-bindings&#34;&gt;OS-Specific Key Bindings&lt;/h2&gt;&#xA;&lt;h3 id=&#34;macos&#34;&gt;macOS&lt;/h3&gt;&#xA;&lt;p&gt;Disable the Command key as Meta and enable Option as Meta (Alt).&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;;;; `macOS&amp;#39; keyboard&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(when os-macos&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (setq mac-command-key-is-meta &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mac-command-modifier &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;super&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mac-option-key-is-meta &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mac-option-modifier &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;meta&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Prevent accidentally closing the frame or Emacs app by disabling ⌘-w and ⌘-q.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(when os-macos&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (global-unset-key (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;s-w&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (global-unset-key (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;s-q&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;os-specific-tweaks&#34;&gt;OS-Specific Tweaks&lt;/h2&gt;&#xA;&lt;h3 id=&#34;microsoft-windows&#34;&gt;Microsoft Windows&lt;/h3&gt;&#xA;&lt;p&gt;Increase the default Windows pipe buffer size. (&lt;strong&gt;Note&lt;/strong&gt;: This may no&#xA;longer be necessary, but I include it for compatibility.)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(when os-windows&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq w32-pipe-read-delay &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq irony-server-w32-pipe-buffer-size (&lt;span style=&#34;color:#a6e22e&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Configure &lt;code&gt;Dired&lt;/code&gt; to resemble its appearance on Linux/macOS.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(if os-windows&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (setq dired-listing-switches &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/A:H /O:NG&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;;; Linux/macOS&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq dired-listing-switches &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-laGgh1v --group-directories-first --time-style=long-iso&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;linux&#34;&gt;Linux&lt;/h3&gt;&#xA;&lt;p&gt;Set the default browser on Linux.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(when os-linux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq browse-url-browser-function &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;browse-url-firefox&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;font-size&#34;&gt;Font Size&lt;/h2&gt;&#xA;&lt;p&gt;I use the same &lt;code&gt;.emacs&lt;/code&gt; configuration on both a 13&amp;quot; laptop and a 27&amp;quot;&#xA;desktop, which have significantly different screen sizes and&#xA;resolutions. This requires font size adjustments.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(cond&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (os-linux (defvar my/font-height &lt;span style=&#34;color:#ae81ff&#34;&gt;140&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;The default font height for Emacs on Linux (in 1/10th points).&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (os-macos (defvar my/font-height &lt;span style=&#34;color:#ae81ff&#34;&gt;180&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;The default font height for Emacs on macOS (in 1/10th points).&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt; (defvar my/font-height &lt;span style=&#34;color:#ae81ff&#34;&gt;140&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;The default font height for Emacs on Windows and other systems (in 1/10th points).&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Set the default font size based on the OS type.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(custom-set-faces&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(default ((&lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt; (:height &lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;my/font-height :width normal :family &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Aporetic Sans Mono&amp;#34;&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note the use of the backquote macro for dynamic font height.&lt;/p&gt;&#xA;&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;&#xA;&lt;p&gt;With these configurations, I can use a single &lt;code&gt;.emacs&lt;/code&gt; file across all&#xA;my machines, ensuring a consistent Emacs experience regardless of the&#xA;operating system.&lt;/p&gt;&#xA;&lt;p&gt;Happy emacsing!&lt;/p&gt;&#xA;&lt;p&gt;&amp;mdash; The Emacs Cat.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Windows Navigation in Emacs</title>
      <link>https://olddeuteronomy.github.io/post/emacs-window-navigation/</link>
      <pubDate>Fri, 16 May 2025 10:11:27 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/emacs-window-navigation/</guid>
      <description>&lt;p&gt;Last week there were some quite interesting posts about&#xA;windows management in Emacs &amp;mdash;&#xA;&lt;a href=&#34;https://taonaw.com/2025/05/09/emacs-windows-navigations-and-some.html&#34;&gt;Emacs&amp;rsquo; windows navigations and some Emacs zen&lt;/a&gt;&#xA;(a review by &lt;a href=&#34;https://irreal.org/blog/?p=12979&#34;&gt;Irreal&lt;/a&gt;),&#xA;&lt;a href=&#34;https://taonaw.com/2025/05/03/emacs-window-management-tweaking.html&#34;&gt;Emacs window management tweaking&lt;/a&gt;,&#xA;for instance.&lt;/p&gt;&#xA;&lt;p&gt;In this regard, I&amp;rsquo;ve  decided to share my configuration for the issue.&lt;/p&gt;&#xA;&lt;p&gt;For switching between windows in Emacs I use the &lt;a href=&#34;https://github.com/abo-abo/ace-window&#34;&gt;&lt;code&gt;ace-window&lt;/code&gt;&lt;/a&gt;&#xA;package by &lt;a href=&#34;https://github.com/abo-abo&#34;&gt;Oleh Krehel aka abo-abo&lt;/a&gt;,&#xA;a renowned author of such gems as &lt;a href=&#34;https://github.com/abo-abo/hydra&#34;&gt;Hydra&lt;/a&gt;,&#xA;&lt;a href=&#34;https://github.com/abo-abo/avy&#34;&gt;avy&lt;/a&gt;, &lt;a href=&#34;https://github.com/abo-abo/swiper&#34;&gt;Swiper&lt;/a&gt;, and others.&#xA;Most of these packages have found their place in my &lt;code&gt;.emacs&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;My configuration is quite simple.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package avy :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package ace-window :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :after avy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key [(f2)]  &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;ace-window)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&#xA;&lt;p&gt;The main function, &lt;code&gt;ace-window&lt;/code&gt; is meant to replace &lt;code&gt;other-window&lt;/code&gt;&#xA;by assigning each window a short, unique label. When there are only&#xA;two windows present, &lt;code&gt;other-window&lt;/code&gt; is called&amp;hellip; If there are more,&#xA;each window will have its first label character highlighted. Once a&#xA;unique label is typed, &lt;code&gt;ace-window&lt;/code&gt; will switch to that window.&lt;br&gt;&#xA;&amp;hellip;&lt;br&gt;&#xA;By default, &lt;code&gt;ace-window&lt;/code&gt; uses &lt;strong&gt;numbers&lt;/strong&gt; for window labels so the&#xA;window labeling is intuitively ordered.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve bound &lt;code&gt;ace-window&lt;/code&gt; to &lt;code&gt;&amp;lt;F2&amp;gt;&lt;/code&gt;. Why &lt;code&gt;&amp;lt;F2&amp;gt;&lt;/code&gt;? For ergonomic reasons.&#xA;On most keyboards, the numeric keys (&lt;code&gt;1&lt;/code&gt;-&lt;code&gt;2&lt;/code&gt;-&lt;code&gt;3&lt;/code&gt;-&amp;hellip;) are located&#xA;right under the &lt;code&gt;&amp;lt;F2&amp;gt;&lt;/code&gt; key. It would be easy to press &lt;code&gt;&amp;lt;F2&amp;gt;&lt;/code&gt; then, for&#xA;example, &lt;code&gt;2&lt;/code&gt; using the same finger.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/ace-window.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/ace-window.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Window labels are in the top left corner of each window (shown in red). The frame is dimmed when activating `ace-window`.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;The &lt;code&gt;ace-window&lt;/code&gt; package has many other options; you can find more detailed&#xA;information at the &lt;a href=&#34;https://github.com/abo-abo/ace-window&#34;&gt;&lt;code&gt;ace-window&lt;/code&gt;&lt;/a&gt; GitHub repository.&lt;/p&gt;&#xA;&lt;p&gt;Happy emacsing!&lt;/p&gt;&#xA;&lt;p&gt;&amp;mdash; The Emacs Cat.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Emacs Time Stamp</title>
      <link>https://olddeuteronomy.github.io/post/emacs-time-stamp/</link>
      <pubDate>Thu, 24 Apr 2025 10:44:10 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/emacs-time-stamp/</guid>
      <description>&lt;p&gt;I do almost all my text editing in Emacs, and it would be worth&#xA;to store the last modified date/time of a file &amp;mdash; org/plain&#xA;text/source code/whatever &amp;mdash; &lt;em&gt;in&lt;/em&gt; the file, without consulting the&#xA;file system.&lt;/p&gt;&#xA;&lt;p&gt;Fortunately, that is Emacs, and it always extends a helping hand. In&#xA;our case this is the &lt;code&gt;time-stamp&lt;/code&gt; Emacs built-in function that provides&#xA;automatic time-stamping for a file.&lt;/p&gt;&#xA;&lt;p&gt;All you need to do is to place a time-stamp template &lt;em&gt;near the&#xA;beginning&lt;/em&gt; of the file, and enable automatic time-stamping in your&#xA;config.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; When there is a &amp;#34;Time-stamp: &amp;lt;&amp;gt;&amp;#34; string in the first 10 lines of the file,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Emacs will write time-stamp information there when saving the file.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; (Borrowed from http://home.thep.lu.se/~karlf/emacs.html)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq time-stamp-active &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;; Do enable time-stamps.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      time-stamp-line-limit &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;     &lt;span style=&#34;color:#75715e&#34;&gt;; Check first 10 buffer lines for Time-stamp: &amp;lt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      time-stamp-format &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Last changed %Y-%02m-%02d %02H:%02M:%02S by %u&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;write-file-hooks&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;time-stamp&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;; Update when saving.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;See more about the &lt;code&gt;time-stamp-format&lt;/code&gt; variable in Emacs built-in Help&#xA;(&lt;code&gt;M-x describe-variable&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;h2 id=&#34;examples&#34;&gt;Examples&lt;/h2&gt;&#xA;&lt;h3 id=&#34;elisp&#34;&gt;ELisp&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;;; package --- .emacs&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Time-stamp: &amp;lt;Last changed 2025-04-18 12:54:28 by magnolia&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;;; Commentary:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Emacs startup file (macOS, Linux, Windows).&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar os-windows (&lt;span style=&#34;color:#a6e22e&#34;&gt;string-equal&lt;/span&gt; system-type &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;windows-nt&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;OMG, that&amp;#39;s Windows!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar os-linux (&lt;span style=&#34;color:#a6e22e&#34;&gt;string-equal&lt;/span&gt; system-type &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gnu/linux&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;I&amp;#39;m on Linux&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar os-macos (&lt;span style=&#34;color:#a6e22e&#34;&gt;string-equal&lt;/span&gt; system-type &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;darwin&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Oh, I&amp;#39;m on macOS&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar my/home (getenv &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HOME&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;org-mode&#34;&gt;Org Mode&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;:PROPERTIES:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;:ID:       a483c173-162d-44fb-8c10-fec0f24eafc9&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;:END:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+TITLE&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;: Hugo&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+DATE&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;: Time-stamp: &amp;lt;Last changed 2025-04-22 14:40:44 by magnolia&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+FILETAGS&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;: :blog:web:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*&lt;span style=&#34;font-weight:bold&#34;&gt; Issues&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;**&lt;/span&gt; 2025-04-01 Newest Hugo version publishes local links&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Fixed: Rolled back to v.0.123.7 from Ubuntu 24.04 repository.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;c-source-code&#34;&gt;C++ source code&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Time-stamp: &amp;lt;Last changed 2025-03-31 15:36:04 by magnolia&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#pragma once&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;queue&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;mutex&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;condition_variable&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SafeQueue&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Happy emacsing!&lt;/p&gt;&#xA;&lt;p&gt;&amp;mdash; The Emacs Cat.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Elfeed-optimized Blogging</title>
      <link>https://olddeuteronomy.github.io/post/elfeed-optimized-blogging/</link>
      <pubDate>Wed, 02 Apr 2025 13:16:58 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/elfeed-optimized-blogging/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;em&gt;To read my newspapers I load my RSS feed via the &lt;a href=&#34;https://github.com/skeeto/elfeed&#34;&gt;elfeed package&lt;/a&gt;&lt;/em&gt;.&lt;br&gt;&#xA;&amp;hellip;&lt;br&gt;&#xA;&lt;em&gt;Also, I identify any RSS feed entry that does not provide the full&#xA;text. And those live in provisional status. My reflexes are to ask&#xA;“there’s lots of full-text feeds, why bother with this truncation?”&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Jeremy Friesen, &lt;a href=&#34;https://takeonrules.com/2025/03/23/a-walk-through-my-digital-neighborhood/&#34;&gt;&lt;em&gt;A Walk Through My Digital Neighborhood&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Jeremy is totally right! &amp;ndash; it came to my mind immediately.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m using the &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; static site generator to&#xA;build this blog. Hugo uses &lt;em&gt;content summaries&lt;/em&gt; to display a list of&#xA;blog entries on the main page. As a result, the Elfeed entry shows a&#xA;summary of the post instead of the full text.&lt;/p&gt;&#xA;&lt;p&gt;Many of us &amp;ndash; including me &amp;ndash; are using &lt;a href=&#34;https://github.com/skeeto/elfeed&#34;&gt;Elfeed&lt;/a&gt;&#xA;as an RSS reader, and I have realized that the truncated Elfeed entry may cause inconvenience&#xA;to the Elfeed users.&lt;/p&gt;&#xA;&lt;p&gt;Applying some tricks I was able to disable the automatic displaying of&#xA;summaries on the main page. I hope it has become more comfortable for&#xA;those who use Elfeed for reading RSS feeds.&lt;/p&gt;&#xA;&lt;p&gt;Happy elfeeding!&lt;/p&gt;&#xA;&lt;p&gt;&amp;ndash; The Emacs Cat.&lt;/p&gt;&#xA;&lt;p&gt;P.S. Thanks to &lt;a href=&#34;https://takeonrules.com/&#34;&gt;Jeremy Friesen&lt;/a&gt; for the heads up.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Emacs Org Mode for Reproducibility Testing</title>
      <link>https://olddeuteronomy.github.io/post/orgmode-for-reproducibility-testing/</link>
      <pubDate>Fri, 07 Mar 2025 10:33:34 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/orgmode-for-reproducibility-testing/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;em&gt;Software reproducibility testing is a critical aspect of&#xA;software development and maintenance.&#xA;It ensures that software is reliable, consistent, and predictable and&#xA;that it can be easily replicated and verified by others.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ana Pustan, &lt;a href=&#34;https://testerwork.com/reproducibility-testing/&#34;&gt;&lt;em&gt;Reproducibility Testing: A Complete Guide&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;For many of us, it won&amp;rsquo;t be a surprise that&#xA;the Emacs &lt;a href=&#34;https://orgmode.org/&#34;&gt;Org mode&lt;/a&gt; is perfectly suited&#xA;for reproducibility testing.&lt;/p&gt;&#xA;&lt;p&gt;In some of my projects I&amp;rsquo;m using &lt;a href=&#34;https://grpc.io&#34;&gt;gRPC&lt;/a&gt;, a modern&#xA;open source high performance Remote Procedure Call (RPC) framework&#xA;that can run in any environment. The gRPC framework is evolving very&#xA;rapidly so I have to update it to the most recent stable version time to time.&#xA;No doubt, I want to make sure that everything is working properly&#xA;after the update.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve built a tiny &lt;em&gt;hello-world&lt;/em&gt; gRPC server for testing the&#xA;update. I use &lt;a href=&#34;https://github.com/fullstorydev/grpcurl&#34;&gt;grpcurl&lt;/a&gt;,&#xA;a command-line tool that interacts with gRPC servers, as a client.&lt;/p&gt;&#xA;&lt;p&gt;Now Emacs has to go be onstage.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-server&#34;&gt;The Server&lt;/h2&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t like having to leave Emacs for too long so I run my server in Eshell.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/grpc-server-start.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/grpc-server-start.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Click or tap to view the full-size picture.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h2 id=&#34;the-client&#34;&gt;The Client&lt;/h2&gt;&#xA;&lt;p&gt;The Org mode code blocks &amp;ndash; that&amp;rsquo;s all we need now.&lt;/p&gt;&#xA;&lt;h3 id=&#34;listing-of-available-services-at-localhost-port-50051&#34;&gt;Listing of available services at localhost port 50051&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+begin_src &lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;bash&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; :results verbatim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  grpcurl -plaintext localhost:50051 list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+end_src&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+RESULTS&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: grpc.reflection.v1.ServerReflection&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: grpc.reflection.v1alpha.ServerReflection&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: helloworld.Greeter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pressing &lt;code&gt;C-c C-c&lt;/code&gt; when the point (cursor) is inside the code block&#xA;shows 3 services available at &lt;em&gt;localhost:50051&lt;/em&gt; &amp;ndash; 2 builtin services and&#xA;our &lt;code&gt;helloworld.Greeter&lt;/code&gt; service, the last one.&lt;/p&gt;&#xA;&lt;h3 id=&#34;inspecting-helloworldgreeter-service&#34;&gt;Inspecting helloworld.Greeter service&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+begin_src &lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;shell&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; :results verbatim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  grpcurl -plaintext localhost:50051 describe helloworld.Greeter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+end_src&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+RESULTS&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: helloworld.Greeter is a service:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: service Greeter {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;:   rpc SayHello ( .helloworld.HelloRequest ) returns ( .helloworld.HelloReply );&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK, everything seems to be in order.&lt;/p&gt;&#xA;&lt;h3 id=&#34;inspecting-helloworldgreetersayhello-method&#34;&gt;Inspecting helloworld.Greeter.SayHello method&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+begin_src &lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;bash&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; :results verbatim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  grpcurl -plaintext localhost:50051 describe helloworld.Greeter.SayHello&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+end_src&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+RESULTS&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: helloworld.Greeter.SayHello is a method:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: rpc SayHello ( .helloworld.HelloRequest ) returns ( .helloworld.HelloReply );&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;querying-the-server&#34;&gt;Querying the server&lt;/h3&gt;&#xA;&lt;p&gt;Finally, let&amp;rsquo;s query the server.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+begin_src &lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;bash&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; :results verbatim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  grpcurl -plaintext -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{&amp;#34;name&amp;#34;: &amp;#34;world&amp;#34;}&amp;#39;&lt;/span&gt; localhost:50051 helloworld.Greeter.SayHello&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+end_src&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+RESULTS&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;:   &amp;#34;message&amp;#34;: &amp;#34;Hello world!&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is the expected outcome &amp;ndash; the server replied accordingly.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/grpc-server.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/grpc-server.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Click or tap to view the full-size picture.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Now I can perform gRPC reproducibility testing every time after the update.&lt;/p&gt;&#xA;&lt;p&gt;Happy emacsing!&lt;/p&gt;&#xA;&lt;p&gt;&amp;ndash; The Emacs Cat.&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; Programming in Emacs</title>
      <link>https://olddeuteronomy.github.io/post/cpp-programming-in-emacs/</link>
      <pubDate>Sat, 22 Feb 2025 10:36:27 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/cpp-programming-in-emacs/</guid>
      <description>&lt;p&gt;C++ is my primary programming language since &amp;ndash; I can&amp;rsquo;t believe it&#xA;myself &amp;ndash; 1991 (yes, it was Turbo C++). As I&amp;rsquo;m going to do almost&#xA;everything within Emacs 29.4 now &amp;ndash; no doubt I want to have the C++ IDE in&#xA;Emacs, in the same way I&amp;rsquo;m using Emacs as the&#xA;&lt;a href=&#34;https://olddeuteronomy.github.io/post/python-programming-in-emacs/&#34;&gt;Python IDE&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Thankfully, &lt;a href=&#34;https://github.com/joaotavora/eglot&#34;&gt;eglot&lt;/a&gt;, the Emacs &lt;em&gt;client&lt;/em&gt; for&#xA;the Language Server Protocol (LSP), is now &amp;ndash; since version 29 &amp;ndash; the&#xA;part of Emacs. It remains to choose the appropriate LSP.&lt;/p&gt;&#xA;&lt;h2 id=&#34;choosing-a-language-server&#34;&gt;Choosing a Language Server&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve settled on &lt;a href=&#34;https://clangd.llvm.org/&#34;&gt;clangd&lt;/a&gt;, a powerful LSP for&#xA;C++ based on the &lt;a href=&#34;https://clang.llvm.org/&#34;&gt;Clang&lt;/a&gt; C++ compiler. It&#xA;provides an impressive set of&#xA;&lt;a href=&#34;https://clangd.llvm.org/features&#34;&gt;features&lt;/a&gt; including error checking,&#xA;code completion, cross-references, navigation, and others.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;clangd&lt;/code&gt; is the part of the &lt;a href=&#34;https://llvm.org/&#34;&gt;LLVM&lt;/a&gt; project and it can be&#xA;downloaded from &lt;a href=&#34;https://releases.llvm.org/download.html&#34;&gt;LLVM Download Page&lt;/a&gt;.&#xA;Which version to download?&#xA;It depends on OS/version you are using. I&amp;rsquo;m using&#xA;Pop!_OS 22.04 (Ubuntu 22.04 fork); after researching, I came upon&#xA;&lt;em&gt;clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04.tar.xz&lt;/em&gt;&#xA;from &lt;a href=&#34;https://github.com/llvm/llvm-project/releases/tag/llvmorg-17.0.6&#34;&gt;this repository&lt;/a&gt;&#xA;that contains pre-build binaries for my OS. It supports C++17 standard&#xA;&amp;ndash; that&amp;rsquo;s good enough for me.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve unpacked the archive to &lt;code&gt;~/bin/LLVM-17.0.6/&lt;/code&gt; then added&#xA;&lt;code&gt;$HOME/bin/LLVM-17.0.6/bin&lt;/code&gt; to the &lt;code&gt;$PATH&lt;/code&gt; envvar.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ clangd --version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clangd version 17.0.6 &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Features: linux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Platform: x86_64-unknown-linux-gnu&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;configuring-clangd&#34;&gt;Configuring clangd&lt;/h3&gt;&#xA;&lt;p&gt;Clangd stores its configuration in YAML files. I&amp;rsquo;m using &lt;em&gt;per-project&lt;/em&gt;&#xA;configuration file &lt;code&gt;.clangd&lt;/code&gt; &amp;ndash; clangd searches for it in all parent&#xA;directories of the active file.&lt;/p&gt;&#xA;&lt;p&gt;Below is my simple and straightforward &lt;code&gt;.clangd&lt;/code&gt; for some of my projects.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Enable all warnings, use C++17 standard, specify include directories.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;CompileFlags&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;Add&lt;/span&gt;: [-&lt;span style=&#34;color:#ae81ff&#34;&gt;xc++,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       -&lt;span style=&#34;color:#ae81ff&#34;&gt;Wall,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       -&lt;span style=&#34;color:#ae81ff&#34;&gt;std=c++17,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       -&lt;span style=&#34;color:#ae81ff&#34;&gt;I/home/magnolia/workspace/devel,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       -&lt;span style=&#34;color:#ae81ff&#34;&gt;I/home/magnolia/lib/grpc/include,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       -&lt;span style=&#34;color:#ae81ff&#34;&gt;I/home/magnolia/lib/spdlog/include]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;Compiler&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;clang++ &lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# Always use `clang++&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It is placed in the &lt;em&gt;top level directory&lt;/em&gt; of my project.&#xA;You can find more about &lt;code&gt;clangd&lt;/code&gt; configuration &lt;a href=&#34;https://clangd.llvm.org/config&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Now we can return back to the Emacs configuration.&lt;/p&gt;&#xA;&lt;h2 id=&#34;emacs-configuration-for-c&#34;&gt;Emacs Configuration for C++&lt;/h2&gt;&#xA;&lt;h3 id=&#34;using-eglot&#34;&gt;Using Eglot&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(require &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;eglot&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;c-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;eglot-ensure&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;c++-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;eglot-ensure&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;c-or-c++-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;eglot-ensure&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The Eglot session will start automatically every time you open the C/C++ file in a buffer.&#xA;If the Eglot session for the current C/C++ buffer has started successfully&#xA;it displays the following message in the Emacs minibuffer:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[eglot] Connected! Server `clangd&amp;#39; now managing `(c++-mode c-mode)&amp;#39; buffers in project ...&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;visual-improvements&#34;&gt;Visual Improvements&lt;/h3&gt;&#xA;&lt;p&gt;Highlighting symbols and numbers in the source code.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Highlights the word/symbol at point and any other occurrences in&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; view. Also allows to jump to the next or previous occurrence.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; https://github.com/nschum/highlight-symbol.el&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package highlight-symbol&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq highlight-symbol-on-navigation-p &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;prog-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;highlight-symbol-mode&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Emacs minor mode that highlights numeric literals in source code.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; https://github.com/Fanael/highlight-numbers&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package highlight-numbers&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;prog-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;highlight-numbers-mode&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;c-headers&#34;&gt;C++ Headers&lt;/h3&gt;&#xA;&lt;p&gt;Please, treat C headers as C++ ones.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; .h files to open in c++-mode rather than c-mode.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-to-list &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;auto-mode-alist&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\\.h$&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; c++-mode))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;code-styles&#34;&gt;Code Styles&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq c-default-style &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;stroustrup&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq c-basic-indent &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq c-basic-offset &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;m using the Stroustrup C++ &lt;a href=&#34;https://www.emacswiki.org/emacs/IndentingC&#34;&gt;code style&lt;/a&gt;&#xA;that is very similar to the K&amp;amp;R (Kernighan &amp;amp; Ritchie) code style.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;c-style-alist&lt;/code&gt; Elisp variable contains a list of all predefined code&#xA;styles. Pick a &lt;a href=&#34;https://www.emacswiki.org/emacs/IndentingC&#34;&gt;style&lt;/a&gt; that suits you.&lt;/p&gt;&#xA;&lt;h3 id=&#34;indentation-inside-of-namespaces&#34;&gt;Indentation Inside of Namespaces&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; emacs-fu: don’t indent inside of C++ namespaces&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; http://brrian.tumblr.com/post/9018043954/emacs-fu-dont-indent-inside-of-c-namespaces&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(c-set-offset &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;innamespace&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I prefer to have the code &lt;em&gt;unindented&lt;/em&gt; inside of a namespace as shown below,&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; tec {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Client&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Client() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;get_id&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}; &lt;span style=&#34;color:#75715e&#34;&gt;// ::Client&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#75715e&#34;&gt;// ::tec&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;rather than&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; tec {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Client&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Client() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;// ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;get_id&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;// ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }; &lt;span style=&#34;color:#75715e&#34;&gt;// ::Client&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#75715e&#34;&gt;// ::tec&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;spaces-vs-tabs&#34;&gt;Spaces vs Tabs&lt;/h3&gt;&#xA;&lt;p&gt;Yes, I&amp;rsquo;m using spaces instead of tabs for indentation.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Spaces instead of tabs when indenting.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq-default indent-tabs-mode &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;trailing-tabs-and-spaces&#34;&gt;Trailing Tabs and Spaces&lt;/h3&gt;&#xA;&lt;p&gt;A builtin &lt;a href=&#34;https://www.gnu.org/software/emacs/manual/html_node/emacs/Useless-Whitespace.html&#34;&gt;package&lt;/a&gt;&#xA;that shows/deletes useless trailing tabs and spaces.&#xA;You can also use &lt;code&gt;M-x delete-trailing-whitespace&lt;/code&gt; to remove all&#xA;trailing white-spaces in a buffer interactively.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; http://www.reddit.com/r/emacs/comments/2keh6u/show_tabs_and_trailing_whitespaces_only/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package whitespace&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;;; Commented since there are too many &amp;#39;valid&amp;#39; whitespaces in some modes.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;;; (setq-default show-trailing-whitespace t)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq whitespace-style &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(face tabs trailing))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (set-face-attribute &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;whitespace-tab&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      :background &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;red&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      :foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;yellow&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      :weight &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;bold&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;prog-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;whitespace-mode&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;;; Delete trailing tabs and spaces on save of a file.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;before-save-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;whitespace-cleanup&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;clangd-with-flymake&#34;&gt;Clangd with Flymake&lt;/h3&gt;&#xA;&lt;style type=&#34;text/css&#34;&gt;&#xA;     &#xA;    .notice {&#xA;        --title-color: #fff;&#xA;        --title-background-color: #6be;&#xA;        --content-color: #444;&#xA;        --content-background-color: #e7f2fa;&#xA;    }&#xA;&#xA;    .notice.info {&#xA;        --title-background-color: #fb7;&#xA;        --content-background-color: #fec;&#xA;    }&#xA;&#xA;    .notice.tip {&#xA;        --title-background-color: #5a5;&#xA;        --content-background-color: #efe;&#xA;    }&#xA;&#xA;    .notice.warning {&#xA;        --title-background-color: #c33;&#xA;        --content-background-color: #fee;&#xA;    }&#xA;&#xA;     &#xA;    @media (prefers-color-scheme:dark) {&#xA;        .notice {&#xA;            --title-color: #fff;&#xA;            --title-background-color: #069;&#xA;            --content-color: #ddd;&#xA;            --content-background-color: #023;&#xA;        }&#xA;&#xA;        .notice.info {&#xA;            --title-background-color: #a50;&#xA;            --content-background-color: #420;&#xA;        }&#xA;&#xA;        .notice.tip {&#xA;            --title-background-color: #363;&#xA;            --content-background-color: #121;&#xA;        }&#xA;&#xA;        .notice.warning {&#xA;            --title-background-color: #800;&#xA;            --content-background-color: #400;&#xA;        }&#xA;    }&#xA;&#xA;    body.dark .notice {&#xA;        --title-color: #fff;&#xA;        --title-background-color: #069;&#xA;        --content-color: #ddd;&#xA;        --content-background-color: #023;&#xA;    }&#xA;&#xA;    body.dark .notice.info {&#xA;        --title-background-color: #a50;&#xA;        --content-background-color: #420;&#xA;    }&#xA;&#xA;    body.dark .notice.tip {&#xA;        --title-background-color: #363;&#xA;        --content-background-color: #121;&#xA;    }&#xA;&#xA;    body.dark .notice.warning {&#xA;        --title-background-color: #800;&#xA;        --content-background-color: #400;&#xA;    }&#xA;&#xA;     &#xA;    .notice {&#xA;        padding: 18px;&#xA;        line-height: 24px;&#xA;        margin-bottom: 24px;&#xA;        border-radius: 4px;&#xA;        color: var(--content-color);&#xA;        background: var(--content-background-color);&#xA;    }&#xA;&#xA;    .notice p:last-child {&#xA;        margin-bottom: 0&#xA;    }&#xA;&#xA;     &#xA;    .notice-title {&#xA;        margin: -18px -18px 12px;&#xA;        padding: 4px 18px;&#xA;        border-radius: 4px 4px 0 0;&#xA;        font-weight: 700;&#xA;        color: var(--title-color);&#xA;        background: var(--title-background-color);&#xA;    }&#xA;&#xA;     &#xA;    .icon-notice {&#xA;        display: inline-flex;&#xA;        align-self: center;&#xA;        margin-right: 8px;&#xA;    }&#xA;&#xA;    .icon-notice img,&#xA;    .icon-notice svg {&#xA;        height: 1em;&#xA;        width: 1em;&#xA;        fill: currentColor;&#xA;    }&#xA;&#xA;    .icon-notice img,&#xA;    .icon-notice.baseline svg {&#xA;        top: .125em;&#xA;        position: relative;&#xA;    }&#xA;&lt;/style&gt;&lt;div class=&#34;notice info&#34; &gt;&#xA;    &lt;p class=&#34;notice-title&#34;&gt;&#xA;        &lt;span class=&#34;icon-notice baseline&#34;&gt;&#xA;            &lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;92 59.5 300 300&#34;&gt;&#xA;  &lt;path d=&#34;M292 303.25V272c0-3.516-2.734-6.25-6.25-6.25H267v-100c0-3.516-2.734-6.25-6.25-6.25h-62.5c-3.516 0-6.25 2.734-6.25 6.25V197c0 3.516 2.734 6.25 6.25 6.25H217v62.5h-18.75c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h87.5c3.516 0 6.25-2.734 6.25-6.25Zm-25-175V97c0-3.516-2.734-6.25-6.25-6.25h-37.5c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h37.5c3.516 0 6.25-2.734 6.25-6.25Zm125 81.25c0 82.813-67.188 150-150 150-82.813 0-150-67.188-150-150 0-82.813 67.188-150 150-150 82.813 0 150 67.188 150 150Z&#34;/&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;        &lt;/span&gt;&lt;/p&gt;&lt;p&gt;This chapter is identical to the corresponding chapter in my previous post&#xA;&lt;a href=&#34;https://olddeuteronomy.github.io/post/python-programming-in-emacs/&#34;&gt;Python Programming in Emacs&lt;/a&gt;.&#xA;I put it here for clarity.&lt;/p&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Flymake is a minor Emacs mode performing on-the-fly syntax checks. I&amp;rsquo;m&#xA;using the &lt;code&gt;flymake&lt;/code&gt; built-in Emacs package as an Eglot front-end for&#xA;syntax checks.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(require &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;flymake&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;My custom &lt;code&gt;my/flymake-toggle-diagnostics-buffer&lt;/code&gt; function toggles the&#xA;&lt;em&gt;Flymake diagnostics&lt;/em&gt; buffer window.&lt;/p&gt;&#xA;&lt;p&gt;If there is the Flymake diagnostics buffer associated with a file in&#xA;the current buffer, it shows the diagnostics buffer in the new window&#xA;and switches to it. If the current buffer &lt;em&gt;is&lt;/em&gt; the Flymake diagnostics&#xA;buffer, it closes it. Otherwise it just shows the error message.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun my/flymake-toggle-diagnostics-buffer ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;;; Check if we are in the diagnostics buffer.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (if (string-search &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*Flymake diagnostics&amp;#34;&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;buffer-name&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (delete-window)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (progn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; Activate the Flymake diagnostics buffer.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; and switch to it&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (flymake-show-buffer-diagnostics)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (let ((name (flymake--diagnostics-buffer-name)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (if (&lt;span style=&#34;color:#a6e22e&#34;&gt;get-buffer&lt;/span&gt; name)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (switch-to-buffer-other-window name)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;No Flymake diagnostics buffer found&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          )))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve bound this function to the &lt;code&gt;F7&lt;/code&gt; key globally since I&amp;rsquo;m using &lt;code&gt;F7&lt;/code&gt;&#xA;in other programming modes as well.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key [(f7)] &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;my/flymake-toggle-diagnostics-buffer)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Additional bindings.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C-c f b&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;flymake-show-buffer-diagnostics)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C-c f p&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;flymake-show-project-diagnostics)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The screenshot below shows what happens if you press &lt;code&gt;F7&lt;/code&gt; while&#xA;editing a C++ file managed by Eglot + Flymake.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/cpp-eglot.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/cpp-eglot.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Click or tap to view the full-size picture.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h2 id=&#34;treemacs&#34;&gt;Treemacs&lt;/h2&gt;&#xA;&lt;p&gt;From looking at the screenshot above, you can see using of&#xA;&lt;a href=&#34;https://github.com/Alexander-Miller/treemacs&#34;&gt;Treemacs&lt;/a&gt;, a tree&#xA;layout file explorer for Emacs.&lt;/p&gt;&#xA;&lt;p&gt;I can highly recommend to use it for any project you&amp;rsquo;re working on in&#xA;conjunction with the excellent&#xA;&lt;a href=&#34;https://github.com/bbatsov/projectile&#34;&gt;Projectile&lt;/a&gt;&#xA;and &lt;a href=&#34;https://github.com/abo-abo/swiper&#34;&gt;Ivy&lt;/a&gt; packages.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package ivy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (ivy-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq ivy-use-virtual-buffers &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;after-init-hook&lt;/span&gt; (lambda () (setq ivy-height (&lt;span style=&#34;color:#a6e22e&#34;&gt;/&lt;/span&gt; (window-height) &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package projectile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (projectile-global-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq projectile-enable-caching &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq projectile-completion-system &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ivy&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package treemacs :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package treemacs-projectile :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve bound Treemacs to &lt;code&gt;F12&lt;/code&gt; globally.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key [(f12)] &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;treemacs-select-window)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Press &lt;code&gt;?&lt;/code&gt; when in the Treemacs window to see all commands available.&#xA;Press &lt;code&gt;q&lt;/code&gt; to close the Treemacs window.&lt;/p&gt;&#xA;&lt;h2 id=&#34;code-completion&#34;&gt;Code Completion&lt;/h2&gt;&#xA;&lt;div class=&#34;notice info&#34; &gt;&#xA;    &lt;p class=&#34;notice-title&#34;&gt;&#xA;        &lt;span class=&#34;icon-notice baseline&#34;&gt;&#xA;            &lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;92 59.5 300 300&#34;&gt;&#xA;  &lt;path d=&#34;M292 303.25V272c0-3.516-2.734-6.25-6.25-6.25H267v-100c0-3.516-2.734-6.25-6.25-6.25h-62.5c-3.516 0-6.25 2.734-6.25 6.25V197c0 3.516 2.734 6.25 6.25 6.25H217v62.5h-18.75c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h87.5c3.516 0 6.25-2.734 6.25-6.25Zm-25-175V97c0-3.516-2.734-6.25-6.25-6.25h-37.5c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h37.5c3.516 0 6.25-2.734 6.25-6.25Zm125 81.25c0 82.813-67.188 150-150 150-82.813 0-150-67.188-150-150 0-82.813 67.188-150 150-150 82.813 0 150 67.188 150 150Z&#34;/&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;        &lt;/span&gt;&lt;/p&gt;&lt;p&gt;This chapter is identical to the corresponding chapter in my previous post&#xA;&lt;a href=&#34;https://olddeuteronomy.github.io/post/python-programming-in-emacs/&#34;&gt;Python Programming in Emacs&lt;/a&gt;.&#xA;I put it here for clarity.&lt;/p&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;I&amp;rsquo;m using the &lt;a href=&#34;https://company-mode.github.io/&#34;&gt;&lt;code&gt;company&lt;/code&gt;&lt;/a&gt; package, a&#xA;modular in-buffer completion framework for Emacs, as an Eglot&#xA;front-end for code completion; it integrates with Eglot seamlessly.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;;;; `COMPANY&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package company&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq company-idle-delay &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq company-minimum-prefix-length &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq company-show-numbers &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;;; To prevent default down-casing.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;;; https://emacs.stackexchange.com/questions/10837/how-to-make-company-mode-be-case-sensitive-on-plain-text&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq company-dabbrev-downcase &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;;; 2023-01-13 From a Reddit post on mixed case issue.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq company-dabbrev-ignore-case &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq company-dabbrev-code-ignore-case &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Use `company&amp;#39; everywhere.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;after-init-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;global-company-mode&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/cpp-company2.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/cpp-company2.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Click or tap to view the full-size picture.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h2 id=&#34;code-navigation&#34;&gt;Code Navigation&lt;/h2&gt;&#xA;&lt;p&gt;My favorite tool for code navigation &lt;em&gt;in the current buffer&lt;/em&gt; is the&#xA;excellent &lt;code&gt;imenu-list&lt;/code&gt; &lt;a href=&#34;https://github.com/bmag/imenu-list&#34;&gt;package&lt;/a&gt;.&#xA;Powered by Eglot, it shows almost everything you want to see.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/cpp-imenu.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/cpp-imenu.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Click or tap to view the full-size picture.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Now your Emacs looks like a full-featured C++ IDE &amp;ndash; and it is, actually.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Show the current buffer&amp;#39;s imenu entries in a separate buffer&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package imenu-list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq imenu-list-focus-after-activation &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (global-set-key (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C-.&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;imenu-list-minor-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve bound &lt;code&gt;imenu-list-minor-mode&lt;/code&gt; to &lt;code&gt;C-.&lt;/code&gt;; this key chord will&#xA;toggle the Imenu buffer on/off.&lt;/p&gt;&#xA;&lt;p&gt;Alternatively, you can use Treemacs to navigate through the code and files on a&#xA;&lt;em&gt;per-project&lt;/em&gt; basis.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/cpp-treemacs.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/cpp-treemacs.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Click or tap to view the full-size picture.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;&amp;ldquo;Classic&amp;rdquo; default navigation keys will also work with all files in&#xA;your project.&lt;/p&gt;&#xA;&lt;dl&gt;&#xA;&lt;dt&gt;&lt;code&gt;xref-find-definitions&lt;/code&gt;&lt;/dt&gt;&#xA;&lt;dd&gt;&lt;code&gt;M-.&lt;/code&gt; to find the definition of the identifier at point.&lt;/dd&gt;&#xA;&lt;dt&gt;&lt;code&gt;xref-go-back&lt;/code&gt;&lt;/dt&gt;&#xA;&lt;dd&gt;&lt;code&gt;M-,&lt;/code&gt; to return back to where you invoked the &lt;code&gt;xref-find-definitions&lt;/code&gt; command.&lt;/dd&gt;&#xA;&lt;dt&gt;&lt;code&gt;xref-find-references&lt;/code&gt;&lt;/dt&gt;&#xA;&lt;dd&gt;&lt;code&gt;M-?&lt;/code&gt; to find references to the identifier at point.&lt;/dd&gt;&#xA;&lt;/dl&gt;&#xA;&lt;p&gt;These functions are now powered by Eglot.&lt;/p&gt;&#xA;&lt;h2 id=&#34;appendix-a&#34;&gt;Appendix A&lt;/h2&gt;&#xA;&lt;h3 id=&#34;all-the-icons&#34;&gt;All the Icons&lt;/h3&gt;&#xA;&lt;p&gt;As you can see from the screenshots above, I like to see icons&#xA;wherever possible &amp;ndash; in &lt;code&gt;treemacs&lt;/code&gt;, &lt;code&gt;dired&lt;/code&gt;, &lt;code&gt;ibuffer&lt;/code&gt;, &lt;code&gt;company&lt;/code&gt; and&#xA;other modes. To achieve that, all you need is to install the&#xA;corresponding packages.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; https://github.com/domtronn/all-the-icons.el&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package all-the-icons :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package all-the-icons-dired :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;dired-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;all-the-icons-dired-mode&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package all-the-icons-ibuffer :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :init (all-the-icons-ibuffer-mode &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :hook (ibuffer-mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; all-the-icons-ibuffer-mode))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package treemacs-all-the-icons :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package all-the-icons-ivy :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :after all-the-icons&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :config (all-the-icons-ivy-setup))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;notice tip&#34; &gt;&#xA;    &lt;p class=&#34;notice-title&#34;&gt;&#xA;        &lt;span class=&#34;icon-notice baseline&#34;&gt;&#xA;            &lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;300.5 134 300 300&#34;&gt;&#xA;  &lt;path d=&#34;M551.281 252.36c0-3.32-1.172-6.641-3.515-8.985l-17.774-17.578c-2.344-2.344-5.469-3.711-8.789-3.711-3.32 0-6.445 1.367-8.789 3.71l-79.687 79.493-44.141-44.14c-2.344-2.344-5.469-3.712-8.79-3.712-3.32 0-6.444 1.368-8.788 3.711l-17.774 17.579c-2.343 2.343-3.515 5.664-3.515 8.984 0 3.32 1.172 6.445 3.515 8.789l70.704 70.703c2.343 2.344 5.664 3.711 8.789 3.711 3.32 0 6.64-1.367 8.984-3.71l106.055-106.056c2.343-2.343 3.515-5.468 3.515-8.789ZM600.5 284c0 82.813-67.188 150-150 150-82.813 0-150-67.188-150-150 0-82.813 67.188-150 150-150 82.813 0 150 67.188 150 150Z&#34;/&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;        &lt;/span&gt;&lt;/p&gt;&lt;p&gt;To install icons font, please follow&#xA;these &lt;a href=&#34;https://github.com/domtronn/all-the-icons.el#installing-fonts&#34;&gt;instructions&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;appendix-b&#34;&gt;Appendix B&lt;/h2&gt;&#xA;&lt;h3 id=&#34;a-note-for-tree-sitter-users&#34;&gt;A Note for Tree-Sitter Users&lt;/h3&gt;&#xA;&lt;div class=&#34;notice note&#34; &gt;&#xA;    &lt;p class=&#34;notice-title&#34;&gt;&#xA;        &lt;span class=&#34;icon-notice baseline&#34;&gt;&#xA;            &lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 128 300 300&#34;&gt;&#xA;  &lt;path d=&#34;M150 128c82.813 0 150 67.188 150 150 0 82.813-67.188 150-150 150C67.187 428 0 360.812 0 278c0-82.813 67.188-150 150-150Zm25 243.555v-37.11c0-3.515-2.734-6.445-6.055-6.445h-37.5c-3.515 0-6.445 2.93-6.445 6.445v37.11c0 3.515 2.93 6.445 6.445 6.445h37.5c3.32 0 6.055-2.93 6.055-6.445Zm-.39-67.188 3.515-121.289c0-1.367-.586-2.734-1.953-3.516-1.172-.976-2.93-1.562-4.688-1.562h-42.968c-1.758 0-3.516.586-4.688 1.563-1.367.78-1.953 2.148-1.953 3.515l3.32 121.29c0 2.734 2.93 4.882 6.64 4.882h36.134c3.515 0 6.445-2.148 6.64-4.883Z&#34;/&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;        &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;I do not use Tree-Sitter for coding in C++&lt;/strong&gt;. It seems it has&#xA;its own rules for indentation that break down the code style I prefer.&lt;/p&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Happy emacsing!&lt;/p&gt;&#xA;&lt;p&gt;&amp;ndash; The Emacs Cat.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;P.S.&lt;/em&gt; Emacs 30.1 has been released on February 23. Thanks for everyone&#xA;involved with this great project!&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;P.P.S.&lt;/em&gt; Mickey Petersen has published his excellent&#xA;&lt;a href=&#34;https://www.masteringemacs.org/article/whats-new-in-emacs-301&#34;&gt;review&lt;/a&gt;&#xA;on what&amp;rsquo;s new in this release.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python Programming in Emacs</title>
      <link>https://olddeuteronomy.github.io/post/python-programming-in-emacs/</link>
      <pubDate>Thu, 26 Dec 2024 10:01:05 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/python-programming-in-emacs/</guid>
      <description>&lt;p&gt;Python is one of my programming languages I&amp;rsquo;m using for both work and&#xA;home life &amp;ndash; no doubt, I&amp;rsquo;d want to use Emacs as an IDE for Python&#xA;programming. There is a certain set of features we&amp;rsquo;d expect to have&#xA;in any IDE: 1) code completion, 2) code navigation, 3) error checking.&lt;/p&gt;&#xA;&lt;p&gt;Thanks to the fact that both &lt;code&gt;eglot&lt;/code&gt;, the Emacs client for the&#xA;Language Server Protocol (LSP), and &lt;code&gt;tree-sitter&lt;/code&gt;, a powerful parsing&#xA;library, are now &amp;ndash; since version 29 &amp;ndash; the parts of Emacs, It should&#xA;not be too hard to construct a lightweight and fast Python IDE.&lt;/p&gt;&#xA;&lt;h2 id=&#34;choosing-a-language-server&#34;&gt;Choosing a Language Server&lt;/h2&gt;&#xA;&lt;p&gt;There are a number of the language servers for Python available these days &amp;ndash;&#xA;&lt;a href=&#34;https://github.com/python-lsp/python-lsp-server&#34;&gt;pylsp&lt;/a&gt;,&#xA;&lt;a href=&#34;https://github.com/palantir/python-language-server&#34;&gt;pyls&lt;/a&gt;,&#xA;&lt;a href=&#34;https://github.com/microsoft/pyright&#34;&gt;pyright&lt;/a&gt;,&#xA;&lt;a href=&#34;https://github.com/pappasam/jedi-language-server&#34;&gt;jedi-language-server&lt;/a&gt;.&#xA;After a series of tests, I&amp;rsquo;ve settled on &lt;a href=&#34;https://github.com/microsoft/pyright&#34;&gt;pyright&lt;/a&gt;,&#xA;an open syntax and type checker from Microsoft &lt;em&gt;(sic!)&lt;/em&gt; used in Visual Studio Code,&#xA;the fast and reliable one, as for me.&lt;/p&gt;&#xA;&lt;p&gt;The Pyright &lt;a href=&#34;https://microsoft.github.io/pyright/#/&#34;&gt;documentation&lt;/a&gt; &amp;ndash;&#xA;a bit weird &amp;ndash; claims that Pyright is just static type checker for Python.&#xA;However, as we&amp;rsquo;ll see later, Pyright can do much more than just type checks.&lt;/p&gt;&#xA;&lt;h2 id=&#34;a-note-on-the-tree-sitter-package&#34;&gt;A note on the Tree-Sitter package&lt;/h2&gt;&#xA;&lt;p&gt;The &lt;code&gt;tree-sitter&lt;/code&gt; package is optional &amp;ndash; I&amp;rsquo;m using it for&#xA;pretty-looking source code fontification mainly. However, if you want&#xA;to use it you have to pay attention to the following quote from the&#xA;Mickey Petersen&amp;rsquo;s &lt;a href=&#34;https://www.masteringemacs.org/article/how-to-get-started-tree-sitter&#34;&gt;&amp;lsquo;Mastering Emacs&amp;rsquo;&lt;/a&gt;&#xA;book:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;And in Emacs 29, support for tree-sitter is built in. Sort of. It&amp;rsquo;s an&#xA;optional extra, so you must compile Emacs from source, or hope that&#xA;someone else will do it for you.&lt;/p&gt;&#xA;&lt;p&gt;Neither tree-sitter nor Emacs come installed with language grammars.&#xA;Just like kids&amp;rsquo; toys and batteries, they&amp;rsquo;re sold separately. So you&amp;rsquo;re&#xA;required to download and compile the sources for each language grammar&#xA;you want to use.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;&amp;ndash; Mastering Emacs by Mickey Petersen.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;If you are &amp;ndash; like me &amp;ndash; on Linux, the best way to setup language&#xA;grammars is to compile them from the source code; you can find all grammars&#xA;available on the &lt;a href=&#34;https://github.com/orgs/tree-sitter/repositories?type=all&#34;&gt;tree-sitter repository&lt;/a&gt;.&#xA;More details at &lt;a href=&#34;https://www.masteringemacs.org/article/how-to-get-started-tree-sitter&#34;&gt;How to Get Started with Tree-Sitter&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;python-prerequisites&#34;&gt;Python prerequisites&lt;/h2&gt;&#xA;&lt;p&gt;First of all, we need to install the following Python packages &amp;ndash;&#xA;&lt;code&gt;pyright&lt;/code&gt; (the language server) and &lt;code&gt;jsonrpc&lt;/code&gt; (the transport layer for&#xA;the LSP).&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;p3&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; $ pip install pyright&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;p3&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; $ pip install jsonrpc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;m running Python in the virtual environment, &amp;ldquo;p3&amp;rdquo; in my case.&lt;/p&gt;&#xA;&lt;h2 id=&#34;error-checking-with-pyright&#34;&gt;Error checking with Pyright&lt;/h2&gt;&#xA;&lt;p&gt;Eglot automatically finds a suitable LSP &amp;ndash; Pyright in our case &amp;ndash;&#xA;when you are opening a Python file. I&amp;rsquo;m using the default Pyright&#xA;settings, no extra tuning required.&lt;/p&gt;&#xA;&lt;h3 id=&#34;pyright-lsp-with-flymake&#34;&gt;Pyright LSP with Flymake&lt;/h3&gt;&#xA;&lt;p&gt;Flymake is a minor Emacs mode performing on-the-fly syntax checks. I&amp;rsquo;m&#xA;using the &lt;code&gt;flymake&lt;/code&gt; built-in Emacs package as an Eglot front-end for&#xA;syntax checks.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(require &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;flymake&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;My custom &lt;code&gt;my/flymake-toggle-diagnostics-buffer&lt;/code&gt; function toggles the&#xA;&lt;em&gt;Flymake diagnostics&lt;/em&gt; buffer window.&lt;/p&gt;&#xA;&lt;p&gt;If there is the Flymake diagnostics buffer associated with a file in&#xA;the current buffer, it shows the diagnostics buffer in the new window&#xA;and switches to it. If the current buffer &lt;em&gt;is&lt;/em&gt; the Flymake diagnostics&#xA;buffer, it closes it. Otherwise it just shows the error message.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun my/flymake-toggle-diagnostics-buffer ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;;; Check if we are in the diagnostics buffer.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (if (string-search &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*Flymake diagnostics&amp;#34;&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;buffer-name&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (delete-window)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (progn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; Activate the Flymake diagnostics buffer.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; and switch to it&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (flymake-show-buffer-diagnostics)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (let ((name (flymake--diagnostics-buffer-name)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (if (&lt;span style=&#34;color:#a6e22e&#34;&gt;get-buffer&lt;/span&gt; name)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (switch-to-buffer-other-window name)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;No Flymake diagnostics buffer found&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          )))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve bound this function to the &lt;code&gt;F7&lt;/code&gt; key globally since I&amp;rsquo;m using &lt;code&gt;F7&lt;/code&gt;&#xA;in other programming modes as well.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key [(f7)] &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;my/flymake-toggle-diagnostics-buffer)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Additional bindings.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C-c f b&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;flymake-show-buffer-diagnostics)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C-c f p&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;flymake-show-project-diagnostics)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The screenshot below shows what happens if you press &lt;code&gt;F7&lt;/code&gt; while&#xA;editing a Python file managed by Eglot + Flymake.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/python-pyright.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/python-pyright.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Click or tap to view the full-size picture.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;As you can see, Pyright can do much more than just type checks.&lt;/p&gt;&#xA;&lt;h2 id=&#34;code-completion&#34;&gt;Code completion&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m using the &lt;a href=&#34;https://company-mode.github.io/&#34;&gt;&lt;code&gt;company&lt;/code&gt;&lt;/a&gt; package, a&#xA;modular in-buffer completion framework for Emacs, as an Eglot&#xA;front-end for code completion; it integrates with Eglot seamlessly.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;;;; `COMPANY&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package company&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :ensure &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq company-idle-delay &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq company-minimum-prefix-length &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq company-show-numbers &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;;; To prevent default down-casing.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;;; https://emacs.stackexchange.com/questions/10837/how-to-make-company-mode-be-case-sensitive-on-plain-text&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq company-dabbrev-downcase &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;;; 2023-01-13 From a Reddit post on mixed case issue.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq company-dabbrev-ignore-case &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (setq company-dabbrev-code-ignore-case &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Use `company&amp;#39; everywhere.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;after-init-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;global-company-mode&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/python-eglot.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/python-eglot.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Click or tap to view the full-size picture.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h2 id=&#34;code-navigation&#34;&gt;Code navigation&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m using the default key bindings for&lt;/p&gt;&#xA;&lt;dl&gt;&#xA;&lt;dt&gt;&lt;code&gt;xref-find-definitions&lt;/code&gt;&lt;/dt&gt;&#xA;&lt;dd&gt;&lt;code&gt;M-.&lt;/code&gt; to find the definition of the identifier at point.&lt;/dd&gt;&#xA;&lt;dt&gt;&lt;code&gt;xref-go-back&lt;/code&gt;&lt;/dt&gt;&#xA;&lt;dd&gt;&lt;code&gt;M-,&lt;/code&gt; to return back to where you invoked the &lt;code&gt;xref-find-definitions&lt;/code&gt; command.&lt;/dd&gt;&#xA;&lt;dt&gt;&lt;code&gt;xref-find-references&lt;/code&gt;&lt;/dt&gt;&#xA;&lt;dd&gt;&lt;code&gt;M-?&lt;/code&gt; to find references to the identifier at point.&lt;/dd&gt;&#xA;&lt;/dl&gt;&#xA;&lt;p&gt;These functions are now powered by Eglot.&lt;/p&gt;&#xA;&lt;h2 id=&#34;final-notes&#34;&gt;Final notes&lt;/h2&gt;&#xA;&lt;p&gt;I can recommend to force using Eglot for Python explicitly &amp;ndash;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(require &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;eglot&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;python-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;eglot-ensure&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;a-note-for-tree-sitter-users&#34;&gt;A note for Tree-Sitter users&lt;/h3&gt;&#xA;&lt;p&gt;If you are using Tree-Sitter for Python, it&amp;rsquo;s recommended to &lt;em&gt;remap&lt;/em&gt;&#xA;the &lt;code&gt;python-mode&lt;/code&gt; to the Tree-Sitter specific &lt;code&gt;python-ts-mode&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-to-list &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;major-mode-remap-alist&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(python-mode &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; python-ts-mode))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If this is the case, do not forget to force using Eglot for this mode&#xA;as well.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;python-ts-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;eglot-ensure&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Happy emacsing!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Emacs Startup Screen</title>
      <link>https://olddeuteronomy.github.io/post/emacs-startup-screen/</link>
      <pubDate>Fri, 06 Dec 2024 18:40:56 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/emacs-startup-screen/</guid>
      <description>&lt;p&gt;Some time ago, I decided to customize my Emacs startup screen in order&#xA;to display something helpful for me. Ultimately, after much&#xA;consideration, I&amp;rsquo;ve settled on the following items I just want to see on&#xA;my startup screen: 1) 3-month calendar, 2) agenda, 3) diary, 4)&#xA;something just for fun.&lt;/p&gt;&#xA;&lt;p&gt;No doubt, there are a number of packages that can assist you in making&#xA;a pretty good-looking startup screen &amp;ndash; like&#xA;&lt;a href=&#34;https://github.com/ichernyshovvv/enlight&#34;&gt;enlight&lt;/a&gt;, for instance.&#xA;However, I decided to construct my own startup screen, a very simple&#xA;one.&lt;/p&gt;&#xA;&lt;p&gt;It requires having two command line utilities installed on your&#xA;system: &lt;code&gt;fortune&lt;/code&gt; to print out a random epigram, and &lt;code&gt;calendar&lt;/code&gt; to&#xA;print out some of the events that have occurred on the current date in&#xA;the past. If you, like me, are using Linux or macOS &amp;ndash; it will not be&#xA;difficult to install them.&lt;/p&gt;&#xA;&lt;p&gt;And this is what I got&amp;hellip;&lt;/p&gt;&#xA;&lt;h2 id=&#34;in-the-emacs-init-file&#34;&gt;In the &lt;code&gt;.emacs&lt;/code&gt; init file&lt;/h2&gt;&#xA;&lt;p&gt;First of all, disable the builtin startup screen.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq inhibit-startup-screen &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then add a startup hook.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;emacs-startup-hook&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (lambda ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (let* ((buffer-today (&lt;span style=&#34;color:#a6e22e&#34;&gt;get-buffer-create&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*today*&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (buffer-calendar &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*Calendar*&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (buffer-agenda &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*Org Agenda*&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (buffer-diary &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*Fancy Diary Entries*&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; Call calendar first to obtain the current date&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; required to display the diary.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (calendar)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (diary)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (org-agenda-list)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; Fill and show the Today Events buffer.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; NOTE: requires `fortune&amp;#39; and `calendar&amp;#39; command line utilities.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (switch-to-buffer buffer-today)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a6e22e&#34;&gt;call-process&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fortune&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; buffer-today)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a6e22e&#34;&gt;insert&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a6e22e&#34;&gt;call-process&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;calendar&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; buffer-today)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a6e22e&#34;&gt;goto-char&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (toggle-truncate-lines)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; Maximize the Today Events window&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (delete-other-windows)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; Show Agenda in the lower left quadrant.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (split-window-vertically)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (other-window &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (switch-to-buffer (&lt;span style=&#34;color:#a6e22e&#34;&gt;get-buffer&lt;/span&gt; buffer-agenda))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (split-window-horizontally)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; Try to show Diary in the lower right quadrant.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (other-window &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (if (&lt;span style=&#34;color:#a6e22e&#34;&gt;get-buffer&lt;/span&gt; buffer-diary)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;;; If Diary exists then show it ...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (switch-to-buffer (&lt;span style=&#34;color:#a6e22e&#34;&gt;get-buffer&lt;/span&gt; buffer-diary))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;;; ... else show the scratch buffer.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (let* ((buffer-scratch (switch-to-buffer (&lt;span style=&#34;color:#a6e22e&#34;&gt;get-buffer&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*scratch*&amp;#34;&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a6e22e&#34;&gt;goto-char&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;point-max&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a6e22e&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;format-time-string&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\n;; No diary entries for %A %d %b&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; Go back to the Today Events buffer.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (other-window &lt;span style=&#34;color:#ae81ff&#34;&gt;-2&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (split-window-horizontally)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; Show Calendar in the upper left quadrant.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (switch-to-buffer (&lt;span style=&#34;color:#a6e22e&#34;&gt;get-buffer&lt;/span&gt; buffer-calendar))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      )))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;the-startup-screen&#34;&gt;The startup screen&lt;/h2&gt;&#xA;&lt;figure&gt;&lt;a href=&#34;https://olddeuteronomy.github.io/img/emacs-init-screen.png&#34;&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/emacs-init-screen.png&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Click or tap to view the full-size picture.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Happy emacsing!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Some Excerpts From My Emacs Config - 2: Functions</title>
      <link>https://olddeuteronomy.github.io/post/some-excerpts-from-config-2-functions/</link>
      <pubDate>Fri, 29 Nov 2024 11:45:17 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/some-excerpts-from-config-2-functions/</guid>
      <description>&lt;p&gt;In his comment on &lt;a href=&#34;https://irreal.org/blog/&#34;&gt;Irreal&lt;/a&gt;&amp;rsquo;s post&#xA;&lt;a href=&#34;https://irreal.org/blog/?p=12595&#34;&gt;Some Configuration To Solve Common Problems&lt;/a&gt;,&#xA;&lt;a href=&#34;https://disqus.com/by/gregbognar/&#34;&gt;gregbognar&lt;/a&gt; noted that some of my&#xA;configuration &lt;em&gt;is seriously outdated&lt;/em&gt;. In some sense, he is absolutely&#xA;correct &amp;ndash; I&amp;rsquo;ve been collecting Emacs settings/tweaks since 2012, and&#xA;keeping them unmodified for 12+ years.&lt;/p&gt;&#xA;&lt;p&gt;But on the other hand, it demonstrates how stable and powerful Emacs&#xA;is &amp;ndash; everything is still working! &lt;em&gt;If something works, don&amp;rsquo;t fix it&lt;/em&gt;&#xA;&amp;ndash; I&amp;rsquo;ve since tried to apply this rule wherever possible.&lt;/p&gt;&#xA;&lt;p&gt;Here are a few functions/enhancements I found helpful.&lt;/p&gt;&#xA;&lt;h2 id=&#34;dired-mode-enhancements&#34;&gt;&lt;code&gt;dired-mode&lt;/code&gt; enhancements&lt;/h2&gt;&#xA;&lt;h3 id=&#34;function-calculate-the-total-size-of-all-marked-files&#34;&gt;Function: Calculate the total size of all marked files&lt;/h3&gt;&#xA;&lt;p&gt;The custom &lt;code&gt;dired-get-size&lt;/code&gt; function calculates the total size of all&#xA;marked files in the dired buffer and displays it in the echo area.&#xA;Files in the dired buffer can be marked with &lt;code&gt;m&lt;/code&gt; key and unmarked with&#xA;&lt;code&gt;u&lt;/code&gt; key.&lt;/p&gt;&#xA;&lt;p&gt;The current version only works on systems with the &lt;code&gt;/usr/bin/du&lt;/code&gt;&#xA;system utility, which actually comprise 100% of the (non-Windows)&#xA;systems &amp;ndash; borrowed from &lt;a href=&#34;https://oremacs.com/2015/01/12/dired-file-size/&#34;&gt;oremacs.com&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun dired-get-size ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Display file size in dired.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (let ((files (dired-get-marked-files)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (with-temp-buffer&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a6e22e&#34;&gt;apply&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;call-process&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/bin/du&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-sch&amp;#34;&lt;/span&gt; files)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a6e22e&#34;&gt;message&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Size of all marked files: %s&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       (progn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;re-search-backward&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\\(^[ 0-9.,]+[A-Za-z]+\\).*total$&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (match-string &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In my config, &lt;code&gt;dired-get-size&lt;/code&gt; is bound to &lt;code&gt;z&lt;/code&gt; key in the &lt;code&gt;dired-mode&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; https://oremacs.com/2015/01/12/dired-file-size/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;define-key&lt;/span&gt; dired-mode-map &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;dired-get-size)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/dired-z.png&#34;/&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;The result of pressing the `z` key in dired.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h3 id=&#34;some-other-dired-mode-enhancements&#34;&gt;Some other &lt;code&gt;dired-mode&lt;/code&gt; enhancements&lt;/h3&gt;&#xA;&lt;h4 id=&#34;move-to-the-parent-directory&#34;&gt;Move to the parent directory&lt;/h4&gt;&#xA;&lt;p&gt;It reuses the current &lt;code&gt;dired&lt;/code&gt; buffer for opening the parent&#xA;directory (&lt;a href=&#34;https://oremacs.com/2015/01/21/dired-shortcuts/&#34;&gt;oremacs.com&lt;/a&gt;)&#xA;instead of creating a new buffer.&#xA;Bounded to the &lt;code&gt;a&lt;/code&gt; key in &lt;code&gt;dired-mode&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Move to the parent directory.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;define-key&lt;/span&gt; dired-mode-map &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (lambda ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (find-alternate-file &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;..&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;run-eshell-in-the-current-dired-directory&#34;&gt;Run &lt;code&gt;eshell&lt;/code&gt; in the current &lt;code&gt;dired&lt;/code&gt; directory&lt;/h4&gt;&#xA;&lt;p&gt;Bounded to the ` back-tick key in &lt;code&gt;dired-mode&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Run eshell.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;define-key&lt;/span&gt; dired-mode-map &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (lambda ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (eshell)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;date-and-time-stamps&#34;&gt;Date and time stamps&lt;/h2&gt;&#xA;&lt;p&gt;Inserting the date and/or time stamps at the current cursor position.&#xA;You can bind these functions to any key chords you prefer or call the&#xA;corresponding function with &lt;code&gt;M-x&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun my/time-stamp ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Insert full date/time stamp as 2024-11-29 10:41 +0100 CET&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;format-time-string&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%Y-%m-%d %R %z %Z&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun my/time-stamp-short ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Insert short date/time stamp as 2024-11-29 10:41&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;format-time-string&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%Y-%m-%d %R&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun my/date-stamp ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Insert date stamp as 2024-11-29&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;format-time-string&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%Y-%m-%d&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;some-editing-tweaks&#34;&gt;Some editing tweaks&lt;/h2&gt;&#xA;&lt;h3 id=&#34;inserting-a-new-line&#34;&gt;Inserting a new line&lt;/h3&gt;&#xA;&lt;p&gt;Insert a new line, indent it, and move the cursor there. This behavior&#xA;is different then the typical function bound to &lt;code&gt;Enter&lt;/code&gt; which may be&#xA;&lt;code&gt;open-line&lt;/code&gt; or &lt;code&gt;newline-and-indent&lt;/code&gt;. When you call them with the cursor&#xA;between ^ (beginning of line) and $ (end of line), the contents of the&#xA;line to the right of it will be moved to the newly inserted line. &lt;em&gt;This&#xA;function will not do that&lt;/em&gt;. Instead, the current line is &lt;em&gt;left alone&lt;/em&gt;, a new line&#xA;is inserted, indented, and the cursor is moved there. Borrowed from&#xA;&lt;a href=&#34;http://emacsredux.com/blog/2013/03/26/smarter-open-line/&#34;&gt;emacsredux&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun smart-open-line ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Insert a new line, indent it, and move the cursor there.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (move-end-of-line &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (newline-and-indent))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;C-return&amp;gt;&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;smart-open-line)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I have bound it globally to &lt;code&gt;Ctrl-Enter&lt;/code&gt; &amp;ndash; &lt;code&gt;C-return&lt;/code&gt; in the Emacs&#xA;notation &amp;ndash; so it should work in any mode.&lt;/p&gt;&#xA;&lt;h3 id=&#34;smart-beginning-of-line&#34;&gt;Smart beginning of line&lt;/h3&gt;&#xA;&lt;p&gt;Move point to first non-whitespace character or &lt;code&gt;beginning-of-line&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun smart-beginning-of-line ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Move point to first non-whitespace character or `beginning-of-line`.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (let ((oldpos (&lt;span style=&#34;color:#a6e22e&#34;&gt;point&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (back-to-indentation)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (and (&lt;span style=&#34;color:#a6e22e&#34;&gt;=&lt;/span&gt; oldpos (&lt;span style=&#34;color:#a6e22e&#34;&gt;point&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;beginning-of-line&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C-a&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;smart-beginning-of-line)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve rebound the &lt;em&gt;default&lt;/em&gt; &lt;code&gt;Ctrl-A&lt;/code&gt; &amp;ndash; &lt;code&gt;C-a&lt;/code&gt; in the Emacs notation &amp;ndash; to&#xA;move to first non-whitespace character of a line instead of first&#xA;column.&lt;/p&gt;&#xA;&lt;h3 id=&#34;killing-a-word-at-point&#34;&gt;Killing a word at point&lt;/h3&gt;&#xA;&lt;p&gt;Deleting the whole word at the cursor position.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun kill-whole-word ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kill the current word at point.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (backward-word)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (kill-word &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;define-key&lt;/span&gt; global-map (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;M-DEL&amp;gt;&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;kill-whole-word)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve rebound it to &lt;code&gt;Alt-delete&lt;/code&gt; &amp;ndash; &lt;code&gt;M-DEL&lt;/code&gt; in the Emacs notation.&lt;/p&gt;&#xA;&lt;h2 id=&#34;nuke-all-buffers&#34;&gt;Nuke all buffers&lt;/h2&gt;&#xA;&lt;p&gt;Kill all buffers, leaving &lt;em&gt;*scratch*&lt;/em&gt; only.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun nuke-all-buffers ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kill all buffers, leaving *scratch* only.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;mapc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (lambda (buffer)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#a6e22e&#34;&gt;kill-buffer&lt;/span&gt; buffer))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a6e22e&#34;&gt;buffer-list&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (delete-other-windows))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To be continued. Happy emacsing!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Migration to Bluesky</title>
      <link>https://olddeuteronomy.github.io/post/migration-to-bluesky/</link>
      <pubDate>Fri, 22 Nov 2024 11:23:12 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/migration-to-bluesky/</guid>
      <description>&lt;p&gt;After reading the quite interesting post &lt;a href=&#34;https://cestlaz.github.io/post/blue-sky/&#34;&gt;Blue Sky&lt;/a&gt;&#xA;by &lt;a href=&#34;https://bsky.app/profile/zamansky.bsky.social&#34;&gt;Mike Zamansky&lt;/a&gt; I decided to begin&#xA;my gentle migration to &lt;a href=&#34;https://bsky.app/&#34;&gt;Bluesky&lt;/a&gt;, a new and promising social media platform.&lt;/p&gt;&#xA;&lt;p&gt;I completely agree with Mike&amp;rsquo;s opinion on Twitter as well as other&#xA;social platforms. Like many of us, I migrated from&#xA;&lt;a href=&#34;https://x.com/ODeuteronomy&#34;&gt;Twitter&lt;/a&gt; &amp;ndash; keeping my existing account&#xA;there &amp;ndash; to &lt;a href=&#34;https://emacs.ch/@olddeuteronomy&#34;&gt;Mastodon&lt;/a&gt;.&#xA;Unfortunately, Mastodon, largely due to its distributed architecture,&#xA;seems to be more fragile than other platforms &amp;ndash; recently, I have been&#xA;warned that &lt;a href=&#34;https://emacs.ch&#34;&gt;emacs.ch&lt;/a&gt;, a fediverse server I have been using for two&#xA;years now, is about to shutdown in this December.&lt;/p&gt;&#xA;&lt;p&gt;Sure, there is a (bit complex) way to transfer your Mastodon account&#xA;to another server &amp;ndash; and here is &lt;a href=&#34;https://fedi.tips/transferring-your-mastodon-account-to-another-server/&#34;&gt;detailed explanation&lt;/a&gt;&#xA;on how to do that. Perhaps, I will do that in the nearest future, but&#xA;who can guarantee that the new server is immune from the same fate?&lt;/p&gt;&#xA;&lt;p&gt;Anyway, Bluesky looks promising and I decided to give it a try.&#xA;You can find me at &lt;a href=&#34;https://bsky.app/profile/olddeuteronomy.bsky.social&#34;&gt;@olddeuteronomy.bsky.social&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Some Excerpts From My Emacs Config</title>
      <link>https://olddeuteronomy.github.io/post/some-excerpts-from-my-emacs-config/</link>
      <pubDate>Wed, 20 Nov 2024 11:52:19 +0100</pubDate>
      <guid>https://olddeuteronomy.github.io/post/some-excerpts-from-my-emacs-config/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to be back after one year away and it feels great.&lt;/p&gt;&#xA;&lt;p&gt;Below are some chaotic mini/micro &amp;ndash; or even nano &amp;ndash; excerpts from my&#xA;&lt;code&gt;~/.emacs&lt;/code&gt; file I have been tuning in for 12 years. These days, I&amp;rsquo;m&#xA;running Emacs 29.4 on Ubuntu (Pop!_OS) 22.04 and, rarely, on macOS.&lt;/p&gt;&#xA;&lt;p&gt;These tweaks have been collected from various sources; I provide a&#xA;reference to the source if available.&lt;/p&gt;&#xA;&lt;h2 id=&#34;checking-the-operating-system-emacs-is-running-on&#34;&gt;Checking the operating system Emacs is running on&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar my/os-linux (&lt;span style=&#34;color:#a6e22e&#34;&gt;string-equal&lt;/span&gt; system-type &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gnu/linux&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;I&amp;#39;m on Linux&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar my/os-macos (&lt;span style=&#34;color:#a6e22e&#34;&gt;string-equal&lt;/span&gt; system-type &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;darwin&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Oh, I&amp;#39;m on macOS&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar my/os-windows (&lt;span style=&#34;color:#a6e22e&#34;&gt;string-equal&lt;/span&gt; system-type &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;windows-nt&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;OMG, that&amp;#39;s Windows!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;macos-keyboard&#34;&gt;macOS keyboard&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Disable Command key and enable Options as Meta.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(if my/os-macos&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (setq mac-command-key-is-meta &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mac-command-modifier &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;super&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mac-option-key-is-meta &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mac-option-modifier &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;meta&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;everything-is-utf-8&#34;&gt;Everything is UTF-8&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(set-language-environment &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;utf-8&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq locale-coding-system &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;utf-8&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq buffer-file-coding-system &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;utf-8-unix&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(set-terminal-coding-system &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;utf-8&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(set-keyboard-coding-system &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;utf-8&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(set-selection-coding-system &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;utf-8&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(prefer-coding-system &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;utf-8&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;smooth-scrolling&#34;&gt;Smooth scrolling&lt;/h2&gt;&#xA;&lt;p&gt;Borrowed from &lt;a href=&#34;http://home.thep.lu.se/~karlf/emacs.html&#34;&gt;http://home.thep.lu.se/~karlf/emacs.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq scroll-step &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Marker distance from center (don&amp;#39;t jump to center).&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq scroll-conservatively &lt;span style=&#34;color:#ae81ff&#34;&gt;100000&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Try to keep screen position when PgDn/PgUp.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq scroll-preserve-screen-position &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Start scrolling when marker at top/bottom.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq scroll-margin &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Mouse scroll moves 1 line at a time, instead of 5 lines.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq mouse-wheel-scroll-amount &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; On a long mouse scroll keep scrolling by 1 line.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq mouse-wheel-progressive-speed &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;some-helpful-tips-for-emacsing-in-comfort&#34;&gt;Some helpful tips for emacsing in comfort&lt;/h2&gt;&#xA;&lt;h3 id=&#34;clipboard&#34;&gt;Clipboard&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Non-nil means cutting and pasting uses the clipboard.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq x-select-enable-clipboard &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;turning-off-some-annoying-features&#34;&gt;Turning off some annoying features&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; No ToolBar, please.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(tool-bar-mode &lt;span style=&#34;color:#ae81ff&#34;&gt;-1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; No alarms, please.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq ring-bell-function &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ignore&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; No lock files, please.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; https://emacs.stackexchange.com/questions/78800/how-to-disable-automatic-appearance-of-warnings-buffer-in-emacs&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq create-lockfiles &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Sentences do not need double spaces to end. Period.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;set-default&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;sentence-end-double-space&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Replace &amp;#34;yes&amp;#34; by &amp;#34;y&amp;#34;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;fset&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;yes-or-no-p&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;y-or-n-p&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Don’t use dialog boxes.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq use-dialog-box &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; For gpg (works on Ubuntu and macOS) to disable custom prompt.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setenv &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GPG_AGENT_INFO&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Speedup cursor movement.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; https://emacs.stackexchange.com/questions/28736/emacs-pointcursor-movement-lag/28746&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq auto-window-vscroll &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Spaces instead of tabs when indenting.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Some people may not agree with this though.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq-default indent-tabs-mode &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;turning-on-some-helpful-features&#34;&gt;Turning on some helpful features&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Nonzero means echo unfinished commands after this many seconds of&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; pause. The value may be integer or floating point. If the value is&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; zero, don’t echo at all.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq echo-keystrokes &lt;span style=&#34;color:#ae81ff&#34;&gt;0.01&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Winner mode is a global minor mode that records the changes in the&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; window configuration.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Window-Convenience.html&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(winner-mode &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Turn on highlighting current line.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; http://ergoemacs.org/emacs/emacs_make_modern.html&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-hl-line-mode &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Replace highlighted text with what I type rather than just&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; inserting at point.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(delete-selection-mode &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Restore opened files.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(desktop-save-mode &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Save minibuffer history.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(savehist-mode &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; When on a tab, make the cursor the tab length.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq-default x-stretch-cursor &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Auto refresh dired when file changes.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; http://pragmaticemacs.com/emacs/automatically-revert-buffers/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;dired-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;auto-revert-mode&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Auto refresh dired, but be quiet about it.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq global-auto-revert-non-file-buffers &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq auto-revert-verbose &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Automatically reload files was modified by external program.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; https://www.emacswiki.org/emacs/AutoRevertMode&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-auto-revert-mode &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Make URLs in comments/strings clickable, (Emacs &amp;gt; v22).&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;find-file-hooks&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;goto-address-prog-mode&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Display fringe indicators in `visual-line-mode`.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq visual-line-fringe-indicators &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(left-curly-arrow right-curly-arrow))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Switching the focus to the help window when it&amp;#39;s opened.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq help-window-select &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;frame-title&#34;&gt;Frame title&lt;/h3&gt;&#xA;&lt;p&gt;Template for displaying the title bar of visible frames.&#xA;(Assuming the window manager supports this feature.)&lt;/p&gt;&#xA;&lt;p&gt;This variable has the same structure as &lt;code&gt;mode-line-format&lt;/code&gt;, except that&#xA;the %c, %C, and %l constructs are ignored.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Frame title.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq frame-title-format &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%F--%b-[%f]--%Z&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;electric-pair-mode&#34;&gt;Electric Pair mode&lt;/h3&gt;&#xA;&lt;p&gt;Electric Pair mode is a global minor mode. When enabled, typing an&#xA;open parenthesis automatically inserts the corresponding closing&#xA;parenthesis, and vice versa. (Likewise for brackets, etc.). If the&#xA;region is active, the parentheses (brackets, etc.) are inserted around&#xA;the region instead.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Global.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(electric-pair-mode &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;calendar-tweaks&#34;&gt;Calendar tweaks&lt;/h2&gt;&#xA;&lt;p&gt;If you want to be informed about the times of sunrise and sunset for&#xA;any date at your location, Emacs is always ready to lend a hand &amp;ndash; you&#xA;just need to provide your coordinates to Emacs. Use one decimal place&#xA;in the values of &lt;code&gt;calendar-latitude&lt;/code&gt; and &lt;code&gt;calendar-longitude&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar calendar-latitude NN.N)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar calendar-longitude NN.N)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Number of minutes difference between local standard time and UTC.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; For example, -300 for New York City, -480 for Los Angeles.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar calendar-time-zone NNN)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Optional, the default value is just the variable `calendar-latitude`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; paired with the variable `calendar-longitude`.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar calendar-location-name &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Your City, Your Country&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Within the calendar, the following commands are available:&lt;/p&gt;&#xA;&lt;dl&gt;&#xA;&lt;dt&gt;&lt;code&gt;S&lt;/code&gt;&lt;/dt&gt;&#xA;&lt;dd&gt;Display times of sunrise and sunset for the selected date (&lt;code&gt;calendar-sunrise-sunset&lt;/code&gt;).&lt;/dd&gt;&#xA;&lt;dt&gt;&lt;code&gt;M-x sunrise-sunset&lt;/code&gt;&lt;/dt&gt;&#xA;&lt;dd&gt;Display times of sunrise and sunset for today&amp;rsquo;s date.&lt;/dd&gt;&#xA;&lt;dt&gt;&lt;code&gt;C-u M-x sunrise-sunset&lt;/code&gt;&lt;/dt&gt;&#xA;&lt;dd&gt;Display times of sunrise and sunset for a specified date.&lt;/dd&gt;&#xA;&lt;dt&gt;&lt;code&gt;M-x calendar-sunrise-sunset-month&lt;/code&gt;&lt;/dt&gt;&#xA;&lt;dd&gt;Display times of sunrise and sunset for the selected month.&lt;/dd&gt;&#xA;&lt;/dl&gt;&#xA;&lt;p&gt;The command &lt;code&gt;M-x sunrise-sunset&lt;/code&gt; is also available outside the&#xA;calendar to display the sunrise and sunset information for today&amp;rsquo;s&#xA;date in the echo area.&lt;/p&gt;&#xA;&lt;h3 id=&#34;some-other-calendar-tweaks&#34;&gt;Some other Calendar tweaks&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; First day of the week: 0:Sunday, 1:Monday.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar calendar-week-start-day &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Use European date format (DD/MM/YYYY or 9 October 2024).&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar calendar-date-style &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;european&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To be continued. Happy emacsing!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Org Mode: Exporting Clock Tables</title>
      <link>https://olddeuteronomy.github.io/post/org-export-clocktables/</link>
      <pubDate>Tue, 01 Aug 2023 14:07:46 +0300</pubDate>
      <guid>https://olddeuteronomy.github.io/post/org-export-clocktables/</guid>
      <description>&lt;p&gt;After reading a quite interesting post by Irreal on &lt;a href=&#34;https://irreal.org/blog/?p=11416&#34;&gt;Org mode clock tables&lt;/a&gt;,&#xA;I decided to share my — a bit specific —  experience with the subject.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-task&#34;&gt;The Task&lt;/h2&gt;&#xA;&lt;p&gt;Like many of us these days, I&amp;rsquo;m working remotely. My employer requires&#xA;a periodic report and I should track my time I spend on various task —&#xA;exactly as Irreal describes in his post. Of course, I&amp;rsquo;m using Org mode&#xA;clock tables for that purpose.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+TITLE&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;: Worktime Tracker for July 2023&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+OPTIONS&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;: num:nil toc:nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+BEGIN&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;: clocktable :maxlevel 3 :scope file&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#+END&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*&lt;span style=&#34;font-weight:bold&#34;&gt; 2023-07   &lt;/span&gt;&lt;span style=&#34;font-style:italic&#34;&gt; :2023:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;**&lt;/span&gt; 2023-07-03&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;***&lt;/span&gt; Impl. a test gRPC server                           &lt;span style=&#34;font-style:italic&#34;&gt; :TEST:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;:LOGBOOK:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;CLOCK: [2023-07-03 Mon 15:05]--[2023-07-03 Mon 15:50] =&amp;gt;  0:45&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;CLOCK: [2023-07-03 Mon 09:45]--[2023-07-03 Mon 14:10] =&amp;gt;  4:25&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;:END:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;**&lt;/span&gt; 2023-07-04&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;***&lt;/span&gt; Fix client timeout                                  &lt;span style=&#34;font-style:italic&#34;&gt; :FIX:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;:LOGBOOK:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;CLOCK: [2023-07-04 Tue 12:45]--[2023-07-04 Tue 13:10] =&amp;gt;  0:25&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;:END:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;***&lt;/span&gt; Add AddOrder handler                               &lt;span style=&#34;font-style:italic&#34;&gt; :FEAT:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;:LOGBOOK:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;CLOCK: [2023-07-04 Tue 14:05]--[2023-07-04 Tue 15:10] =&amp;gt;  1:05&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;:END:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then if I put the cursor at the line with the word &lt;code&gt;#+BEGIN&lt;/code&gt; (line #4&#xA;in my org file) and press &lt;code&gt;C-c C-c&lt;/code&gt; (in the Org mode, this chord runs&#xA;the multipurpose command &lt;code&gt;org-ctrl-c-ctrl-c&lt;/code&gt;), the dynamic clock table&#xA;block is getting updated immediately and I get a standard clock table&#xA;report as shown below.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+BEGIN&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;: clocktable :maxlevel 3 :scope file&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#+CAPTION&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;: Clock summary at [2023-07-30 Sun 15:32]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;| Headline                       | Time |      |      |&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;|--------------------------------+------+------+------|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;| *Total time*                   |*6:40*|      |      |&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;|--------------------------------+------+------+------|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;| 2023-07                        | 6:40 |      |      |&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;| \_  2023-07-03                 |      | 5:10 |      |&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;| \_    Impl. a test gRPC server |      |      | 5:10 |&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;| \_  2023-07-04                 |      | 1:30 |      |&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;| \_    Fix client timeout       |      |      | 0:25 |&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;| \_    Add AddOrder handler     |      |      | 1:05 |&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#+END&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So far, everything looks fine.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;&#xA;&lt;p&gt;The problem is that my employer wants the report to be in a specific&#xA;format.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/clock-report.png&#34;/&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;The required MS Word (sic!) file with the work time report.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Please note the column #1 should contain &lt;em&gt;a tag&lt;/em&gt; of the task, all dates&#xA;should be in the &lt;em&gt;DD.MM.YYYY&lt;/em&gt; format, a time spent for the task should&#xA;be in the &lt;em&gt;hh:mm&lt;/em&gt; format, left-padded with 0s if required, and the&#xA;total time should be in the &lt;em&gt;hhh:mm&lt;/em&gt; format, left-padded with 0s as&#xA;well.&lt;/p&gt;&#xA;&lt;p&gt;Here the adventure begins.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-adventure&#34;&gt;The Adventure&lt;/h2&gt;&#xA;&lt;p&gt;I decided to implement my &lt;em&gt;exporter&lt;/em&gt; as the Elisp code block inside my&#xA;time tracking org file. Therefore, if I press &lt;code&gt;C-c C-c&lt;/code&gt; when the&#xA;cursor is over the &lt;em&gt;exporter&lt;/em&gt; code block, Emacs evaluates this block&#xA;and prints the result just below the block. This would allow us to&#xA;make some experiments.&lt;/p&gt;&#xA;&lt;p&gt;First of all, I need an access to my clock table entries. After some&#xA;research I found what I need — &lt;code&gt;org-clock-get-table-data&lt;/code&gt;, a built-in&#xA;function defined in the &lt;code&gt;org-clock.el[.gz]&lt;/code&gt; file (as of Emacs 28.2).&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun org-clock-get-table-data (file params)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Get the clocktable data for file FILE, with parameters PARAMS.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;FILE is only for identification - this function assumes that&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;the correct buffer is current, and that the wanted restriction is&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;in place.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;The return value will be a list with the file name and the total&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;file time (in minutes) as 1st and 2nd elements.  The third element&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;of this list will be a list of headline entries.  Each entry has the&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;following structure:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  (LEVEL HEADLINE TAGS TIMESTAMP TIME PROPERTIES)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;LEVEL:      The level of the headline, as an integer.  This will be&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            the reduced level, so 1,2,3,... even if only odd levels&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            are being used.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;HEADLINE:   The text of the headline.  Depending on PARAMS, this may&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            already be formatted like a link.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;TAGS:       The list of tags of the headline.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;TIMESTAMP:  If PARAMS require it, this will be a time stamp found in the&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            entry, any of SCHEDULED, DEADLINE, NORMAL, or first inactive,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            in this sequence.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;TIME:       The sum of all time spend in this tree, in minutes.  This time&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            will of cause be restricted to the time block and tags match&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            specified in PARAMS.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;PROPERTIES: The list properties specified in the `:properties&amp;#39; parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            along with their value, as an alist following the pattern&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            (NAME . VALUE).&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s make an experiment.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+begin_src elisp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(org-clock-get-table-data &lt;span style=&#34;color:#a6e22e&#34;&gt;buffer-file-name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(:tags &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+end_src&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+RESULTS:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| /home/magnolia/Desktop/demo.org | &lt;span style=&#34;color:#ae81ff&#34;&gt;400&lt;/span&gt; | ((&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; 2023-07 (&lt;span style=&#34;color:#ae81ff&#34;&gt;2023&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;400&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;) (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; 2023-07-03 (&lt;span style=&#34;color:#ae81ff&#34;&gt;2023&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;310&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;) (&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; Impl. a test gRPC server (&lt;span style=&#34;color:#ae81ff&#34;&gt;2023&lt;/span&gt; TEST) &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;310&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;) (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; 2023-07-04 (&lt;span style=&#34;color:#ae81ff&#34;&gt;2023&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;90&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;) (&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; Fix client timeout (&lt;span style=&#34;color:#ae81ff&#34;&gt;2023&lt;/span&gt; FIX) &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;) (&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; Add AddOrder handler (&lt;span style=&#34;color:#ae81ff&#34;&gt;2023&lt;/span&gt; FEAT) &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;65&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)) |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Please note the output is an Org table because the result is a list.&#xA;Please also note the &lt;code&gt;&#39;(:tags t)&lt;/code&gt; parameter — it is required because&#xA;we want all tags to be included in the output.&lt;/p&gt;&#xA;&lt;p&gt;Obviously, we actually want the 3rd element of the output list.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+begin_src elisp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;nth&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; (org-clock-get-table-data &lt;span style=&#34;color:#a6e22e&#34;&gt;buffer-file-name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(:tags &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+end_src&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+RESULTS:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; |                  2023-07 | (&lt;span style=&#34;color:#ae81ff&#34;&gt;2023&lt;/span&gt;)      | &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; | &lt;span style=&#34;color:#ae81ff&#34;&gt;400&lt;/span&gt; | &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; |               2023-07-03 | (&lt;span style=&#34;color:#ae81ff&#34;&gt;2023&lt;/span&gt;)      | &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; | &lt;span style=&#34;color:#ae81ff&#34;&gt;310&lt;/span&gt; | &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; | Impl. a test gRPC server | (&lt;span style=&#34;color:#ae81ff&#34;&gt;2023&lt;/span&gt; TEST) | &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; | &lt;span style=&#34;color:#ae81ff&#34;&gt;310&lt;/span&gt; | &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; |               2023-07-04 | (&lt;span style=&#34;color:#ae81ff&#34;&gt;2023&lt;/span&gt;)      | &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; |  &lt;span style=&#34;color:#ae81ff&#34;&gt;90&lt;/span&gt; | &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; |       Fix client timeout | (&lt;span style=&#34;color:#ae81ff&#34;&gt;2023&lt;/span&gt; FIX)  | &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; |  &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt; | &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; |     Add AddOrder handler | (&lt;span style=&#34;color:#ae81ff&#34;&gt;2023&lt;/span&gt; FEAT) | &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; |  &lt;span style=&#34;color:#ae81ff&#34;&gt;65&lt;/span&gt; | &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It seems we are on the right way. The column #1 contains the level of&#xA;the headline, as an integer; #2 — the text of the headline; #3 — the&#xA;list of tags of the headline; #5 — the sum of all time spend in this&#xA;tree, in minutes, as an integer.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-magic&#34;&gt;The Magic&lt;/h3&gt;&#xA;&lt;p&gt;Before implementing the clock table parser, we need some &lt;em&gt;utilities&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;First of all we should convert a date from the ISO 8601 format&#xA;(YYYY-MM-DD) to the European DD.MM.YYYY format.&#xA;According to the &lt;a href=&#34;https://www.gnu.org/software/emacs/manual/html_node/elisp/Time-Parsing.html&#34;&gt;GNU Emacs Lisp Reference Manual&lt;/a&gt;,&#xA;we can use two built-in functions for this purpose:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Function: &lt;code&gt;format-time-string&lt;/code&gt; &lt;em&gt;format-string &amp;amp;optional time zone&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;This function converts &lt;em&gt;time&lt;/em&gt; (which should be a Lisp &lt;strong&gt;timestamp&lt;/strong&gt;,&#xA;and defaults to the current time if time is omitted or nil) to a&#xA;string according to format-string.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;and&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Function: &lt;code&gt;date-to-time&lt;/code&gt; &lt;em&gt;string&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;This function parses the time-string &lt;em&gt;string&lt;/em&gt; and returns the&#xA;corresponding Lisp &lt;strong&gt;timestamp&lt;/strong&gt;.&#xA;This function assumes Universal Time if &lt;em&gt;string&lt;/em&gt; lacks explicit time zone information,&#xA;and &lt;em&gt;assumes earliest values if string lacks month, day, or time&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;As we&amp;rsquo;ll see below, the last sentence (in italic) is wrong — at least as of Emacs&#xA;28.2. Maybe it has something to do with&#xA;&lt;a href=&#34;https://debbugs.gnu.org/cgi/bugreport.cgi?bug=52209&#34;&gt;this bug in Emacs 28&lt;/a&gt;,&#xA;I don&amp;rsquo;t know.&lt;/p&gt;&#xA;&lt;p&gt;Okay, let&amp;rsquo;s test it out.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+begin_src elisp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;format-time-string&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%d.%m.%Y&amp;#34;&lt;/span&gt; (date-to-time &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2023-07&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+end_src&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Error: date-to-time: Invalid date: 2023-07&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This doesn&amp;rsquo;t work.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+begin_src elisp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;format-time-string&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%d.%m.%Y&amp;#34;&lt;/span&gt; (date-to-time &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2023-07-04&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+end_src&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Error: date-to-time: Invalid date: 2023-07-04&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This doesn&amp;rsquo;t work as well.&lt;/p&gt;&#xA;&lt;p&gt;This is where the magic begins. Let&amp;rsquo;s add &lt;em&gt;a fake time component&lt;/em&gt;&#xA;&lt;code&gt;T01&lt;/code&gt; to the ISO date string.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+begin_src elisp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;format-time-string&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%d.%m.%Y&amp;#34;&lt;/span&gt; (date-to-time &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2023-07-04T01&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+end_src&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+RESULTS:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; 04.07.2023&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It worked, I&amp;rsquo;m so happy.&lt;/p&gt;&#xA;&lt;p&gt;Now let&amp;rsquo;s implement a utility function that converts a time, in&#xA;minutes, as an integer, to the properly padded  string.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+begin_src elisp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (defun my/clock--format-time (time-in-minutes &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;optional&lt;/span&gt; padding)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Convert TIME-IN-MINUTES, as an integer, to a string,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;   with hours left-padded with zeroes. Default PADDING is 2.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (let* ((hours (&lt;span style=&#34;color:#a6e22e&#34;&gt;/&lt;/span&gt; time-in-minutes &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (minutes (&lt;span style=&#34;color:#a6e22e&#34;&gt;-&lt;/span&gt; time-in-minutes (&lt;span style=&#34;color:#a6e22e&#34;&gt;*&lt;/span&gt; hours &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a6e22e&#34;&gt;format&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;concat&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%0&amp;#34;&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%d&amp;#34;&lt;/span&gt; (or padding &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;d:%02d&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               hours minutes)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; TEST&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(my/clock--format-time &lt;span style=&#34;color:#ae81ff&#34;&gt;310&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+end_src&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+RESULTS:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; 05:10&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Okay, it works.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-result&#34;&gt;The Result&lt;/h2&gt;&#xA;&lt;p&gt;Now let&amp;rsquo;s combine everything together and then evaluate the code&#xA;block.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+begin_src elisp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (require &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;org-clock&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (defvar my/cur-date &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Holds the current entry date.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (defun my/clock--format-time (time-in-minutes &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;optional&lt;/span&gt; padding)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Convert TIME-IN-MINUTES, as an integer, to a string,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;   with hours left-padded with zeroes. Default PADDING is 2.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (let* ((hours (&lt;span style=&#34;color:#a6e22e&#34;&gt;/&lt;/span&gt; time-in-minutes &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (minutes (&lt;span style=&#34;color:#a6e22e&#34;&gt;-&lt;/span&gt; time-in-minutes (&lt;span style=&#34;color:#a6e22e&#34;&gt;*&lt;/span&gt; hours &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a6e22e&#34;&gt;format&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;concat&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%0&amp;#34;&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%d&amp;#34;&lt;/span&gt; (or padding &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;d:%02d&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               hours minutes)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (defun my/clock--parse-entry (entry)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Parse the clock table ENTRY, returning a list of row items,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;   depending on the level of the headline.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (let* ((level (&lt;span style=&#34;color:#a6e22e&#34;&gt;car&lt;/span&gt; entry))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (headline (&lt;span style=&#34;color:#a6e22e&#34;&gt;nth&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; entry))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (tag (&lt;span style=&#34;color:#a6e22e&#34;&gt;nth&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;nth&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; entry)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (minutes (&lt;span style=&#34;color:#a6e22e&#34;&gt;nth&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt; entry))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (date (if (&lt;span style=&#34;color:#a6e22e&#34;&gt;=&lt;/span&gt; level &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (&lt;span style=&#34;color:#a6e22e&#34;&gt;format-time-string&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%d.%m.%Y&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                         (date-to-time (&lt;span style=&#34;color:#a6e22e&#34;&gt;concat&lt;/span&gt; headline &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;T01&amp;#34;&lt;/span&gt;))))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (cond&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ((&lt;span style=&#34;color:#a6e22e&#34;&gt;=&lt;/span&gt; level &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) (&lt;span style=&#34;color:#a6e22e&#34;&gt;list&lt;/span&gt; headline &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TOTAL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; (my/clock--format-time minutes &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ((&lt;span style=&#34;color:#a6e22e&#34;&gt;=&lt;/span&gt; level &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) (progn (setq my/cur-date date) &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ((&lt;span style=&#34;color:#a6e22e&#34;&gt;=&lt;/span&gt; level &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;) (&lt;span style=&#34;color:#a6e22e&#34;&gt;list&lt;/span&gt; tag headline my/cur-date (my/clock--format-time minutes)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      )))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;;; Apply the parser to every entry in the clock table.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;mapcar&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;my/clock--parse-entry&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#a6e22e&#34;&gt;nth&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; (org-clock-get-table-data &lt;span style=&#34;color:#a6e22e&#34;&gt;buffer-file-name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(:tags &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+end_src&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;+RESULTS:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| 2023-07 | TOTAL                    |            | 006:40 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| TEST    | Impl. a test gRPC server | 03.07.2023 |  05:10 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| FIX     | Fix client timeout       | 04.07.2023 |  00:25 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| FEAT    | Add AddOrder handler     | 04.07.2023 |  01:05 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bingo! We&amp;rsquo;ve got what we exactly want — the Org mode table filled with&#xA;properly formatted data. Now I can just copy this table from my work&#xA;time org file to another org file and export it to the ODT file (and&#xA;then save it as the MS Word file).&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/clock-report.png&#34;/&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;The MS Word file with the work time report.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Tested on Ubuntu Linux (Pop!_OS 20.10) and MS Windows 10 using Emacs 28.2.&lt;/p&gt;&#xA;&lt;h2 id=&#34;conclusions&#34;&gt;Conclusions&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;We can have access to all the data collected in a clock table.&lt;/li&gt;&#xA;&lt;li&gt;Org mode code blocks provide an ideal way to make experiments,&#xA;testing your code, and getting the result &lt;em&gt;inplace&lt;/em&gt;.&lt;/li&gt;&#xA;&lt;li&gt;In Emacs, you can do everything.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Happy emacsing!&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Simple tree-sitter Config That Works</title>
      <link>https://olddeuteronomy.github.io/post/a-tree-sitter-config-that-works/</link>
      <pubDate>Mon, 05 Dec 2022 14:14:13 +0300</pubDate>
      <guid>https://olddeuteronomy.github.io/post/a-tree-sitter-config-that-works/</guid>
      <description>&lt;p&gt;Recently, I&amp;rsquo;ve discovered a number of posts on Reddit — like&#xA;&lt;a href=&#34;https://www.reddit.com/r/emacs/comments/zc70m8/treesitterhlmode_does_not_do_anything/&#34;&gt;tree-sitter-hl-mode does not do&#xA;anything&lt;/a&gt;&#xA;or &lt;a href=&#34;https://www.reddit.com/r/emacs/comments/zbpa42/how_to_use_emacs_29_treesitter/&#34;&gt;How to use Emacs 29&#xA;Tree-sitter?&lt;/a&gt;&#xA;— and decided to share my simple &lt;code&gt;tree-sitter&lt;/code&gt; setup that&#xA;seems to be working on my Emacs 28.2 like a charm.&lt;/p&gt;&#xA;&lt;h2 id=&#34;step-1-os-installing-the--tree-sitter-app&#34;&gt;Step 1. OS: Installing the  &lt;code&gt;tree-sitter&lt;/code&gt; app&lt;/h2&gt;&#xA;&lt;p&gt;First of all, I&amp;rsquo;ve downloaded the latest pre-build binary archive for my&#xA;system from this &lt;a href=&#34;https://github.com/tree-sitter/tree-sitter/releases/tag/v0.20.7&#34;&gt;GitHub&#xA;repo&lt;/a&gt;,&#xA;in my case that is &lt;em&gt;tree-sitter-linux-x64.gz&lt;/em&gt; because I&amp;rsquo;m on Pop!_OS&#xA;20.10. Then I&amp;rsquo;ve unpack the archive, put the standalone binary in my&#xA;&lt;code&gt;$HOME/bin&lt;/code&gt; that is in my &lt;code&gt;$PATH&lt;/code&gt; and therefore is accessible from&#xA;anywhere, and changed its mode to &lt;em&gt;executable&lt;/em&gt; by &lt;code&gt;chmod +x tree-sitter&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/tree-sitter-bin.png&#34;/&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;The latest tree-sitter app is installed.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h2 id=&#34;step-2-emacs&#34;&gt;Step 2. Emacs&lt;/h2&gt;&#xA;&lt;h3 id=&#34;step-21-emacs-installing-tree-sitter-packages&#34;&gt;Step 2.1. Emacs: Installing &lt;code&gt;tree-sitter&lt;/code&gt; packages&lt;/h3&gt;&#xA;&lt;p&gt;Then I&amp;rsquo;ve installed &lt;code&gt;tree-sitter&lt;/code&gt; (the parsing system) and &lt;code&gt;tree-sitter-langs&lt;/code&gt;&#xA;(the grammar bundle) Emacs packages using &lt;code&gt;package-list-packages&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/tree-sitter-packages.png&#34;/&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;The tree-sitter packages are installed.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h3 id=&#34;step-22-emacs-configuring-tree-sitter&#34;&gt;Step 2.2. Emacs: Configuring &lt;code&gt;tree-sitter&lt;/code&gt;&lt;/h3&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve added the following lines to my &lt;code&gt;~/.emacs&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;;;; `TREE-SITTER&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; 2022-12-04&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(require &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tree-sitter&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(require &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tree-sitter-langs&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-tree-sitter-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;python-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;tree-sitter-hl-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. Quite simple, isn&amp;rsquo;t it?&lt;/p&gt;&#xA;&lt;p&gt;Please pay attention to the last line. It seems that the &lt;em&gt;tree-sitter&#xA;highlighting mode&lt;/em&gt; provided by &lt;code&gt;tree-sitter-hl-mode&lt;/code&gt; is not activated when&#xA;you load a file into the buffer even if the &lt;em&gt;global tree sitter mode&lt;/em&gt; is on.&#xA;Adding the hook for the particular source code mode solves this problem.&lt;/p&gt;&#xA;&lt;h2 id=&#34;result&#34;&gt;Result&lt;/h2&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/tree-sitter-python.png&#34;/&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Now I have a pretty looking Python code.&lt;/p&gt;&#xA;&lt;p&gt;More on &lt;code&gt;tree-sitter&lt;/code&gt; and its internals can be found at &lt;a href=&#34;https://tree-sitter.github.io/tree-sitter/&#34;&gt;https://tree-sitter.github.io/tree-sitter/&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Happy tree-sittering!&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Clear the Eshell</title>
      <link>https://olddeuteronomy.github.io/post/how-to-clear-the-eshell/</link>
      <pubDate>Wed, 05 Oct 2022 13:07:45 +0300</pubDate>
      <guid>https://olddeuteronomy.github.io/post/how-to-clear-the-eshell/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a big fan of Eshell, but some things in Eshell look, hmm,&#xA;a bit strange. One of such things is how the Eshell&amp;rsquo;s command &lt;code&gt;clear&lt;/code&gt; clears&#xA;the screen.&lt;/p&gt;&#xA;&lt;p&gt;As it is decribed at the Unix Wiki page, &lt;em&gt;&lt;code&gt;clear&lt;/code&gt; is a computer operating&#xA;system command which is used to bring the command line on top of the&#xA;computer terminal.&lt;/em&gt; The key words are &amp;ldquo;bring the command line &lt;strong&gt;on top&lt;/strong&gt;&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;The Eshell&amp;rsquo;s &lt;code&gt;clear&lt;/code&gt; works in a different way, it brings the command&#xA;prompt &lt;strong&gt;on bottom&lt;/strong&gt;, instead.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/eshell-clear-1.png&#34;/&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Using the `clear` command to clear the Eshell screen.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;figure&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/eshell-clear-2.png&#34;/&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;After the `clear`, the command prompt has been moved on bottom.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Just recently, I&amp;rsquo;ve accidently discovered an unexpected, at least for me, workaround&#xA;(from this Stackexchange&#xA;&lt;a href=&#34;https://emacs.stackexchange.com/questions/12503/how-to-clear-the-eshell&#34;&gt;thread&lt;/a&gt;).&#xA;To clear the Eshell screen you just need to type &lt;code&gt;clear 1&lt;/code&gt; instead of&#xA;just &lt;code&gt;clear&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/eshell-clear1-1.png&#34;/&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;Using the `clear 1` command to clear the Eshell screen.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;figure&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/eshell-clear1-2.png&#34;/&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;After the `clear 1`, it&amp;#39;s OK now.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Of course, then I&amp;rsquo;ve immediately added an alias for &lt;code&gt;clear 1&lt;/code&gt; to my&#xA;Eshell aliases configuration file &lt;code&gt;~/.emacs.d/eshell/alias&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;alias cls clear 1&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;More on Eshell aliases you can find&#xA;in my post &lt;a href=&#34;https://olddeuteronomy.github.io/post/eshell-aliases-and-prompt/&#34;&gt;Eshell Aliases, Prompt, And Colors&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Perhaps you can use this trick for your eshelling.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Emacs Keyboard Shortcuts</title>
      <link>https://olddeuteronomy.github.io/post/emacs-shortcuts/</link>
      <pubDate>Tue, 06 Sep 2022 15:26:36 +0300</pubDate>
      <guid>https://olddeuteronomy.github.io/post/emacs-shortcuts/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://irreal.org/blog/&#34;&gt;Irreal&lt;/a&gt; has recently published &lt;a href=&#34;https://irreal.org/blog/?p=10784&#34;&gt;a&#xA;post&lt;/a&gt; with a reference to the Vernon&#xA;Grant&amp;rsquo;s&#xA;&lt;a href=&#34;https://github.com/VernonGrant/emacs-keyboard-shortcuts&#34;&gt;emacs-keyboard-shortcuts&lt;/a&gt;&#xA;README that contains a list of Emacs keyboard shortcuts Vernon uses on&#xA;a regular basis.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s worth to bookmark it or to download the markdown README locally even&#xA;if you think you know Emacs very well (there is no such people,&#xA;though).&lt;/p&gt;&#xA;&lt;p&gt;Many thanks to both Irreal and Vernon.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reverso Context in Emacs</title>
      <link>https://olddeuteronomy.github.io/post/reverso-context-in-emacs/</link>
      <pubDate>Sat, 03 Sep 2022 01:46:36 +0300</pubDate>
      <guid>https://olddeuteronomy.github.io/post/reverso-context-in-emacs/</guid>
      <description>&lt;p&gt;If you are an emacser, you are probably already following the &lt;a href=&#34;https://sachachua.com/blog/&#34;&gt;Sacha&#xA;Chua&amp;rsquo;s blog&lt;/a&gt;. If you are not, you should.&#xA;Sacha maintains an incredible blog on Emacs-related news, upcoming&#xA;events, Org Mode, configuration, new packages, and many other things&#xA;from the Emacs world.&lt;/p&gt;&#xA;&lt;p&gt;English is not my native language so I need &lt;em&gt;the right tools&lt;/em&gt; to&#xA;improve my language skills. My favorite tool is the&#xA;&lt;a href=&#34;https://www.reverso.net/text-translation&#34;&gt;Reverso&lt;/a&gt; web service, an&#xA;AI-powered service for translation, grammar check, context, and&#xA;synonyms search.&lt;/p&gt;&#xA;&lt;p&gt;Of course, I&amp;rsquo;d prefer to use it in Emacs directly, and in&#xA;&lt;a href=&#34;https://sachachua.com/blog/2022/08/2022-08-29-emacs-news/&#34;&gt;one&lt;/a&gt; of&#xA;the latest Sacha&amp;rsquo;s posts I found what I had been searching for -&#xA;&lt;a href=&#34;https://github.com/SqrtMinusOne/reverso.el&#34;&gt;reverso.el&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;At the time of writing, the package isn’t yet available anywhere but&#xA;in the author&amp;rsquo;s GitHub repository, so as a first step you need either&#xA;to download or to clone this package to your box.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve cloned it to my &lt;code&gt;~/emacs.d/extras/&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/SqrtMinusOne/reverso.el.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Secondly, you need to add this directory to your &lt;code&gt;load-path&lt;/code&gt; and&#xA;&lt;code&gt;require&lt;/code&gt; the package.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-to-list &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;load-path&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/.emacs.d/extras/reverso.el/&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Almost done.&lt;/p&gt;&#xA;&lt;p&gt;Because I&amp;rsquo;m using Reverso quite often, I decided to implement a&#xA;&lt;em&gt;smart&lt;/em&gt; start-up function and to bind it to a &lt;em&gt;common&lt;/em&gt; key like&#xA;&lt;code&gt;&amp;lt;F9&amp;gt;&lt;/code&gt;. I want to distinguish between the &lt;em&gt;Translation&lt;/em&gt; (applied to a&#xA;single word) and the &lt;em&gt;Context&lt;/em&gt; (applied to a phrase or a sentence)&#xA;features of Reverso. So now if you press &lt;code&gt;&amp;lt;F9&amp;gt;&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; there is some&#xA;region selected (active, in terminology of Emacs), &lt;code&gt;reverso-context&lt;/code&gt;&#xA;is called, else, if no region selected, &lt;code&gt;reverso-translate&lt;/code&gt; is&#xA;called for a word under the cursor.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Reverso context&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; https://github.com/SqrtMinusOne/reverso.el&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(require &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;reverso&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun avs/reverso ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Calls &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`reverso&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; functions depending on selection.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;If a region (selection) is active, calls &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`reverso-context&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;otherwise calls &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`reverso-translate&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; for a word under the cursor.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (if (region-active-p)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; Region is active, use context.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (reverso-context)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;;; Region is not active, get word coordinates...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (let ((bounds (bounds-of-thing-at-point &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;word&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (p (&lt;span style=&#34;color:#a6e22e&#34;&gt;point&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (if bounds&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (progn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;;; ...select the word under cursor...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#a6e22e&#34;&gt;goto-char&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;car&lt;/span&gt; bounds))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (set-mark-command &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#a6e22e&#34;&gt;goto-char&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;cdr&lt;/span&gt; bounds))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;;; ...and translate it.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (reverso-translate)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;;; Then back to the initial position.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (deactivate-mark)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#a6e22e&#34;&gt;goto-char&lt;/span&gt; p)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;No word under cursor!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key [(f9)] &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;avs/reverso)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/reverso-translate.png&#34;/&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;The word &amp;#39;deposed&amp;#39; is under the cursor, no region is active, &amp;lt;F9&amp;gt; calls `reverso-translate&amp;#39;.&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;figure&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/reverso-context.png&#34;/&gt;&lt;figcaption&gt;&#xA;            &lt;h4&gt;The region &amp;#39;different kind of weather&amp;#39; is active, &amp;lt;F9&amp;gt; calls `reverso-context&amp;#39;&lt;/h4&gt;&#xA;        &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Many thanks to &lt;a href=&#34;https://github.com/SqrtMinusOne&#34;&gt;Pavel Korytov&lt;/a&gt; for&#xA;the excellent packages, and, indeed, to &lt;a href=&#34;https://sachachua.com/blog/contact/&#34;&gt;Sacha&#xA;Chua&lt;/a&gt; for pointing it out to all of us.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using abbrev to Enter Special Characters</title>
      <link>https://olddeuteronomy.github.io/post/use-abbrev-to-enter-special-characters/</link>
      <pubDate>Tue, 16 Aug 2022 15:08:36 +0300</pubDate>
      <guid>https://olddeuteronomy.github.io/post/use-abbrev-to-enter-special-characters/</guid>
      <description>&lt;p&gt;As it&amp;rsquo;s described in the GNU Emacs Manual, &lt;em&gt;an abbreviation or abbrev&#xA;is a string of characters that may be expanded to a longer string. The&#xA;user can insert the abbrev string and find it replaced automatically&#xA;with the expansion of the abbrev. This saves typing&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Mostly I use builtin &lt;strong&gt;abbrev&lt;/strong&gt; package to enter the special&#xA;characters like greek letters, arrow symbols etc.&lt;/p&gt;&#xA;&lt;p&gt;Below is my setup of &lt;strong&gt;abbrev&lt;/strong&gt; from my &lt;code&gt;~/.emacs&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq abbrev-file-name                &lt;span style=&#34;color:#75715e&#34;&gt;;; Tell Emacs where to read abbrev&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/.emacs.d/abbrev_defs.el&amp;#34;&lt;/span&gt;)    &lt;span style=&#34;color:#75715e&#34;&gt;;; Definitions from...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq save-abbrevs &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)                 &lt;span style=&#34;color:#75715e&#34;&gt;;; (ask) save abbrevs when files are saved&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq-default abbrev-mode &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)          &lt;span style=&#34;color:#75715e&#34;&gt;;; Turn it on globally&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(if (&lt;span style=&#34;color:#a6e22e&#34;&gt;file-exists-p&lt;/span&gt; abbrev-file-name) (quietly-read-abbrev-file))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here is my abbrev definition file &lt;code&gt;~/.emacs.d/abbrev_defs.el&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; Time-stamp: &amp;lt;Last changed 2022-08-16 16:38:50 by magnolia&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(define-abbrev-table &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;global-abbrev-table&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8alpha&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;α&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8beta&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;β&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8gamma&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;γ&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8Delta&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Δ&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8delta&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;δ&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8theta&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;θ&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8ksi&amp;#34;&lt;/span&gt;     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ξ&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8lambda&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;λ&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8mu&amp;#34;&lt;/span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;µ&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8nu&amp;#34;&lt;/span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ν&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8pi&amp;#34;&lt;/span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;π&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8Sigma&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Σ&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8sigma&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;σ&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8tau&amp;#34;&lt;/span&gt;     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;τ&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8phi&amp;#34;&lt;/span&gt;     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;φ&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8psi&amp;#34;&lt;/span&gt;     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ψ&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8Omega&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ω&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8omega&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ω&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8in&amp;#34;&lt;/span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;∈&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8nin&amp;#34;&lt;/span&gt;     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;∉&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8almost&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;≈&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8inf&amp;#34;&lt;/span&gt;     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;∞&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8deg&amp;#34;&lt;/span&gt;     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;°&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8cels&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;℃&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8right&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;→&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8left&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;←&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8up&amp;#34;&lt;/span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;↑&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8down&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;↓&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8para&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;§&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8copy&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;©&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8reg&amp;#34;&lt;/span&gt;     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;®&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8tm&amp;#34;&lt;/span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;™&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8eur&amp;#34;&lt;/span&gt;     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;€&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8pound&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;£&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8plusmin&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;±&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8sup1&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;¹&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8sup2&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;²&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8sup3&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;³&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8ldquo&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;«&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8rdquo&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;»&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8range&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;÷&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8not&amp;#34;&lt;/span&gt;     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;¬&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8mdot&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;·&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8bull&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;∙&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8accent&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;´&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8mdash&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;—&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8ndash&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;–&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Just after you type an abbreviation following by either SPC or any&#xA;punctuation symbol it is replaced by the corresponding character.&lt;/p&gt;&#xA;&lt;p&gt;Of course, I&amp;rsquo;ve compiled this setup from various sources, mostly from&#xA;the &lt;a href=&#34;https://impaktor.gitlab.io/dot_emacs.html#org87d6718&#34;&gt;Impaktor&amp;rsquo;s article&lt;/a&gt;&#xA;with some additions.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s also worth to read the &lt;a href=&#34;http://xahlee.info/emacs/emacs/emacs_abbrev_mode_tutorial.html&#34;&gt;Xah Lee&amp;rsquo;s article&lt;/a&gt;&#xA;for more examples of how to use &lt;strong&gt;abbrev&lt;/strong&gt; mode in your daily Emacs&#xA;life.&lt;/p&gt;&#xA;&lt;p&gt;Happy abbreving.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Eshell Aliases, Prompt, And Colors</title>
      <link>https://olddeuteronomy.github.io/post/eshell-aliases-and-prompt/</link>
      <pubDate>Fri, 22 Jul 2022 13:57:32 +0300</pubDate>
      <guid>https://olddeuteronomy.github.io/post/eshell-aliases-and-prompt/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Do you use #Emacs to run shells or terminal emulators?&#xA;Well, you should. With vterm you have a fast alternative to the&#xA;builtin ansi-term. And if you prefer shells, you&amp;rsquo;ve got EShell and&#xA;Shell Mode.&#xA;And don&amp;rsquo;t forget serial-term for embedded programming.&#xA;— Mickey Petersen (@mickeynp) on Twitter, July 18, 2022.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;eshell-aliases&#34;&gt;Eshell Aliases&lt;/h2&gt;&#xA;&lt;p&gt;An excellent&#xA;&lt;a href=&#34;https://www.masteringemacs.org/article/running-shells-in-emacs-overview&#34;&gt;post&lt;/a&gt;&#xA;from Mickey Petersen, a famous Emacs guru and the author of&#xA;&lt;a href=&#34;https://www.masteringemacs.org/&#34;&gt;&lt;em&gt;Mastering Emacs&lt;/em&gt;&lt;/a&gt; reminded me to&#xA;share my eshell configuration.&lt;/p&gt;&#xA;&lt;p&gt;There are 2 ways to configure eshell aliases. &lt;a href=&#34;http://www.gonsie.com/blorg/eshell.html&#34;&gt;Elsa&#xA;Gonsiorowski&lt;/a&gt; uses a&#xA;special configuration file &lt;code&gt;~/.emacs.d/eshell/alias&lt;/code&gt; while &lt;a href=&#34;https://github.com/howardabrams/dot-files/blob/master/emacs-eshell.org#aliases&#34;&gt;Howard&#xA;Abrams&lt;/a&gt;&#xA;prefers to put his eshell alias settings to &lt;code&gt;.emacs&lt;/code&gt; or &lt;code&gt;init.el&lt;/code&gt;.&#xA;Personally, I prefer the former approach.&lt;/p&gt;&#xA;&lt;p&gt;Here is my &lt;code&gt;~/.emacs.d/eshell/alias&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;alias ll ls -AFGhl --color=always $1&#xA;alias ff find-file $1&#xA;alias e find-file-other-window $1&#xA;alias d dired $1&#xA;alias gd magit-diff-unstaged&#xA;alias gds magit-diff-staged&#xA;alias gg git log --color --graph --oneline --abbrev-commit --decorate --all --date=short --pretty=format:&amp;#34;%C(cyan)%h %C(yellow)%ad %C(bold green)%d %C(reset)%s&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Most of these aliases are obvious, e.g. &lt;code&gt;ll&lt;/code&gt; prints extended directory&#xA;listing, &lt;code&gt;ff somefile&lt;/code&gt; opens &lt;em&gt;somefile&lt;/em&gt; for editing in the same&#xA;window, &lt;code&gt;e somefile&lt;/code&gt; uses other window to edit &lt;em&gt;somefile&lt;/em&gt;, &lt;code&gt;d&lt;/code&gt; opens&#xA;the dired buffer in the same window, etc. The last one prints&#xA;the colorized one-line git log as shown below.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://olddeuteronomy.github.io/img/gg2.png&#34;/&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h2 id=&#34;eshell-prompt&#34;&gt;Eshell Prompt&lt;/h2&gt;&#xA;&lt;p&gt;The prompt you can see on the screenshot above is borrowed from the&#xA;Reddit&#xA;&lt;a href=&#34;https://www.reddit.com/r/emacs/comments/6f0rkz/my_fancy_eshell_prompt/&#34;&gt;post&lt;/a&gt;&#xA;with some colors optimized for the Solarized Dark theme.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setq eshell-prompt-function&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (lambda ()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#a6e22e&#34;&gt;concat&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;propertize&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;┌─[&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;face&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#2aa198&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;propertize&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;user-login-name&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;face&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#dc322f&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;propertize&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;face&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#2aa198&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;propertize&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;system-name&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;face&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#268bd2&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;propertize&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;]──[&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;face&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#2aa198&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;propertize&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;format-time-string&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%H:%M&amp;#34;&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;current-time&lt;/span&gt;)) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;face&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#b58900&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;propertize&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;]──[&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;face&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#2aa198&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;propertize&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;concat&lt;/span&gt; (eshell/pwd)) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;face&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#93a1a1&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;propertize&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;]\n&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;face&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#2aa198&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;propertize&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;└─&amp;gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;face&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#2aa198&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;propertize&lt;/span&gt; (if venv-current-name (&lt;span style=&#34;color:#a6e22e&#34;&gt;concat&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; (&amp;#34;&lt;/span&gt; venv-current-name &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;)&amp;#34;&lt;/span&gt;)  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;face&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#00dc00&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;propertize&lt;/span&gt; (if (&lt;span style=&#34;color:#a6e22e&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;user-uid&lt;/span&gt;) &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; # &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; $ &amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;face&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(:foreground &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#2aa198&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         )))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In addition to the username, the current time, and the current&#xA;directory it also shows the current Python virtual environment name&#xA;(in green).&lt;/p&gt;&#xA;&lt;h2 id=&#34;eshell-colors&#34;&gt;Eshell Colors&lt;/h2&gt;&#xA;&lt;p&gt;The often cited issue with eshell is the lack of color output even if&#xA;it is explicitly specified in a command (e.g. &lt;code&gt;ls --color=always&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Adding this to your &lt;code&gt;~/.emacs&lt;/code&gt; (or &lt;code&gt;init.el&lt;/code&gt;)  DOES NOT solve the problem:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(setenv &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TERM&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;xterm-256color&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;THIS DOES solve the problem with color output in eshell:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;eshell-mode-hook&lt;/span&gt; (lambda () (setenv &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TERM&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;xterm-256color&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Though to get the current directory listing in eshell I prefer to use the eshell&#xA;alias &lt;code&gt;d&lt;/code&gt; (equivalent to &lt;code&gt;d .&lt;/code&gt;), see the list of aliases above.&lt;/p&gt;&#xA;&lt;p&gt;More on Emacs&amp;rsquo; eshell can be found&#xA;&lt;a href=&#34;https://www.masteringemacs.org/article/complete-guide-mastering-eshell&#34;&gt;here&lt;/a&gt;,&#xA;thanks again, Mickey.&lt;/p&gt;</description>
    </item>
    <item>
      <title>DMS To Decimal Degree Conversions And More</title>
      <link>https://olddeuteronomy.github.io/post/dms-decimal-degree-conversions/</link>
      <pubDate>Wed, 22 Jun 2022 14:11:33 +0300</pubDate>
      <guid>https://olddeuteronomy.github.io/post/dms-decimal-degree-conversions/</guid>
      <description>&lt;p&gt;Working with satellite data I often have to convert a coordinate value or an&#xA;angle value from the DMS notation (&lt;em&gt;degree@minute&amp;rsquo;second&amp;quot;&lt;/em&gt;) to a decimal&#xA;degree in the floating point number format and vice versa.&lt;/p&gt;&#xA;&lt;h2 id=&#34;dms-to-decimal-degree&#34;&gt;DMS to Decimal Degree&lt;/h2&gt;&#xA;&lt;p&gt;Of course, I want to do this directly in an Emacs buffer, so I wrote a&#xA;simple function that uses &lt;code&gt;deg&lt;/code&gt; and &lt;code&gt;hms&lt;/code&gt; functions provided by the&#xA;built-in superb &lt;strong&gt;calc&lt;/strong&gt; package.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun dms2deg (p1 p2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Converts a region from the DMS (dd@mm&amp;#39;ss\&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  to a decimal degree.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  P1,P2 are the beginning and the end of the region&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  (selection) respectively.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (let (s)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (if (region-active-p)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (progn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (setq s (calc-eval&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#a6e22e&#34;&gt;concat&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deg(&amp;#34;&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;buffer-substring-no-properties&lt;/span&gt; p1 p2) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;)&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (delete-active-region)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a6e22e&#34;&gt;insert&lt;/span&gt; s))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a6e22e&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;No active region!&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve bound this function to the &lt;code&gt;Ctrl+F6&lt;/code&gt; key chord (&lt;code&gt;C-f6&lt;/code&gt; in the Emacs&#xA;notation) globally. Of course, you can use your own key combination.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key [(control f6)] &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;dms2deg)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now I can select a region in a buffer, press &lt;code&gt;C-f6&lt;/code&gt; and &lt;em&gt;replace&lt;/em&gt; the&#xA;selection with its decimal value, so &lt;code&gt;30@15&#39;54&amp;quot;&lt;/code&gt; becomes &lt;code&gt;30.265&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;decimal-degree-to-dms&#34;&gt;Decimal Degree to DMS&lt;/h2&gt;&#xA;&lt;p&gt;The inverse function (bound to &lt;code&gt;S-f6&lt;/code&gt; or &lt;code&gt;Shift+F6&lt;/code&gt;) &lt;em&gt;replaces&lt;/em&gt; a floating&#xA;point with the corresponding DMS string.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun deg2dms (p1 p2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Converts a region from a decimal degree&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  to the DMS format (dd@ mm&amp;#39; ss\&amp;#34;).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  P1,P2 - beginning and end of the region&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  (selection) respectively.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (let (s)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (if (region-active-p)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (progn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (setq s (calc-eval&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#a6e22e&#34;&gt;concat&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hms(&amp;#34;&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;buffer-substring-no-properties&lt;/span&gt; p1 p2) &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;)&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (delete-active-region)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a6e22e&#34;&gt;insert&lt;/span&gt; s))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a6e22e&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;No active region!&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key [(shift f6)] &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;deg2dms)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now if you select a region in a buffer and then press &lt;code&gt;S-f6&lt;/code&gt;, your &lt;code&gt;30.265&lt;/code&gt;&#xA;becomes &lt;code&gt;30@ 15&#39; 54.&amp;quot;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;enhanced-version&#34;&gt;Enhanced Version&lt;/h2&gt;&#xA;&lt;p&gt;After a while, I decided to enhance the first conversion function by&#xA;adding an &lt;em&gt;&amp;lsquo;inline calculator&amp;rsquo;&lt;/em&gt; feature. It works quite simple: if a&#xA;selected region contains the &amp;lsquo;@&amp;rsquo; character, the region is considered&#xA;as a coordinate (angle) value in the DMS notation, and it should be &lt;em&gt;replaced&lt;/em&gt;&#xA;with its decimal value. Otherwise, the region is considered as an&#xA;arithmetic expression (in terms of the Emacs&amp;rsquo; calc) and its calculated&#xA;value will be &lt;em&gt;inserted&lt;/em&gt; just after the region.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun avs/calc-region (p1 p2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Calculates a region or converts DMS to decimal.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;   P1,P2 - beginning and end of the region&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;   respectively.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (if (region-active-p)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (let ((b (&lt;span style=&#34;color:#a6e22e&#34;&gt;buffer-substring-no-properties&lt;/span&gt; p1 p2)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (cond ((string-match-p &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@&amp;#34;&lt;/span&gt; b) &lt;span style=&#34;color:#75715e&#34;&gt;; convert DMS to decimal ...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (delete-active-region)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#a6e22e&#34;&gt;insert&lt;/span&gt; (calc-eval (&lt;span style=&#34;color:#a6e22e&#34;&gt;concat&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deg(&amp;#34;&lt;/span&gt; b &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;)&amp;#34;&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;; ... otherwise calculate a region&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#a6e22e&#34;&gt;goto-char&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;region-end&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (pop-mark)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#a6e22e&#34;&gt;insert&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; = &amp;#34;&lt;/span&gt; (calc-eval b))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a6e22e&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;No active region!&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key [(f6)] &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;avs/calc-region&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The enhanced function is bound to &lt;code&gt;f6&lt;/code&gt;. So now if you press &lt;code&gt;F6&lt;/code&gt;,&#xA;&lt;code&gt;15@45&#39;20&amp;quot;&lt;/code&gt; becomes &lt;code&gt;15.7555555556&lt;/code&gt;, and &lt;code&gt;((350.0 / 7) + 48.314)&lt;/code&gt;&#xA;becomes &lt;code&gt;((350.0 / 7) + 48.314) = 98.314&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;&#xA;&lt;p&gt;Emacs&amp;rsquo; &lt;strong&gt;calc&lt;/strong&gt; is great.&lt;/p&gt;&#xA;&lt;h2 id=&#34;next&#34;&gt;Next&lt;/h2&gt;&#xA;&lt;p&gt;As a next step, I want to implement DMS and Decimal degree&#xA;conversions to the DD:MM:SS format used by the excellent &lt;a href=&#34;https://www.generic-mapping-tools.org/&#34;&gt;Generic&#xA;Mapping Tools&lt;/a&gt; (GMT) toolbox.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I Am Back</title>
      <link>https://olddeuteronomy.github.io/post/i-am-back/</link>
      <pubDate>Tue, 21 Jun 2022 02:45:58 +0300</pubDate>
      <guid>https://olddeuteronomy.github.io/post/i-am-back/</guid>
      <description>&lt;p&gt;I started this blog in 2017. After a long break, I decided to continue&#xA;blogging about various things related to Emacs. And not just to Emacs.&lt;/p&gt;&#xA;&lt;p&gt;Also, I&amp;rsquo;ve switched from Jekyll to Hugo for a variety of reasons, mainly&#xA;because of the Mainroad theme.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://olddeuteronomy.github.io/about/</link>
      <pubDate>Sat, 17 Jun 2017 14:51:33 +0300</pubDate>
      <guid>https://olddeuteronomy.github.io/about/</guid>
      <description>About The Emacs Cat My first attempt to dive into the vast ocean of Emacs was in 1997, over 25 years ago.&#xA;My first attempt was unsuccessful; I now realize I couldn’t fully grasp the spirit of Emacs at the time.&#xA;My second—and successful—attempt came in 2012. Since then, I’ve been using Emacs for nearly everything, from coding in C++ and Python to maintaining my knowledge base with org-roam and writing articles in LaTeX.</description>
    </item>
  </channel>
</rss>
