<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>notes from /dev/null - musings</title><link href="http://yummymelon.com/devnull/" rel="alternate"/><link href="http://yummymelon.com/devnull/feeds/tags/musings.atom.xml" rel="self"/><id>http://yummymelon.com/devnull/</id><updated>2025-11-13T17:20:00-08:00</updated><entry><title>Thoughts on Funding Free Software Development</title><link href="http://yummymelon.com/devnull/thoughts-on-funding-free-software-development.html" rel="alternate"/><published>2025-11-13T17:20:00-08:00</published><updated>2025-11-13T17:20:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-11-13:/devnull/thoughts-on-funding-free-software-development.html</id><summary type="html">&lt;p&gt;“I don’t like to dream about getting paid.”&lt;/p&gt;</summary><content type="html">&lt;p&gt;“I have always depended on the kindness of strangers.” — Blanche Dubois from “A Streetcar Named Desire”, Tennessee Williams.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;DISCLAIMER: None of this post should be considered as financial or career advice of any kind. All views and opinions expressed here belong solely to Charles Y. Choi.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Not getting paid for making free software has long been recognized as a conundrum in the early 21st century, where much of its  discourse is trenchantly summarized by the xkcd drawing “Dependency” &lt;a href="#citeproc_bib_item_1"&gt;[1]&lt;/a&gt; shown below.&lt;/p&gt;
&lt;p align='center'&gt;
&lt;img src='http://yummymelon.com/devnull/images/funding-free-software/dependency.png' alt='' /&gt;
&lt;/p&gt;

&lt;p&gt;For some time I’ve been gathering my thoughts on this matter, with stances that I’ll share in this post today.&lt;/p&gt;
&lt;h1&gt;Fundamentals on Bringing a Product to Market&lt;/h1&gt;
&lt;p&gt;Before talking about software, let’s review the basic steps needed to bring a physical product to market.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Design &amp;amp; Development&lt;/p&gt;
&lt;p&gt;In this step, the intellectual construction of the product is defined.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Manufacture&lt;/p&gt;
&lt;p&gt;In this step the product is mass produced. This step must occur after step 1.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Distribution&lt;/p&gt;
&lt;p&gt;In this step the manufactured product is delivered. This step must occur after step 2.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Marketing&lt;/p&gt;
&lt;p&gt;In this step, awareness of the product to its target market is raised to induce demand for it. Ideally this step is taken when there is high confidence in delivering the product to the market.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support&lt;/p&gt;
&lt;p&gt;In this step, the producers provide support for the product after it has shipped. This step must occur after step 3.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For a physical product, each step has a monetary cost associated with it. If the producer wishes to make a profit by selling the product, the price of the product must be greater than the cost to produce it. This leads to the incentive to manufacture and distribute as many copies as possible to maximize profit. At scale, the dominant costs are manufacturing and distribution for a physical product.&lt;/p&gt;
&lt;h1&gt;Software is Different&lt;/h1&gt;
&lt;p&gt;If the product is software using internet distribution, then its costs for manufacture and distribution become effectively zero. For a software provider, the dominant costs to bring a product to market are design &amp;amp; development, marketing, and support. Such costs are largely fixed with respect to demand. Since software has no intrinsic manufacturing nor distribution cost, for-profit software must resort to creating artificial scarcity to justify (and protect) profit that scales with meeting demand. Tactics to create scarcity include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Constraining code to be closed-source.&lt;/li&gt;
&lt;li&gt;Distributing only executables, typically code-signed to a model of computer.&lt;/li&gt;
&lt;li&gt;Compilation-enforced licensing, typically tied to a subscription model.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;What about Free Software?&lt;/h1&gt;
&lt;p&gt;With that background in place, let’s talk about &lt;em&gt;free&lt;/em&gt; (both in speech and beer) software. In this post, I make no distinction between free (libre) and open source licensed software &lt;a href="#citeproc_bib_item_2"&gt;[2]&lt;/a&gt; as their differences fixate on the user’s ability to modify and redistribute received software. In contrast, this post views &lt;em&gt;free&lt;/em&gt; software through the lens of the costs required to deliver said software to the market as described above.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Free software requires that its distribution be zero-cost to users&lt;/strong&gt;. In contrast with for-profit software, free software evades the creation of artificial scarcity. In light of this, what options are available for developers who want to get paid for making free software? Here are three:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ask users to voluntarily give money after the software has been produced.&lt;/li&gt;
&lt;li&gt;Attach the developed software to a service or hardware-based business model.&lt;/li&gt;
&lt;li&gt;Get money upfront from users (or organizations) who have an interest in realizing some specific software, &lt;em&gt;before&lt;/em&gt; its design and development are completed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first option offers providers no financial incentive to make free software, nor offers a reliable path to cover the cost to make it.&lt;/p&gt;
&lt;p&gt;The second option relies on indirect compensation where the service or hardware revenue is expected to cover the cost of software development. Scarcity is imposed by restricting access to the service or hardware based on payment. This option is often taken by startups funded with venture capital.&lt;/p&gt;
&lt;p&gt;The third option offers direct financial incentive for the developer to create free software, as money is taken by the developer with the expectation that said software is delivered at a future date. With this option, the design &amp;amp; development step is what is considered scarce. Upfront funding can come in a variety of forms, but largely fall into the following patterns:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Institutional funding, where an organization puts up the funding.&lt;/li&gt;
&lt;li&gt;Angel funding, where a small group (&amp;lt; 5) of people contribute the funding.&lt;/li&gt;
&lt;li&gt;Crowdfunding, where a pool of small contributions from individuals (&amp;gt; 1,000) is gathered, typically with a target funding goal.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Which approach is taken can vary widely depending on the functionality of the software and the relationship (or lack thereof) between the developer and their benefactors. Note that getting money upfront to develop software &lt;em&gt;precludes gaining profit from it based on demand after it is made&lt;/em&gt;, as free software insists its distribution be zero-cost to users. The only avenue for developer profit in this case is to demand funding that exceeds the baseline cost of producing the software.&lt;/p&gt;
&lt;p&gt;Getting money upfront implies negotiation, which gives the developer agency to choose whether to commit to building the desired software. It also significantly raises risk to all involved parties if the software fails to be built.&lt;/p&gt;
&lt;p&gt;Upfront funding aligns the incentives for producers and consumers of software by having agreement on a future deliverable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consumers pay to get the future software deliverable.&lt;/li&gt;
&lt;li&gt;Producers work to build the future software deliverable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While the exact number is unknown, I think a safe presumption is that single developers have built the vast majority of free software packages as evidenced by the Linux, Emacs, Python, and Node ecosystems. Most all of them resort to appeals to user gratuity, which is not enough to actually cover the market cost of designing &amp;amp; developing that software.&lt;/p&gt;
&lt;p&gt;Given the above options for upfront funding, I’ll further make the assumption that most single developers do not have access to institutional nor angel funding. So, let's talk about crowdfunding.&lt;/p&gt;
&lt;h1&gt;Crowdfunding&lt;/h1&gt;
&lt;p&gt;The dominant cost to producing software is labor. A common project scope is a three month schedule with a single developer. Estimating a market rate salary of $10K/month, this results in a budget of $30K to deliver software at cost.&lt;/p&gt;
&lt;p&gt;Crowdfunding has proven to be successful in raising that level of funding, by mitigating risk to all participants by defining a funding goal. Typically a funding goal is set within a window of time. If the goal is not met, then patrons who already put money down will have their money returned and the producer is not committed to work on the software. With high demand, the goal can be met with potentially low financial risk to an individual patron. For example, if 30,000 people gave $1, the above budget could be met.&lt;/p&gt;
&lt;p&gt;Reaching those 30,000 people is another thing altogether, as crowdfunding is an exercise in &lt;em&gt;marketing&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;To have a successful crowdfunding campaign, the producer must deliver a message about a future software product that is compelling enough to create demand for it. Common tasks undertaken to make a crowdfunding campaign include producing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A video describing the envisioned product.&lt;/li&gt;
&lt;li&gt;Marketing copy for said envisioned product published on web, possibly print.&lt;/li&gt;
&lt;li&gt;Brand merchandise for patrons.&lt;ul&gt;
&lt;li&gt;Order taking&lt;/li&gt;
&lt;li&gt;Fulfillment&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Press campaign.&lt;/li&gt;
&lt;li&gt;Social media campaign.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that the success of the crowdfunding campaign will depend on how effective its message is to the target audience. Each audience is bespoke, meaning that not all things successful for one crowdfunding campaign can be applied to another. Invariably, the software producer must know their audience.&lt;/p&gt;
&lt;p&gt;Single developers producing free software might look at the above and say “nope.” Most certainly it is a lot of work, much of which is perhaps outside the comfort level of persons whose focus has only been on coding. It is also not a common practice to use crowdfunding to support free (libre) or open source development. Regardless, if a developer wishes to be paid to work on free software, they will need to get comfortable with pitching their work beforehand to get the funding to do it. Wider-scale use of crowdfunding could bring better agency to the developer and enable the development of larger scope free software projects that would be untenable with volunteer time.&lt;/p&gt;
&lt;h1&gt;Observations and Closing Thoughts&lt;/h1&gt;
&lt;p&gt;This post has been a distillation of my thinking about free software and how it can be sustainably funded. From this exercise are some of my personal observations:&lt;/p&gt;
&lt;p&gt;If you have a software idea that you want to distribute for free, determine as soon as possible if you want to get paid to make it.&lt;/p&gt;
&lt;p&gt;If you don’t care about getting paid, ever, for that work, then GO MAKE IT! Be thankful for whatever gratuity you get from it.&lt;/p&gt;
&lt;p&gt;If you do care about getting paid to make the idea, then explore what funding model fits best for the idea. At this point, DO NOT MAKE THE IDEA AND PUBLISH IT.&lt;/p&gt;
&lt;p&gt;If you get funding, GO MAKE THE THING. MAKE PEOPLE HAPPY.&lt;/p&gt;
&lt;p&gt;If you don’t get funding, let it rest. Move on to the next idea.&lt;/p&gt;
&lt;p&gt;If you already produced free software that was built without funding, accept that you will never recover your development cost.&lt;/p&gt;
&lt;p&gt;To reiterate, free software requires that its distribution be zero-cost to users. This is excellent for user freedom but comes at the expense of agency for developers: Users can not be compelled to pay developers for their already published work. Developers can however make new features and fixes contingent on funding. I think this position is fair and defensible for the obvious reason that software developers must pay for the costs of living in a material world.&lt;/p&gt;
&lt;p&gt;If you’ve made to here, thanks for reading! Feel free to share your thoughts about this post on &lt;a href="https://sfba.social/@kickingvegas/115545442516504660"&gt;Mastodon&lt;/a&gt; or &lt;a href="https://www.reddit.com/r/emacs/comments/1owj8zo/thoughts_on_funding_free_software_development/?utm_source=share&amp;amp;utm_medium=web3x&amp;amp;utm_name=web3xcss&amp;amp;utm_term=1&amp;amp;utm_content=share_button"&gt;Reddit&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;style&gt;.csl-left-margin{float: left; padding-right: 0em;}
 .csl-right-inline{margin: 0 0 0 1em;}&lt;/style&gt;
&lt;div class="csl-bib-body"&gt;
  &lt;div class="csl-entry"&gt;&lt;a id="citeproc_bib_item_1"&gt;&lt;/a&gt;
    &lt;div class="csl-left-margin"&gt;[1]&lt;/div&gt;&lt;div class="csl-right-inline"&gt;R. Munroe, “Dependency,” Aug. 17, 2020. Available: &lt;a href="https://xkcd.com/2347/"&gt;https://xkcd.com/2347/&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="csl-entry"&gt;&lt;a id="citeproc_bib_item_2"&gt;&lt;/a&gt;
    &lt;div class="csl-left-margin"&gt;[2]&lt;/div&gt;&lt;div class="csl-right-inline"&gt;R. Stallman, “Why open source misses the point of free software - gnu project - free software foundation,” 2024. Available: &lt;a href="https://www.gnu.org/philosophy/open-source-misses-the-point.en.html"&gt;https://www.gnu.org/philosophy/open-source-misses-the-point.en.html&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</content><category term="misc"/><category term="emacs"/><category term="software"/><category term="musings"/></entry><entry><title>Surprise and Emacs Defaults</title><link href="http://yummymelon.com/devnull/surprise-and-emacs-defaults.html" rel="alternate"/><published>2023-07-05T09:54:00-07:00</published><updated>2023-07-05T09:54:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2023-07-05:/devnull/surprise-and-emacs-defaults.html</id><summary type="html">&lt;p&gt;Getting surprised by Emacs is an evergreen story.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Throughout the history of building computers (both hardware and software), there have been different schools of thought on &lt;em&gt;how&lt;/em&gt; to build them. There&amp;rsquo;s really no one &amp;ldquo;right&amp;rdquo; way, however different schools have formed with different levels of success. The thinking of such schools gets further compounded by the many levels of abstraction in computer design. More often than not, a school with a successful pattern at one level of abstraction tries to apply that to other (or worse yet, all) levels. An observation in building computers is that invariably you must ship something that embodies both &lt;a href="https://en.wikipedia.org/wiki/Separation_of_mechanism_and_policy"&gt;policy and mechanism&lt;/a&gt;. Systems that coherently separate the two end up being more flexible to change. &lt;/p&gt;
&lt;p&gt;When I think of the default settings in Emacs (base and external packages alike) and its design overall, I can&amp;rsquo;t help but think of its culture&amp;rsquo;s emphasis on providing mechanism and deferring policy to user choice. Perhaps this thinking was influenced by the &lt;a href="https://en.wikipedia.org/wiki/X_Window_System_protocols_and_architecture"&gt;design of X11 protocols&lt;/a&gt; (&lt;em&gt;&amp;ldquo;Provide mechanism rather than policy. In particular, place user interface policy in the clients&amp;rsquo; hands.&amp;rdquo;&lt;/em&gt;). Regardless, this school of thinking values building systems with generalized behavior that can be sculpted into many specific use cases. With such thinking there is a strong tendency to not fixate on the default policy, as it can always be defined by the end user.&lt;/p&gt;
&lt;p&gt;Another school of thought, particularly coming from 80&amp;rsquo;s microcomputer user interface research has been to emphasize &lt;em&gt;consistency&lt;/em&gt; to improve usability. Such thinking, evangelized by folks such as &lt;a href="https://asktog.com/atc/principles-of-interaction-design/"&gt;Bruce Tognazzini&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Don_Norman"&gt;Don Norman&lt;/a&gt;, has had a profound influence in thinking about computer user experience (UX). Key to gaining such consistency was to be very opinionated about &lt;em&gt;policy&lt;/em&gt;. Informed by human computer interface (HCI) research and scaled by microcomputer adoption, the UX of such opinionated software became the expected &lt;em&gt;convention&lt;/em&gt; by contemporary users.&lt;/p&gt;
&lt;p&gt;Suffice to say, the conflict between such schools of thought play out repeatedly in many different places; the most recent one that comes to mind is the Fediverse (Mastodon, ActivityPub, etc.) versus &lt;a href="https://social.coop/@scottjenson/110634637995620113"&gt;Scott Jenson&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It also plays out in thinking about the default settings (aka the policy choices) in Emacs in 2023.&lt;/p&gt;
&lt;p&gt;New users are often &lt;a href="https://en.wikipedia.org/wiki/Principle_of_least_astonishment"&gt;surprised&lt;/a&gt; by the policy choices in Emacs because these choices often diverge from conventional app UX. When surprised, the reaction can be quite adverse. Such was the reaction from &lt;a href="https://fashionsocial.host/@summeremacs/110646246358081748"&gt;@summeremacs&lt;/a&gt; which prompted me to write this post. I&amp;rsquo;ve had similar reaction multiple times as well over my several decades of using Emacs.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t have any power to make Emacs maintainers change their defaults, but I will call out that the default settings they ship are a policy &lt;em&gt;choice&lt;/em&gt;. If one considers usability with minimal training (and consequently minimal surprise) to be valuable, as I do, then positive first impressions are important! I think it would be a better thing for Emacs defaults to be less surprising to contemporary users.&lt;/p&gt;
&lt;p&gt;That said, here are some opinionated Emacs settings that I think makes Emacs less surprising.&lt;/p&gt;
&lt;h1&gt;Variables&lt;/h1&gt;
&lt;h2&gt;bookmark-save-flag&lt;/h2&gt;
&lt;p&gt;By default, bookmarks are saved only when you exit Emacs cleanly. This is problematic if you keep Emacs running for a long time, particularly if you use Emacs server and are not aware of this default behavior. I got burned badly by this several years back when first adding a number of bookmarks during a long-running Emacs server session. The session ended up being in a bad state, crashing Emacs, and I had lost all those bookmarks. Persisting bookmark changes to disk as it happens it is the saner default. I leave it as an open question as to why &lt;code&gt;bookmark-save&lt;/code&gt; behavior is so &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Bookmarks.html"&gt;complicated&lt;/a&gt;. &lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center;"&gt;Default&lt;/th&gt;
&lt;th style="text-align: center;"&gt;My Setting&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;t&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Interestingly enough, in the recent post &lt;a href="https://protesilaos.com/codelog/2023-06-28-emacs-mark-register-basics/"&gt;Emacs: mark and register basics&lt;/a&gt;, Stavrou remarks that he discovered &lt;code&gt;bookmark-save-flag&lt;/code&gt; after implementing his own logic to persist bookmarks, which reinforces my opinion that the default behavior of persisting bookmarks is surprising.&lt;/p&gt;
&lt;h2&gt;sentence-end-double-space&lt;/h2&gt;
&lt;p&gt;The one that triggered @summeremacs. Yes, sentences are single-spaced in 2023.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center;"&gt;Default&lt;/th&gt;
&lt;th style="text-align: center;"&gt;My Setting&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;t&lt;/td&gt;
&lt;td style="text-align: center;"&gt;nil&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;delete-selection-mode&lt;/h2&gt;
&lt;p&gt;If you select text and then type over it, it should delete that text. Surprisingly, you do not get this behavior out of the box with default Emacs. You have to explicitly enable it.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center;"&gt;Default&lt;/th&gt;
&lt;th style="text-align: center;"&gt;My Setting&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;nil&lt;/td&gt;
&lt;td style="text-align: center;"&gt;t&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;dired-auto-revert-buffer&lt;/h2&gt;
&lt;p&gt;By default, Dired buffers will not update themselves unless you explicitly tell them to. Setting this variable to &lt;code&gt;t&lt;/code&gt; will auto-update the Dired buffer when you revisit it.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center;"&gt;Default&lt;/th&gt;
&lt;th style="text-align: center;"&gt;My Setting&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;nil&lt;/td&gt;
&lt;td style="text-align: center;"&gt;t&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;global-auto-revert-mode, global-auto-revert-non-file-buffers&lt;/h2&gt;
&lt;p&gt;Whenever the disk state changes, Emacs should update as well. While supported, this is not turned on by default. Changing these two variables to &lt;code&gt;t&lt;/code&gt; fixes this.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center;"&gt;Default&lt;/th&gt;
&lt;th style="text-align: center;"&gt;My Setting&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;nil&lt;/td&gt;
&lt;td style="text-align: center;"&gt;t&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;dired-dwim-target&lt;/h2&gt;
&lt;p&gt;If you like Dired to emulate Midnite Commander with having two Dired buffers side-by-side and moving files between then both, then use this setting.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center;"&gt;Default&lt;/th&gt;
&lt;th style="text-align: center;"&gt;My Setting&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;nil&lt;/td&gt;
&lt;td style="text-align: center;"&gt;dired-dwim-target-next&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;eshell-scroll-to-bottom-on-input&lt;/h2&gt;
&lt;p&gt;Pretty much every terminal program will scroll to the bottom on input. Eshell won&amp;rsquo;t though until you configure it to.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center;"&gt;Default&lt;/th&gt;
&lt;th style="text-align: center;"&gt;My Setting&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;nil&lt;/td&gt;
&lt;td style="text-align: center;"&gt;this&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;magit-save-repository-buffers&lt;/h2&gt;
&lt;p&gt;IMHO Magit is too cautious by defaulting to prompting the user to save every modified file in a repo before taking action. This gets annoying quite fast. Setting it to &lt;code&gt;dontask&lt;/code&gt; will save you from a lot of prompts.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center;"&gt;Default&lt;/th&gt;
&lt;th style="text-align: center;"&gt;My Setting&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;t&lt;/td&gt;
&lt;td style="text-align: center;"&gt;dontask&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Ediff&lt;/h2&gt;
&lt;p&gt;Having the visual diff tool, Ediff, packaged into Emacs is really convenient. I&amp;rsquo;ll be blunt though: Ediff default behavior out of the box is awkward. First, the Ediff control panel is put into a separate frame (GUI window) when running in GUI mode, making GUI window management an issue. Second is the default behavior to show the diffs on top of each other rather than side-by-side. Third, when you quit Ediff, your previous window&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; layout is messed up.&lt;/p&gt;
&lt;p&gt;Here is what I do to address the above three points:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Variable&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Default&lt;/th&gt;
&lt;th style="text-align: left;"&gt;My Setting&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;ediff-split-window-function&lt;/td&gt;
&lt;td style="text-align: left;"&gt;split-window-vertically&lt;/td&gt;
&lt;td style="text-align: left;"&gt;split-window-horizontally&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Show diffs side-by-side&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;ediff-window-setup-function&lt;/td&gt;
&lt;td style="text-align: left;"&gt;ediff-setup-windows-default&lt;/td&gt;
&lt;td style="text-align: left;"&gt;ediff-setup-windows-plain&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Puts the control panel in the same frame as the diff windows&lt;sup&gt;&lt;a id="fnr.1.100" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Updated 2023-07-10&lt;/em&gt; - Please disregard this Ediff checkpoint and restore logic. A much better configuration is offered in the post &lt;a href="http://yummymelon.com/devnull/using-ediff-in-2023.html"&gt;Using Ediff in 2023&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;s&gt;Checkpoint and restore window&lt;/s&gt;&lt;sup&gt;&lt;a id="fnr.1.100" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;s&gt;configuration for 
Ediff session&lt;/s&gt; (code from &lt;a href="https://emacs.stackexchange.com/questions/7482/restoring-windows-and-layout-after-an-ediff-session"&gt;helm - Restoring windows and layout after an Ediff session - Emacs Stack Exchange&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defvar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;my-ediff-last-windows&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;my-store-pre-ediff-winconfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="s"&gt;&amp;quot;Store &lt;/span&gt;&lt;span class="ss"&gt;`current-window-configuration&amp;#39;&lt;/span&gt;&lt;span class="s"&gt; in variable &lt;/span&gt;&lt;span class="ss"&gt;`my-ediff-last-windows&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;.&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;my-ediff-last-windows&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;current-window-configuration&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;my-restore-pre-ediff-winconfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="s"&gt;&amp;quot;Restore window configuration to stored value in &lt;/span&gt;&lt;span class="ss"&gt;`my-ediff-last-windows&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;.&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set-window-configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;my-ediff-last-windows&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;ediff-before-setup-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;my-store-pre-ediff-winconfig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;ediff-quit-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;my-restore-pre-ediff-winconfig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;Man-notify-method&lt;/h2&gt;
&lt;p&gt;When raising a &lt;code&gt;man&lt;/code&gt; page in Emacs, the default behavior is to open it in a new buffer but keep the focus on your current buffer. Typically I want to read the man page and quickly exit it. Changing this variable to &lt;code&gt;aggressive&lt;/code&gt; will change the focus to the new &lt;code&gt;man&lt;/code&gt; buffer so you can immediately (q)uit it.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center;"&gt;Default&lt;/th&gt;
&lt;th style="text-align: center;"&gt;My Setting&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;friendly&lt;/td&gt;
&lt;td style="text-align: center;"&gt;aggressive&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;Summary&lt;/h1&gt;
&lt;p&gt;Reviewing the above defaults, I&amp;rsquo;m struck by seeing that many of them deal with synchronizing state (typically persisting to disk) and choose to make the user responsible for managing it. This stands in stark contrast to conventional UX in both desktop and mobile apps to automatically synchronize state on behalf of the user. My preferences definitely are in-line with the latter camp.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve gotten to here I hope this post has been helpful, especially if you&amp;rsquo;re new to Emacs. Let me qualify that I very much &lt;em&gt;like&lt;/em&gt; using Emacs and that I am deeply grateful to its many contributors who help make it an essential tool for me. That said, I do think first impressions are important in software, and the less surprises it gives the user, the better. Ciao folks!&lt;/p&gt;
&lt;h2&gt;Footnotes&lt;/h2&gt;
&lt;p&gt;&lt;sup&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Basic-Window.html"&gt;Emacs window&lt;/a&gt; definition, which is a whole another story on the different semantics Emacs uses to describe UI elements.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="musings"/><category term="ux"/></entry></feed>