<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title><![CDATA[Matthew Bauer’s Blog]]></title>
<description><![CDATA[Matthew Bauer’s Blog]]></description>
<link>https://matthewbauer.us/blog/</link>
<lastBuildDate>Sun, 09 Jun 2024 22:26:21 -0500</lastBuildDate>
<item>
  <title><![CDATA[Owning Your Home’s Utilities]]></title>
  <description><![CDATA[
<p>
Ideally, utilities, such as water, electricity and gas, should be
owned by its customers and not for-profit corporations. That would
mean any money left over at the end of the year are passed on as
future savings to ratepayers. In reality, this is not the case, and
most Americans have at least one utility with for-profit ownership.
</p>

<p>
What’s interesting, however, is that these privately owned utilities
are often publicly traded. So the everyday investor, with enough
money, can actually purchase a chunk of their utilities and simulate
the kind of customer ownership that publicly owned utilities have. The
question is, what’s the right allocation? I’ve been thinking about
this recently, and believe I have a full answer.
</p>

<p>
You want to buy just enough shares of the utility company so that the
profit the company makes off of your usage equals the profit you make
from your stake. If you have any more shares than that, then you’re
taking some profits from other customers. If you have any less (or
zero) shares, then an investor is capturing your profits.
</p>

<p>
So, my allocation formula looks like this:
</p>


<div class="equation-container">
<span class="equation">
<object class="org-svg" aria-label="\begin{equation*}
\label{eq:1}
Your Spending * \frac{Earnings}{Revenue} = Your Shares * \frac{Earnings}{\# Shares}
\end{equation*}
" type="image/svg+xml" data="ltximg/latex7ZWedU_23d14ee262cf6a22471119b3ac72999d0213d230.svg">
Sorry, your browser does not support SVG.</object>
</span>
<span class="equation-label">
1
</span>
</div>

<p>
Interestingly, earnings cancels out in this formula, so we don’t
actually need to know about profitability, just revenue. We want just
enough shares so that the revenue taken from us is equal to the
revenue our shares represent. This can further be simplified to:
</p>


<div class="equation-container">
<span class="equation">
<object class="org-svg" aria-label="\begin{equation*}
\label{eq:2}
Your Shares = Your Spending * \frac{\# Shares}{Revenue}
\end{equation*}
" type="image/svg+xml" data="ltximg/latexk8yjXV_19ad564c06042c19f0cfb816455488fec4696c1d.svg">
Sorry, your browser does not support SVG.</object>
</span>
<span class="equation-label">
2
</span>
</div>

<p>
To determine optimal allocation, the two things we will need to
calculate are personal spending and shares per revenue. Personal
spending is not too hard to figure out, but number of shares per
revenue is not a common metric you usually find in prospectuses -
usually number of shares is in the denominator not the numerator. But
there is a related metric we can use for this: Revenue Per Share
(RPS). So the above formula can be rewritten as:
</p>


<div class="equation-container">
<span class="equation">
<object class="org-svg" aria-label="\begin{equation*}
\label{eq:3}
Your Shares = \frac{Your Spending}{Revenue Per Share}
\end{equation*}
" type="image/svg+xml" data="ltximg/latexQkC6ou_f474e8b5610b82c7c32721d3bc6e649c99556d5b.svg">
Sorry, your browser does not support SVG.</object>
</span>
<span class="equation-label">
3
</span>
</div>

<p>
Since we cannot predict the future, we have to look backwards at these
two metrics. For my own purposes, I am looking at 2023 numbers, which
will hopefully even out some of the fluctuations in consumption that
happens with seasonal changes.
</p>
<div id="outline-container-orge2400d6" class="outline-2">
<h2 id="orge2400d6"><span class="section-number-2">1.</span> Example</h2>
<div class="outline-text-2" id="text-1">
<p>
For this exercise, I’ve looked at my own utilities. I’ve omitted
telephone &amp; cable which I don’t use. I also excluded cellular which is
not quite a monopoly where I am (U.S. cellular networks include AT&amp;T,
Dish, T-Mobile and Verizon).
</p>

<table>


<colgroup>
<col  class="org-left">

<col  class="org-left">
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Utility</th>
<th scope="col" class="org-left">Ownership</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Electricity</td>
<td class="org-left">Invester owned</td>
</tr>

<tr>
<td class="org-left">Water</td>
<td class="org-left">Publicly owned</td>
</tr>

<tr>
<td class="org-left">Sewer</td>
<td class="org-left">Publicly owned</td>
</tr>

<tr>
<td class="org-left">Natural Gas</td>
<td class="org-left">Invester owned</td>
</tr>

<tr>
<td class="org-left">Trash</td>
<td class="org-left">Invester owned</td>
</tr>

<tr>
<td class="org-left">Internet</td>
<td class="org-left">Invester owned</td>
</tr>
</tbody>
</table>

<p>
For where I live, water and sewer are publicly owned. All other
utilities are owned by investors, and can be bought on the stock
market. Here’s my spending for each of these utilities, as well as:
</p>

<table>


<colgroup>
<col  class="org-left">

<col  class="org-left">

<col  class="org-left">
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Utility</th>
<th scope="col" class="org-left">Stock symbol</th>
<th scope="col" class="org-left">My 2023 Spending</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Electricity</td>
<td class="org-left">NASDAQGS:EVRG</td>
<td class="org-left">$1,374.58</td>
</tr>

<tr>
<td class="org-left">Natural Gas</td>
<td class="org-left">NYSE:OGS</td>
<td class="org-left">$1,147.89</td>
</tr>

<tr>
<td class="org-left">Trash</td>
<td class="org-left">NYSE:GFL</td>
<td class="org-left">$229.05</td>
</tr>

<tr>
<td class="org-left">Internet</td>
<td class="org-left">NASDAQ:GOOGL</td>
<td class="org-left">$840</td>
</tr>
</tbody>
</table>

<p>
Some of this spending is rough estimates. Some percentage of spending
in all of the above goes to sales tax, franchise fees, and other
miscellaneous fees that may not actually reach the utility company.
But, my opinion is a rough estimate is probably okay.
</p>
</div>
<div id="outline-container-org244ec09" class="outline-3">
<h3 id="org244ec09"><span class="section-number-3">1.1.</span> Utilities</h3>
<div class="outline-text-3" id="text-1-1">
</div>
<div id="outline-container-org222ff01" class="outline-4">
<h4 id="org222ff01"><span class="section-number-4">1.1.1.</span> Electricity</h4>
<div class="outline-text-4" id="text-1-1-1">
<p>
Evergy is the only utility of electricity in my area. I was able to
pull financial data from its 2023 10-K:
</p>

<table>


<colgroup>
<col  class="org-left">

<col  class="org-left">
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Evergy 2023</th>
<th scope="col" class="org-left">(millions)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Revenue</td>
<td class="org-left">$5,508.2</td>
</tr>

<tr>
<td class="org-left">Net Income</td>
<td class="org-left">$743.6</td>
</tr>

<tr>
<td class="org-left">Number of shares</td>
<td class="org-left">230</td>
</tr>
</tbody>
</table>

<p>
This gives RPS of $23.95/share. According to the above formula, I need
to purchase 57.4 shares of Evergy. As of end of day June 3rd, 2023,
Evergy traded at $52.29/share. So this would require a $3,001.45
investment.
</p>

<p>
Notably, this is looking at the profitability of the whole company.
It’s possible that my specific home is more profitable than the
average Evergy customer. For instance, a big cost for electricity is
getting the power line to the home, which has already been done in my
case. Or maybe some regions are more profitable than others. However,
the same thing I think happens in public utilities - some houses are
cheaper than others, yet the rates stay the same. So, I think looking
at it from a whole company view is both simpler, and closely mirrors
how public utilities actually run in practice.
</p>
</div>
</div>
<div id="outline-container-org3590939" class="outline-4">
<h4 id="org3590939"><span class="section-number-4">1.1.2.</span> Natural Gas</h4>
<div class="outline-text-4" id="text-1-1-2">
<p>
<a href="https://www.onegas.com/home/default.aspx">One Gas</a> is the only utility of natural gas in my area. I was able
to pull financial from its 2023 10-K:
</p>

<table>


<colgroup>
<col  class="org-left">

<col  class="org-left">
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">ONE Gas 2023</th>
<th scope="col" class="org-left">(thousands)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Revenue</td>
<td class="org-left">$2,371,990</td>
</tr>

<tr>
<td class="org-left">Net Income</td>
<td class="org-left">$231,232</td>
</tr>

<tr>
<td class="org-left">Number of shares</td>
<td class="org-left">55,600</td>
</tr>
</tbody>
</table>

<p>
This gives RPS of $42.66/share. According to the above formula, I need
to purchase 26.91 shares of One Gas. As of end of day June 3rd, 2023,
One Gas traded at $62.87/share. So this would require a $1,691.83 investment.
</p>
</div>
</div>
<div id="outline-container-org5dbb7ff" class="outline-4">
<h4 id="org5dbb7ff"><span class="section-number-4">1.1.3.</span> Trash</h4>
<div class="outline-text-4" id="text-1-1-3">
<p>
<a href="https://gflenv.com">GFL</a> is the trash service used in my neighborhood. Unlike the previous
two companies, GFL is headquartered in Canada. However, it is still
listed on the NYSE, so it can easily be purchased by Americans. The
financial data is included in its 40-F instead of 10-K.
</p>

<table>


<colgroup>
<col  class="org-left">

<col  class="org-left">
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">GFL 2023</th>
<th scope="col" class="org-left">(millions)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Revenue</td>
<td class="org-left">$7,515.5</td>
</tr>

<tr>
<td class="org-left">Net Income</td>
<td class="org-left">$32.2</td>
</tr>

<tr>
<td class="org-left">Number of shares</td>
<td class="org-left">408</td>
</tr>
</tbody>
</table>

<p>
This gives RPS of $18.42/share. According to the above formula, I need
to purchase 12.43 shares of GFL. As of end of day June 3rd, 2023, GFL
traded at $34.73/share. So this would require a $431.69 investment.
</p>
</div>
</div>
<div id="outline-container-org19993ab" class="outline-4">
<h4 id="org19993ab"><span class="section-number-4">1.1.4.</span> Internet</h4>
<div class="outline-text-4" id="text-1-1-4">
<p>
I’ve saved Google Fiber, now called <a href="https://fiber.google.com">GFiber</a>, for last because I think
it is a special case in this. Alphabet (Google) is a huge company, and
GFiber is only a small part of that. In financial statements, Alphabet
has a broad category called "other bets" which includes GFiber as well
as Waymo, Verily, and X. Other bets as a whole posted losses in the
last couple of years. So most likely Alphabet is not making a profit
on my $70/month I pay for GFiber. As a result, I think it doesn’t make
sense to purchase shares in Alphabet.
</p>
</div>
</div>
</div>
<div id="outline-container-orgb37be7d" class="outline-3">
<h3 id="orgb37be7d"><span class="section-number-3">1.2.</span> My Asset Allocation</h3>
<div class="outline-text-3" id="text-1-2">
<p>
Here is what my asset allocation would look like:
</p>

<table>


<colgroup>
<col  class="org-left">

<col  class="org-left">

<col  class="org-right">

<col  class="org-right">
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
<th scope="col" class="org-left">Investment</th>
<th scope="col" class="org-right">% of company</th>
<th scope="col" class="org-right">Allocation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Electricity</td>
<td class="org-left">$3,001.45</td>
<td class="org-right">0.00000025%</td>
<td class="org-right">59%</td>
</tr>

<tr>
<td class="org-left">Natural Gas</td>
<td class="org-left">$1,691.83</td>
<td class="org-right">0.00000048%</td>
<td class="org-right">33%</td>
</tr>

<tr>
<td class="org-left">Trash</td>
<td class="org-left">$431.69</td>
<td class="org-right">0.00000003%</td>
<td class="org-right">8%</td>
</tr>
</tbody>
<tbody>
<tr>
<td class="org-left">Total</td>
<td class="org-left">$5,124.96</td>
<td class="org-right">&#xa0;</td>
<td class="org-right">100%</td>
</tr>
</tbody>
</table>

<p>
While it may seem like a lot of money, this is actually much cheaper
than I first thought it would cost. Most people don’t have this kind
of money just sitting around, though.
</p>

<p>
Unlike most asset allocations, the percentages will change every year.
For example, increased consumption of natural gas would mean higher
allocation of natural gas. Increased price of natural gas, however,
should be neutral on natural gas’s allocation because while revenue
per share is going up, so is your personal spending.
</p>

<p>
The price of these shares will also change over time, but the allocation is
really based on number of shares, not price. So, any price change
shoudn’t require reallocation, but every time new revenue numbers come
out, you may want to <a href="https://www.bogleheads.org/wiki/Rebalancing">rebalance</a>.
</p>
</div>
</div>
</div>
<div id="outline-container-orgfd3a45d" class="outline-2">
<h2 id="orgfd3a45d"><span class="section-number-2">2.</span> Open Questions</h2>
<div class="outline-text-2" id="text-2">
<ul class="org-ul">
<li><p>
What’s the risk to this allocation?
</p>

<p>
I think by purchasing utilities, you are taking on risk that are
held by the shareholders. So, in the event of bankruptcy, your
equity would be wiped out. However, I’m skeptical that public
utilities wouldn’t be bailed out in the event of insolvency. Also,
publicly owned utilities already have this problem - ratepayers (and
maybe also taxpayers) would be on the hook if the utility were
insolvent, so it may not be much worse than that. I haven’t yet
researched any cases of for-profit or pubicly owned utilities
becoming insolvent.
</p></li>

<li><p>
What if you own your utilities through an index fund already?
</p>

<p>
I think you can think of your index fund as a separate pool of money
from your direct ownership of utilities. Index funds are used to
reduce overall risk, while this strategy is intended to capture the
profits from your utility payments.
</p></li>

<li><p>
What if everyone did this?
</p>

<p>
It would be interesting if every ratepayer did this by buying all
the shares of each utility. Would the utility become de facto
publicly owned? Would company management care as much about rates as
profits? All are fascinating questions that I don’t think we can
answer.
</p>

<p>
Another crazy idea: what if publicly owned utilities gave each of
their ratepayers shares: 1 share for $100 in spending. It would let
ratepayers sell their shares if they needed money in return for
higher realized rates rates. But it would be unclear how you would
ensure future ratepayers also get equity. Perhaps it could work
similar to how ESOP programs work in some workplaces.
</p></li>

<li><p>
Don’t state energy regulators represent consumers already?
</p>

<p>
State regulators do have a large role in regulation of energy and
natural gas. They seem to mostly focus on pushing the utilities to
keep rates low. But even the strictist state regulators will
recognize a profit needs to be paid to shareholders each year.
</p></li>

<li><p>
What are some other applications of this?
</p>

<p>
You could take this allocation formula to other applications where
you consume goods. For instance, if you regularly spend $100/month
at Amazon, you could buy ($1200/Amazon RPS) shares in Amazon (where
Amazon’s 2023 RPS is $55.78). This probably doesn’t work for Amazon
in particular since they are a very diverse business and product
sales like Amazon.com is probably less profitable than service sales
like AWS. If you could purchase just the Amazon.com side of the
business, you could perhaps do something like this. It might even be
possible to do it yourself with some clever use of options trading.
Perhaps, a business relying heavily on AWS would want to reap some
of the profits they contribute to. There’s also a risk of being
doubly exposed to risk in Amazon however - both your cloud platform
and your balance sheet are effected if AWS becomes unprofitable.
</p></li>
</ul>
</div>
</div>
<div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/own-your-utilities.html</link>
  <guid>https://matthewbauer.us/blog/own-your-utilities.html</guid>
  <pubDate>Sun, 09 Jun 2024 00:00:00 -0500</pubDate>
</item>
<item>
  <title><![CDATA[Announcing Nixiosk]]></title>
  <description><![CDATA[
<p>
Today I’m announcing a project I’ve been working on for the last few
weeks. I’m calling it Nixiosk which is kind of a smashing together of
the words NixOS and Kiosk. The idea is to have an easy way to make
locked down, declarative systems
</p>

<p>
My main application of this is my two Raspberry Pi systems that I own.
Quite a few people have installed NixOS on these systems, but usually
they are starting from some prebuilt image. A major goal of this
project is to make it easy to build these images yourself. For this to
work, I’ve had to make lots of changes to NixOS cross-compilation
ecosystem, but the results seem to be very positive. I also want the
system to be locked down so that no user can login directly on the
machine. Instead, all administration is done on a remote machine, and
deployed through SSH and Nix remote builders.
</p>

<p>
Right now, I have RetroArch (a frontend for a bunch of emulators) on
my Raspberry Pi 4, and Epiphany (a web browser) on my Raspberry Pi 0.
Both systems seem to be working pretty well.
</p>

<p>
GitHub: <a href="https://github.com/matthewbauer/nixiosk">https://github.com/matthewbauer/nixiosk</a>
</p>
<div id="outline-container-org723e690" class="outline-2">
<h2 id="org723e690"><span class="section-number-2">1.</span> Deploying</h2>
<div class="outline-text-2" id="text-1">
</div>
<div id="outline-container-org0d38188" class="outline-3">
<h3 id="org0d38188"><span class="section-number-3">1.1.</span> Install Nix</h3>
<div class="outline-text-3" id="text-1-1">
<p>
If you haven’t already, you need to install Nix. This can be done
through the installer:
</p>

<div class="org-src-container">
<pre class="src src-sh">$ bash &lt;(curl -L https://nixos.org/nix/install)
</pre>
</div>
</div>
</div>
<div id="outline-container-org9339723" class="outline-3">
<h3 id="org9339723"><span class="section-number-3">1.2.</span> Cache</h3>
<div class="outline-text-3" id="text-1-2">
<p>
To speed things up, you should setup a binary cache for nixiosk. This
can be done easily through <a href="https://nixiosk.cachix.org/">Cachix</a>. First, install Cachix:
</p>

<div class="org-src-container">
<pre class="src src-sh">$ nix-env -iA cachix -f https://cachix.org/api/v1/install
</pre>
</div>

<p>
Then, use the nixiosk cache:
</p>

<div class="org-src-container">
<pre class="src src-sh">$ cachix use nixiosk
</pre>
</div>
</div>
</div>
<div id="outline-container-org060641e" class="outline-3">
<h3 id="org060641e"><span class="section-number-3">1.3.</span> Configuration</h3>
<div class="outline-text-3" id="text-1-3">
<p>
To make things simple, it just reads from an ad-hoc JSON file that
describe the hardware plus some other customizations. It looks like
this:
</p>

<div class="org-src-container">
<pre class="src src-json">{
    "hostName": "nixiosk",
    "hardware": "raspberryPi4",
    "authorizedKeys": [],
    "program": {
        "package": "epiphany",
        "executable": "/bin/epiphany",
        "args": ["https://en.wikipedia.org/"]
    },
    "networks": {
        "my-router": "0000000000000000000000000000000000000000000000000000000000000000",
    },
    "locale": {
        "timeZone": "America/New_York",
        "regDom": "US",
        "lang": "en_US.UTF-8"
    },
    "localSystem": {
        "system": "x86_64-linux",
        "sshUser": "me",
        "hostName": "my-laptop-host",
    }
}
</pre>
</div>

<p>
Here’s a basic idea of what each of these fields do:
</p>

<ul class="org-ul">
<li>hostName: Name of the host to use. If mDNS is configured on your
network, this can be used to identify the IP address of the device
via “&lt;hostName&gt;.local”.</li>
<li>hardware: A string describing what hardware we are using. Valid
values currently are “raspberryPi0”, “raspberryPi1”, “raspberryPi2”,
“raspberryPi3”, “raspberryPi4”.</li>
<li>authorizedKeys: A list of SSH public keys that are authorized to
make changes to your device. Note this is required because no
passwords will be set for this system.</li>
<li>program: What to do in the kiosk. This should be a Nixpkgs attribute
(<b>package</b>), an <b>executable</b> in that package, and a list of <b>args</b>.</li>
<li>networks: This is a name/value pairing of SSIDs to PSK passphrases.
This can be found with the wpa_passphrase(8) command from
wpa_supplicant.</li>
<li>locale: This provides some information of what localizations to use.
You can set <a href="https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">regulation domain</a>, <a href="https://www.gnu.org/software/libc/manual/html_node/Locale-Names.html#Locale-Names">language</a>, <a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones">time zone</a> via “regDom”,
“lang”, and “timeZone”. If unspecified, defaults to US / English /
New York.</li>
<li>localSystem: Information on system to use for <a href="https://github.com/matthewbauer/nixiosk#remote-builder-optional">remote builder</a>.
Optional.</li>
</ul>
</div>
</div>
<div id="outline-container-org16f7e34" class="outline-3">
<h3 id="org16f7e34"><span class="section-number-3">1.4.</span> Initial deployment</h3>
<div class="outline-text-3" id="text-1-4">
<p>
The deployment is pretty easy provided you have <a href="https://nixos.org/nix/">Nix installed</a>. Here
are some steps:
</p>

<div class="org-src-container">
<pre class="src src-sh">$ git clone https://github.com/matthewbauer/nixiosk.git
$ cd nixiosk/
$ cp nixiosk.json.sample nixiosk.json
</pre>
</div>

<p>
Now you need to make some changes to nixiosk.json to reflect what you
want your system to do. The important ones are ‘authorizedKeys’ and
‘networks’ so that your systems can startup and you can connect to it.
</p>

<p>
If you have an SSH key setup, you can get its value with:
</p>

<div class="org-src-container">
<pre class="src src-sh">$ cat $<span class="org-variable-name">HOME</span>/.ssh/id_rsa.pub
<span class="org-whitespace-line">ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC050iPG8ckY/dj2O3ol20G2lTdr7ERFz4LD3R4yqoT5W0THjNFdCqavvduCIAtF1Xx/OmTISblnGKf10rYLNzDdyMMFy7tUSiC7/T37EW0s+EFGhS9yOcjCVvHYwgnGZCF4ec33toE8Htq2UKBVgtE0PMwPAyCGYhFxFLYN8J8/xnMNGqNE6iTGbK5qb4yg3rwyrKMXLNGVNsPVcMfdyk3xqUilDp4U7HHQpqX0wKrUvrBZ87LnO9z3X/QIRVQhS5GqnIjRYe4L9yxZtTjW5HdwIq1jcvZc/1Uu7bkMh3gkCwbrpmudSGpdUlyEreaHOJf3XH4psr6IMGVJvxnGiV9 mbauer@dellbook</span>
</pre>
</div>

<p>
which will give you a line for “authorizedKeys” like:
</p>

<div class="org-src-container">
<pre class="src src-json">"authorizedKeys": ["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC050iPG8ckY/dj2O3ol20G2lTdr7ERFz4LD3R4yqoT5W0THjNFdCqavvduCIAtF1Xx/OmTISblnGKf10rYLNzDdyMMFy7tUSiC7/T37EW0s+EFGhS9yOcjCVvHYwgnGZCF4ec33toE8Htq2UKBVgtE0PMwPAyCGYhFxFLYN8J8/xnMNGqNE6iTGbK5qb4yg3rwyrKMXLNGVNsPVcMfdyk3xqUilDp4U7HHQpqX0wKrUvrBZ87LnO9z3X/QIRVQhS5GqnIjRYe4L9yxZtTjW5HdwIq1jcvZc/1Uu7bkMh3gkCwbrpmudSGpdUlyEreaHOJf3XH4psr6IMGVJvxnGiV9 mbauer@dellbook"],
</pre>
</div>

<p>
and you can get a PSK value for your WiFi network with:
</p>

<div class="org-src-container">
<pre class="src src-sh">$ nix run nixpkgs.wpa_supplicant -c wpa_passphrase my-network
<span class="org-variable-name">network</span>={
        <span class="org-variable-name">ssid</span>=<span class="org-string">"my-network"</span>
        <span class="org-comment-delimiter">#</span><span class="org-comment">psk="abcdefgh"</span>
        <span class="org-variable-name">psk</span>=17e76a6490ac112dbeba996caa7cd1387c6ebf6ce721ef704f92b681bb2e9000
}
</pre>
</div>

<p>
so your .json file looks like:
</p>

<div class="org-src-container">
<pre class="src src-json">"networks": {
  "my-network": "17e76a6490ac112dbeba996caa7cd1387c6ebf6ce721ef704f92b681bb2e9000",
},
</pre>
</div>

<p>
Now, after inserting your Raspberry Pi SD card into the primary slot,
you can deploy to it with:
</p>

<div class="org-src-container">
<pre class="src src-sh">$ ./deploy.sh /dev/mmcblk0
</pre>
</div>

<p>
You can now eject your SD card and insert it into your Raspberry Pi.
It will boot immediately to an Epiphany browser, loading
en.wikipedia.org.
</p>

<p>
<a href="https://github.com/matthewbauer/nixiosk#troubleshooting">Troubleshooting steps</a> can be found in the README.
</p>
</div>
</div>
<div id="outline-container-org043ac72" class="outline-3">
<h3 id="org043ac72"><span class="section-number-3">1.5.</span> Redeployments</h3>
<div class="outline-text-3" id="text-1-5">
<p>
You can pretty easily make changes to a running system given you have
SSH access. This is as easy as cloning the running config:
</p>

<div class="org-src-container">
<pre class="src src-sh">$ git clone ssh://root@nixiosk.local/etc/nixos/configuration.git nixiosk-configuration
$ cd nixiosk-configuration
</pre>
</div>

<p>
Then, make some changes in your repo. After your done, you can just
run ‘git push’ to redeploy.
</p>

<div class="org-src-container">
<pre class="src src-sh">$ git add .
$ git commit
$ git push
</pre>
</div>

<p>
You’ll see the NixOS switch-to-configuration log in your command
output. If all is successful, the system should immediately reflect
your changes. If not, the output of Git should explain what went
wrong.
</p>

<p>
Note, that some versions of the Raspberry Pi like the 0 and the 1 are
not big enough to redeploy the whole system. You will probably need to
setup remote builders. This is <a href="https://github.com/matthewbauer/nixiosk#remote-builder-optional">described in the README</a>.
</p>
</div>
</div>
</div>
<div id="outline-container-orgf990169" class="outline-2">
<h2 id="orgf990169"><span class="section-number-2">2.</span> Technology</h2>
<div class="outline-text-2" id="text-2">
<p>
Here are some of the pieces that make the Kiosk system possible:
</p>

<ul class="org-ul">
<li><a href="https://www.hjdskes.nl/projects/cage/">Cage</a> / <a href="https://wayland.freedesktop.org/">Wayland</a>: Cage is a Wayland compositor that allows only one
application to display at a time. This makes the system a true
Kiosk.</li>
<li><a href="https://nixos.org/">NixOS</a> - A Linux distro built on top of functional package management.</li>
<li><a href="https://gitlab.com/obsidian.systems/basalt/">Basalt</a>: A tool to manage NixOS directly from Git. This allows doing
push-to-deploy directly to NixOS.</li>
<li><a href="https://www.freedesktop.org/wiki/Software/Plymouth/">Plymouth</a>: Nice graphical boot animations. Right now, it uses the
NixOS logo but in the future this should be configurable so that you
can include your own branding.</li>
<li><a href="https://www.openssh.com/">OpenSSH</a>: Since no direct login is available, SSH is required for
remote administration.</li>
<li><a href="http://www.avahi.org/">Avahi</a>: Configures mDNS registration for the system, allowing you to
remember host names instead of IP addresses.</li>
</ul>

<p>
I would also like to include some more tools to make administration
easier:
</p>

<ul class="org-ul">
<li>ddclient / miniupnp: Allow registering external IP address with a
DNS provider. This would enable administration outside of the
device’s immediate network.</li>
</ul>
</div>
</div>
<div id="outline-container-orgcd14e8c" class="outline-2">
<h2 id="orgcd14e8c"><span class="section-number-2">3.</span> Project</h2>
<div class="outline-text-2" id="text-3">
<p>
You can try it out right now if you have an Raspberry Pi system. Other
hardware is probably not too hard, but may require tweaking. The
project page is available at <a href="https://github.com/matthewbauer/nixiosk">https://github.com/matthewbauer/nixiosk</a>
and issues and pull requests are welcomed.
</p>
</div>
</div>
<div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/nixiosk.html</link>
  <guid>https://matthewbauer.us/blog/nixiosk.html</guid>
  <pubDate>Mon, 23 Mar 2020 00:00:00 -0500</pubDate>
</item>
<item>
  <title><![CDATA[All the versions with Nix]]></title>
  <description><![CDATA[
<div id="outline-container-org70c198e" class="outline-2">
<h2 id="org70c198e"><span class="section-number-2">1.</span> Background</h2>
<div class="outline-text-2" id="text-1">
<p>
In <a href="channel-changing.html">Channel Changing with Nix</a>, I described how to move between channels
in Nix expressions. This provides an easy way to work with multiple
versions of Nixpkgs. I was reminded of this post after seeing <a href="https://news.ycombinator.com/item?id=20753066">a
comment</a> by jolmg on Hacker News. The comment suggested we should have
a way to use multiple versions of packages seamlessly together. It
suggested that we should use commits to differentiate versions, but I
suggested that stable <i>channels</i> would work much better.
</p>

<p>
So, as a follow up to my Channel Changing post, I want to show how you
can use a quick Nix mockup to accomplish this. Like the previous post,
it will come with a Nix snippet that you can try out yourself.
</p>
</div>
</div>
<div id="outline-container-org7bfe8a4" class="outline-2">
<h2 id="org7bfe8a4"><span class="section-number-2">2.</span> Code</h2>
<div class="outline-text-2" id="text-2">
<p>
So, what follows is some code that I wrote up that lets you find
package versions in an easier way. It is also available for download
at <a href="https://matthewbauer.us/generate-versions.nix">https://matthewbauer.us/generate-versions.nix</a>.
</p>

<div class="org-src-container">
<pre class="src src-nix">{ channels ? [ <span class="org-string">"19.03"</span> <span class="org-string">"18.09"</span> <span class="org-string">"18.03"</span> <span class="org-string">"17.09"</span> <span class="org-string">"17.03"</span>
               <span class="org-string">"16.09"</span> <span class="org-string">"16.03"</span> <span class="org-string">"15.09"</span> <span class="org-string">"14.12"</span> <span class="org-string">"14.04"</span> <span class="org-string">"13.10"</span> ]
, attrs ? builtins.attrNames (<span class="org-nix-builtin">import</span> <span class="org-nix-constant">&lt;nixpkgs&gt;</span> {})
, system ? builtins.currentSystem
, args ? { <span class="org-nix-keyword">inherit</span> system; }
}: <span class="org-nix-keyword">let</span>

  <span class="org-nix-attribute">getSet</span> = channel:
    (<span class="org-nix-builtin">import</span> (builtins.fetchTarball <span class="org-string">"channel:nixos-</span><span class="org-nix-antiquote">${</span>channel<span class="org-nix-antiquote">}</span>") args).pkgs;

  <span class="org-nix-attribute">getPkg</span> = name: channel: <span class="org-nix-keyword">let</span>
    <span class="org-nix-attribute">pkgs</span> = getSet channel;
    <span class="org-nix-attribute">pkg</span> = pkgs.${name};
    <span class="org-nix-attribute">version</span> = (builtins.parseDrvName pkg.name).version;
  <span class="org-nix-keyword">in</span> if builtins.hasAttr name pkgs &amp;&amp; pkg ? name <span class="org-nix-keyword">then</span> {
    <span class="org-nix-attribute">name</span> = version;
    <span class="org-nix-attribute">value</span> = pkg;
  } <span class="org-nix-keyword">else</span> <span class="org-nix-builtin">null</span>;

<span class="org-nix-keyword">in</span> builtins.listToAttrs (<span class="org-nix-builtin">map</span> (name: {
  <span class="org-nix-keyword">inherit</span> name;
  <span class="org-nix-attribute">value</span> = builtins.listToAttrs
    (builtins.filter (x: x != <span class="org-nix-builtin">null</span>)
      (<span class="org-nix-builtin">map</span> (getPkg name) channels));
}) attrs)
</pre>
</div>

<p>
This Nix expression generates an index of each package from all 11
releases of Nixpkgs that have occurred since October 2010. For every
package, each version that came with a release is included and put
into a map. The map uses the version as a key and the package as its
value, preferring the newer release when versions conflict.
</p>

<p>
This is all done lazily, because that’s how Nix works. Still, it will
take a little while at first to evaluate because we need to parse all
11 releases! Remarkably, this expression uses only Nix builtins, and
requires no special library function.
</p>
</div>
</div>
<div id="outline-container-org5dbd821" class="outline-2">
<h2 id="org5dbd821"><span class="section-number-2">3.</span> Usage</h2>
<div class="outline-text-2" id="text-3">
<p>
Working with this Nix expression is extremely interesting, and I’ve
included some examples of how to work with it. They should all be
usable on a Linux machine (or maybe macOS) with <a href="https://nixos.org/nix/">Nix installed</a>.
</p>
</div>
<div id="outline-container-org4c9f0e0" class="outline-3">
<h3 id="org4c9f0e0"><span class="section-number-3">3.1.</span> Query package versions</h3>
<div class="outline-text-3" id="text-3-1">
<p>
You can query what package versions are available through Nix’s
<code>builtins.attrNames</code> function. For example,
</p>

<div class="org-src-container">
<pre class="src src-shell">$ nix eval <span class="org-string">"(builtins.attrNames (import (builtins.fetchurl https://matthewbauer.us/generate-versions.nix) {}).emacs)"</span>
[ <span class="org-string">"24.3"</span> <span class="org-string">"24.4"</span> <span class="org-string">"24.5"</span> <span class="org-string">"25.3"</span> <span class="org-string">"26.1"</span> ]
</pre>
</div>

<p>
This shows us that there are 5 versions of Emacs. This is kind of
interesting because it means that there were at least 6 duplicate
versions of Emacs between our release channels. Unfortunately, a few
versions of Emacs are notably missing including Emacs 25.1 and Emacs
25.2. Emacs 24.2 was released almost a year before the first stable
Nixpkgs release! As time goes on, we should collect more of these
releases.
</p>
</div>
</div>
<div id="outline-container-org04411d4" class="outline-3">
<h3 id="org04411d4"><span class="section-number-3">3.2.</span> Running an old version</h3>
<div class="outline-text-3" id="text-3-2">
<p>
As shown above, there are 5 versions of Emacs available to us. We can
run Emacs 24.3 with a fairly short command:
</p>

<div class="org-src-container">
<pre class="src src-shell"><span class="org-whitespace-line">$ </span><span class="org-variable-name"><span class="org-whitespace-line">LC_ALL</span></span><span class="org-whitespace-line">=C nix run </span><span class="org-string"><span class="org-whitespace-line">"(import (builtins.fetchurl https://matthewbauer.us/generate-versions.nix) {}).emacs.\"24.3\""</span></span><span class="org-whitespace-line"> -c emacs</span>
</pre>
</div>

<p>
<code>LC_ALL=C</code> is needed on Linux to avoid the old Glibc trying to load
the newer, incompatible locales that may be included with your system.
This is an unfortunate problem with Glibc including breaking changes
between releases. It also makes me want use to switch to Musl some
time soon! I’ve also noticed some incompatibilities with GTK icons
that appear to come from the gdk-pixbuf module. More investigation is
needed on why this is the case.
</p>

<p>
This will not work on macOS because we did not have Emacs
working on macOS back then! macOS users can try Emacs 25.3. This looks
very similar to the above:
</p>

<div class="org-src-container">
<pre class="src src-shell">$ nix run <span class="org-string">"(import (builtins.fetchurl https://matthewbauer.us/generate-versions.nix) {}).emacs.\"25.3\""</span> -c emacs
</pre>
</div>
</div>
</div>
<div id="outline-container-org4a0ea7d" class="outline-3">
<h3 id="org4a0ea7d"><span class="section-number-3">3.3.</span> Firefox</h3>
<div class="outline-text-3" id="text-3-3">
<p>
Another example using Firefox is pretty neat. The code is very similar
to Emacs:
</p>

<div class="org-src-container">
<pre class="src src-shell">$ nix eval <span class="org-string">"(builtins.attrNames (import (builtins.fetchurl https://matthewbauer.us/generate-versions.nix) {}).firefox)"</span>
[ <span class="org-string">"25.0.1"</span> <span class="org-string">"34.0.5"</span> <span class="org-string">"39.0.3"</span> <span class="org-string">"45.0"</span> <span class="org-string">"48.0.2"</span> <span class="org-string">"51.0.1"</span> <span class="org-string">"55.0.3"</span> <span class="org-string">"59.0.2"</span> <span class="org-string">"63.0.3"</span> <span class="org-string">"66.0.3"</span> <span class="org-string">"68.0.2"</span> ]
</pre>
</div>

<p>
We get all 11 releases with unique Firefox versions this time. 
</p>

<p>
You can run Firefox 25.0.1 using this command:
</p>

<div class="org-src-container">
<pre class="src src-shell"><span class="org-whitespace-line">$ </span><span class="org-variable-name"><span class="org-whitespace-line">LC_ALL</span></span><span class="org-whitespace-line">=C nix run </span><span class="org-string"><span class="org-whitespace-line">"(import (builtins.fetchurl https://matthewbauer.us/generate-versions.nix) {}).firefox.\"25.0.1\""</span></span><span class="org-whitespace-line"> -c firefox</span>
</pre>
</div>

<p>
Amazing how notably Firefox has changed since then!
</p>
</div>
</div>
<div id="outline-container-org7b398b1" class="outline-3">
<h3 id="org7b398b1"><span class="section-number-3">3.4.</span> Blender</h3>
<div class="outline-text-3" id="text-3-4">
<p>
Another example using Blender. The code is very similar to the two above:
</p>

<div class="org-src-container">
<pre class="src src-shell">$ nix eval <span class="org-string">"(builtins.attrNames (import (builtins.fetchurl https://matthewbauer.us/generate-versions.nix) {}).blender)"</span>
[ <span class="org-string">"2.67"</span> <span class="org-string">"2.70"</span> <span class="org-string">"2.72b"</span> <span class="org-string">"2.75a"</span> <span class="org-string">"2.77a"</span> <span class="org-string">"2.78c"</span> <span class="org-string">"2.79"</span> <span class="org-string">"2.79a"</span> <span class="org-string">"2.79b"</span> ]
</pre>
</div>

<p>
You can run Blender 2.67 using this command:
</p>

<div class="org-src-container">
<pre class="src src-shell"><span class="org-whitespace-line">$ </span><span class="org-variable-name"><span class="org-whitespace-line">LC_ALL</span></span><span class="org-whitespace-line">=C nix run </span><span class="org-string"><span class="org-whitespace-line">"(import (builtins.fetchurl https://matthewbauer.us/generate-versions.nix) {}).blender.\"26.7\""</span></span><span class="org-whitespace-line"> -c blender</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org3271051" class="outline-2">
<h2 id="org3271051"><span class="section-number-2">4.</span> Rationale</h2>
<div class="outline-text-2" id="text-4">
<p>
The reason that channels work better than commits is because every
commit in Nixpkgs is not guaranteed to work on its own. Some may be
missing security patches, configuration changes, or worse may just not
work with other versions of packages. In addition, there are just too
many commits to work with effectively. On the other hand, Nixpkgs
release stable channels every 6 months, and we have a long vetting
process of ensuring the stabilized channel works well.
</p>

<p>
The main drawback the 6-month channels have is that we don’t have
every version released of package. If the version you want is missing
in a release, you are out of luck. But, the 6-month window tends to
pick up a lot of packages and we end up with almost every major
version of popular software. My philosophy is not all releases are
worth keeping. Some contain critical security flaws, contain major
bugs, and might not work well with other software. The 6-month window
is good enough for me. Perhaps in the future we can increase Nixpkgs
release cadence to 3-month or 1-month, but the maintainers are not
quite ready for that yet.
</p>
</div>
</div>
<div id="outline-container-org185ed28" class="outline-2">
<h2 id="org185ed28"><span class="section-number-2">5.</span> Conclusion</h2>
<div class="outline-text-2" id="text-5">
<p>
This has hopefully shown how Nix’s functional dependency model makes
it very easy to switch between versions of packages. This is builtin
to Nix, but you need some scripts to really use this well. Our 6-month
release window is an arbitrary choice, but tends to pick up a lot of
useful versions in the mean time.
</p>
</div>
</div>
<div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/all-the-versions.html</link>
  <guid>https://matthewbauer.us/blog/all-the-versions.html</guid>
  <pubDate>Wed, 21 Aug 2019 00:00:00 -0500</pubDate>
</item>
<item>
  <title><![CDATA[Nixpkgs macOS Stdenv Updates]]></title>
  <description><![CDATA[
<p>
Over the past couple of months, I have been working on updating the
macOS stdenv in Nixpkgs. This has significant impact on users of
Nix/Nixpkgs on macOS. So, I want to explain what’s being updated, what
the benefits are, and how we can minimize breakages.
</p>
<div id="outline-container-org01c1c16" class="outline-2">
<h2 id="org01c1c16"><span class="section-number-2">1.</span> macOS/Darwin stdenv changes</h2>
<div class="outline-text-2" id="text-1">
<p>
First, to summarize the changes that impact stdenv and the Darwin
infrastructure. The PR is available at <a href="https://github.com/NixOS/nixpkgs/pull/56744">NixOS/nixpkgs PR #56744</a>. This
update has been in the works for the last few months, and is currently
in the staging-next branch, waiting to be merged in <a href="https://github.com/NixOS/nixpkgs/pull/60491">NixOS/nixpkgs PR
#60491</a>. It should land on master and nixpkgs-unstable in the next few
days. The main highlights are —
</p>

<ul class="org-ul">
<li>Change default LLVM toolchain from 5 to 7. LLVM 5 stdenv is still
available through <code>llvmPackages_5.stdenv</code> attribute path.</li>
<li>Upgrade Apple SDK from 10.10 to 10.12.</li>
<li>Update libSystem symbols from 10.10 (XNU 3789.1.32) to 10.12 (XNU
3789.1.32).</li>
<li>Removed old patches to support old stdenv in Qt 5 and elsewhere.</li>
</ul>

<p>
These macOS SDK upgrades are equivalent to setting
<code>-mmacosx-version-min</code> to 10.12 in XCode. As a result, we will break
compatibility with macOS before 10.12.
</p>
</div>
</div>
<div id="outline-container-org4c0cd69" class="outline-2">
<h2 id="org4c0cd69"><span class="section-number-2">2.</span> Why do we need to set a minimum macOS version?</h2>
<div class="outline-text-2" id="text-2">
<p>
Without knowing internals of Nixpkgs, it might not be clear why we
need to set a minimum macOS version. For instance with Linux, we are
able to support any Linux kernel in Nixpkgs without any problem. The
answer to this requires some understanding of how the kernel and
userspace function.
</p>

<p>
Nixpkgs is able to support multiple Linux kernels because we can use
multiple Libc’s at one time. For any executable, a Nix closure will
include both its own Libc and the dynamic linker in its closure. This
works in Linux where multiple Libc’s can be used, but not on macOS
where only one Libc is available.
</p>

<p>
In short, Linux and macOS deal with compatibility between built
binaries in different ways. They represent two opposite ends in how
Unix-like kernels maintain compatibility with their userspace binaries.
</p>
</div>
<div id="outline-container-org6750d0f" class="outline-3">
<h3 id="org6750d0f"><span class="section-number-3">2.1.</span> Linux syscall compatibility</h3>
<div class="outline-text-3" id="text-2-1">
<p>
The kernel is responsible for managing core operating system functions
such as start-up, memory management, device abstractions, and process
isolation. For it to function, the kernel needs to interact with the
rest of the operating system which is collectively referred to as
“userspace”. Executables in userspace use “syscalls” to tell the
kernel what to do. These syscalls are very low-level and usually not
called directly by a process. Instead, an abstraction layer is
provided by the standard C library, or Libc.
</p>

<p>
Linux is unique among operating systems due to the fact that the
Kernel and Libc are developed independently. Linux is maintained by
creator Linus Torvalds and a community of contributors. Glibc, the
most popular Libc for Linux, is maintained by the GNU project. As a
result, Linux has a strong separation between Syscalls and Libc.
</p>

<p>
Linux does not tie itself to any specific Libc. Even though Glibc is
used in almost all distros, many alternatives are available. For
instance, Musl provides a more lightweight version of Glibc, while
Bionic is the Libc used in the Android operating system. In addition,
multiple versions of each of these Libc’s can be used on any one
kernel, even at the same time. This can become very common when using
multiple Nixpkgs versions at one time.
</p>

<p>
To accomplish this, Linux provides a stable list of syscalls that it
has maintained across many versions. This is specified for i386 at
<a href="https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_32.tbl">arch/x86/entry/syscalls/syscall_32.tbl</a> in the kernel tree. The
syscalls specified here are the interface through which the Libc
communicates with the kernel. As a result, applications built in 1992
can run on a modern kernel, provided it comes with copies of all its
libraries<sup><a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>.
</p>
</div>
</div>
<div id="outline-container-org6b2c847" class="outline-3">
<h3 id="org6b2c847"><span class="section-number-3">2.2.</span> macOS Libc compatibility</h3>
<div class="outline-text-3" id="text-2-2">
<p>
The macOS Libc is called libSystem. It is available on all macOS
systems at <code>/usr/lib/libSystem.B.dylib</code>. This library is the main
interface that binary compatibility is maintained in macOS. Unlike
Linux, macOS maintains a stable interface in libSystem that all
executables are expected to link to. This interface is guaranteed by
Apple to be stable between versions.
</p>

<p>
In Nixpkgs, we maintain this compatibility through a list of symbols
that are exported by libSystem. This is a simple text list and is
available for viewing at
<a href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/os-specific/darwin/apple-source-releases/Libsystem/system_c_symbols">NixOS/nixpkgs/pkgs/os-specific/darwin/apple-source-releases/Libsystem/system_c_symbols</a>.
The symbol list is created by listing symbols (<code>nm</code>) on the minimum
macOS version that we support (for my PR, 10.12). We do some linking
tricks to ensure that everything that we build in Nixpkgs only
contains those symbols. This means that we can reproducibly build on
newer versions of macOS, while maintaining compatibility with older
macOS versions. Unfortunately, newer symbols introduced in later
versions cannot be used even on systems that have those symbols.
</p>

<p>
A side effect of macOS design, is that fully static executables are
not supported in macOS as they are on Linux. Without a stable syscall
interface, there is nothing to provide compatibility between versions.
As a result, Apple does not support this type of linking<sup><a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink">2</a></sup>.
</p>

<p>
There is no mandated reason why we need to use libSystem directly. In
fact, some languages like Go have attempted to instead use the syscall
interface directly. There is no reason why this couldn’t work,
however, upgrades between versions will almost certainly break
binaries. Go eventually <a href="https://github.com/golang/go/issues/17490">abandoned this scheme in time for Go 1.12</a>
(proposed by Nixpkgs macOS contributor copumpkin!)
</p>
</div>
</div>
<div id="outline-container-orgee5e6d2" class="outline-3">
<h3 id="orgee5e6d2"><span class="section-number-3">2.3.</span> Others</h3>
<div class="outline-text-3" id="text-2-3">
<p>
Some other examples may be useful. They mostly fall on one side or the
other of the Syscall / Libc divide —
</p>

<ul class="org-ul">
<li>FreeBSD - breaks syscall compatibility between major releases,
should use Libc for longterm binary compatibility.</li>
<li>OpenBSD - similarly, changes syscall interface, perhaps even more
often than FreeBSD<sup><a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink">3</a></sup>.</li>
<li>NetBSD - apparently has maintained syscall compatibility
since 1992. <sup><a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink">4</a></sup></li>
<li>Windows, Solaris, Fuchsia - I cannot find any information on these
and how they handle binary compatibility.</li>
</ul>
</div>
</div>
<div id="outline-container-orgd63d2dd" class="outline-3">
<h3 id="orgd63d2dd"><span class="section-number-3">2.4.</span> LLVM triple</h3>
<div class="outline-text-3" id="text-2-4">
<p>
As a side note, this difference can be clearly seen in how we specify
target systems. The LLVM triple is a 3 or 4-part string specifying
what we want to build for. The parts of the triple correspond to:
</p>

<div class="org-src-container">
<pre class="src src-text">&lt;cpu&gt;-&lt;vendor&gt;-&lt;kernel&gt;-&lt;abi&gt;
</pre>
</div>

<ul class="org-ul">
<li><code>&lt;cpu&gt;</code> — the CPU architecture that we are building for. Examples
include <code>x86_64</code>, <code>aarch64</code>, <code>armv7l</code>, etc.</li>
<li><code>&lt;vendor&gt;</code> — an arbitrary string specifying the vendor for the
toolchain. In Nixpkgs, this should always be <code>unknown</code>.</li>
<li><code>&lt;kernel&gt;</code> — the kernel to build for (<code>linux</code>).</li>
<li><code>&lt;abi&gt;</code> — the kernel ABI to use. On Linux, this corresponds to the
Libc we are using (<code>gnu</code> for Glibc, <code>musl</code> for Musl, <code>android</code> for
Bionic).</li>
</ul>

<p>
When building for Linux, we can build for any version of Linux at one
time. No version information is required. In addition, we must specify
what “ABI” we want to use. In Nix, this is not very important because
the Libc is provided by the closure. In fact, Nix has its own version
of the LLVM triple called a Nix system tuple that omits the <code>&lt;abi&gt;</code>
portion altogether! It corresponds to <code>&lt;cpu&gt;-&lt;kernel&gt;</code> from the LLVM
triple.
</p>

<p>
In comparison, when building for BSDs, we must specify which
version of the kernel we are building for. In addition, we leave off
the <code>&lt;abi&gt;</code> portion, because there is only one Libc available for
these platforms. They are even included in the same tree as the
kernel. Examples of BSD triples include,
</p>

<ul class="org-ul">
<li><code>aarch64-apple-darwin16.0.0</code></li>
<li><code>x86_64-unknown-freebsd12.0</code></li>
<li><code>i386-unknown-openbsd5.8</code></li>
<li><code>armv7l-unknown-netbsd7.99</code></li>
</ul>
</div>
</div>
</div>
<div id="outline-container-orgd0821af" class="outline-2">
<h2 id="orgd0821af"><span class="section-number-2">3.</span> Compatibility table</h2>
<div class="outline-text-2" id="text-3">
<p>
Looking through the old versions, I’ve compiled a list of what I think
are the corresponding macOS versions for each Nixpkgs release. As you
can see, we try to support at least 3 previous macOS releases. This
also happens to be about what Apple supports through security
updates<sup><a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink">5</a></sup>.
</p>

<table>


<colgroup>
<col  class="org-right">

<col  class="org-left">
</colgroup>
<thead>
<tr>
<th scope="col" class="org-right">Nixpkgs release</th>
<th scope="col" class="org-left">macOS version</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-right">19.09</td>
<td class="org-left">10.12, 10.13, 10.14, 10.15?</td>
</tr>

<tr>
<td class="org-right">19.03</td>
<td class="org-left">10.11<sup><a id="fnr.6" class="footref" href="#fn.6" role="doc-backlink">6</a></sup>, 10.12, 10.13, 10.14</td>
</tr>

<tr>
<td class="org-right">18.09</td>
<td class="org-left">10.11, 10.12, 10.13, 10.14</td>
</tr>

<tr>
<td class="org-right">18.03</td>
<td class="org-left">10.11, 10.12, 10.13, 10.14</td>
</tr>

<tr>
<td class="org-right">17.09</td>
<td class="org-left">10.10, 10.11, 10.12, 10.13</td>
</tr>

<tr>
<td class="org-right">17.03</td>
<td class="org-left">10.10, 10.11, 10.12</td>
</tr>

<tr>
<td class="org-right">16.09</td>
<td class="org-left">10.10, 10.11, 10.12</td>
</tr>

<tr>
<td class="org-right">16.03</td>
<td class="org-left">10.9?, 10.10, 10.11, 10.12</td>
</tr>
</tbody>
</table>

<p>
We know that some users are stuck on older versions of macOS due to
reasons outside of their control. As a result, we will try to support
the 19.03 branch for a little bit longer than is usually done. If your
organization uses 10.11, it might be a good idea to update to a newer
version along with your update to Nixpkgs 19.09.
</p>
</div>
</div>
<div id="outline-container-org9412939" class="outline-2">
<h2 id="org9412939"><span class="section-number-2">4.</span> Conclusion</h2>
<div class="outline-text-2" id="text-4">
<p>
My main goal has been to show better how Nixpkgs and macOS system
interact. I got a little bit sidetracked exploring differences in
binary compatibility between different operating systems. But, this
should help users to better understand the differences in how macOS
and Linux works in relation to Nixpkgs.
</p>
</div>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">

<div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
It would be interesting to test this in practice. Finding a
Libc that would work might be the hardest part. Even better if we
could use Nix’s closures!
</p></div></div>

<div class="footdef"><sup><a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink">2</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
StackOverflow question at
<a href="https://stackoverflow.com/questions/844819/how-to-static-link-on-os-x">https://stackoverflow.com/questions/844819/how-to-static-link-on-os-x</a>.
</p></div></div>

<div class="footdef"><sup><a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink">3</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
According to the_why_of_y on Hacker News,
<a href="https://news.ycombinator.com/item?id=14011662">https://news.ycombinator.com/item?id=14011662</a>
</p></div></div>

<div class="footdef"><sup><a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink">4</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Some more details on NetBSD’s ABI are available at
<a href="http://www.jp.netbsd.org/gallery/presentations/joerg/asiabsdcon2016/asiabsdcon2016.pdf">http://www.jp.netbsd.org/gallery/presentations/joerg/asiabsdcon2016/asiabsdcon2016.pdf</a>
</p></div></div>

<div class="footdef"><sup><a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink">5</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
macOS updates come out about every year and Apple offers about
3 months support. More information is available at
<a href="https://apple.stackexchange.com/questions/47664/what-is-apples-policy-for-supporting-security-updates-on-older-versions-of-os-x">https://apple.stackexchange.com/questions/47664/what-is-apples-policy-for-supporting-security-updates-on-older-versions-of-os-x</a>.
</p></div></div>

<div class="footdef"><sup><a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink">6</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
There is an issue with building on 10.11 with the new
swift-corelibs derivation. As a result, you need to use prebuilt
version to avoid this issue.
</p></div></div>


</div>
</div><div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/darwin-stdenv-update.html</link>
  <guid>https://matthewbauer.us/blog/darwin-stdenv-update.html</guid>
  <pubDate>Mon, 06 May 2019 00:00:00 -0500</pubDate>
</item>
<item>
  <title><![CDATA[Static Nix: a command-line swiss army knife]]></title>
  <description><![CDATA[
<p>
Nix is an extremely useful package manager. But, not all systems have
it installed. Without root priveleges, you cannot create the
<code>/nix</code> directory required for it to work.
</p>

<p>
With static linking, and some new features added in Nix 2.0, you can
fairly easily use the Nix package manager in these unpriveleged
context<sup><a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>. To make this even easier, I am publishing prebuilt a
<code>x86_64</code> binary on my personal website. It will reside permanently at
<a href="https://matthewbauer.us/nix">https://matthewbauer.us/nix</a> (5M download).
</p>
<div id="outline-container-orgc92d223" class="outline-2">
<h2 id="orgc92d223"><span class="section-number-2">1.</span> Trying it out</h2>
<div class="outline-text-2" id="text-1">
<p>
You can use it like this,
</p>

<div class="org-src-container">
<pre class="src src-sh">$ curl https://matthewbauer.us/nix | sh -s run --store $<span class="org-variable-name">HOME</span>/.cache/nix/store -f channel:nixpkgs-unstable hello -c hello
Hello World!
</pre>
</div>

<p>
You can use any package provided by <a href="https://nixos.org/nixos/packages.html">Nixpkgs</a> (using the attribute
name). This gives you a swiss army knife of command line tools. I have
compiled some cool commands to try out. There examples of various
tools, games and demos that you can use through Nix, without
installing anything! Everything is put into temporary
directories<sup><a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink">2</a></sup>.
</p>
</div>
<div id="outline-container-orgb47f788" class="outline-3">
<h3 id="orgb47f788"><span class="section-number-3">1.1.</span> Dev tools</h3>
<div class="outline-text-3" id="text-1-1">
<div class="org-src-container">
<pre class="src src-sh">$ <span class="org-variable-name">nix</span>=$(mktemp); <span class="org-sh-escaped-newline">\</span>
  curl https://matthewbauer.us/nix &gt; $<span class="org-variable-name">nix</span> &amp;&amp; <span class="org-sh-escaped-newline">\</span>
  chmod +x $<span class="org-variable-name">nix</span> &amp;&amp; <span class="org-sh-escaped-newline">\</span>
  $<span class="org-variable-name">nix</span> run --store $<span class="org-variable-name">HOME</span>/.cache/nix/store -f channel:nixpkgs-unstable <span class="org-sh-escaped-newline">\</span>
  bashInteractive curl git htop imagemagick file findutils jq nix openssh pandoc
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf4204fb" class="outline-3">
<h3 id="orgf4204fb"><span class="section-number-3">1.2.</span> Emacs</h3>
<div class="outline-text-3" id="text-1-2">
<div class="org-src-container">
<pre class="src src-sh">$ <span class="org-variable-name">nix</span>=$(mktemp); <span class="org-sh-escaped-newline">\</span>
  curl https://matthewbauer.us/nix &gt; $<span class="org-variable-name">nix</span> &amp;&amp; <span class="org-sh-escaped-newline">\</span>
  chmod +x $<span class="org-variable-name">nix</span> &amp;&amp; <span class="org-sh-escaped-newline">\</span>
  $<span class="org-variable-name">nix</span> run --store $<span class="org-variable-name">HOME</span>/.cache/nix/store -f channel:nixpkgs-unstable <span class="org-sh-escaped-newline">\</span>
  emacs -c emacs
</pre>
</div>
</div>
</div>
<div id="outline-container-org421d38b" class="outline-3">
<h3 id="org421d38b"><span class="section-number-3">1.3.</span> File manager</h3>
<div class="outline-text-3" id="text-1-3">
<div class="org-src-container">
<pre class="src src-sh">$ <span class="org-variable-name">nix</span>=$(mktemp); <span class="org-sh-escaped-newline">\</span>
  curl https://matthewbauer.us/nix &gt; $<span class="org-variable-name">nix</span> &amp;&amp; <span class="org-sh-escaped-newline">\</span>
  chmod +x $<span class="org-variable-name">nix</span> &amp;&amp; <span class="org-sh-escaped-newline">\</span>
  $<span class="org-variable-name">nix</span> run --store $<span class="org-variable-name">HOME</span>/.cache/nix/store -f channel:nixpkgs-unstable <span class="org-sh-escaped-newline">\</span>
  ranger -c ranger
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf4090cf" class="outline-3">
<h3 id="orgf4090cf"><span class="section-number-3">1.4.</span> Fire</h3>
<div class="outline-text-3" id="text-1-4">
<div class="org-src-container">
<pre class="src src-sh">$ curl https://matthewbauer.us/nix | <span class="org-sh-escaped-newline">\</span>
  sh -s run --store $<span class="org-variable-name">HOME</span>/.cache/nix/store -f channel:nixpkgs-unstable <span class="org-sh-escaped-newline">\</span>
  aalib -c aafire
</pre>
</div>
</div>
</div>
<div id="outline-container-org24eb5ba" class="outline-3">
<h3 id="org24eb5ba"><span class="section-number-3">1.5.</span> Fortune</h3>
<div class="outline-text-3" id="text-1-5">
<div class="org-src-container">
<pre class="src src-sh">$ curl https://matthewbauer.us/nix | <span class="org-sh-escaped-newline">\</span>
  sh -s run --store $<span class="org-variable-name">HOME</span>/.cache/nix/store -f channel:nixpkgs-unstable <span class="org-sh-escaped-newline">\</span>
  bash cowsay fortune -c sh -c <span class="org-string">'cowsay $(fortune)'</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org38adb58" class="outline-3">
<h3 id="org38adb58"><span class="section-number-3">1.6.</span> Nethack</h3>
<div class="outline-text-3" id="text-1-6">
<div class="org-src-container">
<pre class="src src-sh">$ <span class="org-variable-name">nix</span>=$(mktemp); <span class="org-sh-escaped-newline">\</span>
  curl https://matthewbauer.us/nix &gt; $<span class="org-variable-name">nix</span> &amp;&amp; <span class="org-sh-escaped-newline">\</span>
  chmod +x $<span class="org-variable-name">nix</span> &amp;&amp; <span class="org-sh-escaped-newline">\</span>
  $<span class="org-variable-name">nix</span> run --store $<span class="org-variable-name">HOME</span>/.cache/nix/store -f channel:nixpkgs-unstable <span class="org-sh-escaped-newline">\</span>
  nethack -c nethack
</pre>
</div>
</div>
</div>
<div id="outline-container-org7ca59cd" class="outline-3">
<h3 id="org7ca59cd"><span class="section-number-3">1.7.</span> Weather</h3>
<div class="outline-text-3" id="text-1-7">
<div class="org-src-container">
<pre class="src src-sh">$ curl https://matthewbauer.us/nix | <span class="org-sh-escaped-newline">\</span>
  sh -s run --store $<span class="org-variable-name">HOME</span>/.cache/nix/store -f channel:nixpkgs-unstable <span class="org-sh-escaped-newline">\</span>
  bash curl cowsay -c sh -c <span class="org-string">'cowsay $(curl wttr.in/?format=3)'</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgedcd208" class="outline-3">
<h3 id="orgedcd208"><span class="section-number-3">1.8.</span> World map</h3>
<div class="outline-text-3" id="text-1-8">
<div class="org-src-container">
<pre class="src src-sh">$ curl https://matthewbauer.us/nix | <span class="org-sh-escaped-newline">\</span>
  sh -s run --store $<span class="org-variable-name">HOME</span>/.cache/nix/store -f channel:nixpkgs-unstable <span class="org-sh-escaped-newline">\</span>
  bash coreutils curl libcaca ncurses -c bash -c <span class="org-sh-escaped-newline">\</span>
  <span class="org-string">'img=$(mktemp ${TMPDIR:-/tmp}/XXX.jpg); \</span>
<span class="org-string"><span class="org-whitespace-line">  curl -k https://www.cia.gov/library/publications/the-world-factbook/attachments/images/large/world-physical.jpg &gt; $img \</span></span>
<span class="org-string">  &amp;&amp; img2txt -W $(tput cols) -f utf8 $img'</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgfc4d76f" class="outline-3">
<h3 id="orgfc4d76f"><span class="section-number-3">1.9.</span> Youtube</h3>
<div class="outline-text-3" id="text-1-9">
<div class="org-src-container">
<pre class="src src-sh">$ curl https://matthewbauer.us/nix | <span class="org-sh-escaped-newline">\</span>
  sh -s run --store $<span class="org-variable-name">HOME</span>/.cache/nix/store -f channel:nixpkgs-unstable <span class="org-sh-escaped-newline">\</span>
  bash youtube-dl mplayer -c sh -c <span class="org-sh-escaped-newline">\</span>
  <span class="org-string">'mplayer -vo caca $(youtube-dl --no-check-certificate -g https://www.youtube.com/watch?v=dQw4w9WgXcQ)'</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc974d79" class="outline-3">
<h3 id="orgc974d79"><span class="section-number-3">1.10.</span> And more&#x2026;</h3>
<div class="outline-text-3" id="text-1-10">
<p>
Lots more cool things are possible. Look through <a href="https://nixos.org/nixos/packages.html#">the packages provided
by Nixpkgs</a> if you need inspiration.
</p>
</div>
</div>
</div>
<div id="outline-container-orga49b4ec" class="outline-2">
<h2 id="orga49b4ec"><span class="section-number-2">2.</span> Avoid installing and extracting each time</h2>
<div class="outline-text-2" id="text-2">
<p>
This method of using Nix has some upfront cost. This is because
<a href="https://matthewbauer.us/nix">https://matthewbauer.us/nix</a> must be downloaded each time and the
embedded .tar.gz file extracted. If you want Nix to stay around
permanently, you have to follow a few tricks. Total install size is
about 11M. Using this method, you will reduce startup and keep Nix in
your path at each login.
</p>

<p>
I have two ways of doing this. One the “easy” way is just running
this script.
</p>

<div class="org-src-container">
<pre class="src src-sh">$ curl https://matthewbauer.us/nix.sh | sh
</pre>
</div>

<p>
The other is the "safe" way and involves running some commands in
order. These are the same commands run by the script, but this lets
you audit everything being done line by line.
</p>

<div class="org-src-container">
<pre class="src src-sh">$ <span class="org-variable-name">t</span>=$(mktemp -d)
$ curl https://matthewbauer.us/nix &gt; $<span class="org-variable-name">t</span>/nix.sh
$ (<span class="org-builtin">cd</span> $<span class="org-variable-name">t</span> &amp;&amp; sh nix.sh --extract)
$ mkdir -p $<span class="org-variable-name">HOME</span>/bin/ $<span class="org-variable-name">HOME</span>/share/nix/corepkgs/
$ mv $<span class="org-variable-name">t</span>/dat/nix $<span class="org-variable-name">HOME</span>/bin/
$ mv $<span class="org-variable-name">t</span>/dat/share/nix/corepkgs/* $<span class="org-variable-name">HOME</span>/share/nix/corepkgs/
$ echo export <span class="org-string">'PATH=$HOME/bin:$PATH'</span> &gt;&gt; $<span class="org-variable-name">HOME</span>/.profile
$ echo export <span class="org-string">'NIX_DATA_DIR=$HOME/share'</span> &gt;&gt; $<span class="org-variable-name">HOME</span>/.profile
$ source $<span class="org-variable-name">HOME</span>/.profile
$ rm -rf $<span class="org-variable-name">t</span>
</pre>
</div>

<p>
You can now run the Nix commands above as you need to, and it will be
available on each login. Remember to always add the arguments <code>-f
channel:nixpkgs-unstable</code> and <code>--store $HOME/.cache/nix/store</code>,
otherwise Nix will be confused on how to handle the missing
<code>/nix/store</code> and other environment variables.
</p>
</div>
</div>
<div id="outline-container-orgbde5fc7" class="outline-2">
<h2 id="orgbde5fc7"><span class="section-number-2">3.</span> Build it yourself</h2>
<div class="outline-text-2" id="text-3">
<p>
This is certainly a security vulnerability so you may want to build
static Nix for youself from <a href="https://github.com/NixOS/nixpkgs/pull/56281">my pull request</a>. Of course you can’t build
static Nix without Nix, so this would need to be done from a system
that has Nix installed. You can build it yourself, provided you have
git and nix installed, like this,
</p>

<div class="org-src-container">
<pre class="src src-sh">$ git clone https://github.com/matthewbauer/nixpkgs.git
$ cd nixpkgs
$ git checkout static-nix
$ nix-build -A pkgsStatic.nix
</pre>
</div>

<p>
Then, copy it to your machine without Nix installed (provided you have
ssh installed), like this,
</p>

<div class="org-src-container">
<pre class="src src-sh">$ scp ./result/bin/nix your-machine:
$ ssh your-machine
$ ./nix ...
</pre>
</div>
</div>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">

<div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Note that you will need to be able to set up a private
namespace. This is enabled by default on Linux, but some distros have
specifically disabled it. See <a href="https://github.com/NixOS/nix/issues/2404">this issue</a> for more discussion.
</p></div></div>

<div class="footdef"><sup><a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink">2</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
While ideally we would not need temporary directories at all,
some of these commands require it. This is because they check whether
they are in a pipe and refuse to run if so. Your temporary directory
should be cleaned each time your reboot anyway. The Nix packages will
be installed in <code>$HOME/.cache/nix/store</code> but they can be removed at
any time.
</p></div></div>


</div>
</div><div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/static-nix.html</link>
  <guid>https://matthewbauer.us/blog/static-nix.html</guid>
  <pubDate>Sun, 24 Feb 2019 00:00:00 -0600</pubDate>
</item>
<item>
  <title><![CDATA[Call for proofreaders and beta testers for 19.03]]></title>
  <description><![CDATA[
<p>
This was originally published on <a href="https://discourse.nixos.org/t/call-for-proofreaders-and-beta-testers-for-19-03/">Discourse</a>. I am putting it here for
posterity reasons.
</p>

<p>
We get lots of contributors in Nixpkgs and NixOS who modify our source
code. They are the most common type of contribution we receive. But,
there is actually a great need for other types of contributions that
don't involve programming at all! For the benefit of new users, I am
going to outline how you can easily contribute to the community and
help make 19.03 the best NixOS release yet.
</p>
<div id="outline-container-org3d1636e" class="outline-2">
<h2 id="org3d1636e"><span class="section-number-2">1.</span> Proofreading</h2>
<div class="outline-text-2" id="text-1">
<p>
We have two different manuals in the NixOS/nixpkgs repo. One is for
Nixpkgs, the set of all software. And the other is for NixOS, our
Linux distro. Proofreading these manuals is important in helping new
users learn about how our software works.
</p>

<ul class="org-ul">
<li><a href="https://hydra.nixos.org/job/nixos/trunk-combined/nixos.manual.x86_64-linux/latest/download-by-type/doc/manual">NixOS unstable manual</a></li>
<li><a href="https://hydra.nixos.org/job/nixpkgs/trunk/manual/latest/download-by-type/doc/manual">Nixpkgs unstable manual</a></li>
</ul>

<p>
When you find an issue, you can do one of two things. The first and
most encouraged is to open a PR on GitHub fixing the documentation.
Both manuals are written in docbook. You can see the source for each
here:
</p>

<ul class="org-ul">
<li><a href="https://github.com/NixOS/nixpkgs/tree/master/nixos/doc/manual">NixOS manual source code</a></li>
<li><a href="https://github.com/NixOS/nixpkgs/tree/master/doc">Nixpkgs manual source code</a></li>
</ul>

<p>
GitHub allows you to edit these files directly on the web. You can
also always use your own Git client. For reference on writing in
DocBook, I recommend reading through <a href="https://docbook.rocks">docbook.rocks</a>.
</p>

<p>
An alternative if you are unable to fix the documentation yourself is
to open an issue. We use the same issue tracker includes any issues
with Nixpkgs/NixOS and can be accessed through
<a href="https://github.com/NixOS/nixpkgs/issues">GitHub Issues</a>. Please be
sure to provide a link to where in the manual the issue is as well as
what is incorrect or otherwise confusing.
</p>
</div>
</div>
<div id="outline-container-orge3a5d57" class="outline-2">
<h2 id="orge3a5d57"><span class="section-number-2">2.</span> Beta testing</h2>
<div class="outline-text-2" id="text-2">
<p>
An alternative to proofreading is beta testing. There are a number of
ways to do this, but I would suggest using VirtualBox. Some
information on installing VirtualBox can be found online, but you
should just need to set these NixOS options:
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">virtualisation.virtualbox.host.enable</span> = <span class="org-nix-builtin">true</span>;
</pre>
</div>

<p>
and add your user to the vboxusers group:
</p>

<div class="org-src-container">
<pre class="src src-nix">users.users.<span class="org-nix-constant">&lt;user&gt;</span>.<span class="org-nix-attribute">extraGroups</span> = [ <span class="org-string">"vboxusers"</span> ];
</pre>
</div>

<p>
then rebuild your NixOS machine (<code>sudo nixos-rebuild switch</code>), and run
this command to start virtualbox:
</p>

<div class="org-src-container">
<pre class="src src-sh">VirtualBox
</pre>
</div>

<p>
Other distros have their own ways of installing VirtualBox, see
<a href="https://www.virtualbox.org/wiki/Downloads">Download VirtualBox</a> for more info.
</p>

<p>
You can download an unstable NixOS .ova file directly here.
(<b><b>WARNING</b></b>: this will be a large file, a little below 1GB).
</p>

<ul class="org-ul">
<li><a href="https://hydra.nixos.org/job/nixos/trunk-combined/nixos.ova.x86_64-linux/latest/download-by-type/file/ova">nixos-19.03pre-x86<sub>64</sub>-linux.ova</a></li>
</ul>

<p>
Once downloaded, you can import this .ova file directly into
VirtualBox using "File" -&gt; "Import Appliance&#x2026;". Select the .ova file
downloaded from above and click through a series of Next dialogs,
using the provided defaults. After this, you can boot your NixOS
machine by selecting it from the list on the left and clicking
"Start".
</p>

<p>
The next step is to just play around with the NixOS machine and try to
break it! You can report any issues you find on <a href="https://github.com/NixOS/nixpkgs/issues">the GitHub Issues
tracker</a>. We use the same issue tracker for both NixOS and Nixpkgs.
Just try to make your issues as easy to reproduce as possible. Be
specific on where the problem is and how someone else could recreate
the problem for themselves.
</p>
</div>
</div>
<div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/proofreaders.html</link>
  <guid>https://matthewbauer.us/blog/proofreaders.html</guid>
  <pubDate>Fri, 08 Feb 2019 00:00:00 -0600</pubDate>
</item>
<item>
  <title><![CDATA[Subjective ranking of build systems]]></title>
  <description><![CDATA[
<div id="outline-container-org64b48e2" class="outline-2">
<h2 id="org64b48e2"><span class="section-number-2">1.</span> My subjective ranking of build systems</h2>
<div class="outline-text-2" id="text-1">
<p>
Very few of us are happy with our choices of build systems. There
are a lot out there and none feel quite right to many people. I
wanted to offer my personal opinions on build systems. Every build
system is “bad” in its own way. But some are much worse than
others.
</p>

<p>
As a maintainer for Nixpkgs, we have to deal with . I’ve avoided
build systems that are language-specific. Those build systems are
usually the only choice for your language, so ranking them will
inevitably include opinions on the language itself. So, I’ve
included in this list only language neutral build systems. In
addition, I’ve filtered out any build systems that are not included
in Nixpkgs. This perspective is going to prioritize features that
make your project easiest to package in cross-platform ways. It’s
very subjective, so I only speak for myself here.
</p>

<p>
I separate two kinds of software used for packages. One is the
“meta” build system that provides an abstract interface to create
build rules. The other is the build runner that will run the rules.
Most meta build systems support targeting multiple backends.
</p>
</div>
<div id="outline-container-org78ebd28" class="outline-3">
<h3 id="org78ebd28"><span class="section-number-3">1.1.</span> What makes a good build system?</h3>
<div class="outline-text-3" id="text-1-1">
<p>
Some criteria I have for these build systems.
</p>

<ul class="org-ul">
<li>Good defaults builtin. By default, packages should support
specifying “prefix” and “destination directory”.</li>
<li>Works with widely available software. Being able to generate
Makefiles is a big bonus. Everyone has access to make - not
everyone has Ninja. This is often needed for bootstrapping.</li>
<li>Supports cross compilation concepts. A good separation between
buildtime and runtime is a must have! In addition you should be
able to set build, host, and target from the command line. This
makes things much easier for packaging and bootstrapping.</li>
<li>Detection of dependencies reuses existing solutions. Pkgconfig
provides an easy way to detect absolute directories. No need to
reinvent the wheel here.</li>
<li>The less dependencies the better! Requiring a Java or Python
runtime means it takes longer to rebuild the world. They
introduce bottlenecks where every package needs to wait for these
runtimes to be built before we can start running things in
parallel.</li>
</ul>
</div>
</div>
<div id="outline-container-org2aa0a17" class="outline-3">
<h3 id="org2aa0a17"><span class="section-number-3">1.2.</span> Ranking of meta build systems from bad to worse</h3>
<div class="outline-text-3" id="text-1-2">
<ol class="org-ol">
<li>GNU Autotools (Automake &amp; autoconf)</li>
<li>Meson</li>
<li>CMake</li>
<li>gyp</li>
<li>qmake</li>
<li>imake</li>
<li>premake</li>
</ol>

<p>
GNU Autotools comes in at the top. It has the best support for
cross compilation of any meta build system. It has been around for
a while and means that the classic “./configure &amp;&amp; make &amp;&amp; make
install” work. Because the configure script is just a simple bash
script, packages don’t have to depend directly on GNU Autotools at
build time. This is a big plus in bootstrapping software. I think
Meson has made a lot of progress in improving its cross
compilation support. It’s not quite there in my opinion, as it
requires you to create cross tool files instead of using command
line arguments.
</p>
</div>
</div>
<div id="outline-container-org1bddcb4" class="outline-3">
<h3 id="org1bddcb4"><span class="section-number-3">1.3.</span> Ranking of build runners from bad to worse</h3>
<div class="outline-text-3" id="text-1-3">
<ol class="org-ol">
<li>GNU Make</li>
<li>Ninja</li>
<li>Bazel</li>
<li>boost.build</li>
<li>SCons</li>
</ol>

<p>
GNU Make is still the top choice in my personal opinion. It has
been around for a while, but Makefiles are widely understood and
GNU Make is included everywhere. In addition, the Makefile build
rule format is easy to parallelize. Ninja still requires Python to
build itself. This adds to the Nixpkgs bottleneck because Python
is not included in the bootstrap tools. While there are some
speedups in Ninja, they don’t appear to be significant enough to
be worth switching at this time. At the same time, Ninja is still
a perfectly good choice if you value performance over legacy
support.
</p>
</div>
</div>
<div id="outline-container-orga5998c3" class="outline-3">
<h3 id="orga5998c3"><span class="section-number-3">1.4.</span> Conclusion</h3>
<div class="outline-text-3" id="text-1-4">
<p>
In Nixpkgs, we have made an attempt to support whatever build
system you are using. But, some are definitely better than others.
</p>

<p>
My main goal here is to try to get software authors to think more
critically about what build system they are using. In my opinion,
it is better to use well known software over more obscure systems.
These shouldn’t be taken as a universal truth. Everyone has their
own wants and needs. But, if your build system comes in at the
bottom of this list, you might want to consider switching to
something else!
</p>
</div>
</div>
</div>
<div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/build-systems.html</link>
  <guid>https://matthewbauer.us/blog/build-systems.html</guid>
  <pubDate>Mon, 26 Nov 2018 00:00:00 -0600</pubDate>
</item>
<item>
  <title><![CDATA[Beginner’s guide to cross compilation in Nixpkgs]]></title>
  <description><![CDATA[
<div id="outline-container-orge188e37" class="outline-2">
<h2 id="orge188e37"><span class="section-number-2">1.</span> What is cross compilation?</h2>
<div class="outline-text-2" id="text-1">
<p>
First, compilation refers to converting human-readable source code
into computer-readable object code. Usually the computer you are
building the code <i>for</i> is the same as the computer you are running
<i>on</i><sup><a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>. In cross compilation, however, that is not the case. We can
build code for any computer that our compiler supports!
</p>

<p>
Cross-compilation is not a new idea at all. GCC and Autoconf are
ancient tools that we use internally in Nixpkgs. But, getting those
ideas to work well with Nix’s functional dependency model has taken
years and years of work from the Nix community. We are finally to the
point where an end user can easily start cross compiling things
themselves.
</p>
</div>
</div>
<div id="outline-container-org247fb4e" class="outline-2">
<h2 id="org247fb4e"><span class="section-number-2">2.</span> Unstable channel</h2>
<div class="outline-text-2" id="text-2">
<p>
If you do not have Nix installed, you can install it available at
<a href="https://nixos.org/nix/">NixOS.org</a>. The rest of the guide will assume that Nix is already
installed.
</p>

<p>
Much work has gone into bringing cross compilation support to Nixpkgs.
While Nixpkgs has had some support for cross compiling for awhile,
recent changes have made cross compilation much easier and more
elegant. These changes will be required for this guide. We plan to
have a stable version of this ready for 18.09. Before that though, you
will need to use the unstable channel. Things can be built with the
unstable channel fairly easily with Nix 2.0. For instance, to build
the hello program,
</p>

<div class="org-src-container">
<pre class="src src-sh">nix build -f channel:nixos-unstable hello
</pre>
</div>

<p>
The rest of the guide will use nixos-unstable as the channel. However,
once 18.09 is released, you should be able to also use the stable
channel.
</p>
</div>
</div>
<div id="outline-container-orgc5f5b7c" class="outline-2">
<h2 id="orgc5f5b7c"><span class="section-number-2">3.</span> Building things</h2>
<div class="outline-text-2" id="text-3">
<p>
One of the important principles of cross compilation in Nixpkgs is
handling native and cross compilation identically. This means that it
should be possible to cross-compile any package in Nixpkgs with little
to no modification at all. If your derivation specifies its
dependencies correctly, Nix/Nixpkgs can figure out how to build it.
</p>

<p>
So now it’s time to show what we can do with Nixpkgs cross compilation
framework<sup><a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink">2</a></sup>. I’ve compiled a short list of cross package sets
along with their corresponding attribute names.
</p>

<ul class="org-ul">
<li>Raspberry Pi (pkgsCross.raspberryPi)</li>
<li><code>x86_64</code> Musl (pkgsCross.musl64)</li>
<li>Android (pkgsCross.aarch64-android-prebuilt)</li>
<li>iPhone (pkgsCross.iphone64)</li>
<li>Windows (pkgsCross.mingwW64)</li>
</ul>

<p>
So, if you are familiar with Nixpkgs, you would know that if you
wanted to build Emacs for your native computer you can just run,
</p>

<div class="org-src-container">
<pre class="src src-sh">$ nix build -f channel:nixos-unstable pkgs.emacs
</pre>
</div>

<p>
Likewise, if you wanted to build Emacs for a Raspberry Pi, you can
just run,
</p>

<div class="org-src-container">
<pre class="src src-sh">$ nix build -f channel:nixos-unstable pkgsCross.raspberryPi.emacs
</pre>
</div>

<p>
The built package will be in the same ARM machine code used by the
Raspberry Pi. The important thing to notice here is that we have the
power to build in any package in Nixpkgs for any of the platforms
listed above. Of course, many of these will have issues due to not
being portable, but with time we can make both Nixpkgs &amp; the free
software world better at handling cross compilation. Any of the
software listed in ‘nix search’ should be possible to cross compile
through the pkgsCross attribute.
</p>

<p>
Some more examples of things that I have worked on,
</p>

<ol class="org-ol">
<li><p>
Windows
</p>

<div class="org-src-container">
<pre class="src src-sh">$ nix build -f channel:nixos-unstable pkgsCross.mingw32.hello
$ nix run -f channel:nixos-unstable wine -c ./result/bin/hello.exe
Hello, world!
</pre>
</div></li>

<li><p>
Android
</p>

<div class="org-src-container">
<pre class="src src-sh">$ nix build -f channel:nixos-unstable <span class="org-sh-escaped-newline">\</span>
      pkgsCross.aarch64-android-prebuilt.curl
</pre>
</div></li>

<li><p>
iPhone<sup><a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink">3</a></sup>
</p>

<div class="org-src-container">
<pre class="src src-sh">$ nix build -f channel:nixos-unstable <span class="org-sh-escaped-newline">\</span>
      pkgsCross.iphone64.haskell.packages.jq
</pre>
</div></li>
</ol>

<p>
Notice that the pkgsCross attribute is just sugar to a more powerful &amp;
composable interface to Nixpkgs. This can be specified from the
command line with,
</p>

<div class="org-src-container">
<pre class="src src-sh">$ nix build -f channel:nixos-unstable <span class="org-sh-escaped-newline">\</span>
      --arg crossSystem <span class="org-string">'{ config = "&lt;arch&gt;-&lt;vendor&gt;-&lt;kernel&gt;-&lt;environment&gt;"; }'</span>
</pre>
</div>

<p>
For instance you may want to cross-compile Firefox for ARM64 Linux.
This is as easy as<sup><a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink">4</a></sup>:
</p>

<div class="org-src-container">
<pre class="src src-sh">$ nix build -f channel:nixos-unstable <span class="org-sh-escaped-newline">\</span>
      --arg crossSystem <span class="org-string">'{ config = "arm64-unknown-linux-gnu"; }'</span>
</pre>
</div>

<p>
You can be much more specific with what you want through crossSystem.
Many more combinations are possible, but they all revolve around that
four-part string config listed. It corresponds to
<code>&lt;arch&gt;-&lt;vendor&gt;-&lt;kernel&gt;-&lt;environment&gt;</code> and is commonly called the
LLVM triple<sup><a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink">5</a></sup>. The LLVM triple has become the standard way to
specify systems across many free software toolchains including GCC,
Binutils, Clang, libffi, etc. There is more information that can be
specified in <code>crossSystem</code> &amp; <code>localSystem</code> within Nixpkgs but this is
not covered here as they are heavily dependent on the specific
toolchain being used.
</p>
</div>
</div>
<div id="outline-container-org48cea55" class="outline-2">
<h2 id="org48cea55"><span class="section-number-2">4.</span> When things break</h2>
<div class="outline-text-2" id="text-4">
<p>
While the fundamentals of cross compiling in Nixpkgs are very good,
individual packages will sometimes be broken. This is sometime because
the package definition in Nixpkgs is incorrect. There are some common
mistakes that occur that I want to cover here. First, the difference
between ‘build-time’ vs ‘runtime’ dependencies<sup><a id="fnr.6" class="footref" href="#fn.6" role="doc-backlink">6</a></sup>. 
</p>

<ul class="org-ul">
<li>build-time dependencies: tools that will be run on the computer
doing the cross compiling</li>
<li>runtime dependencies: libraries and tools that will run on the
computer we are targeting.</li>
</ul>

<p>
In Nixpkgs, build-time dependencies should be put in
<code>nativeBuildInputs</code>. Runtime dependencies should be put in
<code>buildInputs</code>. Currently, this distinction has no effect on native
compilation but it is crucial for correct cross-compilation. There are
proposals to Nixpkgs to enforce the use of <code>buildInputs</code> as
<code>nativeBuildInputs</code> even on native builds but this is yet to be agreed
on<sup><a id="fnr.7" class="footref" href="#fn.7" role="doc-backlink">7</a></sup>.
</p>

<p>
Sometimes your package will pull in a dependency indirectly so that
dependency is not listed in <code>buildInputs</code> or <code>nativeBuildInputs</code>. This
breaks the package splicing that goes on behind the scenes to make
pick up the package set to get each package. To fix it, you will have
to splice the package yourself. This is fairly straightforward. For
examples, let’s say that your package depends on the <code>pkgs.git</code> git
executable to be available through the <code>GIT_CMD</code> variable, which means
it is not listed in <code>nativeBuildInputs</code>. In this case, you should
instead refer to <code>git</code> as <code>pkgs.buildPackages.git</code>. This will pick up
the build package set instead of the target package set.
</p>

<p>
There are a few more things that can go wrong within Nixpkgs. If you
need to conditionally do something only when cross compiling (say a
configure flag like <code>--enable-cross-compilation</code>), you should use
<code>stdenv.hostPlatform != stdenv.buildPlatform</code>. If you want to check,
for instance, that the platform you are building for is a Windows
computer, just use <code>stdenv.hostPlatform.isWindows</code>, in the same way
that you can also check for Linux with <code>stdenv.hostPlatform.isLinux</code>.
These cases are often necessary, but remember they should only be used
when absolutely needed. The more code we share between platforms, the
more code is tested.
</p>

<p>
Sometimes packages are just not written in a cross-friendly way. This
will usually happen just because the software author has not thought
of how to handle cross compilation<sup><a id="fnr.8" class="footref" href="#fn.8" role="doc-backlink">8</a></sup>. We want to work with
software authors to make this process easier &amp; contribute to the
portability of free software. This takes time but we are definitely
making progress. Contributions are always encouraged to <a href="https://github.com/nixos/nixpkgs/">the Nixpkgs
repo</a>.
</p>
</div>
</div>
<div id="outline-container-org400787f" class="outline-2">
<h2 id="org400787f"><span class="section-number-2">5.</span> Further reading</h2>
<div class="outline-text-2" id="text-5">
<p>
The concepts introduced here are also available in the Nixpkgs manual.
These are the relevant sections/chapters:
</p>

<ul class="org-ul">
<li><a href="https://nixos.org/nixpkgs/manual/#ssec-stdenv-dependencies">Nixpkgs Manual. Section 3.3, Specifying dependencies</a></li>
<li><a href="https://nixos.org/nixpkgs/manual/#chap-cross">Nixpkgs Manual. Chapter 5, Cross compilation</a></li>
</ul>

<p>
GNU Automake also has a section on build vs. host vs. target. This
will help clarify some of the naming conventions in Nixpkgs:
</p>

<ul class="org-ul">
<li><a href="https://www.gnu.org/software/automake/manual/html_node/Cross_002dCompilation.html">Automake Manual. Section 2.2.8, Cross-Compilation</a></li>
</ul>
</div>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">

<div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
This is referred to as <i>native</i> compilation.
</p></div></div>

<div class="footdef"><sup><a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink">2</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
All examples are provided by the file <a href="https://github.com/NixOS/nixpkgs/blob/master/lib/systems/examples.nix">lib/systems/examples.nix</a>
in Nixpkgs.
</p></div></div>

<div class="footdef"><sup><a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink">3</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Cross-compilation to iPhone, unfortunately, requires that you
download the unfree XCode environment. This is a consequence of
Apple’s choices regarding what toolchains they allow.
</p></div></div>

<div class="footdef"><sup><a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink">4</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
In fact, each of these correspond to a value for crossSystem
listed in <a href="https://github.com/NixOS/nixpkgs/blob/master/lib/systems/examples.nix">lib/systems/examples.nix</a>.
</p></div></div>

<div class="footdef"><sup><a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink">5</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Of course there are 4 of them, so LLVM quadruple seems like a
better name.
</p></div></div>

<div class="footdef"><sup><a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink">6</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Like a few other parts of this article, this is somewhat of a
simplification. There are many other types of dependencies but they
all revolve around the build-time vs runtime distinction.
</p></div></div>

<div class="footdef"><sup><a id="fn.7" class="footnum" href="#fnr.7" role="doc-backlink">7</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
See <code>strictDeps</code> in <a href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh">pkgs/stdenv/generic/setup.sh</a>.
</p></div></div>

<div class="footdef"><sup><a id="fn.8" class="footnum" href="#fnr.8" role="doc-backlink">8</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Or even worse, they have thought about cross-compilation, but
embraced many anti-patterns that break with Nixpkgs’ cross-compilation
framework.
</p></div></div>


</div>
</div><div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/beginners-guide-to-cross.html</link>
  <guid>https://matthewbauer.us/blog/beginners-guide-to-cross.html</guid>
  <pubDate>Wed, 25 Jul 2018 00:00:00 -0500</pubDate>
</item>
<item>
  <title><![CDATA[Channel Changing with Nix]]></title>
  <description><![CDATA[
<div id="outline-container-org209da67" class="outline-2">
<h2 id="org209da67"><span class="section-number-2">1.</span> Introduction to channels</h2>
<div class="outline-text-2" id="text-1">
<p>
One of the many underappreciated feature of Nix is its ability to
travel back in time. Functional dependencies mean that you can easily
pull in old releases of NixOS &amp; Nixpkgs without changing your
environment at all! It’s surprisingly easy in Nix 2.0 with its
support for Import From Derivation.
</p>

<p>
First, I will provide some code to get us started. This Nix script is
what I use as my “channel changer”. It bootstraps the use of old
channels. In Nix-world, channels are just what we call the CI-tested
branch of NixOS/Nixpkgs<sup><a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>. The NixOS maintainers have been making
releases consistently since 2013, so there is a lot of interesting
history.
</p>
</div>
</div>
<div id="outline-container-org9a85182" class="outline-2">
<h2 id="org9a85182"><span class="section-number-2">2.</span> Channel changing</h2>
<div class="outline-text-2" id="text-2">
<p>
Here is my script that I will refer to later on in the post
as “channels.nix” (be sure to try it out yourself!)<sup><a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink">2</a></sup>
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-keyword">let</span> <span class="org-nix-attribute">mapAttrs</span> = f: set: builtins.listToAttrs (
      <span class="org-nix-builtin">map</span> (attr: { <span class="org-nix-attribute">name</span> = attr; <span class="org-nix-attribute">value</span> = f set.${attr}; })
          (builtins.attrNames set));
    <span class="org-nix-attribute">channels</span> = {
      <span class="org-nix-attribute">aardvark</span>    = <span class="org-string">"13.10"</span>;
      <span class="org-nix-attribute">baboon</span>      = <span class="org-string">"14.04"</span>;
      <span class="org-nix-attribute">caterpillar</span> = <span class="org-string">"14.12"</span>;
      <span class="org-nix-attribute">dingo</span>       = <span class="org-string">"15.09"</span>;
      <span class="org-nix-attribute">emu</span>         = <span class="org-string">"16.03"</span>;
      <span class="org-nix-attribute">flounder</span>    = <span class="org-string">"16.09"</span>;
      <span class="org-nix-attribute">gorilla</span>     = <span class="org-string">"17.03"</span>;
      <span class="org-nix-attribute">hummingbird</span> = <span class="org-string">"17.09"</span>;
      <span class="org-nix-attribute">impala</span>      = <span class="org-string">"18.03"</span>;
    };
<span class="org-nix-keyword">in</span> mapAttrs (v:
     <span class="org-nix-builtin">import</span> (builtins.fetchTarball
             <span class="org-string">"https://nixos.org/channels/nixos-</span><span class="org-nix-antiquote">${</span>v<span class="org-nix-antiquote">}</span><span class="org-string">/nixexprs.tar.xz"</span>) {})
   channels
</pre>
</div>

<p>
As you can see from the script there have been 9 releases in total. We
use a different letter of the alphabet for each release, starting with
A for Aardvark. We are now up to I for Impala<sup><a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink">3</a></sup>. New releases
happen every 6 months with Aardvark released in December 2013. The
releases are versioned as <code>YY.MM</code> which is a common practice for Linux
distros.
</p>
</div>
</div>
<div id="outline-container-orgb8bf5ad" class="outline-2">
<h2 id="orgb8bf5ad"><span class="section-number-2">3.</span> ‘nix run’ magic</h2>
<div class="outline-text-2" id="text-3">
<p>
In my Nix script, I have created an “attribute” for each version that
has been released. With Nix 2.0, it is very easy to run packages from
them. Here is the command to run <code>hello</code> world from Hummingbird.
</p>

<div class="org-src-container">
<pre class="src src-sh">nix run -f channels.nix hummingbird.hello -c hello
</pre>
</div>

<pre class="example">
Hello, world!
</pre>


<p>
This has run the <code>hello</code> executable from the hummingbird release.
Since you are most likely not running Hummingbird, it may take a while
to the first time. However, once Nix has downloaded the needed files
future execution will be instantaneous. The package is completely
self-contained! To start, we will do examples in Impala (18.03) so
that things go a little faster.
</p>

<p>
There are lots of packages in Nixpkgs so we don’t have to restrict
ourselves to just hello. Let’s try out cowsay first.
</p>

<div class="org-src-container">
<pre class="src src-sh">nix run -f channels.nix impala.cowsay -c cowsay hello
</pre>
</div>

<pre class="example">
 _______ 
&lt; hello &gt;
 ------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
</pre>


<p>
There are many, many more of these commands. I’ve included a few below
for you to try out on your own.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-comment-delimiter"># </span><span class="org-comment">Look up the weather</span>
nix run -f channels.nix impala.curl -c curl wttr.in/seville

<span class="org-comment-delimiter"># </span><span class="org-comment">Download music</span>
nix run -f channels.nix impala.youtube-dl -c <span class="org-sh-escaped-newline">\</span>
    youtube-dl -t --extract-audio <span class="org-sh-escaped-newline">\</span>
    --audio-format mp3 <span class="org-sh-escaped-newline">\</span>
    https://www.youtube.com/watch?<span class="org-variable-name">v</span>=dQw4w9WgXcQ

<span class="org-comment-delimiter"># </span><span class="org-comment">Go see a Star War</span>
nix run -f channels.nix impala.telnet -c telnet towel.blinkenlights.nl 666
nix run -f channels.nix impala.sox -c bash -c <span class="org-sh-escaped-newline">\</span>
    <span class="org-string">'for n in E2 A2 D3 G3 B3 E4;</span>
<span class="org-string">     do play -n synth 4 pluck $n repeat 2;</span>
<span class="org-string">     done'</span>

<span class="org-comment-delimiter"># </span><span class="org-comment">Play Nethack</span>
nix run -f channels.nix impala.nethack -c nethack

<span class="org-comment-delimiter"># </span><span class="org-comment">Get your fortune</span>
nix run -f channels.nix impala.fortune -c fortune
</pre>
</div>
</div>
</div>
<div id="outline-container-org8512b01" class="outline-2">
<h2 id="org8512b01"><span class="section-number-2">4.</span> The macOS+Nix odyssey</h2>
<div class="outline-text-2" id="text-4">
<p>
The fact that Nix works so well on macOS is a miracle in its own
right. Apple has a proprietary ABI but Nix is intended to be used with
free software. To get around this, many hacks are necessary including
taking Apple’s standard C library<sup><a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink">4</a></sup>. Anyway, I was interested in how
well the binaries produced by Nixpkgs hold up on my MacBook. For
reference, here are the versions of macOS available when each release
happened. Those familiar with macOS internals will remember some
significant differences between these versions.
</p>

<table>


<colgroup>
<col  class="org-left">

<col  class="org-left">
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">NixOS release</th>
<th scope="col" class="org-left">macOS release</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Aardvark (13.10)</td>
<td class="org-left">Mountain Lion (10.8)</td>
</tr>

<tr>
<td class="org-left">Baboon (14.04)</td>
<td class="org-left">Mavericks (10.9)</td>
</tr>

<tr>
<td class="org-left">Caterpillar (14.12)</td>
<td class="org-left">Yosemite (10.10)</td>
</tr>

<tr>
<td class="org-left">Dingo (15.09)</td>
<td class="org-left">Yosemite (10.10)</td>
</tr>

<tr>
<td class="org-left">Emu (16.03)</td>
<td class="org-left">El Capitan (10.11)</td>
</tr>

<tr>
<td class="org-left">Flounder (16.09)</td>
<td class="org-left">El Capitan (10.11)</td>
</tr>

<tr>
<td class="org-left">Gorilla (17.03)</td>
<td class="org-left">Sierra (10.12)</td>
</tr>

<tr>
<td class="org-left">Hummingbird (17.09)</td>
<td class="org-left">High Sierra (10.13)</td>
</tr>

<tr>
<td class="org-left">Impala (18.03)</td>
<td class="org-left">High Sierra (10.13)</td>
</tr>
</tbody>
</table>

<p>
So, my MacBook is running the latest macOS 10.13. Naturally we can
test that Impala &amp; Hummingbird will work correctly. <code>hello</code> is a good
tester, of course, not comprehensive.
</p>

<div class="org-src-container">
<pre class="src src-sh">nix run -f channels.nix impala.hello -c hello
</pre>
</div>

<pre class="example">
Hello, world!
</pre>


<div class="org-src-container">
<pre class="src src-sh">nix run -f channels.nix hummingbird.hello -c hello
</pre>
</div>

<pre class="example">
Hello, world!
</pre>


<p>
But now let’s test Gorilla. It was released when macOS Sierra was
still around but the ABI should be compatible.
</p>

<div class="org-src-container">
<pre class="src src-sh">nix run -f channels.nix gorilla.hello -c hello
</pre>
</div>

<pre class="example">
dyld: Library not loaded: /usr/lib/system/libsystem_coretls.dylib
 Referenced from: /nix/store/v7i520r9c2p8z6vk26n53hfrxgqn8cl9-Libsystem-osx-10.11.6/lib/libSystem.B.dylib
 Reason: image not found
sh: line 1: 23628 Abort trap: 6           nix run -f channels.nix gorilla.hello -c hello
</pre>


<p>
Oh no!
</p>

<p>
We can see that libSystem 10.11 has been downloaded for us<sup><a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink">5</a></sup>.
However, libSystem is referring to an image that isn’t on our machine.
<code>libsystem_coretls.dylib</code> must have existed in 10.11 macOS but been
removed since then<sup><a id="fnr.6" class="footref" href="#fn.6" role="doc-backlink">6</a></sup>.
</p>

<p>
At this point, it may look like Nixpkgs will be broken going
backwards. But, I want to try Flounder just to see what happens.
</p>

<div class="org-src-container">
<pre class="src src-sh">nix run -f channels.nix flounder.hello -c hello
</pre>
</div>

<pre class="example">
Hello, world!
</pre>


<p>
Amazingly, it worked! I am still not sure what the differences are,
but it seems that the older executable is still available. Let’s try
out Emu to see what happens there.
</p>

<div class="org-src-container">
<pre class="src src-sh">nix run -f channels.nix emu.hello -c hello
</pre>
</div>

<pre class="example">
builder for '/nix/store/s41jnb4kmxxbwj40c5l88k9ma0mwfy0b-hello-2.10.drv' failed due to signal 4 (Illegal instruction: 4)
error: build of '/nix/store/s41jnb4kmxxbwj40c5l88k9ma0mwfy0b-hello-2.10.drv' failed
</pre>


<p>
Wow! Again we hit an issue. This is the infamouse <code>Illegal
instruction: 4</code> bug that is frequently hit in Nixpkgs<sup><a id="fnr.7" class="footref" href="#fn.7" role="doc-backlink">7</a></sup>. It occurs
when an executable uses instructions that have been blocked by the XNU
kernel. This is usually because they are considered insecure so a
patch is needed to fix it. We no longer support Emu, so this is
probably the end of the line. Let’s try Dingo out just to be sure
though.
</p>

<div class="org-src-container">
<pre class="src src-sh">nix run -f channels.nix dingo.hello -c hello
</pre>
</div>

<pre class="example">
builder for '/nix/store/1cyagihl211vsis9bz09cqaz3h2yyc23-libxml2-2.9.3.drv' failed with exit code 77; last 10 log lines:
 checking for awk... awk
 checking whether make sets $(MAKE)... yes
 checking whether make supports nested variables... yes
 checking whether make supports nested variables... (cached) yes
 checking for gcc... gcc
 checking whether the C compiler works... no
 configure: error: in `/private/tmp/nix-build-libxml2-2.9.3.drv-0/libxml2-2.9.3':
 configure: error: C compiler cannot create executables
 See `config.log' for more details
 
cannot build derivation '/nix/store/jd4y5aps1z61jqbhsz1gy408zwwa49w4-clang-3.6.2.drv': 1 dependencies couldn't be built
cannot build derivation '/nix/store/n4q29z97dc1p9mqrn2ydhlfmsqwbgx0j-libarchive-3.1.2.drv': 1 dependencies couldn't be built
cannot build derivation '/nix/store/vh2bh7gaw2m0rgxscf3mhm1d3rz3xwfg-clang-wrapper-3.6.2.drv': 1 dependencies couldn't be built
cannot build derivation '/nix/store/zg90kfmf99h03z0fl03gw3gh105mb02c-cmake-3.3.1.drv': 1 dependencies couldn't be built
cannot build derivation '/nix/store/45ndaky3079nd78042384f8hbidq7f7q-libc++abi-3.6.2.drv': 1 dependencies couldn't be built
cannot build derivation '/nix/store/mmyz6rrddfahwl23i9d9vjh7wa8irp5k-stdenv-darwin-boot-3.drv': 1 dependencies couldn't be built
cannot build derivation '/nix/store/lqjabx84kndk75y8m0lq7zh5190k6zzz-hello-2.10.drv': 1 dependencies couldn't be built
error: build of '/nix/store/lqjabx84kndk75y8m0lq7zh5190k6zzz-hello-2.10.drv' failed
</pre>


<p>
This is a curious error because it is very different from the previous
one. Back here we were still using Clang 3.3 &amp; it looks like
bootstrapping is failing on our newer machines. I was not using Nix at
this time (late 2015), so I will have to defer to someone who
remembers that time better. Let’s keep going.
</p>

<div class="org-src-container">
<pre class="src src-sh">nix run -f channels.nix caterpillar.hello -c hello
</pre>
</div>

<pre class="example">
error: attribute 'hello' in selection path 'caterpillar.hello' not found
</pre>


<div class="org-src-container">
<pre class="src src-sh">nix run -f channels.nix baboon.hello -c hello
</pre>
</div>

<pre class="example">
error: attribute 'hello' in selection path 'baboon.hello' not found
</pre>


<div class="org-src-container">
<pre class="src src-sh">nix run -f channels.nix aardvark.hello -c hello
</pre>
</div>

<pre class="example">
error: attribute 'hello' in selection path 'aardvark.hello' not found
</pre>


<p>
I’ve grouped them together because they have the same output. It
appears that <code>hello</code> was not available back then! I’m not sure what is
going on. Again, I will defer to someone else to explain why this
happens. But, I know for a fact that GNU Hello is one of the first
packages to be packaged in the Nix language<sup><a id="fnr.8" class="footref" href="#fn.8" role="doc-backlink">8</a></sup>.
</p>
</div>
</div>
<div id="outline-container-orga967b15" class="outline-2">
<h2 id="orga967b15"><span class="section-number-2">5.</span> Conclusion</h2>
<div class="outline-text-2" id="text-5">
<p>
I wanted to also look at what happens on Linux when you go back
through channels. I don’t have time currently so I am just including
what I have. Anyway, if you are able to report back what happens on
Linux when running these old channels, it would certainly be
interesting.
</p>

<p>
My main goal was to just share some useful things in Nix that I don’t
think many people outside of the core Nix community know about.
Documentation has gotten better recently but lots of times people like
to just read blog posts like this. Hopefully you got a feel for what
can be done in Nix.
</p>
</div>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">

<div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
The difference between NixOS &amp; Nixpkgs can sometimes cause
confusion especially because they are hosted in the same repository.
We usually refer to NixOS for the Linux-specific distro while Nixpkgs
refers to the cross-platform set of packages. Here I am referring to
them collectively.
</p></div></div>

<div class="footdef"><sup><a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink">2</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Note that the channel changing script is not necessary. You can
always refer to the Nixpkgs version directly with the <code>-f</code> argument.
The script is just an easy way to introduce people to the concept.
</p></div></div>

<div class="footdef"><sup><a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink">3</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
The in-development version of NixOS/Nixpkgs will be a J for
Jackrabbit.
</p></div></div>

<div class="footdef"><sup><a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink">4</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Apple’s C standard library is called libSystem. Note that
unlike Glibc &amp; Musl it contains much, much more than what is needed to
compile simple C programs.
</p></div></div>

<div class="footdef"><sup><a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink">5</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Note that the same libSystem is used for all of Nixpkgs to
peliminate having to do SDK detection. Eventually we will update this
to 10.12 or 10.13 but we prefer to stay a couple releases behind.
</p></div></div>

<div class="footdef"><sup><a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink">6</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
This is not a complete explanation, but the best I can do for
those not aware of the internals of Nixpkgs.
</p></div></div>

<div class="footdef"><sup><a id="fn.7" class="footnum" href="#fnr.7" role="doc-backlink">7</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
See GitHub issue <a href="https://github.com/NixOS/nixpkgs/issues/17372">#17372</a>.
</p></div></div>

<div class="footdef"><sup><a id="fn.8" class="footnum" href="#fnr.8" role="doc-backlink">8</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
See release <a href="https://github.com/NixOS/nixpkgs/tree/0.5">0.5</a>.
</p></div></div>


</div>
</div><div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/channel-changing.html</link>
  <guid>https://matthewbauer.us/blog/channel-changing.html</guid>
  <pubDate>Sun, 13 May 2018 00:00:00 -0500</pubDate>
</item>
<item>
  <title><![CDATA[2018 Summer]]></title>
  <description><![CDATA[
<p>
Quick post to annouce summer plans. I have accepted a summer
internship position at <a href="https://obsidian.systems">Obsidian Systems</a> in <a href="https://en.wikipedia.org/wiki/New_York_City">the greatest city in the
world</a>. Very excited to be working with a team of really smart people.
</p>
<div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/2018-summer.html</link>
  <guid>https://matthewbauer.us/blog/2018-summer.html</guid>
  <pubDate>Sat, 31 Mar 2018 00:00:00 -0500</pubDate>
</item>
<item>
  <title><![CDATA[66% of Nixpkgs are up-to-date]]></title>
  <description><![CDATA[
<p>
Just wanted to congratulate everyone for all of the work in keeping
Nixpkgs up-to-date!
</p>

<p>
Repology has just updated our stats and we have shown significant
improvement. 66% of nixpkgs-unstable packages are up-to-date, with a
total of 6112 up-to-date packages<sup><a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>. Nixpkgs is slowly growing to
match package sets that come in many of the big Linux distros. We now
have more up-to-date packages than rolling release distros Arch (5924)
and Manjaro (5708)! We certainly have a ways to go to compete with
heavyweights like FreeBSD Ports (15410), DragonFly BSD Ports (14268),
and Debian (14915) but these are ancient projects that have had a huge
headstart. We are definitely making progress and it’s visible in the
Repology graphs<sup><a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink">2</a></sup>.
</p>

<p>
For comparison, in February, nixpkgs-unstable had 60% of packages
up-to-date, with a total of 5439 up-to-date packages<sup><a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink">3</a></sup>. This kind
of progress over 1 month is tremendously helpful. Remember that most
of these updates will be included in 18.09, not the soon to be release
18.03. This protects users from potentially breaking changes as well
as giving maintainers plenty of time to verify that the updates have
not had any negative effects.
</p>

<p>
Ryan Mulligan’s <a href="https://github.com/ryantm/nix-update">nix-update</a> has made updating packages much easier and
I think it will be a game changer for Nixpkgs in the long run. There
are still some kinks in it but I think it is slowly getting better. It
has certainly been a headache to handle the huge increase in pull
requests, but we are slowly clearing through that glut of outdated
software. If an update to nixpkgs-unstable breaks something for you,
please be sure to open an issue.
</p>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">

<div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
<a href="https://repology.org/statistics/newest">https://repology.org/statistics/newest</a>
</p></div></div>

<div class="footdef"><sup><a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink">2</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
<a href="https://repology.org/repository/nix_unstable">https://repology.org/repository/nix_unstable</a>
</p></div></div>

<div class="footdef"><sup><a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink">3</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
<a href="https://web.archive.org/web/20180216091523/https://repology.org/statistics/newest">https://web.archive.org/web/20180216091523/https://repology.org/statistics/newest</a>
</p></div></div>


</div>
</div><div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/nixpkgs-fresh.html</link>
  <guid>https://matthewbauer.us/blog/nixpkgs-fresh.html</guid>
  <pubDate>Thu, 29 Mar 2018 00:00:00 -0500</pubDate>
</item>
<item>
  <title><![CDATA[nix-buffer: nix-shell in Emacs]]></title>
  <description><![CDATA[
<p>
Shea Levy has a wonderful package out for users of Nix and Emacs. It’s
called <a href="https://github.com/shlevy/nix-buffer">nix-buffer</a> and it greatly improves working on Nix stuff in
Emacs. To try it just get it from MELPA by running <code>M-x
package-install&lt;RET&gt;nix-buffer</code>.
</p>

<p>
To use it in a project you need to create a new file in your project
directory called <code>dir-locals.nix</code>. It works a lot like
<code>.dir-locals.el</code> but it allows you to evaluate Nix expressions.
</p>

<p>
To setup, just create <code>dir-locals.nix</code> that looks like this:
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-keyword">let</span> <span class="org-nix-attribute">pkgs</span> = <span class="org-nix-builtin">import</span> <span class="org-nix-constant">&lt;nixpkgs&gt;</span> {};
<span class="org-nix-keyword">in</span> with pkgs; nixBufferBuilders.withPackages [ &#8230; ]
</pre>
</div>

<p>
You can put anything from Nixpkgs inside of <code>withPackages</code>. That path
is added to your exec-path in Emacs. Using this you can wrap your
project in a container and avoid conflicts between project configurations!
</p>

<p>
There’s lot of future extensions for this. Ideally we could skip and
the <code>dir-locals.nix</code> configuration and automatically detect what
dependencies you need based on your <code>default.nix</code> file.
</p>
<div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/nix-buffer.html</link>
  <guid>https://matthewbauer.us/blog/nix-buffer.html</guid>
  <pubDate>Sun, 11 Feb 2018 00:00:00 -0600</pubDate>
</item>
<item>
  <title><![CDATA[Why Nix?]]></title>
  <description><![CDATA[
<p>
<b>THIS IS A WORK IN PROGRESS ESSAY</b>
</p>

<p>
To someone new to it, Nix may not stand out as a package manager. We’re all used
to how the average package manager works. You expect it to be able to install
and uninstall apps and services and then mostly get out of the way. With that in
mind, you look for ease-of-use, community support, and number of packages in
your package manager. These are all important in any package manager and Nix
compares well in some of these metrics<sup><a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>. But just looking at this, you’ll
miss what makes Nix useful.
</p>

<p>
Nix isn’t just a package manager. It’s a functional programming language that
just happens to also be a really good package manager. At first, it might not
make sense to have a programming language just for your package manager. The Nix
model of package management takes some getting used to.
</p>

<p>
Packages are represented in Nix as a special data type called a derivation. The
name <b>derivation</b> comes from the idea that each package is <i>derived</i> from some
inputs like source code, libraries, and build tools<sup><a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink">2</a></sup>. Each derivation has
its own directory, unique to every unique derivation written in code.
</p>

<p>
Together, these ideas make Nix really useful. To demonstrate its usefulness,
I’ve outlined three points where Nix is much better than an ordinary package
manager. There are many others<sup><a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink">3</a></sup> but these are the ones that I think are
most convincing.
</p>
<div id="outline-container-org312a803" class="outline-2">
<h2 id="org312a803"><span class="section-number-2">1.</span> <span class="todo TODO">TODO</span> Building</h2>
<div class="outline-text-2" id="text-1">
<p>
Package managers like RPM or Homebrew think of packages as tables.
</p>
</div>
</div>
<div id="outline-container-orgbf85609" class="outline-2">
<h2 id="orgbf85609"><span class="section-number-2">2.</span> <span class="todo TODO">TODO</span> Using packages without installing</h2>
<div class="outline-text-2" id="text-2">
<p>
We are so used to installing software to use it. The Nix model gives you 
</p>
</div>
</div>
<div id="outline-container-org6210f95" class="outline-2">
<h2 id="org6210f95"><span class="section-number-2">3.</span> <span class="todo TODO">TODO</span> Rollbacks</h2>
</div>

<div id="outline-container-org97eba77" class="outline-2">
<h2 id="org97eba77"><span class="section-number-2">4.</span> Comments</h2>
<div class="outline-text-2" id="text-4">
<p>
Thanks for reading! I’ve been trying to improve my writing skills. This blog
post is part of that effort. Feedback on this is welcome. My email is
<a href="mailto:mjbauer95@gmail.com">mjbauer95@gmail.com</a>.
</p>
</div>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">

<div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Not all, but we’re improving every day. Usability is still a major issue.
</p></div></div>

<div class="footdef"><sup><a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink">2</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara"></p></div></div>

<div class="footdef"><sup><a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink">3</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
For more features of Nix, you can checkout the <a href="https://nixos.org/nix/">Nix website</a>.
</p></div></div>


</div>
</div><div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/why-nix.html</link>
  <guid>https://matthewbauer.us/blog/why-nix.html</guid>
  <pubDate>Tue, 21 Nov 2017 00:00:00 -0600</pubDate>
</item>
<item>
  <title><![CDATA[Reproducible résumés]]></title>
  <description><![CDATA[
<p>
Recently, ‘reproducible’ papers have appeared in Academia. The idea is to make
all of a paper’s data and code openly available so that readers can reproduce
its findings. For software-heavy papers, it makes perfect sense to include code
in papers because the code is often as important as the paper’s text.
</p>

<p>
Outside of Academia, there’s not as much interest in this idea of
<i>reproducibility</i>. That’s unfortunate because it’s a really neat idea.
</p>

<p>
To make this idea more accessible for those outside Academia, I’m going to
introduce a new kind of reproducibility. Everyone in the working world needs to
apply for a job at some point. So, let’s figure out how to make a résumé,
reproducible. This document will be all that is needed to generate my résumé.
With some minor adjustments you can use it to generate your own.
</p>

<p>
At the end of this guide, you should have all of the information needed produce
a PDF version of your résume.
</p>
<div id="outline-container-orgacfb73f" class="outline-2">
<h2 id="orgacfb73f"><span class="section-number-2">1.</span> The Résumé</h2>
<div class="outline-text-2" id="text-1">
<p>
LaTeX makes it very easy to generate Résumés. It provides extremely powerful
typesetting features and can output PDF. Some of the syntax is scary to the
unexperienced but I’ve tried to keep it as simple as possible.
</p>

<p>
LaTeX syntax can be a little confuging at first but basically everything is
made up of <b>commands</b>. Each command starts with a <code>\</code> followed by a command
name. Each command can take a variable number of arguments and they are
specified with <code>{</code> and <code>}</code>. LaTeX is made up a series of packages that provide
these commands and do most of the work of typography automatically.
</p>
</div>
<div id="outline-container-org9cc9f35" class="outline-3">
<h3 id="org9cc9f35"><span class="section-number-3">1.1.</span> Document class</h3>
<div class="outline-text-3" id="text-1-1">
<p>
Every LaTeX document has a document class. Think of it like the CSS to the
Résumé’s HTML. Classes tells LaTeX how to layout the document and there are a
few builtin ones like ‘article’ that work fairly well for basic document.
I’ve built up my own class that works well for résumés. It’s largely based
off of @posquit0’s Awesome-CV but with some minor adjustments to make it a
little cleaner. In addition, I’ve followed some of Matthew Butterick’s guide
on résumés. You can read about them at <a href="http://practicaltypography.com/resumes.html">Practical Typography</a>.
</p>

<p>
I’ve make it available at <a href="./resume.cls">resume.cls</a> of this repo’s root but I won’t include
it in this blog post (but it’s still in the <a href="./README.html">./README.html</a> file).
</p>
</div>
</div>
<div id="outline-container-org74c78c5" class="outline-3">
<h3 id="org74c78c5"><span class="section-number-3">1.2.</span> Header</h3>
<div class="outline-text-3" id="text-1-2">
<p>
Every LaTeX document has a document class. For this document, I will use a
custom <b>resume</b> class.
</p>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\documentclass</span>[11pt]{<span class="org-builtin">resume</span>}
</pre>
</div>

<p>
Next, I’ll provide some semantic information. Each of these commands is
defined in the résumé class. You can make your own commands but I’ve tried to
make this document as simple as possible.
</p>

<p>
All of the following elements correspond to my name, address, mobile, email
and homepage. The contents are not parsed by LaTeX so you could put anything
here, but you should aim to make each command as semantic as possible.
</p>

<p>
My personal info follows,
</p>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\name</span>{Matthew}{Bauer}
<span class="org-keyword">\address</span>{10118 GARNETT ST, OVERLAND PARK KS 66214}
<span class="org-keyword">\mobile</span>{(913) 671 0636}
<span class="org-keyword">\email</span>{mjbauer95@gmail.com}
<span class="org-keyword">\homepage</span>{www.matthewbauer.us}
</pre>
</div>

<p>
This begins the document. The command <code>makecvheader</code> is from resume.cls and
will setup the basic template.
</p>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\begin</span>{<span class="org-function-name">document</span>}

<span class="org-keyword">\makecvheader</span>[C]
</pre>
</div>

<p>
Everything that follows is my own résume, but the ideas should be fairly self-explanatory.
</p>
</div>
</div>
<div id="outline-container-org6b9d18e" class="outline-3">
<h3 id="org6b9d18e"><span class="section-number-3">1.3.</span> Education</h3>
<div class="outline-text-3" id="text-1-3">
<p>
This LaTeX class defines <code>\cvsection</code> to separate sections of the résumé by a
horizontal line and some blank space. The only argument for <code>\cvsection</code> sets
the contents of the section header.
</p>

<p>
I start my résume with the ‘Eduction’ section.
</p>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\cvsection</span>{Education}

<span class="org-keyword">\begin</span>{<span class="org-function-name">cventries</span>}
</pre>
</div>

<p>
Each <code>cvsection</code> is composed of multiple <code>cventries</code>.
</p>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\cventry</span>
  {University of Kansas}
  {Lawrence, KS, USA}
  {B.S. in Computer Science}
  {Aug. 2015 &#8211; Exp. Dec. 2018}
  {
    <span class="org-keyword">\begin</span>{<span class="org-function-name">cvitems</span>}
    <span class="org-keyword">\item</span> { Participated in ACM and hackathon competitions }
    <span class="org-keyword">\item</span> { Coursework includes Software Engineering, Programming Languages,
        and Communication Networks }
    <span class="org-keyword">\end</span>{<span class="org-function-name">cvitems</span>}
  }
</pre>
</div>

<p>
<code>cventry</code> can be though of as a function that takes a variable 5 arguments.
The first will be the heading used. The second will be on the right-hand side
in <i>italics</i>. The third will be in <i>italics</i> immediately below the first. The
fourth will be on the right-hand side of the third argument. The last argument
provides items for the entry.
</p>

<p>
For my résumé, I have chosen to use each of these arguments for certain
purposes. It’s not necessary to do the same, but you should use a consistent
style throughout your résumé.
</p>

<table>


<colgroup>
<col  class="org-left">

<col  class="org-left">
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">left</th>
<th scope="col" class="org-left">right</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">argument 1</td>
<td class="org-left"><i>argument 2</i></td>
</tr>

<tr>
<td class="org-left"><i>argument 3</i></td>
<td class="org-left"><i>argument 4</i></td>
</tr>
</tbody>
</table>

<p>
For me, they correspond to,
</p>

<table>


<colgroup>
<col  class="org-left">

<col  class="org-left">
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">left</th>
<th scope="col" class="org-left">right</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Company or University</td>
<td class="org-left"><i>Location</i></td>
</tr>

<tr>
<td class="org-left"><i>Position or degree</i></td>
<td class="org-left"><i>Start date - end date</i></td>
</tr>
</tbody>
</table>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\end</span>{<span class="org-function-name">cventries</span>}
</pre>
</div>

<p>
The next section has work experience. It follows the same pattern outlined in
the Education section.
</p>
</div>
</div>
<div id="outline-container-org054e341" class="outline-3">
<h3 id="org054e341"><span class="section-number-3">1.4.</span> Work Experience</h3>
<div class="outline-text-3" id="text-1-4">
<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\cvsection</span>{Work Experience}

<span class="org-keyword">\begin</span>{<span class="org-function-name">cventries</span>}
</pre>
</div>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\cventry</span>
  {Amazon.com, Inc.}
  {Seattle, WA, USA}
  {SDE Intern}
  {Summer 2017}
  {
    <span class="org-keyword">\begin</span>{<span class="org-function-name">cvitems</span>}
    <span class="org-keyword">\item</span> { Worked on Mobile Identity team which manages the login screens for
            Amazon apps }
    <span class="org-keyword">\item</span> { Project made it easier for teams to register new devices through
            Identity Services }
    <span class="org-keyword">\item</span> { Used Agile development principles in design and development of
            project }
    <span class="org-keyword">\end</span>{<span class="org-function-name">cvitems</span>}
  }
</pre>
</div>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\cventry</span>
  {Lexmark Enterprise Software}
  {Lenexa, KS, USA}
  {Software Engineer Intern}
  {Summer 2015, Summer 2016}
  {
    <span class="org-keyword">\begin</span>{<span class="org-function-name">cvitems</span>}
    <span class="org-keyword">\item</span> { Worked on the Client Architecture team which builds the JavaScript
        web framework which other teams use to build enterprise solutions }
    <span class="org-keyword">\item</span> { Participated in high level design decision conversations }
    <span class="org-keyword">\item</span> { Project moved the web framework away from in-house solutions to
        better maintained open source projects while preserving legacy
        compatibility }
    <span class="org-keyword">\item</span> { Asked to return after impressive first year }
    <span class="org-keyword">\end</span>{<span class="org-function-name">cvitems</span>}
  }
</pre>
</div>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\cventry</span>
  {Together+Clinic}
  {Lincoln, NE, USA}
  {Design Studio Intern}
  {Spring 2015}
  {
    <span class="org-keyword">\begin</span>{<span class="org-function-name">cvitems</span>}
    <span class="org-keyword">\item</span> { Startup building web app to let doctors track patients recovering
        from surgery without frequent checkup visits }
    <span class="org-keyword">\item</span> { The web interface is used by both patients to record progress and
        doctors to track progress }
    <span class="org-keyword">\item</span> { Team used Scrum development principles for quick response and user
        focused design }
    <span class="org-keyword">\end</span>{<span class="org-function-name">cvitems</span>}
  }
</pre>
</div>

<p>
Here we end <code>cventries</code>.
</p>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\end</span>{<span class="org-function-name">cventries</span>}
</pre>
</div>
</div>
</div>
<div id="outline-container-org35e78a0" class="outline-3">
<h3 id="org35e78a0"><span class="section-number-3">1.5.</span> Honors &amp; Awards</h3>
<div class="outline-text-3" id="text-1-5">
<p>
Again we must define a new section, this time for honors and awards.
</p>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\cvsection</span>{Honors <span class="org-keyword">\&amp;</span> Awards}
<span class="org-keyword">\begin</span>{<span class="org-function-name">cvhonors</span>}
</pre>
</div>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\cvhonor</span>
{3rd Place}
{JayHacks Hackathon}
{Lawrence, KS, USA}
{2017}
</pre>
</div>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\cvhonor</span>
{Grand Prize}
{Google Code-in}
{Mountain View, CA, USA}
{2013}
</pre>
</div>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\end</span>{<span class="org-function-name">cvhonors</span>}
</pre>
</div>
</div>
</div>
<div id="outline-container-org2ec88a3" class="outline-3">
<h3 id="org2ec88a3"><span class="section-number-3">1.6.</span> Footer</h3>
<div class="outline-text-3" id="text-1-6">
<p>
The <code>makecvfooter</code> command gives a nice footer that will be put at the bottom
of each page. This can give us the document title and page numbering. In
addition, the LastPage command will tell us how many pages there are in case
we misplace a page while printing.
</p>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\makecvfooter</span>
{BAUER}
{<span class="org-keyword">\thepage</span>}
{<span class="org-keyword">\pageref</span>{<span class="org-constant">LastPage</span>}}
</pre>
</div>

<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\end</span>{<span class="org-function-name">document</span>}
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgd16773d" class="outline-2">
<h2 id="orgd16773d"><span class="section-number-2">2.</span> Building it</h2>
<div class="outline-text-2" id="text-2">
<p>
Nix makes it possible to make this Résumé truly reproducible. Nix is a purely
functional package manager. This means that each package is defined in a
functional language and we have much more powerful tools at our disposal.
</p>

<p>
Nix can be installed on both Linux and macOS machines. It is fairly easy to
setup, provided you have <b>sudo</b> access. Run the following and follow some
simple steps to get Nix working,
</p>

<div class="org-src-container">
<pre class="src src-sh">curl https://nixos.org/nix/install | sh
</pre>
</div>

<p>
More information on Nix is available from the <a href="https://nixos.org/nix/">Nix homepage</a>. On <a href="#org161f64f">the next page</a>, I’ll explain
how build this résumé using Nix.
</p>
</div>
<div id="outline-container-org161f64f" class="outline-3">
<h3 id="org161f64f"><span class="section-number-3">2.1.</span> <code>resume.nix</code></h3>
<div class="outline-text-3" id="text-2-1">
<p>
To start, we’ll this need to pull in Nixpkgs. Nixpkgs provides a set of
packages for Nix to use. Because Nix is functional, we’ll make nixpkgs an
optional argument if we ever want to work with multiple package set versions.
</p>

<div class="org-src-container">
<pre class="src src-nix">{nixpkgs ? <span class="org-nix-constant">&lt;nixpkgs&gt;</span>}: <span class="org-nix-keyword">with</span> <span class="org-nix-builtin">import</span> nixpkgs {};
</pre>
</div>

<p>
This syntax may be a little hard to understand for users new to Nix. <code>{}:</code>
declares a function. This particular function will take up the entire file and
Nix will <code>autocall</code> it when no arguments are necessary. This particular
function has one arguments, nixpkgs, that refers to the package set being
used. To make things easier we provide a default after the <code>?</code> symbol.
<code>&lt;nixpkgs&gt;</code> refers to the nixpkgs channels that the user has setup. It can be
updated with,
</p>

<div class="org-src-container">
<pre class="src src-sh">nix-channel --update
</pre>
</div>

<p>
Giving us a potentially newer version of Nixpkgs and its software to work
with.
</p>

<p>
Almost everything in Nix is a derivation (including Nix itself). Each
derivation has its own store path so we can reference it through
</p>

<div class="org-src-container">
<pre class="src src-nix">stdenv.mkDerivation {
  <span class="org-nix-attribute">name</span> = <span class="org-string">"resume"</span>;
  <span class="org-nix-attribute">src</span> = <span class="org-nix-constant">./.</span>;
</pre>
</div>

<p>
We’ll name this derivation resume and tell it to use the files in the current
directory as source.
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">buildInputs</span> = [
  (texlive.combine {
    <span class="org-nix-keyword">inherit</span> (texlive) scheme-basic xetex xetex-def setspace fontspec
                      chktex enumitem xifthen ifmtarg filehook
                      upquote tools ms geometry graphics oberdiek
                      fancyhdr lastpage xcolor etoolbox unicode-math
                      ucharcat sourcesanspro tcolorbox pgf environ
                      trimspaces parskip hyperref url euenc
                      collection-fontsrecommended;
  })
];
</pre>
</div>

<p>
Inputs in Nix are similar to dependencies in other package managers. Here, we
list only one dependency which provides our LaTeX distribution.
<code>texlive.combine</code> is a function that produces a derivation which will provide
the <code>xetex</code> binary. Each attribute listed in between <code>{</code> and <code>}</code> will be
passed as LaTeX packages to TeX Live. The <code>inherit</code> keyword tells Nix to pass
everything after <code>(texlive)</code> as attributes of <code>texlive</code> to <code>texlive.combine</code>.
Each one of those names listed should correspond to TeX Live packages that are
needed to build the résumé PDF.
</p>

<p>
In the future, I’d like to get Tex Live to actually recognize the packages we
are using within LaTeX, but nothing seems to exist to do this.
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">buildPhase</span> = <span class="org-string">''</span>
<span class="org-string">  xelatex -file-line-error -interaction=nonstopmode resume.tex</span>
<span class="org-string">''</span>;
</pre>
</div>

<p>
Here we actually build the <code>xelatex</code> file. These options make it easier to
debug <code>xelatex</code> when something goes wrong and makes sure we don’t get
<code>xelatex</code> doesn’t require any user input. It will produce a file called
<code>resume.pdf</code> that we can use as a résumé.
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">installPhase</span> = <span class="org-string">''</span>
<span class="org-string">  cp resume.pdf $out</span>
<span class="org-string">''</span>;
</pre>
</div>

<p>
Finally, we copy this résumé to <code>$out</code> where the derivation will live.
</p>

<div class="org-src-container">
<pre class="src src-nix">}
</pre>
</div>
</div>
</div>
<div id="outline-container-orgedb7c1a" class="outline-3">
<h3 id="orgedb7c1a"><span class="section-number-3">2.2.</span> Running the build</h3>
<div class="outline-text-3" id="text-2-2">
<p>
This entire document is built with ~org-mode~’s Babel engine. This means that
we can generate the files needed to build the résumé from scratch. To do
this, first we must clone this repository (if you haven’t already).
</p>

<div class="org-src-container">
<pre class="src src-sh">git clone https://github.com/matthewbauer/resume
<span class="org-builtin">cd</span> resume
</pre>
</div>

<p>
Next, we need to open this file in Emacs and generate the files (<i>tangle</i> it
in Babel lingo). Run this now, if you haven’t already,
</p>

<div class="org-src-container">
<pre class="src src-sh">emacs README.org
</pre>
</div>

<p>
Finally, let’s build these files. From Emacs, type the following: <code>C-c C-v t</code>
(org-babel-tangle). This will take a little bit, but at the end of it you will
have all of the files <i>tangled</i> inside README.org. You can build the résumé
with,
</p>

<div class="org-src-container">
<pre class="src src-sh">nix-build resume.nix
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgc7d1142" class="outline-2">
<h2 id="orgc7d1142"><span class="section-number-2">3.</span> Automating it</h2>
<div class="outline-text-2" id="text-3">
<p>
Sadly, Nix does not understand raw Org mode (yet). We need a bootstrap to
generate a Nix script from this file to truly automate this. I’ve included it
here for completeness, but you’ll need to generate it first before Nix will
work. If you haven’t already, generate this in <code>org-mode</code> by moving the cursor
into the src block below and pressing <code>C-u C-c C-v t</code> (org-babel-tangle).
Alternatively, I’ve provided a pregenerated file at <a href="./default.nix">./default.nix</a>.
</p>

<div class="org-src-container">
<pre class="src src-nix">{nixpkgs ? <span class="org-nix-constant">&lt;nixpkgs&gt;</span>}: <span class="org-nix-keyword">with</span> <span class="org-nix-builtin">import</span> nixpkgs {};
<span class="org-nix-keyword">let</span>
</pre>
</div>

<p>
Again, we’re be defining a function. Now, we will be using the let&#x2026;in
syntax to define a derivation to use.
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">README</span> = stdenv.mkDerivation {
  <span class="org-nix-attribute">name</span> = <span class="org-string">"README"</span>;
  <span class="org-nix-attribute">unpackPhase</span> = <span class="org-string">"true"</span>;
  <span class="org-nix-attribute">buildInputs</span> = [ emacs ];
  <span class="org-nix-attribute">installPhase</span> = <span class="org-string">''</span>
<span class="org-string">    mkdir -p $out</span>
<span class="org-string">    cd $out</span>
<span class="org-string">    cp -r </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./fonts</span><span class="org-nix-antiquote">}</span><span class="org-string"> fonts</span>
<span class="org-string">    cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./README.org</span><span class="org-nix-antiquote">}</span><span class="org-string"> README.org</span>
<span class="org-string">    emacs --batch -l ob-tangle --eval "(org-babel-tangle-file \"README.org\")"</span>
<span class="org-string">    cp resume.nix default.nix</span>
<span class="org-string">  ''</span>;
};
</pre>
</div>

<p>
The README derivation builds all of the things contained within this
README.org file. Almost every code block here will make a file that we’ll feed
into Nix. Fonts are external to the README because they are binary and cannot
be put in an Org file, but you can view them in <a href="./fonts">./fonts</a>.
</p>

<p>
Now, we’ll create another derivation with Nix. This will utilize a little
known feature of Nix called IFD.
It might not make sense right now, but it runs the <code>README</code> derivation’s
<code>resume.nix</code> file as its own Nix expression.
</p>

<p>
<i>IFD</i> stands for Import From Derivation. Basically, it means we can import
data generated in one derivation, <code>README</code>, in Nix to generate another
derivation. This will bootstrap the <a href="./README.html">./README.html</a> and allow us to avoid
generated files.
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-keyword">in</span> <span class="org-nix-builtin">import</span> README {<span class="org-nix-keyword">inherit</span> nixpkgs;}
</pre>
</div>

<p>
This can be thought of as a recursive call to Nix. It basically lets us use
the Nix output of README.org as an input for Nix. The derivation will produce
a <code>./result</code> file that will contain the output of <code>build.nix</code> for the Building
it section.
</p>

<p>
Now, we can finally build the Résumé! To do this, we just need to run
<code>nix-build</code> from the command line.
</p>

<div class="org-src-container">
<pre class="src src-sh">nix-build
</pre>
</div>

<p>
Look at <code>./result</code> and it will be PDF file you can open.
</p>
</div>
<div id="outline-container-org5904cb0" class="outline-3">
<h3 id="org5904cb0"><span class="section-number-3">3.1.</span> Continous Integration</h3>
<div class="outline-text-3" id="text-3-1">
<p>
Travis makes it easy to run continuous integration on our résumé.
</p>

<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">language</span>: nix
</pre>
</div>

<p>
Travis supports Nix projects out-of-the-box so all that’s really needed is
the above. However, matrices are useful to make sure it runs on more than one
machine and accross different versions.
</p>

<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">script</span>: nix-build --arg nixpkgs <span class="org-string">"builtins.fetchTarball \"$NIXPKGS\""</span>
</pre>
</div>

<p>
This line tells Travis what to build. The <code>$NIXPKGS</code> variable should become
clear after reading the usage below.
</p>

<p>
We want to target Linux and macOS. This will make sure the build script is
portable. Unfortunately, Nix does not support Windows systems and Travis does
not support any BSDs.
</p>

<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">os</span>:
  - linux
  - osx
</pre>
</div>

<p>
Each value of <code>NIXPKGS</code> corresponds to a tarball release of Nixpkgs. This
means that we can avoid problems that arise when the Nixpkgs repo is broken.
Any URL to a tarball with a Nixpkgs set will work, but in Nix we call these
‘channels’. Each channel has a set of tests that are required to run before a
new release of the channel. You could actually point directly to Nixpkgs HEAD
using <a href="https://github.com/nixos/nixpkgs/archive/master.tar.gz">GitHub’s archive URL</a> but this would constantly break as you would
frequently have to rebuild whole packages when you could just let Hydra do it
for you. You can find a whole listing at <a href="https://nixos.org/channels">NixOS.org</a> but I have included
the most recent channels below.
</p>

<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">env</span>:
  - NIXPKGS=nixos.org/channels/nixos-17.09/nixexprs.tar.xz
  - NIXPKGS=nixos.org/channels/nixpkgs-17.09-darwin/nixexprs.tar.xz
  - NIXPKGS=nixos.org/channels/nixos-unstable/nixexprs.tar.xz
  - NIXPKGS=nixos.org/channels/nixpkgs-unstable/nixexprs.tar.xz
</pre>
</div>

<p>
Travis works with ‘matrices’ meaning that every attribute of one property
(os) will get crossed with another property (env). We need to modify some of
these to get a working matrix.
</p>

<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">matrix</span>:
</pre>
</div>

<p>
We exclude some (os, env) pairs here. It doesn’t really make sense to use a
Darwin channel on Linux or a NixOS channel on macOS.
</p>

<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">exclude</span>:
  - <span class="org-variable-name">os</span>: linux
    <span class="org-variable-name">env</span>: NIXPKGS=nixos.org/channels/nixpkgs-17.09-darwin/nixexprs.tar.xz
  - <span class="org-variable-name">os</span>: osx
    <span class="org-variable-name">env</span>: NIXPKGS=nixos.org/channels/nixos-17.09/nixexprs.tar.xz
  - <span class="org-variable-name">os</span>: osx
    <span class="org-variable-name">env</span>: NIXPKGS=nixos.org/channels/nixos-unstable/nixexprs.tar.xz
</pre>
</div>

<p>
We allow some failure for unstable branches. We don’t expect stable releases
to always work.
</p>

<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">allow_failures</span>:
  - <span class="org-variable-name">env</span>: NIXPKGS=nixos.org/channels/nixos-unstable/nixexprs.tar.xz
  - <span class="org-variable-name">env</span>: NIXPKGS=nixos.org/channels/nixpkgs-unstable/nixexprs.tar.xz
</pre>
</div>

<p>
This will end up building five résumés three on Linux machines and two on
macOS machines. So, using <a href="./.travis.yml">./.travis.yml</a>, you can make Travis automatically
build a <code>resume.pdf</code> every time you commit a change. You should be able to
set this up yourself but alternatively you can look at <a href="https://travis-ci.org/matthewbauer/resume">my Travis dashboard</a>.
</p>

<a href="https://travis-ci.org/matthewbauer/bauer">
  <img src="https://travis-ci.org/matthewbauer/bauer.svg?branch=master"></img>
</a>
</div>
</div>
</div>
<div id="outline-container-orgdd3f65d" class="outline-2">
<h2 id="orgdd3f65d"><span class="section-number-2">4.</span> Conclusion</h2>
<div class="outline-text-2" id="text-4">
<p>
More information on reproducible research is available at <a href="https://reproducibleresearch.net">Reproducible
Research</a>. My hope is that eventually more things will become ‘reproducible’.
Technologies like Nix and Babel make this fairly easy but they have not yet
entered into the average Software Developer’s toolbelt. Reproducible projects
may take longer to setup, but they lead to more robust software systems.
</p>

<p>
Résumé require a careful mix of informative content and flashy styling. Too
much information and employers will be overwhelmed but too little and
employers assume you are inexperienced. Likewise, . Perhaps eventually,
software companies will read through résumés in org-mode instead of PDFs, but
alas Silicon Valley has not yet reached this level of Nirvana.
</p>

<p>
I welcome everyone to fork <a href="https://github.com/matthewbauer/resume">the repo</a> containing these files. You should be able
to generate your own Résumé by modifying the contents of Semantic info and
LaTeX document. Any contributions to the process of reproducible résumés are
welcome and you can open them as issues under that GitHub repo. Alternatively,
you can email me at <a href="mailto:mjbauer95@gmail.com">mjbauer95@gmail.com</a>.
</p>
</div>
</div>
<div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/resume.html</link>
  <guid>https://matthewbauer.us/blog/resume.html</guid>
  <pubDate>Mon, 13 Nov 2017 00:00:00 -0600</pubDate>
</item>
<item>
  <title><![CDATA[bauer: an Emacs+Nix IDE]]></title>
  <description><![CDATA[
<p>
<b>Note: the updated version of this is available at <a href="https://matthewbauer.us/bauer/">https://matthewbauer.us/bauer/</a></b>
</p>

<p>
I’m publishing my IDE as a blog post. It’s all written in Org Babel.
</p>

<p>
This file generates an Emacs configuration. It can be considered an ‘<a href="https://www.gnu.org/s/emacs/">Emacs</a>+<a href="https://nixos.org">Nix</a>’
IDE. That is, the Emacs configuration is <i>integrated</i> with hardcoded Nix store
paths. This provides a kind of functional Emacs configuration.
</p>
<div id="outline-container-orge48e591" class="outline-2">
<h2 id="orge48e591">Usage</h2>
<div class="outline-text-2" id="text-orge48e591">
</div>
<div id="outline-container-orgf4615a4" class="outline-3">
<h3 id="orgf4615a4">Demo</h3>
<div class="outline-text-3" id="text-orgf4615a4">
<p>
If you already have Nix installed, you can demo this out really easily. Just
run the following,
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-variable-name">url</span>=<span class="org-string">"github.com/matthewbauer/bauer/archive/master.tar.gz"</span> <span class="org-sh-escaped-newline">\</span>
<span class="org-variable-name">expr</span>=<span class="org-string">'import (builtins.fetchTarball "$url")'</span> <span class="org-sh-escaped-newline">\</span>
   nix-shell -p nix-bundle --run <span class="org-string">'nix-run "$expr"'</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org2f25533" class="outline-3">
<h3 id="org2f25533">Installing/upgrading</h3>
<div class="outline-text-3" id="text-org2f25533">
<p>
Run this from your shell:
</p>

<div class="org-src-container">
<pre class="src src-sh">curl https://matthewbauer.us/bootstrap.sh | sh
</pre>
</div>

<p>
Alternatively, you can accomplish the same thing from Emacs by downloading
<a href="https://raw.githubusercontent.com/matthewbauer/bauer/master/lisp/installer.el">installer.el</a>, loading it (<code>M‑x load‑file&lt;RET&gt;</code>) and running ‘install’
(<code>M‑x install&lt;RET&gt;</code>). This process will take a little bit as everything is
downloaded. After you restart Emacs, everything should be working.
</p>
</div>
</div>
<div id="outline-container-org573fda5" class="outline-3">
<h3 id="org573fda5">Developing</h3>
<div class="outline-text-3" id="text-org573fda5">
<p>
To make changes to the IDE, it is recommended you setup your environment like
so,
</p>

<div class="org-src-container">
<pre class="src src-sh">git clone https://github.com/matthewbauer/bauer ~/bauer
<span class="org-builtin">cd</span> ~/bauer
nix-build
./result/run
</pre>
</div>

<p>
The last line will spawn an Emacs frame in the Git repo. Make any changes you
want to <a href="./README.html">this document</a> or any of the files in <a href="./lisp">the list folder</a>. Make sure you
commit your changes afterward by typing <code>C-c p v</code>, then <code>c-ac</code> (using Magit,
of course). If you have forked this repo on GitHub, you can add it by typing
<code>Mg</code> then your GitHub username within Magit. To push to it, just type <code>Pr</code>
then find your username in the list and press enter. Pull requests are
welcome through GitHub!
</p>
</div>
</div>
<div id="outline-container-nonix" class="outline-3">
<h3 id="nonix">w/o Nix usage</h3>
<div class="outline-text-3" id="text-nonix">
<p>
You can use <code>bauer</code> without Nix. This just gives you the unintegrated Emacs
configuration. To get started, run the following.
</p>

<div class="org-src-container">
<pre class="src src-sh">mkdir -p ~/.emacs.d
git clone https://github.com/matthewbauer/bauer ~/.emacs.d/bauer
</pre>
</div>

<p>
Then, add the following to <a href="file:///Users/matthewbauer/.emacs.d/init.el">your Emacs init file</a>,
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defvar</span> <span class="org-variable-name">bauer-dir</span> <span class="org-rainbow-delimiters-depth-2">(</span>expand-file-name <span class="org-string">".nixpkgs"</span> <span class="org-rainbow-delimiters-depth-3">(</span>getenv <span class="org-string">"HOME"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defvar</span> <span class="org-variable-name">bauer-org</span> <span class="org-rainbow-delimiters-depth-2">(</span>expand-file-name <span class="org-string">"README.org"</span> bauer-dir<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> package-enable-at-startup nil<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span>autoload 'org-babel-tangle-file <span class="org-string">"ob-tangle"</span><span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-2">(</span>locate-library <span class="org-string">"default"</span><span class="org-rainbow-delimiters-depth-2">)</span>
    <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">unless</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">featurep</span> '<span class="org-constant">default</span><span class="org-rainbow-delimiters-depth-3">)</span> <span class="org-rainbow-delimiters-depth-3">(</span>load <span class="org-string">"default"</span> t<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>default-directory bauer-dir<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>add-to-list 'load-path <span class="org-rainbow-delimiters-depth-4">(</span>expand-file-name <span class="org-string">"lisp"</span> bauer-dir<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>org-babel-tangle-file bauer-org <span class="org-string">"README.el"</span> <span class="org-string">"emacs-lisp"</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>load-file <span class="org-rainbow-delimiters-depth-4">(</span>expand-file-name <span class="org-string">"README.el"</span> bauer-dir<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orge1769f6" class="outline-2">
<h2 id="orge1769f6">Emacs Init file</h2>
<div class="outline-text-2" id="text-orge1769f6">
<p>
This is the main file of the IDE. It will be loaded by Emacs on startup.
</p>
</div>
<div id="outline-container-org1f503a1" class="outline-3">
<h3 id="org1f503a1">Verify Emacs version ≥ 25</h3>
<div class="outline-text-3" id="text-org1f503a1">
<p>
Emacs 24 is unsupported currently. This will check to make sure Emacs 25+ is
available.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">unless</span> <span class="org-rainbow-delimiters-depth-2">(</span>&gt;= emacs-major-version 25<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-warning">error</span> <span class="org-string">"Need Emacs 25+ to work properly"</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
<div id="outline-container-org194b7b7" class="outline-4">
<h4 id="org194b7b7">EXPERIMENTAL Emacs 24 support</h4>
<div class="outline-text-4" id="text-org194b7b7">
<p>
If Nix is unavailable and only Emacs 24 is install for you, then you can try
the experimental v24 branch. From the Git root of this repository, just run:
</p>

<div class="org-src-container">
<pre class="src src-sh">git checkout v24
</pre>
</div>

<p>
and make sure you have setup the Nix-less version in your <a href="file:///Users/matthewbauer/.emacs.d/init.el">init.el</a> file (see
<a href="#nonix">w/o Nix usage directions</a>).
</p>
</div>
</div>
</div>
<div id="outline-container-org83212c5" class="outline-3">
<h3 id="org83212c5">Increase GC</h3>
<div class="outline-text-3" id="text-org83212c5">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> gc-cons-threshold most-positive-fixnum<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'after-init-hook
          <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-3">()</span>
            <span class="org-rainbow-delimiters-depth-3">(</span>garbage-collect<span class="org-rainbow-delimiters-depth-3">)</span>
            <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">setq</span> gc-cons-threshold
                  <span class="org-rainbow-delimiters-depth-4">(</span>car <span class="org-rainbow-delimiters-depth-5">(</span>get 'gc-cons-threshold 'standard-value<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orge9e6c27" class="outline-3">
<h3 id="orge9e6c27">Autoloads</h3>
<div class="outline-text-3" id="text-orge9e6c27">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span>autoload 'tramp-tramp-file-p <span class="org-string">"tramp"</span><span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">eval-and-compile</span> <span class="org-rainbow-delimiters-depth-2">(</span>autoload 'use-package-autoload-keymap <span class="org-string">"use-package"</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span>autoload 'package-installed-p <span class="org-string">"package"</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orge6aac47" class="outline-3">
<h3 id="orge6aac47">Custom config</h3>
<div class="outline-text-3" id="text-orge6aac47">
<p>
<a href="./lisp/set-defaults.el">set-defaults</a> provides an easy way to override the default custom files. This
means that when you customize a variable it will appear as ‘standard’ even
though it’s not what the package originally defined as the default. This is
useful for an Emacs distribution to provide <i>better defaults</i> while still
letting the user override them. Look through the lispdoc of the package for
documentation on how this works. Eventually, this will be added to MELPA for
use in other Emacs distributions.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">set-defaults</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
<div id="outline-container-orgd3b693f" class="outline-4">
<h4 id="orgd3b693f">Better defaults</h4>
<div class="outline-text-4" id="text-orgd3b693f">
<p>
These are some <b>better</b> defaults for Emacs. They shouldn’t require any
packages to be installed to work (those go in use-package).
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span>set-defaults
 '<span class="org-rainbow-delimiters-depth-2">(</span>TeX-auto-save t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>TeX-engine 'xetex<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ad-redefinition-action 'accept<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>apropos-do-all t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>async-shell-command-buffer 'new-buffer<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>auth-source-save-behavior t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>auto-revert-check-vc-info t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>auto-revert-verbose nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>auto-save-visited-file-name t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>backward-delete-char-untabify-method 'hungry<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>backup-directory-alist `<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"."</span> .
                             ,<span class="org-rainbow-delimiters-depth-5">(</span>expand-file-name <span class="org-string">"backup"</span>
                                                user-emacs-directory<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>bookmark-save-flag t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>c-syntactic-indentation nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>comint-process-echoes t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>comint-input-ignoredups t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>comint-prompt-read-only t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>comint-scroll-show-maximum-output nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>company-auto-complete <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-4">()</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">and</span> <span class="org-rainbow-delimiters-depth-5">(</span>company-tooltip-visible-p<span class="org-rainbow-delimiters-depth-5">)</span>
                                         <span class="org-rainbow-delimiters-depth-5">(</span>company-explicit-action-p<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>company-frontends '<span class="org-rainbow-delimiters-depth-3">(</span>company-pseudo-tooltip-unless-just-one-frontend
                       company-preview-frontend
                       company-echo-metadata-frontend<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>company-continue-commands
   '<span class="org-rainbow-delimiters-depth-3">(</span>not save-buffer
         save-some-buffers
         save-buffers-kill-terminal
         save-buffers-kill-emacs
         comint-previous-matching-input-from-input
         comint-next-matching-input-from-input<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>company-require-match nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>company-selection-wrap-around t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>compilation-always-kill t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>compilation-ask-about-save nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>compilation-auto-jump-to-first-error nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>compilation-environment '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"TERM=xterm-256color"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>compilation-scroll-output nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>compilation-skip-threshold 2<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>completions-format 'vertical<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>completion-cycle-threshold 5<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>counsel-find-file-at-point t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>counsel-mode-override-describe-bindings t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>create-lockfiles nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>cursor-in-non-selected-windows nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>custom-safe-themes t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>custom-buffer-done-kill t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>custom-file <span class="org-rainbow-delimiters-depth-3">(</span>expand-file-name <span class="org-string">"settings.el"</span> user-emacs-directory<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>custom-search-field nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>create-lockfiles nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>checkdoc-spellcheck-documentation-flag t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>delete-old-versions t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>delete-by-moving-to-trash t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dired-auto-revert-buffer t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dired-hide-details-hide-symlink-targets nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dired-dwim-target t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dired-listing-switches <span class="org-string">"-alhv"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dired-omit-verbose nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dired-omit-files <span class="org-string">"^\\."</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dired-recursive-copies 'always<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dired-recursive-deletes 'always<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dired-subtree-line-prefix <span class="org-string">" "</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dtrt-indent-verbosity 0<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>disabled-command-function nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>display-buffer-reuse-frames t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>echo-keystrokes 0<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>enable-recursive-minibuffers t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-autoaway-idle-seconds 600<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-autojoin-timing 'ident<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-fill-prefix <span class="org-string">"          "</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-insert-timestamp-function 'erc-insert-timestamp-left<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-interpret-mirc-color t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-kill-buffer-on-part t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-kill-queries-on-quit t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-kill-server-buffer-on-quit t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-prompt <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> nil <span class="org-rainbow-delimiters-depth-4">(</span>concat <span class="org-string">"["</span> <span class="org-rainbow-delimiters-depth-5">(</span>buffer-name<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-string">"]"</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-prompt-for-password nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-query-display 'buffer<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-server-coding-system '<span class="org-rainbow-delimiters-depth-3">(</span>utf-8 . utf-8<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-timestamp-format <span class="org-string">"%H:%M "</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-timestamp-only-if-changed-flag nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>erc-try-new-nick-p nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-banner-message <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-cd-on-directory t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-cmpl-autolist t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-cmpl-cycle-completions nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-cmpl-cycle-cutoff-length 2<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-cmpl-ignore-case t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-cp-interactive-query t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-cp-overwrite-files nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-default-target-is-dot t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-destroy-buffer-when-process-dies t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-highlight-prompt t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-hist-ignoredups t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-history-size 10000<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-list-files-after-cd t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-ln-interactive-query t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-mv-interactive-query t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-output-filter-functions '<span class="org-rainbow-delimiters-depth-3">(</span>eshell-handle-ansi-color
                                    eshell-handle-control-codes
                                    eshell-watch-for-password-prompt
                                    eshell-truncate-buffer<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-plain-echo-behavior nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-review-quick-commands t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-rm-interactive-query t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-prompt-function
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-4">()</span> <span class="org-rainbow-delimiters-depth-4">(</span>concat
               <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-6">(</span>tramp-tramp-file-p default-directory<span class="org-rainbow-delimiters-depth-6">)</span>
                 <span class="org-rainbow-delimiters-depth-6">(</span>concat
                  <span class="org-rainbow-delimiters-depth-7">(</span>tramp-file-name-user
                   <span class="org-rainbow-delimiters-depth-8">(</span>tramp-dissect-file-name default-directory<span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span>
                  <span class="org-string">"@"</span>
                  <span class="org-rainbow-delimiters-depth-7">(</span>tramp-file-name-real-host <span class="org-rainbow-delimiters-depth-8">(</span>tramp-dissect-file-name
                                              default-directory<span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span>
                  <span class="org-string">" "</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span>
               <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-rainbow-delimiters-depth-7">(</span>dir <span class="org-rainbow-delimiters-depth-8">(</span>eshell/pwd<span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span>
                 <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-7">(</span>string= dir <span class="org-rainbow-delimiters-depth-8">(</span>getenv <span class="org-string">"HOME"</span><span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span> <span class="org-string">"~"</span>
                   <span class="org-rainbow-delimiters-depth-7">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-8">(</span><span class="org-rainbow-delimiters-depth-9">(</span>dirname <span class="org-rainbow-delimiters-depth-1">(</span>file-name-nondirectory dir<span class="org-rainbow-delimiters-depth-1">)</span><span class="org-rainbow-delimiters-depth-9">)</span><span class="org-rainbow-delimiters-depth-8">)</span>
                     <span class="org-rainbow-delimiters-depth-8">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-9">(</span>string= dirname <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-9">)</span> <span class="org-string">"/"</span> dirname<span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span>
               <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-6">(</span>= <span class="org-rainbow-delimiters-depth-7">(</span>user-uid<span class="org-rainbow-delimiters-depth-7">)</span> 0<span class="org-rainbow-delimiters-depth-6">)</span> <span class="org-string">" # "</span> <span class="org-string">" $ "</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eshell-visual-commands
   '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"vi"</span> <span class="org-string">"screen"</span> <span class="org-string">"top"</span> <span class="org-string">"less"</span> <span class="org-string">"more"</span> <span class="org-string">"lynx"</span> <span class="org-string">"ncftp"</span> <span class="org-string">"pine"</span> <span class="org-string">"tin"</span> <span class="org-string">"trn"</span> <span class="org-string">"elm"</span>
     <span class="org-string">"nano"</span> <span class="org-string">"nethack"</span> <span class="org-string">"telnet"</span> <span class="org-string">"emacs"</span> <span class="org-string">"emacsclient"</span> <span class="org-string">"htop"</span> <span class="org-string">"w3m"</span> <span class="org-string">"links"</span> <span class="org-string">"lynx"</span>
     <span class="org-string">"elinks"</span> <span class="org-string">"irrsi"</span> <span class="org-string">"mutt"</span> <span class="org-string">"finch"</span> <span class="org-string">"newsbeuter"</span> <span class="org-string">"pianobar"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eval-expression-print-length 20<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>eval-expression-print-level nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>explicit-shell-args '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"-c"</span> <span class="org-string">"export EMACS= INSIDE_EMACS=; stty echo; shell"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>expand-region-contract-fast-key <span class="org-string">"j"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>fill-column 80<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-check-syntax-automatically '<span class="org-rainbow-delimiters-depth-3">(</span>save
                                         idle-change
                                         mode-enabled
                                         new-line<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-display-errors-function
   'flycheck-display-error-messages-unless-error-list<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-idle-change-delay 0.001<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-standard-error-navigation nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-global-modes '<span class="org-rainbow-delimiters-depth-3">(</span>not erc-mode
                               message-mode
                               git-commit-mode
                               view-mode
                               outline-mode
                               text-mode
                               org-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flyspell-abbrev-p nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flyspell-auto-correct nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flyspell-highlight-properties nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flyspell-incorrect-hook nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flyspell-issue-welcome-flag nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>frame-title-format '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-builtin">:eval</span>
                        <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-5">(</span>buffer-file-name<span class="org-rainbow-delimiters-depth-5">)</span>
                            <span class="org-rainbow-delimiters-depth-5">(</span>abbreviate-file-name <span class="org-rainbow-delimiters-depth-6">(</span>buffer-file-name<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span>
                          <span class="org-string">"%b"</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>global-auto-revert-non-file-buffers t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>highlight-nonselected-windows nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>hideshowvis-ignore-same-line nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>history-delete-duplicates t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>history-length 20000<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>hippie-expand-verbose nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>iedit-toggle-key-default nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>imenu-auto-rescan t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>indicate-empty-lines t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>indent-tabs-mode nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>inhibit-startup-screen t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>inhibit-startup-echo-area-message t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>initial-major-mode 'fundamental-mode<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>initial-scratch-message <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ispell-extra-args '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"--sug-mode=ultra"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ispell-silently-savep t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ispell-quietly t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ivy-count-format <span class="org-string">"\"\""</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ivy-display-style nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ivy-minibuffer-faces nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ivy-use-virtual-buffers t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ivy-fixed-height-minibuffer t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>jit-lock-defer-time 0.01<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>js2-mode-show-parse-errors nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>js2-mode-show-strict-warnings nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>js2-strict-missing-semi-warning nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>kill-do-not-save-duplicates t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>kill-whole-line t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>load-prefer-newer t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>mac-allow-anti-aliasing t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>mac-command-key-is-meta t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>mac-command-modifier 'meta<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>mac-option-key-is-meta nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>mac-option-modifier 'super<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>mac-right-option-modifier nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>mac-frame-tabbing t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>mac-system-move-file-to-trash-use-finder t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-log-auto-more t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-clone-set-remote\.pushDefault t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-diff-options nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-display-buffer-function 'magit-display-buffer-fullframe-status-v1<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-ediff-dwim-show-on-hunks t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-fetch-arguments nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-highlight-trailing-whitespace nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-highlight-whitespace nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-no-confirm t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-process-connection-type nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-process-find-password-functions '<span class="org-rainbow-delimiters-depth-3">(</span>magit-process-password-auth-source<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-process-popup-time 15<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-push-always-verify nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-save-repository-buffers 'dontask<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-stage-all-confirm nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-unstage-all-confirm nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>mmm-global-mode 'buffers-with-submode-classes<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>mmm-submode-decoration-level 2<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>minibuffer-prompt-properties '<span class="org-rainbow-delimiters-depth-3">(</span>read-only t
                                            cursor-intangible t
                                            face minibuffer-prompt<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>mwim-beginning-of-line-function 'beginning-of-line<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>mwim-end-of-line-function 'end-of-line<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>neo-theme 'arrow<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>neo-fixed-size nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>next-error-recenter t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>notmuch-show-logo nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>nrepl-log-messages t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>nsm-save-host-names t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ns-function-modifier 'hyper<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ns-pop-up-frames nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>org-blank-before-new-entry '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>heading<span class="org-rainbow-delimiters-depth-4">)</span> <span class="org-rainbow-delimiters-depth-4">(</span>plain-list-item<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>org-export-in-background nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>org-log-done 'time<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>org-return-follows-link t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>org-special-ctrl-a/e t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>org-src-fontify-natively t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>org-src-preserve-indentation t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>org-src-tab-acts-natively t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>org-support-shift-select t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>parens-require-spaces t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>package-archives '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"melpa-stable"</span> . <span class="org-string">"http://stable.melpa.org/packages/"</span><span class="org-rainbow-delimiters-depth-4">)</span>
                      <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"melpa"</span> . <span class="org-string">"https://melpa.org/packages/"</span><span class="org-rainbow-delimiters-depth-4">)</span>
                      <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"org"</span> . <span class="org-string">"http://orgmode.org/elpa/"</span><span class="org-rainbow-delimiters-depth-4">)</span>
                      <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"gnu"</span> . <span class="org-string">"https://elpa.gnu.org/packages/"</span><span class="org-rainbow-delimiters-depth-4">)</span>
                      <span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>proof-splash-enable nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>projectile-globally-ignored-files '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">".DS_Store"</span> <span class="org-string">"TAGS"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>projectile-enable-caching t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>projectile-mode-line
   '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-builtin">:eval</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">and</span> <span class="org-rainbow-delimiters-depth-6">(</span>projectile-project-p<span class="org-rainbow-delimiters-depth-6">)</span>
                    <span class="org-rainbow-delimiters-depth-6">(</span>not <span class="org-rainbow-delimiters-depth-7">(</span>file-remote-p default-directory<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span>
               <span class="org-rainbow-delimiters-depth-5">(</span>format <span class="org-string">" Projectile[%s]"</span> <span class="org-rainbow-delimiters-depth-6">(</span>projectile-project-name<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>projectile-ignored-project-function 'file-remote-p<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>projectile-switch-project-action 'projectile-dired<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>projectile-do-log nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>projectile-verbose nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>reb-re-syntax 'string<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>require-final-newline t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>resize-mini-windows t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ring-bell-function 'ignore<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>rtags-completions-enabled t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>rtags-imenu-syntax-highlighting 10<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ruby-insert-encoding-magic-comment nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>sh-guess-basic-offset t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>same-window-buffer-names
   '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"*eshell*"</span> <span class="org-string">"*shell*"</span> <span class="org-string">"*mail*"</span> <span class="org-string">"*inferior-lisp*"</span> <span class="org-string">"*ielm*"</span> <span class="org-string">"*scheme*"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>save-abbrevs 'silently<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>save-interprogram-paste-before-kill t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>savehist-additional-variables '<span class="org-rainbow-delimiters-depth-3">(</span>search-ring
                                   regexp-search-ring
                                   kill-ring
                                   comint-input-ring<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>savehist-autosave-interval 60<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>auto-window-vscroll nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>hscroll-margin 5<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>hscroll-step 5<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>scroll-preserve-screen-position 'always<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>send-mail-function 'smtpmail-send-it<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>sentence-end-double-space nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>set-mark-command-repeat-pop t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>shell-completion-execonly nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>shell-input-autoexpand nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>sp-autoskip-closing-pair 'always<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>sp-hybrid-kill-entire-symbol nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>truncate-lines nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>tab-always-indent 'complete<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>term-input-autoexpand t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>term-input-ignoredups t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>term-input-ring-file-name t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>tramp-default-proxies-alist '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>regexp-quote <span class="org-rainbow-delimiters-depth-6">(</span>system-name<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> nil nil<span class="org-rainbow-delimiters-depth-4">)</span>
                                 <span class="org-rainbow-delimiters-depth-4">(</span>nil <span class="org-string">"\\`</span><span class="org-string"><span class="org-constant"><span class="org-constant">root\\</span></span></span><span class="org-string">'"</span> <span class="org-string">"/ssh:%h:"</span><span class="org-rainbow-delimiters-depth-4">)</span>
                                 <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">".*"</span> <span class="org-string">"\\`</span><span class="org-string"><span class="org-constant"><span class="org-constant">root\\</span></span></span><span class="org-string">'"</span> <span class="org-string">"/ssh:%h:"</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>tramp-default-user nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>text-quoting-style 'quote<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>tls-checktrust t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>undo-limit 800000<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>uniquify-after-kill-buffer-p t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>uniquify-buffer-name-style 'forward<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>uniquify-ignore-buffers-re <span class="org-string">"^\\*"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>uniquify-separator <span class="org-string">"/"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>use-dialog-box nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>use-file-dialog nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>use-package-always-defer t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>use-package-enable-imenu-support t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>use-package-expand-minimally nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>version-control t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>vc-allow-async-revert t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>vc-command-messages nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>vc-git-diff-switches '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"-w"</span> <span class="org-string">"-U3"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>vc-follow-symlinks nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>vc-ignore-dir-regexp
   <span class="org-rainbow-delimiters-depth-3">(</span>concat <span class="org-string">"</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(</span></span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(</span></span><span class="org-string">\\`"</span>
           <span class="org-string">"</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(?:</span></span><span class="org-string">[\\/][\\/][</span><span class="org-string"><span class="org-negation-char">^</span></span><span class="org-string">\\/]+[\\/]</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">|</span></span><span class="org-string">/</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(?:</span></span><span class="org-string">net</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">|</span></span><span class="org-string">afs</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">|</span></span><span class="org-string">\\.\\.\\.</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string">/</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string">"</span>
            <span class="org-string">"\\'</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">|</span></span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(</span></span><span class="org-string">\\`/[</span><span class="org-string"><span class="org-negation-char">^</span></span><span class="org-string">/|:][</span><span class="org-string"><span class="org-negation-char">^</span></span><span class="org-string">/|]*:</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">|</span></span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(</span></span><span class="org-string">\\`/[</span><span class="org-string"><span class="org-negation-char">^</span></span><span class="org-string">/|:][</span><span class="org-string"><span class="org-negation-char">^</span></span><span class="org-string">/|]*:</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string">"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>view-read-only t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>view-inhibit-help-message t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>visible-bell nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>visible-cursor nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>woman-imenu t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>whitespace-line-column 80<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>whitespace-auto-cleanup t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>whitespace-rescan-timer-time nil<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>whitespace-silent t<span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>whitespace-style '<span class="org-rainbow-delimiters-depth-3">(</span>face
                      trailing
                      lines
                      space-before-tab
                      empty
                      lines-style<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org0a70d4d" class="outline-4">
<h4 id="org0a70d4d">Site paths</h4>
<div class="outline-text-4" id="text-org0a70d4d">
<p>
Now, pull in generated paths from <code>site-paths.el</code>. Nix will generate this
file automatically for us and different Emacs variables will be set to their
Nix store derivations. Everything should work fine if you don’t have this
available, though. If you are in Emacs and already have the IDE install you
can inspect this file by typing <code>M-: (find-file (locate-library
   "site-paths"))</code>. It will look similar to a <code>settings.el</code> file where each line
corresponds to a customizable variable. Unlike <code>settings.el</code>, each entry is
path in the Nix store and we verify it exists before setting it.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span>load <span class="org-string">"site-paths"</span> <span class="org-builtin">:noerror</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org36544a8" class="outline-4">
<h4 id="org36544a8">Set environment</h4>
<div class="outline-text-4" id="text-org36544a8">
<p>
<code>set-envs</code> is provided by <a href="./lisp/set-defaults.el">set-defaults</a>. We can use it like
<code>custom-set-variables</code>, just it calls <code>setenv</code> instead of <code>setq</code>. All of
these entries correspond to environment variables that we want to always be
set in the Emacs process.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span>set-envs
 '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"EDITOR"</span> <span class="org-string">"emacsclient -nw"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"LANG"</span> <span class="org-string">"en_US.UTF-8"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"LC_ALL"</span> <span class="org-string">"en_US.UTF-8"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"NODE_NO_READLINE"</span> <span class="org-string">"1"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"PAGER"</span> <span class="org-string">"cat"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org82199c1" class="outline-4">
<h4 id="org82199c1">Load custom file</h4>
<div class="outline-text-4" id="text-org82199c1">
<p>
This file allows users to override above defaults.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span>load custom-file 'noerror<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org512b28e" class="outline-3">
<h3 id="org512b28e">Setup use-package</h3>
<div class="outline-text-3" id="text-org512b28e">
<p>
Now to get <code>use-package</code> we will require package.el and initialize it if
site-paths is not setup (meaning we’re outside the Nix expression). Because
site-paths should be available (unless you don’t have Nix), we can skip this
step. All of this is marked ‘eval-and-compile’ to make sure the compiler
picks it up on build phase.
</p>

<p>
So, there are basically two modes for using this configuration. One when
packages are installed externally (through Nix) and another where they are
installed internally. This is captured in the variable ‘needs-package-init’
which will be t when we want to use the builtin package.el and will be nli
when we want to just assume everything is available.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">eval-and-compile</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> needs-package-init <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">and</span> <span class="org-rainbow-delimiters-depth-4">(</span>not <span class="org-rainbow-delimiters-depth-5">(</span>locate-library <span class="org-string">"site-paths"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span>
                                <span class="org-rainbow-delimiters-depth-4">(</span>not <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">and</span> <span class="org-rainbow-delimiters-depth-6">(</span>boundp 'use-package-list--is-running<span class="org-rainbow-delimiters-depth-6">)</span>
                                          use-package-list--is-running<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>

<p>
First handle using package.el.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">when</span> needs-package-init
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">require</span> '<span class="org-constant">package</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>package-initialize<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">unless</span> <span class="org-rainbow-delimiters-depth-3">(</span>package-installed-p 'use-package<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>package-refresh-contents<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>package-install 'use-package<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>

<p>
Actually require use-package,
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">eval-and-compile</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">require</span> '<span class="org-constant">use-package</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">require</span> '<span class="org-constant">bind-key</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>

<p>
Now let’s handle the case where all of the packages are already provided.
Bascially, we’ll prevent use-package from running ‘ensure’ on anything.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">eval-and-compile</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> use-package-always-ensure needs-package-init<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-3">(</span>not needs-package-init<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">setq</span> use-package-ensure-function 'ignore
          package-enable-at-startup nil<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org01cdd3d" class="outline-3">
<h3 id="org01cdd3d">Key bindings</h3>
<div class="outline-text-3" id="text-org01cdd3d">
<p>
Using bind-key, setup some simple key bindings. None of these should
overwrite Emacs’ default keybindings. Also, they should only require vanilla
Emacs to work (non-vanilla Emacs key bindings should be put in their
<code>use-package</code> declaration).
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c C-u"</span>         'rename-uniquely<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-x ~"</span>           <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-3">()</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-3">)</span> <span class="org-rainbow-delimiters-depth-3">(</span>find-file <span class="org-string">"~"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-x /"</span>           <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-3">()</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-3">)</span> <span class="org-rainbow-delimiters-depth-3">(</span>find-file <span class="org-string">"/"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c C-o"</span>         'browse-url-at-point<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"H-l"</span>             'browse-url-at-point<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-x 5 3"</span>         'iconify-frame<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-x 5 4"</span>         'toggle-frame-fullscreen<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"s-SPC"</span>           'cycle-spacing<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c w w"</span>         'whitespace-mode<span class="org-rainbow-delimiters-depth-1">)</span>

<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"&lt;C-return&gt;"</span>      'other-window<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-z"</span>             'delete-other-windows<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"M-g l"</span>           'goto-line<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"&lt;C-M-backspace&gt;"</span> 'backward-kill-sexp<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-x t"</span>           'toggle-truncate-lines<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-x v H"</span>         'vc-region-history<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c SPC"</span>         'just-one-space<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c f"</span>           'flush-lines<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c o"</span>           'customize-option<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c O"</span>           'customize-group<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c F"</span>           'customize-face<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c q"</span>           'fill-region<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c s"</span>           'replace-string<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c u"</span>           'rename-uniquely<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c z"</span>           'clean-buffer-list<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c ="</span>           'count-matches<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c ;"</span>           'comment-or-uncomment-region<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c n"</span>           'clean-up-buffer-or-region<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"C-c d"</span>           'duplicate-current-line-or-region<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"M-+"</span>             'text-scale-increase<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"M-_"</span>             'text-scale-decrease<span class="org-rainbow-delimiters-depth-1">)</span>

<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"H-c"</span>             'compile<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"s-1"</span>             'other-frame<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"&lt;s-return&gt;"</span>      'toggle-frame-fullscreen<span class="org-rainbow-delimiters-depth-1">)</span>

<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"s-C-&lt;left&gt;"</span>      'shrink-window-horizontally<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"s-C-&lt;right&gt;"</span>     'enlarge-window-horizontally<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"s-C-&lt;down&gt;"</span>      'shrink-window<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"s-C-&lt;up&gt;"</span>        'enlarge-window<span class="org-rainbow-delimiters-depth-1">)</span>

<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">iso-transl</span><span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"' /"</span>       <span class="org-string">"&#8242;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"\" /"</span>      <span class="org-string">"&#8243;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"\" ("</span>      <span class="org-string">"&#8220;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"\" )"</span>      <span class="org-string">"&#8221;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"' ("</span>       <span class="org-string">"&#8216;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"' )"</span>       <span class="org-string">"&#8217;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"4 &lt; -"</span>     <span class="org-string">"&#8592;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"4 - &gt;"</span>     <span class="org-string">"&#8594;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"4 b"</span>       <span class="org-string">"&#8592;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"4 f"</span>       <span class="org-string">"&#8594;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"4 p"</span>       <span class="org-string">"&#8593;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"4 n"</span>       <span class="org-string">"&#8595;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"&lt;down&gt;"</span>    <span class="org-string">"&#8659;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"&lt;S-down&gt;"</span>  <span class="org-string">"&#8595;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"&lt;left&gt;"</span>    <span class="org-string">"&#8656;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"&lt;S-left&gt;"</span>  <span class="org-string">"&#8592;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"&lt;right&gt;"</span>   <span class="org-string">"&#8658;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"&lt;S-right&gt;"</span> <span class="org-string">"&#8594;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"&lt;up&gt;"</span>      <span class="org-string">"&#8657;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"&lt;S-up&gt;"</span>    <span class="org-string">"&#8593;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">bind-key</span> <span class="org-string">","</span>         <span class="org-string">"&#8230;"</span> iso-transl-ctl-x-8-map<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org54bc5b3" class="outline-3">
<h3 id="org54bc5b3">Helpers</h3>
<div class="outline-text-3" id="text-org54bc5b3">
<p>
These utils are needed at init stage and should always appear before other
use-package declarations.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">add-hooks</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hooks add-hooks-pair<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">hook-helpers</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>create-hook-helper
             define-hook-helper
             hkhlp-normalize-hook-spec<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:functions</span> <span class="org-rainbow-delimiters-depth-2">(</span>make-hook-helper
              add-hook-helper
              hkhlp-update-helper<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgd22759e" class="outline-3">
<h3 id="orgd22759e">Packages</h3>
<div class="outline-text-3" id="text-orgd22759e">
<p>
Alphabetical listing of all Emacs packages needed by the IDE.
</p>

<p>
Rules: No packages on the top level should have the :demand keyword. Each
package should be setup as either commands, hooks, modes, or key bindings.
Defer timers are allowed but should be used sparingly. Currently, these
packages need defer timers:
</p>

<ul class="org-ul">
<li>autorevert (1)</li>
<li>company (2)</li>
<li>delsel (2)</li>
<li>dtrt-indent (3)</li>
<li>flycheck (3)</li>
<li>savehist (4)</li>
<li>save-place (5)</li>
<li>which-key (3)</li>
<li><p>
apropostriate (2)
</p>

<p>
To resort, go to one of the package group headings and type C-c ^ (the
shortcut for org-sort).
</p></li>
</ul>
</div>
<div id="outline-container-orgba8407f" class="outline-4">
<h4 id="orgba8407f">Essentials</h4>
<div class="outline-text-4" id="text-orgba8407f">
<p>
Some of these are included in Emacs, others aren’t. All of them are
necessary for using Emacs as a full featured IDE.
</p>
</div>
<ul class="org-ul">
<li><a id="orgdd9e60d"></a>ace window<br>
<div class="outline-text-5" id="text-orgdd9e60d">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ace-window</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-o"</span> . other-window<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>remap next-multiframe-window<span class="org-rainbow-delimiters-depth-4">]</span> . ace-window<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgac71a90"></a>aggressive-indent<br>
<div class="outline-text-5" id="text-orgac71a90">
<p>
Automatically indent code as you type. Only enabled for Lisp currently.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">aggressive-indent</span>
  <span class="org-builtin">:commands</span> aggressive-indent-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hooks '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>emacs-lisp-mode
                       inferior-emacs-lisp-mode
                       ielm-mode
                       lisp-mode
                       inferior-lisp-mode
                       lisp-interaction-mode
                       slime-repl-mode<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-warning">. aggressive-indent-mode</span><span class="org-warning"><span class="org-rainbow-delimiters-depth-4">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-3">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-2">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-1">)</span></span>
</pre>
</div>
</div>
</li>
<li><a id="orga7e9bfd"></a>buffer-move<br>
<div class="outline-text-5" id="text-orga7e9bfd">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">buffer-move</span>
  <span class="org-builtin">:bind</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;M-S-up&gt;"</span> . buf-move-up<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;M-S-down&gt;"</span> . buf-move-down<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;M-S-left&gt;"</span> . buf-move-left<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;M-S-right&gt;"</span> . buf-move-right<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org10e65b1"></a>Company<br>
<div class="outline-text-5" id="text-org10e65b1">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">company</span>
  <span class="org-builtin">:demand</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-builtin">:map</span> company-active-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"TAB"</span> .
               company-select-next-if-tooltip-visible-or-complete-selection<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;tab&gt;"</span> .
               company-select-next-if-tooltip-visible-or-complete-selection<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"S-TAB"</span> . company-select-previous<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;backtab&gt;"</span> . company-select-previous<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-n"</span> . company-select-next<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-p"</span> . company-select-previous<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>company-mode
             global-company-mode
             company-auto-begin
             company-complete-common-or-cycle<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> company-backends
        '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>company-css <span class="org-builtin">:with</span> company-dabbrev<span class="org-rainbow-delimiters-depth-4">)</span>
          <span class="org-rainbow-delimiters-depth-4">(</span>company-nxml <span class="org-builtin">:with</span> company-dabbrev<span class="org-rainbow-delimiters-depth-4">)</span>
          <span class="org-rainbow-delimiters-depth-4">(</span>company-elisp <span class="org-builtin">:with</span> company-capf<span class="org-rainbow-delimiters-depth-4">)</span>
          <span class="org-rainbow-delimiters-depth-4">(</span>company-eshell-history <span class="org-builtin">:with</span> company-capf company-files<span class="org-rainbow-delimiters-depth-4">)</span>
          <span class="org-rainbow-delimiters-depth-4">(</span>company-capf <span class="org-builtin">:with</span> company-files company-keywords<span class="org-rainbow-delimiters-depth-4">)</span>
          <span class="org-rainbow-delimiters-depth-4">(</span>company-etags company-gtags company-clang company-cmake
                         <span class="org-builtin">:with</span> company-dabbrev<span class="org-rainbow-delimiters-depth-4">)</span>
          <span class="org-rainbow-delimiters-depth-4">(</span>company-semantic <span class="org-builtin">:with</span> company-dabbrev company-capf<span class="org-rainbow-delimiters-depth-4">)</span>
          <span class="org-rainbow-delimiters-depth-4">(</span>company-abbrev company-dabbrev company-keywords<span class="org-rainbow-delimiters-depth-4">)</span>
          <span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>global-company-mode 1<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'minibuffer-setup-hook 'company-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'minibuffer-setup-hook
            <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-4">()</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">setq-local</span> company-frontends
                                   '<span class="org-rainbow-delimiters-depth-5">(</span>company-preview-frontend<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>advice-add 'completion-at-point <span class="org-builtin">:override</span> 'company-complete-common-or-cycle<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
<ul class="org-ul">
<li><a id="org3018c88"></a>company-eshell-history<br>
<div class="outline-text-6" id="text-org3018c88">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">company-eshell-history</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> company-eshell-history
  <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org65aebdb"></a>company-statistics<br>
<div class="outline-text-6" id="text-org65aebdb">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">company-statistics</span>
  <span class="org-builtin">:commands</span> company-statistics-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'company-mode-hook 'company-statistics-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="orgb207c44"></a>compile<br>
<div class="outline-text-5" id="text-orgb207c44">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">compile</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c C-c"</span> . compile<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-O"</span> . show-compilation<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-builtin">:map</span> compilation-mode-map
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"o"</span> . compile-goto-error<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:preface</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">show-compilation</span> <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>compile-buf
           <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">catch</span> '<span class="org-constant">found</span>
             <span class="org-rainbow-delimiters-depth-7">(</span><span class="org-keyword">dolist</span> <span class="org-rainbow-delimiters-depth-8">(</span>buf <span class="org-rainbow-delimiters-depth-9">(</span>buffer-list<span class="org-rainbow-delimiters-depth-9">)</span><span class="org-rainbow-delimiters-depth-8">)</span>
               <span class="org-rainbow-delimiters-depth-8">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-9">(</span>string-match <span class="org-string">"\\*compilation\\*"</span> <span class="org-rainbow-delimiters-depth-1">(</span>buffer-name buf<span class="org-rainbow-delimiters-depth-1">)</span><span class="org-rainbow-delimiters-depth-9">)</span>
                   <span class="org-rainbow-delimiters-depth-9">(</span><span class="org-keyword">throw</span> '<span class="org-constant">found</span> buf<span class="org-rainbow-delimiters-depth-9">)</span><span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span>
      <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">if</span> compile-buf
          <span class="org-rainbow-delimiters-depth-5">(</span>switch-to-buffer-other-window compile-buf<span class="org-rainbow-delimiters-depth-5">)</span>
        <span class="org-rainbow-delimiters-depth-5">(</span>call-interactively 'compile<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>

  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>create-hook-helper compilation-ansi-color-process-output <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-builtin">:hooks</span> <span class="org-rainbow-delimiters-depth-3">(</span>compilation-filter-hook<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>ansi-color-process-output nil<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>set <span class="org-rainbow-delimiters-depth-4">(</span>make-local-variable 'comint-last-output-start<span class="org-rainbow-delimiters-depth-4">)</span>
         <span class="org-rainbow-delimiters-depth-4">(</span>point-marker<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org1779d0c"></a>Counsel<br>
<div class="outline-text-5" id="text-org1779d0c">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">counsel</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>counsel-descbinds counsel-grep-or-swiper<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:bind*</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>remap execute-extended-command<span class="org-rainbow-delimiters-depth-4">]</span> . counsel-M-x<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>remap find-file<span class="org-rainbow-delimiters-depth-4">]</span> . counsel-find-file<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>remap describe-function<span class="org-rainbow-delimiters-depth-4">]</span> . counsel-describe-function<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>remap describe-variable<span class="org-rainbow-delimiters-depth-4">]</span> . counsel-describe-variable<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>remap info-lookup-symbol<span class="org-rainbow-delimiters-depth-4">]</span> . counsel-info-lookup-symbol<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;f1&gt; l"</span> . counsel-find-library<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c j"</span> . counsel-git-grep<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c k"</span> . counsel-rg<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-x l"</span> . counsel-locate<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-i"</span> . counsel-imenu<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-y"</span> . counsel-yank-pop<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c i 8"</span> . counsel-unicode-char<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">bind-key*</span> <span class="org-rainbow-delimiters-depth-3">[</span>remap isearch-forward<span class="org-rainbow-delimiters-depth-3">]</span> 'counsel-grep-or-swiper
             <span class="org-rainbow-delimiters-depth-3">(</span>executable-find <span class="org-string">"grep"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgb336a89"></a>diff-hl<br>
<div class="outline-text-5" id="text-orgb336a89">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">diff-hl</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>diff-hl-dir-mode diff-hl-mode diff-hl-magit-post-refresh
                              diff-hl-diff-goto-hunk<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-builtin">:map</span> diff-hl-mode-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;left-fringe&gt; &lt;mouse-1&gt;"</span> . diff-hl-diff-goto-hunk<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'diff-hl-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'vc-dir-mode-hook 'diff-hl-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'dired-mode-hook 'diff-hl-dir-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org91db29e"></a>dired<br>
<div class="outline-text-5" id="text-org91db29e">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">dired</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">require</span> '<span class="org-constant">dired</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c J"</span> . dired-double-jump<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-builtin">:map</span> dired-mode-map
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c C-c"</span> . compile<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"r"</span> . browse-url-of-dired-file<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
<ul class="org-ul">
<li><a id="orgcab3ca7"></a>dired-column<br>
<div class="outline-text-6" id="text-orgcab3ca7">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">dired-column</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:after</span> dired
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-builtin">:map</span> dired-mode-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"o"</span> . dired-column-find-file<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgcc4b4c4"></a>dired-imenu<br>
<div class="outline-text-6" id="text-orgcc4b4c4">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">dired-imenu</span>
  <span class="org-builtin">:after</span> dired<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgfeda2b3"></a>dired-subtree<br>
<div class="outline-text-6" id="text-orgfeda2b3">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">dired-subtree</span>
  <span class="org-builtin">:after</span> dired
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-builtin">:map</span> dired-mode-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;tab&gt;"</span> . dired-subtree-toggle<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;backtab&gt;"</span> . dired-subtree-cycle<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org0849610"></a>dired-x<br>
<div class="outline-text-6" id="text-org0849610">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">dired-x</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:after</span> dired
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>dired-omit-mode dired-hide-details-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'dired-mode-hook 'dired-omit-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'dired-mode-hook 'dired-hide-details-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"s-\\"</span> . dired-jump-other-window<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-builtin">:map</span> dired-mode-map
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">")"</span> . dired-omit-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="orgb4bdd93"></a>dtrt-indent<br>
<div class="outline-text-5" id="text-orgb4bdd93">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">dtrt-indent</span>
  <span class="org-builtin">:commands</span> dtrt-indent-mode
  <span class="org-builtin">:demand</span>
  <span class="org-builtin">:config</span> <span class="org-rainbow-delimiters-depth-2">(</span>dtrt-indent-mode 1<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgfb28696"></a>eldoc<br>
<div class="outline-text-5" id="text-orgfb28696">
<p>
Provides some info for the thing at the point.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">eldoc</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> eldoc-mode
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hooks '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>emacs-lisp-mode
                 eval-expression-minibuffer-setup
                 lisp-mode-interactive-mode
                 typescript-mode<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-warning">. eldoc-mode</span><span class="org-warning"><span class="org-rainbow-delimiters-depth-4">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-3">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-2">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-1">)</span></span>
</pre>
</div>
</div>
</li>
<li><a id="org0794706"></a>Emacs shell<br>
<div class="outline-text-5" id="text-org0794706">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">eshell</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c M-t"</span> . eshell<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c x"</span> . eshell<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>eshell eshell-command eshell-bol<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">em-rebind</span>
    <span class="org-builtin">:preface</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">defun</span> <span class="org-function-name">eshell-eol</span> <span class="org-rainbow-delimiters-depth-4">()</span>
      <span class="org-doc">"Goes to the end of line."</span>
      <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-4">)</span>
      <span class="org-rainbow-delimiters-depth-4">(</span>end-of-line<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-builtin">:ensure</span> nil
    <span class="org-builtin">:demand</span>
    <span class="org-builtin">:config</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">setq</span> eshell-rebind-keys-alist
          '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span><span class="org-rainbow-delimiters-depth-6">[</span><span class="org-rainbow-delimiters-depth-7">(</span>control 97<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">]</span> . eshell-bol<span class="org-rainbow-delimiters-depth-5">)</span>
            <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-rainbow-delimiters-depth-6">[</span>home<span class="org-rainbow-delimiters-depth-6">]</span> . eshell-bol<span class="org-rainbow-delimiters-depth-5">)</span>
            <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-rainbow-delimiters-depth-6">[</span><span class="org-rainbow-delimiters-depth-7">(</span>control 100<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">]</span> . eshell-delchar-or-maybe-eof<span class="org-rainbow-delimiters-depth-5">)</span>
            <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-rainbow-delimiters-depth-6">[</span>backspace<span class="org-rainbow-delimiters-depth-6">]</span> . eshell-delete-backward-char<span class="org-rainbow-delimiters-depth-5">)</span>
            <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-rainbow-delimiters-depth-6">[</span>delete<span class="org-rainbow-delimiters-depth-6">]</span> . eshell-delete-backward-char<span class="org-rainbow-delimiters-depth-5">)</span>
            <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-rainbow-delimiters-depth-6">[</span><span class="org-rainbow-delimiters-depth-7">(</span>control 119<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">]</span> . backward-kill-word<span class="org-rainbow-delimiters-depth-5">)</span>
            <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-rainbow-delimiters-depth-6">[</span><span class="org-rainbow-delimiters-depth-7">(</span>control 117<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">]</span> . eshell-kill-input<span class="org-rainbow-delimiters-depth-5">)</span>
            <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-rainbow-delimiters-depth-6">[</span>tab<span class="org-rainbow-delimiters-depth-6">]</span> . completion-at-point<span class="org-rainbow-delimiters-depth-5">)</span>
            <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-rainbow-delimiters-depth-6">[</span><span class="org-rainbow-delimiters-depth-7">(</span>control 101<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">]</span> . eshell-eol<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> eshell-modules-list
        '<span class="org-rainbow-delimiters-depth-3">(</span>eshell-alias
          eshell-banner
          eshell-basic
          eshell-cmpl
          eshell-dirs
          eshell-glob
          eshell-hist
          eshell-ls
          eshell-pred
          eshell-prompt
          eshell-rebind
          eshell-script
          eshell-smart
          eshell-term
          eshell-tramp
          eshell-unix
          eshell-xtra<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
<ul class="org-ul">
<li><a id="org616066b"></a>esh-help<br>
<div class="outline-text-6" id="text-org616066b">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">esh-help</span>
  <span class="org-builtin">:commands</span> esh-help-eldoc-command
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>create-hook-helper esh-help-setup <span class="org-rainbow-delimiters-depth-3">()</span>
          <span class="org-builtin">:hooks</span> <span class="org-rainbow-delimiters-depth-3">(</span>eshell-mode-hook<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span>make-local-variable 'eldoc-documentation-function<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">setq</span> eldoc-documentation-function 'esh-help-eldoc-command<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span>eldoc-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgec85a74"></a>em-dired<br>
<div class="outline-text-6" id="text-orgec85a74">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">em-dired</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>em-dired-mode em-dired-new<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-builtin">:map</span> dired-mode-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"e"</span> . em-dired<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'eshell-mode-hook 'em-dired-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>advice-add 'eshell <span class="org-builtin">:before</span> 'em-dired-new<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="org86af668"></a>Emacs speaks statistics<br>
<div class="outline-text-5" id="text-org86af668">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ess-site</span>
  <span class="org-builtin">:ensure</span> ess
  <span class="org-builtin">:no-require</span>
  <span class="org-builtin">:commands</span> R<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgc361b23"></a>esup<br>
<div class="outline-text-5" id="text-orgc361b23">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">esup</span>
  <span class="org-builtin">:commands</span> esup
  <span class="org-builtin">:preface</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">init-profile</span> <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>esup <span class="org-rainbow-delimiters-depth-4">(</span>locate-library <span class="org-string">"default"</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orge91b1bb"></a>flycheck<br>
<div class="outline-text-5" id="text-orge91b1bb">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">flycheck</span>
  <span class="org-builtin">:demand</span>
  <span class="org-builtin">:commands</span> global-flycheck-mode
  <span class="org-builtin">:config</span> <span class="org-rainbow-delimiters-depth-2">(</span>global-flycheck-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
<ul class="org-ul">
<li><a id="org399119f"></a>flycheck-irony<br>
<div class="outline-text-6" id="text-org399119f">
<p>
This is currently disabled.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">flycheck-irony</span>
  <span class="org-builtin">:commands</span> flycheck-irony-setup
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'flycheck-mode-hook 'flycheck-irony-setup<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="org6c4796c"></a>flyspell<br>
<div class="outline-text-5" id="text-org6c4796c">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">flyspell</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:preface</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">require</span> '<span class="org-constant">ispell</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:when</span> <span class="org-rainbow-delimiters-depth-2">(</span>executable-find ispell-program-name<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>flyspell-mode flyspell-prog-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> flyspell-use-meta-tab nil<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'text-mode-hook 'flyspell-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'flyspell-prog-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org94e0f77"></a>gnus<br>
<div class="outline-text-5" id="text-org94e0f77">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">gnus</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> gnus
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'gnus-group-mode-hook 'gnus-topic-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org9c4a6a0"></a>god-mode<br>
<div class="outline-text-5" id="text-org9c4a6a0">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">god-mode</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;escape&gt;"</span> . god-local-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org292e030"></a>gud<br>
<div class="outline-text-5" id="text-org292e030">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">gud</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> gud-gdb
  <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgab506b5"></a>help<br>
<div class="outline-text-5" id="text-orgab506b5">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">help</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-builtin">:map</span> help-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-v"</span> . find-variable<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-k"</span> . find-function-on-key<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-f"</span> . find-function<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-l"</span> . find-library<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-builtin">:map</span> help-mode-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"g"</span> . revert-buffer-no-confirm<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:preface</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">revert-buffer-no-confirm</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-type">&amp;optional</span> ignore-auto<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-doc">"Revert current buffer without asking."</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">interactive</span> <span class="org-rainbow-delimiters-depth-4">(</span>list <span class="org-rainbow-delimiters-depth-5">(</span>not current-prefix-arg<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>revert-buffer ignore-auto t nil<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org344918e"></a>helpful<br>
<div class="outline-text-5" id="text-org344918e">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">helpful</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-h f"</span> . helpful-callable<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-h v"</span> . helpful-variable<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgd14b455"></a>ivy<br>
<div class="outline-text-5" id="text-orgd14b455">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ivy</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;f6&gt;"</span> . ivy-resume<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>remap list-buffers<span class="org-rainbow-delimiters-depth-4">]</span> . ivy-switch-buffer<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-builtin">:map</span> ivy-minibuffer-map
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;escape&gt;"</span> . abort-recursive-edit<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:commands</span> ivy-mode
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">require</span> '<span class="org-constant">ivy</span> nil t<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defvar</span> <span class="org-variable-name">projectile-completion-system</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defvar</span> <span class="org-variable-name">magit-completing-read-function</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defvar</span> <span class="org-variable-name">dumb-jump-selector</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defvar</span> <span class="org-variable-name">rtags-display-result-backend</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defvar</span> <span class="org-variable-name">projector-completion-system</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> projectile-completion-system 'ivy
        magit-completing-read-function 'ivy-completing-read
        dumb-jump-selector 'ivy
        rtags-display-result-backend 'ivy
        projector-completion-system 'ivy<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:config</span> <span class="org-rainbow-delimiters-depth-2">(</span>ivy-mode 1<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org8313f45"></a>kill-or-bury-alive<br>
<div class="outline-text-5" id="text-org8313f45">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">kill-or-bury-alive</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>remap kill-buffer<span class="org-rainbow-delimiters-depth-4">]</span> . kill-or-bury-alive<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org4d42a35"></a>magit<br>
<div class="outline-text-5" id="text-org4d42a35">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">magit</span>
  <span class="org-builtin">:preface</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">magit-dired-other-window</span> <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>dired-other-window <span class="org-rainbow-delimiters-depth-4">(</span>magit-toplevel<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>

  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">magit-remote-github</span> <span class="org-rainbow-delimiters-depth-3">(</span>username <span class="org-type">&amp;optional</span> args<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">interactive</span> <span class="org-rainbow-delimiters-depth-4">(</span>list <span class="org-rainbow-delimiters-depth-5">(</span>magit-read-string-ns <span class="org-string">"User name"</span><span class="org-rainbow-delimiters-depth-5">)</span>
                       <span class="org-rainbow-delimiters-depth-5">(</span>magit-remote-arguments<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">let*</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>url <span class="org-rainbow-delimiters-depth-6">(</span>magit-get <span class="org-string">"remote.origin.url"</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span>
           <span class="org-rainbow-delimiters-depth-5">(</span>match <span class="org-rainbow-delimiters-depth-6">(</span>string-match <span class="org-string">"^https?://github</span><span class="org-string"><span class="org-warning">\</span></span><span class="org-string">.com/[</span><span class="org-string"><span class="org-negation-char">^</span></span><span class="org-string">/]*/</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(</span></span><span class="org-string">.*</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string">"</span> url<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span>
      <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">unless</span> match
        <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-warning">error</span> <span class="org-string">"Not a github remote"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span>
      <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-rainbow-delimiters-depth-6">(</span>repo <span class="org-rainbow-delimiters-depth-7">(</span>match-string 1 url<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span>
        <span class="org-rainbow-delimiters-depth-5">(</span>apply 'magit-remote-add username <span class="org-rainbow-delimiters-depth-6">(</span>format <span class="org-string">"https://github.com/%s/%s"</span>
                                                  username repo<span class="org-rainbow-delimiters-depth-6">)</span> <span class="org-warning">args</span><span class="org-warning"><span class="org-rainbow-delimiters-depth-5">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-4">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-3">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-2">)</span></span>

  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>magit-clone
             magit-toplevel
             magit-read-string-ns
             magit-remote-arguments
             magit-get
             magit-remote-add
             magit-define-popup-action<span class="org-rainbow-delimiters-depth-2">)</span>

  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-x g"</span> . magit-status<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-x G"</span> . magit-dispatch-popup<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-builtin">:map</span> magit-mode-map
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-o"</span> . magit-dired-other-window<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defvar</span> <span class="org-variable-name">magit-last-seen-setup-instructions</span> <span class="org-string">"1.4.0"</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>create-hook-helper magit-github-hook <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-builtin">:hooks</span> <span class="org-rainbow-delimiters-depth-3">(</span>magit-mode-hook<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>magit-define-popup-action 'magit-remote-popup
      ?g <span class="org-string">"Add remote from github user name"</span> #'magit-remote-github<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgdf80e32"></a>mb-depth<br>
<div class="outline-text-5" id="text-orgdf80e32">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">mb-depth</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> minibuffer-depth-indicate-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'minibuffer-setup-hook 'minibuffer-depth-indicate-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org93f2f02"></a>mmm-mode<br>
<div class="outline-text-5" id="text-org93f2f02">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">mmm-mode</span>
  <span class="org-builtin">:commands</span> mmm-mode
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">mmm-auto</span>
    <span class="org-builtin">:ensure</span> nil
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org4069bb3"></a>multiple-cursors<br>
<div class="outline-text-5" id="text-org4069bb3">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">multiple-cursors</span>
  <span class="org-builtin">:bind</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;C-S-down&gt;"</span> . mc/mark-next-like-this<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;C-S-up&gt;"</span> . mc/mark-previous-like-this<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-&gt;"</span> . mc/mark-next-like-this<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-&lt;"</span> . mc/mark-previous-like-this<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-&lt;mouse-1&gt;"</span> . mc/add-cursor-on-click<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c C-&lt;"</span>     . mc/mark-all-like-this<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-!"</span>         . mc/mark-next-symbol-like-this<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-S-c C-S-c"</span> . mc/edit-lines<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org7cb9119"></a>mwim<br>
<div class="outline-text-5" id="text-org7cb9119">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">mwim</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>remap move-beginning-of-line<span class="org-rainbow-delimiters-depth-4">]</span> . mwim-beginning-of-code-or-line<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>remap move-end-of-line<span class="org-rainbow-delimiters-depth-4">]</span> . mwim-end-of-code-or-line<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgb0d3089"></a>org-mode<br>
<div class="outline-text-5" id="text-orgb0d3089">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">org</span>
  <span class="org-builtin">:ensure</span> org-plus-contrib
  <span class="org-builtin">:commands</span> org-capture
  <span class="org-builtin">:bind*</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c c"</span> . org-capture<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c a"</span> . org-agenda<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c l"</span> . org-store-link<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c b"</span> . org-iswitchb<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:preface</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">org-completion-symbols</span> <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-4">(</span>looking-back <span class="org-string">"=[a-zA-Z]+"</span><span class="org-rainbow-delimiters-depth-4">)</span>
      <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-5">(</span>cands<span class="org-rainbow-delimiters-depth-5">)</span>
        <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">save-match-data</span>
          <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">save-excursion</span>
            <span class="org-rainbow-delimiters-depth-7">(</span>goto-char <span class="org-rainbow-delimiters-depth-8">(</span>point-min<span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span>
            <span class="org-rainbow-delimiters-depth-7">(</span><span class="org-keyword">while</span> <span class="org-rainbow-delimiters-depth-8">(</span>re-search-forward <span class="org-string">"=</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(</span></span><span class="org-string">[a-zA-Z]+</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string">="</span> nil t<span class="org-rainbow-delimiters-depth-8">)</span>
              <span class="org-rainbow-delimiters-depth-8">(</span><span class="org-keyword">cl-pushnew</span>
               <span class="org-rainbow-delimiters-depth-9">(</span>match-string-no-properties 0<span class="org-rainbow-delimiters-depth-9">)</span> cands <span class="org-builtin">:test</span> 'equal<span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span>
            cands<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span>
        <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">when</span> cands
          <span class="org-rainbow-delimiters-depth-6">(</span>list <span class="org-rainbow-delimiters-depth-7">(</span>match-beginning 0<span class="org-rainbow-delimiters-depth-7">)</span> <span class="org-rainbow-delimiters-depth-7">(</span>match-end 0<span class="org-rainbow-delimiters-depth-7">)</span> cands<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">org-completion-refs</span> <span class="org-rainbow-delimiters-depth-3">()</span>
  <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-4">(</span>looking-back <span class="org-string">"\\\\</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(?:</span></span><span class="org-string">ref</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">|</span></span><span class="org-string">label</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string">{</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(</span></span><span class="org-string">[</span><span class="org-string"><span class="org-negation-char">^</span></span><span class="org-string">\n{}]</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string">*"</span><span class="org-rainbow-delimiters-depth-4">)</span>
    <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-5">(</span>cands beg end<span class="org-rainbow-delimiters-depth-5">)</span>
      <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">save-excursion</span>
        <span class="org-rainbow-delimiters-depth-6">(</span>goto-char <span class="org-rainbow-delimiters-depth-7">(</span>point-min<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span>
        <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">while</span> <span class="org-rainbow-delimiters-depth-7">(</span>re-search-forward <span class="org-string">"\\label{</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(</span></span><span class="org-string">[</span><span class="org-string"><span class="org-negation-char">^</span></span><span class="org-string">}]+</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string">}"</span> nil t<span class="org-rainbow-delimiters-depth-7">)</span>
          <span class="org-rainbow-delimiters-depth-7">(</span><span class="org-keyword">push</span> <span class="org-rainbow-delimiters-depth-8">(</span>match-string-no-properties 1<span class="org-rainbow-delimiters-depth-8">)</span> cands<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span>
      <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">save-excursion</span>
        <span class="org-rainbow-delimiters-depth-6">(</span>up-list<span class="org-rainbow-delimiters-depth-6">)</span>
        <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">setq</span> end <span class="org-rainbow-delimiters-depth-7">(</span>1- <span class="org-rainbow-delimiters-depth-8">(</span>point<span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span>
        <span class="org-rainbow-delimiters-depth-6">(</span>backward-list<span class="org-rainbow-delimiters-depth-6">)</span>
        <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">setq</span> beg <span class="org-rainbow-delimiters-depth-7">(</span>1+ <span class="org-rainbow-delimiters-depth-8">(</span>point<span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span>
      <span class="org-rainbow-delimiters-depth-5">(</span>list beg end
            <span class="org-rainbow-delimiters-depth-6">(</span>delete <span class="org-rainbow-delimiters-depth-7">(</span>buffer-substring-no-properties beg end<span class="org-rainbow-delimiters-depth-7">)</span>
                    <span class="org-rainbow-delimiters-depth-7">(</span>nreverse cands<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'org-mode-hook 'auto-fill-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'org-mode-hook
            <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-4">()</span>
              <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">setq-local</span> completion-at-point-functions
                          '<span class="org-rainbow-delimiters-depth-5">(</span>org-completion-symbols
                            org-completion-refs
                            pcomplete-completions-at-point<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ob-dot</span>
    <span class="org-builtin">:ensure</span> nil
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ox-rss</span>
    <span class="org-builtin">:ensure</span> nil
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ox-latex</span>
    <span class="org-builtin">:ensure</span> nil
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ox-beamer</span>
    <span class="org-builtin">:ensure</span> nil
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ox-md</span>
    <span class="org-builtin">:ensure</span> nil
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ox-reveal</span>
    <span class="org-builtin">:disabled</span>
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ox-pandoc</span>
    <span class="org-builtin">:disabled</span>
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ob-http</span>
    <span class="org-builtin">:disabled</span>
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">org-brain</span>
    <span class="org-builtin">:disabled</span>
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">org-projectile</span>
    <span class="org-builtin">:disabled</span>
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">org-present</span>
    <span class="org-builtin">:disabled</span>
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">org-ref</span>
    <span class="org-builtin">:disabled</span>
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">org-autolist</span>
    <span class="org-builtin">:disabled</span>
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ox-tufte</span>
    <span class="org-builtin">:disabled</span>
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">org-static-blog</span>
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>org-babel-do-load-languages 'org-babel-load-languages
                               '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>sh . t<span class="org-rainbow-delimiters-depth-4">)</span>
                                 <span class="org-rainbow-delimiters-depth-4">(</span>emacs-lisp . t<span class="org-rainbow-delimiters-depth-4">)</span>
                                 <span class="org-rainbow-delimiters-depth-4">(</span>dot . t<span class="org-rainbow-delimiters-depth-4">)</span>
                                 <span class="org-rainbow-delimiters-depth-4">(</span>latex . t<span class="org-rainbow-delimiters-depth-4">)</span>
                                 <span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org3374a9c"></a>Projectile<br>
<div class="outline-text-5" id="text-org3374a9c">
<p>
Setup projectile and link it with some other packages. This also adds an
easymenu to make the &ldquo;Projectile&rdquo; modeline clickable.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">projectile</span>
  <span class="org-builtin">:bind-keymap*</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c p"</span> . projectile-command-map<span class="org-rainbow-delimiters-depth-3">)</span>
                 <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"s-p"</span> . projectile-command-map<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-builtin">:map</span> projectile-command-map
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"s r"</span> . projectile-rg<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:preface</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">projectile-rg</span> <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-doc">"Run ripgrep in projectile."</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>counsel-rg <span class="org-string">""</span> <span class="org-rainbow-delimiters-depth-4">(</span>projectile-project-root<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>projectile-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:defer</span> 1
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>put 'projectile-project-run-cmd 'safe-local-variable #'stringp<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>put 'projectile-project-compilation-cmd 'safe-local-variable
       <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-4">(</span>a<span class="org-rainbow-delimiters-depth-4">)</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">and</span> <span class="org-rainbow-delimiters-depth-5">(</span>stringp a<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">or</span> <span class="org-rainbow-delimiters-depth-6">(</span>not <span class="org-rainbow-delimiters-depth-7">(</span>boundp 'compilation-read-command<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span>
                                        compilation-read-command<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>

  <span class="org-rainbow-delimiters-depth-2">(</span>projectile-mode<span class="org-rainbow-delimiters-depth-2">)</span>

  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">easymenu</span>
    <span class="org-builtin">:ensure</span> nil
    <span class="org-builtin">:config</span>

    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">easy-menu-define</span> projectile-menu projectile-mode-map <span class="org-doc">"Projectile"</span>
      '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Projectile"</span>
        <span class="org-builtin">:active</span> nil
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Find file"</span> projectile-find-file<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Find file in known projects"</span> projectile-find-file-in-known-projects<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Find test file"</span> projectile-find-test-file<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Find directory"</span> projectile-find-dir<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Find file in directory"</span> projectile-find-file-in-directory<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Find other file"</span> projectile-find-other-file<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Switch to buffer"</span> projectile-switch-to-buffer<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Jump between implementation file and test file"</span>
         projectile-toggle-between-implementation-and-test<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Kill project buffers"</span> projectile-kill-buffers<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Recent files"</span> projectile-recentf<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Edit .dir-locals.el"</span> projectile-edit-dir-locals<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-string">"--"</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Open project in dired"</span> projectile-dired<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Switch to project"</span> projectile-switch-project<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Switch to open project"</span> projectile-switch-open-project<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Discover projects in directory"</span>
         projectile-discover-projects-in-directory<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Search in project (grep)"</span> projectile-grep<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Search in project (ag)"</span> projectile-ag<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Replace in project"</span> projectile-replace<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Multi-occur in project"</span> projectile-multi-occur<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Browse dirty projects"</span> projectile-browse-dirty-projects<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-string">"--"</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Run shell"</span> projectile-run-shell<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Run eshell"</span> projectile-run-eshell<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Run term"</span> projectile-run-term<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-string">"--"</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Cache current file"</span> projectile-cache-current-file<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Invalidate cache"</span> projectile-invalidate-cache<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Regenerate [e|g]tags"</span> projectile-regenerate-tags<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-string">"--"</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Compile project"</span> projectile-compile-project<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Test project"</span> projectile-test-project<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Run project"</span> projectile-run-project<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-string">"--"</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"Project info"</span> projectile-project-info<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-5">[</span><span class="org-string">"About"</span> projectile-version<span class="org-rainbow-delimiters-depth-5">]</span>
        <span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org91063c2"></a>Proof General<br>
<div class="outline-text-5" id="text-org91063c2">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">proof-site</span>
  <span class="org-builtin">:ensure</span> proofgeneral
  <span class="org-builtin">:no-require</span>
  <span class="org-builtin">:disabled</span> needs-package-init
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>proofgeneral proof-mode proof-shell-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org9b47b50"></a>Ripgrep<br>
<div class="outline-text-5" id="text-org9b47b50">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">rg</span>
  <span class="org-builtin">:commands</span> rg<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgcc1654a"></a>Shell<br>
<div class="outline-text-5" id="text-orgcc1654a">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">shell</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>shell shell-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"C-c C-s"</span> . shell<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'shell-mode-hook 'dirtrack-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>create-hook-helper use-histfile <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-builtin">:hooks</span> <span class="org-rainbow-delimiters-depth-3">(</span>shell-mode-hook<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>turn-on-comint-history <span class="org-rainbow-delimiters-depth-4">(</span>getenv <span class="org-string">"HISTFILE"</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgddcfb20"></a>smart-hungry-delete<br>
<div class="outline-text-5" id="text-orgddcfb20">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">smart-hungry-delete</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>smart-hungry-delete-default-c-mode-common-hook
             smart-hungry-delete-default-prog-mode-hook
             smart-hungry-delete-default-text-mode-hook<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-builtin">:map</span> prog-mode-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;backspace&gt;"</span> . smart-hungry-delete-backward-char<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-d"</span> . smart-hungry-delete-forward-char<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'smart-hungry-delete-default-prog-mode-hook<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'c-mode-common-hook 'smart-hungry-delete-default-c-mode-common-hook<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'python-mode-hook 'smart-hungry-delete-default-c-mode-common-hook<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'text-mode-hook 'smart-hungry-delete-default-text-mode-hook<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgfa701d0"></a>Smartparens<br>
<div class="outline-text-5" id="text-orgfa701d0">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">smartparens</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>smartparens-mode
             show-smartparens-mode
             smartparens-strict-mode
             sp-local-tag
             sp-local-pair<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-builtin">:map</span> smartparens-mode-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-k"</span> . sp-kill-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-f"</span> . sp-forward-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-b"</span> . sp-backward-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-n"</span> . sp-up-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-d"</span> . sp-down-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-u"</span> . sp-backward-up-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-p"</span> . sp-backward-down-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-w"</span> . sp-copy-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-s"</span> . sp-splice-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-}"</span> . sp-forward-barf-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-{"</span> . sp-backward-barf-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-S"</span> . sp-split-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-J"</span> . sp-join-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-t"</span> . sp-transpose-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-&lt;right&gt;"</span> . sp-forward-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-&lt;left&gt;"</span> . sp-backward-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-F"</span> . sp-forward-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-B"</span> . sp-backward-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-a"</span> . sp-backward-down-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-S-d"</span> . sp-beginning-of-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-S-a"</span> . sp-end-of-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-M-e"</span> . sp-up-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-("</span> . sp-forward-barf-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-)"</span> . sp-forward-slurp-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-("</span> . sp-forward-barf-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-)"</span> . sp-forward-slurp-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-D"</span> . sp-splice-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-&lt;down&gt;"</span> . sp-down-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-&lt;up&gt;"</span>   . sp-up-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-&lt;down&gt;"</span> . sp-splice-sexp-killing-forward<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-&lt;up&gt;"</span>   . sp-splice-sexp-killing-backward<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-&lt;right&gt;"</span> . sp-forward-slurp-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-&lt;right&gt;"</span> . sp-forward-barf-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-&lt;left&gt;"</span>  . sp-backward-slurp-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-&lt;left&gt;"</span>  . sp-backward-barf-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-k"</span>   . sp-kill-hybrid-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-k"</span>   . sp-backward-kill-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-&lt;backspace&gt;"</span> . backward-kill-word<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-&lt;backspace&gt;"</span> . sp-backward-kill-word<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>remap sp-backward-kill-word<span class="org-rainbow-delimiters-depth-4">]</span> . backward-kill-word<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-["</span> . sp-backward-unwrap-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-]"</span> . sp-unwrap-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-x C-t"</span> . sp-transpose-hybrid-sexp<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-builtin">:map</span> smartparens-strict-mode-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>remap c-electric-backspace<span class="org-rainbow-delimiters-depth-4">]</span> . sp-backward-delete-char<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-builtin">:map</span> emacs-lisp-mode-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">";"</span> . sp-comment<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hooks '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>emacs-lisp-mode
                 inferior-emacs-lisp-mode
                 ielm-mode
                 lisp-mode
                 inferior-lisp-mode
                 lisp-interaction-mode
                 slime-repl-mode
                 eval-expression-minibuffer-setup<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-warning">. smartparens-strict-mode</span><span class="org-warning"><span class="org-rainbow-delimiters-depth-4">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-3">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-2">)</span></span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hooks '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>emacs-lisp-mode
                 inferior-emacs-lisp-mode
                 ielm-mode
                 lisp-mode
                 inferior-lisp-mode
                 lisp-interaction-mode
                 slime-repl-mode<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-warning">. show-smartparens-mode</span><span class="org-warning"><span class="org-rainbow-delimiters-depth-4">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-3">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-2">)</span></span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hooks '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>web-mode
                 nxml-mode
                 html-mode<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-warning">. smartparens-mode</span><span class="org-warning"><span class="org-rainbow-delimiters-depth-4">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-3">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-2">)</span></span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">smartparens-html</span>
    <span class="org-builtin">:ensure</span> nil
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">smartparens-config</span>
    <span class="org-builtin">:ensure</span> nil
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>

  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">sp-with-modes</span> 'org-mode
    <span class="org-rainbow-delimiters-depth-3">(</span>sp-local-pair <span class="org-string">"*"</span> <span class="org-string">"*"</span>
                   <span class="org-builtin">:actions</span> '<span class="org-rainbow-delimiters-depth-4">(</span>insert wrap<span class="org-rainbow-delimiters-depth-4">)</span>
                   <span class="org-builtin">:unless</span> '<span class="org-rainbow-delimiters-depth-4">(</span>sp-point-after-word-p sp-point-at-bol-p<span class="org-rainbow-delimiters-depth-4">)</span>
                   <span class="org-builtin">:wrap</span> <span class="org-string">"C-*"</span> <span class="org-builtin">:skip-match</span> 'sp--org-skip-asterisk<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>sp-local-pair <span class="org-string">"_"</span> <span class="org-string">"_"</span> <span class="org-builtin">:unless</span> '<span class="org-rainbow-delimiters-depth-4">(</span>sp-point-after-word-p<span class="org-rainbow-delimiters-depth-4">)</span> <span class="org-builtin">:wrap</span> <span class="org-string">"C-_"</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>sp-local-pair <span class="org-string">"/"</span> <span class="org-string">"/"</span> <span class="org-builtin">:unless</span> '<span class="org-rainbow-delimiters-depth-4">(</span>sp-point-after-word-p<span class="org-rainbow-delimiters-depth-4">)</span>
                   <span class="org-builtin">:post-handlers</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span><span class="org-string">"[d1]"</span> <span class="org-string">"SPC"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>sp-local-pair <span class="org-string">"~"</span> <span class="org-string">"~"</span> <span class="org-builtin">:unless</span> '<span class="org-rainbow-delimiters-depth-4">(</span>sp-point-after-word-p<span class="org-rainbow-delimiters-depth-4">)</span>
                   <span class="org-builtin">:post-handlers</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span><span class="org-string">"[d1]"</span> <span class="org-string">"SPC"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>sp-local-pair <span class="org-string">"="</span> <span class="org-string">"="</span> <span class="org-builtin">:unless</span> '<span class="org-rainbow-delimiters-depth-4">(</span>sp-point-after-word-p<span class="org-rainbow-delimiters-depth-4">)</span>
                   <span class="org-builtin">:post-handlers</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span><span class="org-string">"[d1]"</span> <span class="org-string">"SPC"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>sp-local-pair <span class="org-string">"&#171;"</span> <span class="org-string">"&#187;"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>

  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">sp-with-modes</span>
      '<span class="org-rainbow-delimiters-depth-3">(</span>java-mode c++-mode<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>sp-local-pair <span class="org-string">"{"</span> nil <span class="org-builtin">:post-handlers</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span><span class="org-string">"||\n[i]"</span> <span class="org-string">"RET"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>sp-local-pair <span class="org-string">"/*"</span> <span class="org-string">"*/"</span> <span class="org-builtin">:post-handlers</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span><span class="org-string">" | "</span> <span class="org-string">"SPC"</span><span class="org-rainbow-delimiters-depth-5">)</span>
                                              <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-string">"* ||\n[i]"</span> <span class="org-string">"RET"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>

  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">sp-with-modes</span> '<span class="org-rainbow-delimiters-depth-3">(</span>markdown-mode gfm-mode rst-mode<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>sp-local-pair <span class="org-string">"*"</span> <span class="org-string">"*"</span> <span class="org-builtin">:bind</span> <span class="org-string">"C-*"</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>sp-local-tag <span class="org-string">"2"</span> <span class="org-string">"**"</span> <span class="org-string">"**"</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>sp-local-tag <span class="org-string">"s"</span> <span class="org-string">"```scheme"</span> <span class="org-string">"```"</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>sp-local-tag <span class="org-string">"&lt;"</span>  <span class="org-string">"&lt;_&gt;"</span> <span class="org-string">"&lt;/_&gt;"</span> <span class="org-builtin">:transform</span> 'sp-match-sgml-tags<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>

  <span class="org-rainbow-delimiters-depth-2">(</span>sp-local-pair 'emacs-lisp-mode <span class="org-string">"`"</span> nil <span class="org-builtin">:when</span> '<span class="org-rainbow-delimiters-depth-3">(</span>sp-in-string-p<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>sp-local-pair 'clojure-mode <span class="org-string">"`"</span> <span class="org-string">"`"</span> <span class="org-builtin">:when</span> '<span class="org-rainbow-delimiters-depth-3">(</span>sp-in-string-p<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>sp-local-pair 'minibuffer-inactive-mode <span class="org-string">"'"</span> nil <span class="org-builtin">:actions</span> nil<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>sp-local-pair 'org-mode <span class="org-string">"~"</span> <span class="org-string">"~"</span> <span class="org-builtin">:actions</span> '<span class="org-rainbow-delimiters-depth-3">(</span>wrap<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>sp-local-pair 'org-mode <span class="org-string">"/"</span> <span class="org-string">"/"</span> <span class="org-builtin">:actions</span> '<span class="org-rainbow-delimiters-depth-3">(</span>wrap<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>sp-local-pair 'org-mode <span class="org-string">"*"</span> <span class="org-string">"*"</span> <span class="org-builtin">:actions</span> '<span class="org-rainbow-delimiters-depth-3">(</span>wrap<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org9d0ce02"></a>sudo-edit<br>
<div class="outline-text-5" id="text-org9d0ce02">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">sudo-edit</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c C-r"</span> . sudo-edit<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org7627cfc"></a>swiper<br>
<div class="outline-text-5" id="text-org7627cfc">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">swiper</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org70d65b9"></a>term<br>
<div class="outline-text-5" id="text-org70d65b9">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">term</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>term-mode term-char-mode term-set-escape-char<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'term-mode-hook <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-4">()</span>
                              <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">setq</span> term-prompt-regexp <span class="org-string">"^[</span><span class="org-string"><span class="org-negation-char">^</span></span><span class="org-string">#$%&gt;\n]*[#$%&gt;] *"</span><span class="org-rainbow-delimiters-depth-4">)</span>
                              <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">setq-local</span> transient-mark-mode nil<span class="org-rainbow-delimiters-depth-4">)</span>
                              <span class="org-rainbow-delimiters-depth-4">(</span>auto-fill-mode -1<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:preface</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">my-term</span> <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>set-buffer <span class="org-rainbow-delimiters-depth-4">(</span>make-term <span class="org-string">"my-term"</span> <span class="org-string">"zsh"</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>term-mode<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>term-char-mode<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>term-set-escape-char ?\C-x<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>switch-to-buffer <span class="org-string">"*my-term*"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"C-c t"</span> . my-term<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgeb39dc5"></a>tramp<br>
<div class="outline-text-5" id="text-orgeb39dc5">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">tramp</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>tramp-tramp-file-p
             tramp-file-name-user
             tramp-file-name-real-host
             tramp-dissect-file-name<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgf70e321"></a>transpose-frame<br>
<div class="outline-text-5" id="text-orgf70e321">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">transpose-frame</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"H-t"</span> . transpose-frame<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org23be421"></a>try<br>
<div class="outline-text-5" id="text-org23be421">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">try</span>
  <span class="org-builtin">:commands</span> try<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgdab2b18"></a>which-func<br>
<div class="outline-text-5" id="text-orgdab2b18">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">which-func</span>
  <span class="org-builtin">:commands</span> which-function-mode
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:demand</span>
  <span class="org-builtin">:config</span> <span class="org-rainbow-delimiters-depth-2">(</span>which-function-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org4579d70"></a>which-key<br>
<div class="outline-text-5" id="text-org4579d70">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">which-key</span>
  <span class="org-builtin">:commands</span> which-key-mode
  <span class="org-builtin">:demand</span>
  <span class="org-builtin">:config</span> <span class="org-rainbow-delimiters-depth-2">(</span>which-key-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org6c9621d"></a>whitespace-cleanup-mode<br>
<div class="outline-text-5" id="text-org6c9621d">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">whitespace-cleanup-mode</span>
  <span class="org-builtin">:commands</span> whitespace-cleanup-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'whitespace-cleanup-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org7574432"></a>whitespace<br>
<div class="outline-text-5" id="text-org7574432">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">whitespace</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> whitespace-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'whitespace-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org4c3ce88"></a>yafolding<br>
<div class="outline-text-5" id="text-org4c3ce88">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">yafolding</span>
  <span class="org-builtin">:commands</span> yafolding-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'yafolding-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</div>
<div id="outline-container-orgcca0c99" class="outline-4">
<h4 id="orgcca0c99">Built-ins</h4>
<div class="outline-text-4" id="text-orgcca0c99">
<p>
These are available automatically, so these <code>use-package</code> blocks just
configure them.
</p>
</div>
<ul class="org-ul">
<li><a id="org0d2a007"></a>align<br>
<div class="outline-text-5" id="text-org0d2a007">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">align</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c ["</span> . align-regexp<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:commands</span> align
  <span class="org-builtin">:ensure</span> nil<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org2bdf2cf"></a>ansi-color<br>
<div class="outline-text-5" id="text-org2bdf2cf">
<p>
Get color/ansi codes in compilation mode.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ansi-color</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> ansi-color-apply-on-region
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>create-hook-helper colorize-compilation-buffer <span class="org-rainbow-delimiters-depth-3">()</span>
          <span class="org-builtin">:hooks</span> <span class="org-rainbow-delimiters-depth-3">(</span>compilation-filter-hook<span class="org-rainbow-delimiters-depth-3">)</span>
          <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>inhibit-read-only t<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span>
            <span class="org-rainbow-delimiters-depth-4">(</span>ansi-color-apply-on-region <span class="org-rainbow-delimiters-depth-5">(</span>point-min<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-rainbow-delimiters-depth-5">(</span>point-max<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org839514a"></a>autorevert<br>
<div class="outline-text-5" id="text-org839514a">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">autorevert</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:demand</span>
  <span class="org-builtin">:commands</span> auto-revert-mode
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'dired-mode-hook 'auto-revert-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>global-auto-revert-mode t<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org474abdf"></a>bug-reference<br>
<div class="outline-text-5" id="text-org474abdf">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">bug-reference</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> bug-reference-prog-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'bug-reference-prog-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
<ul class="org-ul">
<li><a id="org08a7267"></a>bug-reference-github<br>
<div class="outline-text-6" id="text-org08a7267">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">bug-reference-github</span>
  <span class="org-builtin">:commands</span> bug-reference-github-set-url-format
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'bug-reference-github-set-url-format<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="orgae96488"></a>comint<br>
<div class="outline-text-5" id="text-orgae96488">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">comint</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:bind</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-builtin">:map</span> comint-mode-map
        <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-r"</span>       . comint-history-isearch-backward-regexp<span class="org-rainbow-delimiters-depth-3">)</span>
        <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"s-k"</span>       . comint-clear-buffer<span class="org-rainbow-delimiters-depth-3">)</span>
        <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-TAB"</span>     . comint-previous-matching-input-from-input<span class="org-rainbow-delimiters-depth-3">)</span>
        <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;M-S-tab&gt;"</span> . comint-next-matching-input-from-input<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>comint-next-prompt
             comint-write-input-ring
             comint-after-pmark-p
             comint-read-input-ring
             comint-send-input<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:preface</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">turn-on-comint-history</span> <span class="org-rainbow-delimiters-depth-3">(</span>history-file<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">setq</span> comint-input-ring-file-name history-file<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>comint-read-input-ring 'silent<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'kill-buffer-hook 'comint-write-input-ring<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>create-hook-helper save-history <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-builtin">:hooks</span> <span class="org-rainbow-delimiters-depth-3">(</span>kill-emacs-hook<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">dolist</span> <span class="org-rainbow-delimiters-depth-4">(</span>buffer <span class="org-rainbow-delimiters-depth-5">(</span>buffer-list<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span>
      <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">with-current-buffer</span> buffer <span class="org-rainbow-delimiters-depth-5">(</span>comint-write-input-ring<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgbaa206e"></a>delsel<br>
<div class="outline-text-5" id="text-orgbaa206e">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">delsel</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:demand</span>
  <span class="org-builtin">:config</span> <span class="org-rainbow-delimiters-depth-2">(</span>delete-selection-mode t<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org119b0ed"></a>edebug<br>
<div class="outline-text-5" id="text-org119b0ed">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">edebug</span>
  <span class="org-builtin">:ensure</span> nil<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org5fe6acf"></a>electric<br>
<div class="outline-text-5" id="text-org5fe6acf">
<p>
Setup these modes:
</p>

<ul class="org-ul">
<li>electric-quote</li>
<li>electric-indent</li>
<li>electric-layout</li>
</ul>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">electric</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>electric-quote-mode electric-indent-mode electric-layout-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'electric-quote-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'electric-indent-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'electric-layout-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
<ul class="org-ul">
<li><a id="org0cc6f66"></a>elec-pair<br>
<div class="outline-text-6" id="text-org0cc6f66">
<p>
Setup electric-pair-mode for prog-modes. Also disable it when smartparens is
setup.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">elec-pair</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> electric-pair-mode
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'electric-pair-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'smartparens-mode-hook <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-4">()</span> <span class="org-rainbow-delimiters-depth-4">(</span>electric-pair-mode -1<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="org095b9e5"></a>etags<br>
<div class="outline-text-5" id="text-org095b9e5">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">etags</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>tags-completion-table<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org8c58eb3"></a>executable<br>
<div class="outline-text-5" id="text-org8c58eb3">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">executable</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> executable-make-buffer-file-executable-if-script-p
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'after-save-hook
            'executable-make-buffer-file-executable-if-script-p<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgfead7d9"></a>ffap<br>
<div class="outline-text-5" id="text-orgfead7d9">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ffap</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org3718e37"></a>goto-addr<br>
<div class="outline-text-5" id="text-org3718e37">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">goto-addr</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>goto-address-prog-mode goto-address-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'goto-address-prog-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'git-commit-mode-hook 'goto-address-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgba864e9"></a>grep<br>
<div class="outline-text-5" id="text-orgba864e9">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">grep</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-s d"</span> . find-grep-dired<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-s F"</span> . find-grep<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-s G"</span> . grep<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org047873c"></a>hippie-exp<br>
<div class="outline-text-5" id="text-org047873c">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">hippie-exp</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:bind*</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-/"</span>. hippie-expand<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org5f782f0"></a>ibuffer<br>
<div class="outline-text-5" id="text-org5f782f0">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ibuffer</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">[</span>remap switch-to-buffer<span class="org-rainbow-delimiters-depth-3">]</span> . ibuffer<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgf4aec12"></a>imenu<br>
<ul class="org-ul">
<li><a id="orge0d37d0"></a>imenu-anywhere<br>
<div class="outline-text-6" id="text-orge0d37d0">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">imenu-anywhere</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c i"</span> . imenu-anywhere<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"s-i"</span> . imenu-anywhere<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgf4deaab"></a>imenu-list<br>
<div class="outline-text-6" id="text-orgf4deaab">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">imenu-list</span>
  <span class="org-builtin">:commands</span> imenu-list<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="orge142686"></a>newcomment<br>
<div class="outline-text-5" id="text-orge142686">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">newcomment</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"s-/"</span> . comment-or-uncomment-region<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org48471f8"></a>notmuch<br>
<div class="outline-text-5" id="text-org48471f8">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">notmuch</span>
  <span class="org-builtin">:commands</span> notmuch<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgf6a8c9d"></a>pp<br>
<div class="outline-text-5" id="text-orgf6a8c9d">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">pp</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> pp-eval-last-sexp
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>remap eval-expression<span class="org-rainbow-delimiters-depth-4">]</span> . pp-eval-expression<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>global-unset-key <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-x C-e"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>create-hook-helper always-eval-sexp <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-builtin">:hooks</span> <span class="org-rainbow-delimiters-depth-3">(</span>lisp-mode-hook emacs-lisp-mode-hook<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span>define-key <span class="org-rainbow-delimiters-depth-4">(</span>current-local-map<span class="org-rainbow-delimiters-depth-4">)</span> <span class="org-rainbow-delimiters-depth-4">(</span>kbd <span class="org-string">"C-x C-e"</span><span class="org-rainbow-delimiters-depth-4">)</span> 'pp-eval-last-sexp<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org2149af7"></a>prog-mode<br>
<div class="outline-text-5" id="text-org2149af7">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">prog-mode</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>prettify-symbols-mode global-prettify-symbols-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'prettify-symbols-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>create-hook-helper prettify-symbols-prog <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-string">""</span>
    <span class="org-builtin">:hooks</span> <span class="org-rainbow-delimiters-depth-3">(</span>prog-mode-hook<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"&lt;="</span> . ?&#8804;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"&gt;="</span> . ?&#8805;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>create-hook-helper prettify-symbols-lisp <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-string">""</span>
    <span class="org-builtin">:hooks</span> <span class="org-rainbow-delimiters-depth-3">(</span>lisp-mode-hook<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"/="</span> . ?&#8800;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"sqrt"</span> . ?&#8730;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"not"</span> . ?&#172;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"and"</span> . ?&#8743;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"or"</span> . ?&#8744;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>create-hook-helper prettify-symbols-c <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-string">""</span>
    <span class="org-builtin">:hooks</span> <span class="org-rainbow-delimiters-depth-3">(</span>c-mode-hook<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"&lt;="</span> . ?&#8804;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"&gt;="</span> . ?&#8805;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"!="</span> . ?&#8800;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"&amp;&amp;"</span> . ?&#8743;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"||"</span> . ?&#8744;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"&gt;&gt;"</span> . ?&#187;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"&lt;&lt;"</span> . ?&#171;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>create-hook-helper prettify-symbols-c++ <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-string">""</span>
    <span class="org-builtin">:hooks</span> <span class="org-rainbow-delimiters-depth-3">(</span>c++-mode-hook<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"&lt;="</span> . ?&#8804;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"&gt;="</span> . ?&#8805;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"!="</span> . ?&#8800;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"&amp;&amp;"</span> . ?&#8743;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"||"</span> . ?&#8744;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"&gt;&gt;"</span> . ?&#187;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"&lt;&lt;"</span> . ?&#171;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"-&gt;"</span> . ?&#8594;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>create-hook-helper prettify-symbols-js <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-string">""</span>
    <span class="org-builtin">:hooks</span> <span class="org-rainbow-delimiters-depth-3">(</span>js2-mode-hook js-mode-hook<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"function"</span> . ?&#955;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">push</span> '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"=&gt;"</span> . ?&#8658;<span class="org-rainbow-delimiters-depth-4">)</span> prettify-symbols-alist<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org756885e"></a>savehist<br>
<div class="outline-text-5" id="text-org756885e">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">savehist</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:demand</span>
  <span class="org-builtin">:commands</span> savehist-mode
  <span class="org-builtin">:config</span> <span class="org-rainbow-delimiters-depth-2">(</span>savehist-mode 1<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org5ac1854"></a>simple<br>
<div class="outline-text-5" id="text-org5ac1854">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">simple</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:demand</span>
  <span class="org-builtin">:bind</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-`"</span> . list-processes<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-builtin">:map</span> minibuffer-local-map
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;escape&gt;"</span>  . abort-recursive-edit<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"M-TAB"</span>     . previous-complete-history-element<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;M-S-tab&gt;"</span> . next-complete-history-element<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:commands</span> visual-line-mode
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'text-mode-hook 'visual-line-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>column-number-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgb4f817a"></a>subword<br>
<div class="outline-text-5" id="text-orgb4f817a">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">subword</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> subword-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'java-mode-hook 'subword-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orge90a329"></a>time<br>
<div class="outline-text-5" id="text-orge90a329">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">time</span>
  <span class="org-builtin">:demand</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>display-time-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org48ff6ef"></a>tooltip<br>
<div class="outline-text-5" id="text-org48ff6ef">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">tooltip</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:demand</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>tooltip-mode -1<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgae4024d"></a>view<br>
<div class="outline-text-5" id="text-orgae4024d">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">view</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-builtin">:map</span> view-mode-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"n"</span> . next-line<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"p"</span> . previous-line<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"j"</span> . next-line<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"k"</span> . previous-line<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"l"</span> . forward-char<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"f"</span> . forward-char<span class="org-rainbow-delimiters-depth-3">)</span>
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"b"</span> . backward-char<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org42b3312"></a>windmove<br>
<div class="outline-text-5" id="text-org42b3312">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">windmove</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;s-down&gt;"</span> . windmove-down<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;s-up&gt;"</span> . windmove-up<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</div>
<div id="outline-container-orgc4e87d9" class="outline-4">
<h4 id="orgc4e87d9">Programming languages</h4>
<div class="outline-text-4" id="text-orgc4e87d9">
<p>
Each <code>use-package</code> declaration corresponds to <code>major modes</code> in Emacs lingo.
Each language will at least one of these major modes as well as associated
packages (for completion, syntax checking, etc.)
</p>
</div>
<ul class="org-ul">
<li><a id="org44fb51b"></a>C/C++<br>
<div class="outline-text-5" id="text-org44fb51b">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">cc-mode</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.h</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(</span></span><span class="org-string">h?</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">|</span></span><span class="org-string">xx</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">|</span></span><span class="org-string">pp</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string">\\'"</span> . c++-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.m\\'"</span> . c-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.c\\'"</span> . c-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.cpp\\'"</span> . c++-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.c++\\'"</span> . c++-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.mm\\'"</span> . c++-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">c-eldoc</span>
    <span class="org-builtin">:commands</span> c-turn-on-eldoc-mode
    <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-3">(</span>add-hook 'c-mode-common-hook 'c-turn-on-eldoc-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
<ul class="org-ul">
<li><a id="org1629e68"></a>irony<br>
<div class="outline-text-6" id="text-org1629e68">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">irony</span>
  <span class="org-builtin">:commands</span> irony-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hooks '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>c++-mode c-mode objc-mode<span class="org-rainbow-delimiters-depth-5">)</span> . irony-mode<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org77de06f"></a>irony-eldoc<br>
<div class="outline-text-6" id="text-org77de06f">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">irony-eldoc</span>
  <span class="org-builtin">:commands</span> irony-eldoc
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'irony-mode-hook 'irony-eldoc<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="org5f3059a"></a>CoffeeScript<br>
<div class="outline-text-5" id="text-org5f3059a">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">coffee-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.coffee\\'"</span> . coffee-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org6e06332"></a>CSS<br>
<div class="outline-text-5" id="text-org6e06332">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">css-mode</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:mode</span> <span class="org-string">"\\.css\\'"</span>
  <span class="org-builtin">:commands</span> css-mode
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">css-eldoc</span>
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgea9f0fc"></a>CSV<br>
<div class="outline-text-5" id="text-orgea9f0fc">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">csv-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-string">"\\.csv\\'"</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgc671f27"></a>ELF<br>
<div class="outline-text-5" id="text-orgc671f27">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">elf-mode</span>
  <span class="org-builtin">:commands</span> elf-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'magic-mode-alist <span class="org-rainbow-delimiters-depth-3">(</span>cons <span class="org-string">"&#127;ELF"</span> 'elf-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org4535d78"></a>Go<br>
<div class="outline-text-5" id="text-org4535d78">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">go-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-string">"\\.go\\'"</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
<ul class="org-ul">
<li><a id="org03c56bd"></a>go-eldoc<br>
<div class="outline-text-6" id="text-org03c56bd">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">go-eldoc</span>
  <span class="org-builtin">:commands</span> go-eldoc-setup
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'go-mode-hook 'go-eldoc-setup<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="org243eee8"></a>HAML<br>
<div class="outline-text-5" id="text-org243eee8">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">haml-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-string">"\\.haml\\'"</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org540f2cb"></a>Haskell<br>
<ul class="org-ul">
<li><a id="org9c948c5"></a>intero<br>
<div class="outline-text-6" id="text-org9c948c5">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">intero</span>
  <span class="org-builtin">:commands</span> intero-mode
  <span class="org-builtin">:preface</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">intero-mode-unless-global-project</span> <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-doc">"Run intero-mode iff we're in a project with a stack.yaml"</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">unless</span> <span class="org-rainbow-delimiters-depth-4">(</span>string-match-p
             <span class="org-rainbow-delimiters-depth-5">(</span>regexp-quote <span class="org-string">".stack/global-project"</span><span class="org-rainbow-delimiters-depth-5">)</span>
             <span class="org-rainbow-delimiters-depth-5">(</span>shell-command-to-string
              <span class="org-string">"stack path --project-root --verbosity silent"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span>
      <span class="org-rainbow-delimiters-depth-4">(</span>intero-mode<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'haskell-mode-hook 'intero-mode-unless-global-project<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org1ae35d8"></a>ghc<br>
<div class="outline-text-6" id="text-org1ae35d8">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ghc</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgb4e1bba"></a>haskell-mode<br>
<div class="outline-text-6" id="text-orgb4e1bba">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">haskell-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.hs\\'"</span> . haskell-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.cabal\\'"</span> . haskell-cabal-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:commands</span> haskell-indentation-moe
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'haskell-mode-hook 'haskell-indentation-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">haskell-doc</span>
    <span class="org-builtin">:ensure</span> nil
    <span class="org-builtin">:demand</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="orgf47a923"></a>Java<br>
<ul class="org-ul">
<li><a id="org61167a6"></a>jdee<br>
<div class="outline-text-6" id="text-org61167a6">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">jdee</span>
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"\\.java\\'"</span> . jdee-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:commands</span> jdee-mode
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-builtin">:map</span> jdee-mode-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"&lt;s-mouse-1&gt;"</span> . jdee-open-class-at-event<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="orgb3b0a70"></a>JavaScript<br>
<ul class="org-ul">
<li><a id="orga31a304"></a>indium<br>
<div class="outline-text-6" id="text-orga31a304">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">indium</span>
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"\\.js\\'"</span> . indium-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>indium-mode indium-interaction-mode indium-scratch<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org34066e5"></a>js2-mode<br>
<div class="outline-text-6" id="text-org34066e5">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">js2-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.js\\'"</span> . js2-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:commands</span> js2-imenu-extras-mode
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'js2-mode-hook 'js2-imenu-extras-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org8b249bd"></a>js3-mode<br>
<div class="outline-text-6" id="text-org8b249bd">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">js3-mode</span>
  <span class="org-builtin">:commands</span> js3-mode<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org8150a4f"></a>tern<br>
<div class="outline-text-6" id="text-org8150a4f">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">tern</span>
  <span class="org-builtin">:commands</span> tern-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'js2-mode-hook 'tern-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="org2353470"></a>JSON<br>
<div class="outline-text-5" id="text-org2353470">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">json-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.bowerrc$"</span>     . json-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.jshintrc$"</span>    . json-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.json_schema$"</span> . json-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.json\\'"</span> . json-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>make-local-variable 'js-indent-level<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orge410640"></a>LaTeX<br>
<ul class="org-ul">
<li><a id="org62a67ef"></a>auctex<br>
<div class="outline-text-6" id="text-org62a67ef">
<p>
Auctex provides some helpful tools for working with LaTeX.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">tex-site</span>
  <span class="org-builtin">:ensure</span> auctex
  <span class="org-builtin">:no-require</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>TeX-latex-mode
             TeX-mode
             tex-mode
             LaTeX-mode
             latex-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"\\.tex\\'"</span> . TeX-latex-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="orgf798bce"></a>Lisp<br>
<div class="outline-text-5" id="text-orgf798bce">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">elisp-mode</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:interpreter</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"emacs"</span> . emacs-lisp-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
<ul class="org-ul">
<li><a id="org480aeb9"></a>cider<br>
<div class="outline-text-6" id="text-org480aeb9">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">cider</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org54f220a"></a>slime<br>
<div class="outline-text-6" id="text-org54f220a">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">slime</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgbc1a4a5"></a>ielm<br>
<div class="outline-text-6" id="text-orgbc1a4a5">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ielm</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"C-c :"</span> . ielm<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="orgeef557f"></a>LLVM IR<br>
<div class="outline-text-5" id="text-orgeef557f">
<p>
This is currently disabled.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">llvm-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-string">"\\.ll\\'"</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org2f21e83"></a>Lua<br>
<ul class="org-ul">
<li><a id="org40241de"></a>lua-mode<br>
<div class="outline-text-6" id="text-org40241de">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">lua-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-string">"\\.lua\\'"</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="orgca54e6d"></a>Mach-O<br>
<div class="outline-text-5" id="text-orgca54e6d">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">macho-mode</span>
  <span class="org-builtin">:commands</span> macho-mode
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'magic-mode-alist '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\xFE\xED\xFA\xCE"</span> . macho-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'magic-mode-alist '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\xFE\xED\xFA\xCF"</span> . macho-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'magic-mode-alist '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\xCE\xFA\xED\xFE"</span> . macho-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'magic-mode-alist '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\xCF\xFA\xED\xFE"</span> . macho-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgd878745"></a>Makefile<br>
<ul class="org-ul">
<li><a id="org170d95b"></a>make-mode<br>
<div class="outline-text-6" id="text-org170d95b">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">make-mode</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'makefile-mode-hook 'indent-tabs-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="org26246ec"></a>Markdown<br>
<ul class="org-ul">
<li><a id="orgba14d98"></a>markdown-mode<br>
<div class="outline-text-6" id="text-orgba14d98">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">markdown-mode</span>
  <span class="org-builtin">:mode</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.md\\'"</span> . gfm-mode<span class="org-rainbow-delimiters-depth-3">)</span>
   <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.markdown\\'"</span> . gfm-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">bind-key</span> <span class="org-string">"'"</span> <span class="org-string">"&#8217;"</span> markdown-mode-map
            <span class="org-rainbow-delimiters-depth-3">(</span>not <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">or</span> <span class="org-rainbow-delimiters-depth-5">(</span>markdown-code-at-point-p<span class="org-rainbow-delimiters-depth-5">)</span>
                     <span class="org-rainbow-delimiters-depth-5">(</span>memq 'markdown-pre-face
                           <span class="org-rainbow-delimiters-depth-6">(</span>face-at-point nil 'mult<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="org72a6ae1"></a>Nix<br>
<div class="outline-text-5" id="text-org72a6ae1">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">nix-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-string">"\\.nix\\'"</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
<ul class="org-ul">
<li><a id="org05fa5db"></a>nix-buffer<br>
<div class="outline-text-6" id="text-org05fa5db">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">nix-buffer</span>
  <span class="org-builtin">:commands</span> nix-buffer<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="orga2bdc60"></a>NROFF<br>
<div class="outline-text-5" id="text-orga2bdc60">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">nroff-mode</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> nroff-mode<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org221549f"></a>PHP<br>
<div class="outline-text-5" id="text-org221549f">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">php-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-string">"\\.php\\'"</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org71cdaab"></a>Python<br>
<ul class="org-ul">
<li><a id="org5ac7720"></a>Anaconda<br>
<div class="outline-text-6" id="text-org5ac7720">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">anaconda-mode</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>anaconda-mode anaconda-eldoc-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'python-mode-hook 'anaconda-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'python-mode-hook 'anaconda-eldoc-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org9246166"></a>python-mode<br>
<div class="outline-text-6" id="text-org9246166">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">python</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"\\.py\\'"</span> . python-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:interpreter</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"python"</span> . python-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgd5688b1"></a>elpy<br>
<div class="outline-text-6" id="text-orgd5688b1">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">elpy</span>
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"\\.py\\'"</span> . elpy-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="orga30fc20"></a>Ruby<br>
<div class="outline-text-5" id="text-orga30fc20">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ruby-mode</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"\\.rb\\'"</span> . ruby-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:interpreter</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"ruby"</span> . ruby-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgcc0bc67"></a>Rust<br>
<div class="outline-text-5" id="text-orgcc0bc67">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">rust-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-string">"\\.rs\\'"</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgdc235ba"></a>SASS<br>
<div class="outline-text-5" id="text-orgdc235ba">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">sass-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-string">"\\.sass\\'"</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org06a0d56"></a>Scala<br>
<div class="outline-text-5" id="text-org06a0d56">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">scala-mode</span>
  <span class="org-builtin">:interpreter</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"scala"</span> . scala-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgd838979"></a>SCSS<br>
<div class="outline-text-5" id="text-orgd838979">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">scss-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-string">"\\.scss\\'"</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org0986304"></a>Shell<br>
<div class="outline-text-5" id="text-org0986304">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">sh-script</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:preface</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">shell-command-at-point</span> <span class="org-rainbow-delimiters-depth-3">()</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-3">)</span>
    <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>start-point <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">save-excursion</span>
                         <span class="org-rainbow-delimiters-depth-7">(</span>beginning-of-line<span class="org-rainbow-delimiters-depth-7">)</span>
                         <span class="org-rainbow-delimiters-depth-7">(</span>point<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span>
      <span class="org-rainbow-delimiters-depth-4">(</span>shell-command <span class="org-rainbow-delimiters-depth-5">(</span>buffer-substring start-point <span class="org-rainbow-delimiters-depth-6">(</span>point<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.*shellrc$"</span> . sh-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.*shell_profile"</span> . sh-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.zsh\\'"</span> . sh-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-builtin">:map</span> sh-mode-map
              <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-x C-e"</span> . shell-command-at-point<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org151799c"></a>texinfo<br>
<div class="outline-text-5" id="text-org151799c">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">texinfo</span>
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"\\.texi\\'"</span> . texinfo-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgba6855f"></a>TypeScript<br>
<div class="outline-text-5" id="text-orgba6855f">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">typescript-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-string">"\\.ts\\'"</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
<ul class="org-ul">
<li><a id="org2319b4d"></a>tide<br>
<div class="outline-text-6" id="text-org2319b4d">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">tide</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>tide-setup tide-hl-identifier-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'typescript-mode-hook 'tide-setup<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'typescript-mode-hook 'tide-hl-identifier-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</li>
<li><a id="org80f7912"></a>Web<br>
<div class="outline-text-5" id="text-org80f7912">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">web-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.erb\\'"</span> . web-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.mustache\\'"</span> . web-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.html?\\'"</span> . web-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.php\\'"</span> . web-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.jsp\\'"</span> . web-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org1cfd636"></a>XML<br>
<div class="outline-text-5" id="text-org1cfd636">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">nxml-mode</span>
  <span class="org-builtin">:ensure</span> nil
  <span class="org-builtin">:commands</span> nxml-mode
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defalias</span> '<span class="org-function-name">xml-mode</span> 'nxml-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orge670c2f"></a>YAML<br>
<div class="outline-text-5" id="text-orge670c2f">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">yaml-mode</span>
  <span class="org-builtin">:mode</span> <span class="org-string">"\\.ya?ml\\'"</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</div>
<div id="outline-container-orgfcb7eb6" class="outline-4">
<h4 id="orgfcb7eb6">Personal</h4>
<div class="outline-text-4" id="text-orgfcb7eb6">
<p>
These are all available in <a href="./lisp">./lisp</a>. Eventually they should go into separate
repositories.
</p>
</div>
<ul class="org-ul">
<li><a id="org84401de"></a>dired-column<br></li>
<li><a id="orgb8d0629"></a>em-dired<br></li>
<li><a id="orgb8bc3bb"></a>installer<br></li>
<li><a id="orge19c7f7"></a>macho-mode<br></li>
<li><a id="orgc70676d"></a>nethack<br>
<div class="outline-text-5" id="text-orgc70676d">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">nethack</span>
  <span class="org-builtin">:commands</span> nethack
  <span class="org-builtin">:ensure</span> nil<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgd9b41d7"></a>nix-fontify<br></li>
<li><a id="orgadc0c07"></a>set-defaults<br></li>
<li><a id="orgc5c759e"></a>use-package-list<br></li>
</ul>
</div>
<div id="outline-container-org68e7bb4" class="outline-4">
<h4 id="org68e7bb4">Other</h4>
<div class="outline-text-4" id="text-org68e7bb4">
<p>
These should correspond to minor modes or helper functions. Some of them are
more helpful than others but none are <i>essential</i>.
</p>

<p>
Most of these are available in MELPA.
</p>
</div>
<ul class="org-ul">
<li><a id="org650fa51"></a>gnuplot<br>
<div class="outline-text-5" id="text-org650fa51">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">gnuplot</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgf2d82a8"></a>logview<br>
<div class="outline-text-5" id="text-orgf2d82a8">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">logview</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org8dfa4d4"></a>anything<br>
<div class="outline-text-5" id="text-org8dfa4d4">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">anything</span>
  <span class="org-builtin">:commands</span> anything<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org2b0168d"></a>apropospriate-theme<br>
<div class="outline-text-5" id="text-org2b0168d">
<p>
This is the theme I use. This has to be defered for some reason.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">apropospriate-theme</span>
  <span class="org-builtin">:demand</span>
  <span class="org-builtin">:config</span> <span class="org-rainbow-delimiters-depth-2">(</span>load-theme 'apropospriate-dark t<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgde0ec82"></a>bm<br>
<div class="outline-text-5" id="text-orgde0ec82">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">bm</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org6be326b"></a>bool-flip<br>
<div class="outline-text-5" id="text-org6be326b">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">bool-flip</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"C-c C-b"</span> . bool-flip-do-flip<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org10b8b5b"></a>browse-at-remote<br>
<div class="outline-text-5" id="text-org10b8b5b">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">browse-at-remote</span>
  <span class="org-builtin">:commands</span> browse-at-remote<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org657f34a"></a>copy-as-format<br>
<div class="outline-text-5" id="text-org657f34a">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">copy-as-format</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c w s"</span> . copy-as-format-slack<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c w g"</span> . copy-as-format-github<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgb926aa8"></a>crux<br>
<div class="outline-text-5" id="text-orgb926aa8">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">crux</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c D"</span> . crux-delete-file-and-buffer<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c C-e"</span> . crux-eval-and-replace<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>shift return<span class="org-rainbow-delimiters-depth-4">]</span> . crux-smart-open-line<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org1a34ec2"></a>elfeed<br>
<div class="outline-text-5" id="text-org1a34ec2">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">elfeed</span>
  <span class="org-builtin">:commands</span> elfeed<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org00aa237"></a>expand-region<br>
<div class="outline-text-5" id="text-org00aa237">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">expand-region</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-="</span> . er/expand-region<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org11923a3"></a>firestarter<br>
<div class="outline-text-5" id="text-org11923a3">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">firestarter</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"C-c m s"</span> . firestarter-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org3c1ca42"></a>focus<br>
<div class="outline-text-5" id="text-org3c1ca42">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">focus</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"C-c m f"</span> . focus-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org5448fc3"></a>hl-todo<br>
<div class="outline-text-5" id="text-org5448fc3">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">hl-todo</span>
  <span class="org-builtin">:commands</span> hl-todo-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'prog-mode-hook 'hl-todo-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org8b3d1fa"></a>hookify<br>
<div class="outline-text-5" id="text-org8b3d1fa">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">hookify</span>
  <span class="org-builtin">:commands</span> hookify<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org4a7cf65"></a>htmlize<br>
<div class="outline-text-5" id="text-org4a7cf65">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">htmlize</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org84fc531"></a>mediawiki<br>
<div class="outline-text-5" id="text-org84fc531">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">mediawiki</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org7bed849"></a>minimap<br>
<div class="outline-text-5" id="text-org7bed849">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">minimap</span>
  <span class="org-builtin">:commands</span> minimap-mode<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org0773848"></a>multi-term<br>
<div class="outline-text-5" id="text-org0773848">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">multi-term</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-. t"</span> . multi-term-next<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-. T"</span> . multi-term<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org9bed372"></a>page-break-lines<br>
<div class="outline-text-5" id="text-org9bed372">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">page-break-lines</span>
  <span class="org-builtin">:commands</span> page-break-lines-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hooks '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>doc-mode
                       emacs-lisp-mode<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-warning">. page-break-lines-mode</span><span class="org-warning"><span class="org-rainbow-delimiters-depth-4">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-3">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-2">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-1">)</span></span>
</pre>
</div>
</div>
</li>
<li><a id="org4fad188"></a>pandoc-mode<br>
<div class="outline-text-5" id="text-org4fad188">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">pandoc-mode</span>
  <span class="org-builtin">:commands</span> <span class="org-rainbow-delimiters-depth-2">(</span>pandoc-mode pandoc-load-default-settings<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'markdown-mode-hook 'pandoc-mode<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'pandoc-mode-hook 'pandoc-load-default-settings<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org6bce4df"></a>rainbow-delimiters<br>
<div class="outline-text-5" id="text-org6bce4df">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">rainbow-delimiters</span>
  <span class="org-builtin">:commands</span> rainbow-delimiters-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hooks '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>emacs-lisp-mode
                       inferior-emacs-lisp-mode
                       ielm-mode
                       lisp-mode
                       inferior-lisp-mode
                       lisp-interaction-mode
                       slime-repl-mode<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-warning">. rainbow-delimiters-mode</span><span class="org-warning"><span class="org-rainbow-delimiters-depth-4">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-3">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-2">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-1">)</span></span>
</pre>
</div>
</div>
</li>
<li><a id="org2943d13"></a>rainbow-mode<br>
<div class="outline-text-5" id="text-org2943d13">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">rainbow-mode</span>
  <span class="org-builtin">:commands</span> rainbow-mode
  <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>add-hooks '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>emacs-lisp-mode
                       inferior-emacs-lisp-mode
                       ielm-mode
                       lisp-mode
                       inferior-lisp-mode
                       lisp-interaction-mode
                       slime-repl-mode<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-warning">. rainbow-mode</span><span class="org-warning"><span class="org-rainbow-delimiters-depth-4">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-3">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-2">)</span></span><span class="org-warning"><span class="org-rainbow-delimiters-depth-1">)</span></span>
</pre>
</div>
</div>
</li>
<li><a id="orgbc6cf3f"></a>restclient<br>
<div class="outline-text-5" id="text-orgbc6cf3f">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">restclient</span>
  <span class="org-builtin">:mode</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.rest\\'"</span> . restclient-mode<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.restclient\\'"</span> . restclient-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org827b551"></a>shrink-whitespace<br>
<div class="outline-text-5" id="text-org827b551">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">shrink-whitespace</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"H-SPC"</span> . shrink-whitespace<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org3ec8047"></a>smart-shift<br>
<div class="outline-text-5" id="text-org3ec8047">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">smart-shift</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c &lt;left&gt;"</span> . smart-shift-left<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c &lt;right&gt;"</span> . smart-shift-right<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c &lt;up&gt;"</span> . smart-shift-up<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c &lt;down&gt;"</span> . smart-shift-down<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgf9d5179"></a>string-inflection<br>
<div class="outline-text-5" id="text-orgf9d5179">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">string-inflection</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c r r"</span> . string-inflection-all-cycle<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c r c"</span> . string-inflection-camelcase<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c r l"</span> . string-inflection-lower-camelcase<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c r u"</span> . string-inflection-underscore<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c r k"</span> . string-inflection-kebab-case<span class="org-rainbow-delimiters-depth-3">)</span>
         <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"C-c r J"</span> . string-inflection-java-style-cycle<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org1af7932"></a>vkill<br>
<div class="outline-text-5" id="text-org1af7932">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">vkill</span>
  <span class="org-builtin">:bind</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"C-x L"</span> . vkill<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="org9386f04"></a>xah-math-input<br>
<div class="outline-text-5" id="text-org9386f04">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">xah-math-input</span>
  <span class="org-builtin">:commands</span> xah-math-input-mode<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
<li><a id="orgc6e98fe"></a>xterm-color<br>
<div class="outline-text-5" id="text-orgc6e98fe">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">xterm-color</span>
  <span class="org-builtin">:commands</span> xterm-color-filter
  <span class="org-builtin">:init</span>
  <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'comint-preoutput-filter-functions 'xterm-color-filter<span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> comint-output-filter-functions
        <span class="org-rainbow-delimiters-depth-3">(</span>remove 'ansi-color-process-output comint-output-filter-functions<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-org2a0c3e3" class="outline-2">
<h2 id="org2a0c3e3">Profiles</h2>
<div class="outline-text-2" id="text-org2a0c3e3">
<p>
All of these files live outside of Emacs but are necessary for a usable
developer environment. They are basic shell profile and some git configuration
scripts as well.
</p>
</div>
<div id="outline-container-orgbeba6f4" class="outline-3">
<h3 id="orgbeba6f4"><code>.profile</code></h3>
<div class="outline-text-3" id="text-orgbeba6f4">
<p>
To use this, you must create a short ~/.profile file. Here is an example,
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-variable-name">bootstrap</span>=$<span class="org-variable-name">HOME</span>/.nix-profile/etc/profile
[ -f $<span class="org-variable-name">bootstrap</span> ] &amp;&amp; <span class="org-builtin">source</span> $<span class="org-variable-name">bootstrap</span>
</pre>
</div>

<p>
Here we setup <code>.profile</code>. First, setup exports.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-builtin">export</span> <span class="org-variable-name">LANG</span>=en_US.UTF-8 <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">LC_ALL</span>=en_US.UTF-8 <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">INFOPATH</span>=$<span class="org-variable-name">PREFIX</span>/share/info <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">MANPATH</span>=$<span class="org-variable-name">PREFIX</span>/share/man <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">DICPATH</span>=$<span class="org-variable-name">PREFIX</span>/share/hunspell <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">CLICOLOR</span>=1 <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">GREP_OPTIONS</span>=<span class="org-string">'--color=auto'</span> <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">GREP_COLOR</span>=<span class="org-string">'3;33'</span> <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">LC_COLLATE</span>=C <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">HISTFILE</span>=$<span class="org-variable-name">HOME</span>/.history <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">HISTSIZE</span>=16000 <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">HISTFILESIZE</span>=16000 <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">HISTCONTROL</span>=ignoreboth <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">SAVEHIST</span>=15000 <span class="org-sh-escaped-newline">\</span>
       <span class="org-variable-name">SHELL_SESSION_HISTORY</span>=1
</pre>
</div>

<p>
Then setup aliases.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-builtin">alias</span> <span class="org-variable-name">ls</span>=<span class="org-string">"TERM=ansi ls --color=always"</span> <span class="org-sh-escaped-newline">\</span>
      <span class="org-variable-name">l</span>=<span class="org-string">"ls -lF"</span> <span class="org-sh-escaped-newline">\</span>
      ..=<span class="org-string">"cd .."</span> <span class="org-sh-escaped-newline">\</span>
      ...=<span class="org-string">"cd ../.."</span> <span class="org-sh-escaped-newline">\</span>
      ....=<span class="org-string">"cd ../../.."</span> <span class="org-sh-escaped-newline">\</span>
      .....=<span class="org-string">"cd ../../../.."</span> <span class="org-sh-escaped-newline">\</span>
      <span class="org-variable-name">tree</span>=<span class="org-string">'tree -Csuh'</span> <span class="org-sh-escaped-newline">\</span>
      <span class="org-variable-name">grep</span>=<span class="org-string">"grep --color=auto"</span>
</pre>
</div>

<p>
Configure INSIDE_EMACS.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-keyword">if</span> [ <span class="org-string">"$TERM"</span> = dumb ] &amp;&amp; <span class="org-negation-char">!</span> [ -z <span class="org-string">"$INSIDE_EMACS"</span> ]; <span class="org-keyword">then</span>
    <span class="org-builtin">export</span> <span class="org-variable-name">TERM</span>=dumb-emacs-ansi <span class="org-sh-escaped-newline">\</span>
           <span class="org-variable-name">COLORTERM</span>=1
<span class="org-keyword">fi</span>
</pre>
</div>

<p>
Define <code>update_terminal_cwd</code> function.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-function-name">update_terminal_cwd</span> () {
    <span class="org-builtin">local</span> <span class="org-variable-name">SEARCH</span>=<span class="org-string">' '</span>
    <span class="org-builtin">local</span> <span class="org-variable-name">REPLACE</span>=<span class="org-string">'%20'</span>
    <span class="org-builtin">local</span> <span class="org-variable-name">PWD_URL</span>=<span class="org-string">"file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"</span>
    printf <span class="org-string">'\e]7;%s\a'</span> <span class="org-string">"$PWD_URL"</span>
}
</pre>
</div>
</div>
</div>
<div id="outline-container-org4bdfdf6" class="outline-3">
<h3 id="org4bdfdf6"><code>.bashrc</code></h3>
<div class="outline-text-3" id="text-org4bdfdf6">
<p>
To use this, you must create a short <code>~/.bash_profile</code> file. Here is an
example,
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-variable-name">bootstrap</span>=$<span class="org-variable-name">HOME</span>/.nix-profile/etc/bashrc
[ -f $<span class="org-variable-name">bootstrap</span> ] &amp;&amp; <span class="org-builtin">source</span> $<span class="org-variable-name">bootstrap</span>
</pre>
</div>

<p>
Source profile found above.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-builtin">source</span> @out@/etc/profile
</pre>
</div>

<p>
When TERM=dumb, just do a simple prompt.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-keyword">case</span> <span class="org-string">"$TERM"</span><span class="org-keyword"> in</span>
    dumb)
        <span class="org-variable-name">PS1</span>=<span class="org-string">"\W &gt; "</span>
        <span class="org-keyword">return</span>
        ;;
<span class="org-keyword">esac</span>
</pre>
</div>

<p>
Setup some bash-specific features.
</p>

<div class="org-src-container">
<pre class="src src-sh">shopt -s cdspell <span class="org-sh-escaped-newline">\</span>
         cdable_vars <span class="org-sh-escaped-newline">\</span>
         checkhash <span class="org-sh-escaped-newline">\</span>
         checkwinsize <span class="org-sh-escaped-newline">\</span>
         cmdhist <span class="org-sh-escaped-newline">\</span>
         dotglob <span class="org-sh-escaped-newline">\</span>
         extglob <span class="org-sh-escaped-newline">\</span>
         histappend <span class="org-sh-escaped-newline">\</span>
         histreedit <span class="org-sh-escaped-newline">\</span>
         histverify <span class="org-sh-escaped-newline">\</span>
         nocaseglob <span class="org-sh-escaped-newline">\</span>
         no_empty_cmd_completion <span class="org-sh-escaped-newline">\</span>
         sourcepath
</pre>
</div>

<p>
Turn on notify, noclobber, ignoreeof, emacs. These are bash-specific.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-builtin">set</span> -o notify <span class="org-sh-escaped-newline">\</span>
    -o noclobber <span class="org-sh-escaped-newline">\</span>
    -o ignoreeof <span class="org-sh-escaped-newline">\</span>
    -o emacs
</pre>
</div>

<p>
Setup prompt.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-variable-name">PS1</span>=<span class="org-string">'\e[0;34m\u@\h:\e[0;36m\w \e[0;33m$ \e[0m'</span>
</pre>
</div>

<p>
Bind keys when we’re interactive.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-keyword">if</span> [[ $<span class="org-variable-name">-</span> == *i* ]]; <span class="org-keyword">then</span>
    bind <span class="org-string">'"\e/": dabbrev-expand'</span>
    bind <span class="org-string">'"\ee": edit-and-execute-command'</span>
<span class="org-keyword">fi</span>
</pre>
</div>

<p>
Run the <code>update_terminal_cwd</code> command when we’re in Apple_Terminal. This will
give us the working directory in the title window.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-keyword">if</span> [ <span class="org-string">"$TERM_PROGRAM"</span> = Apple_Terminal ] &amp;&amp; [ -z <span class="org-string">"$INSIDE_EMACS"</span> ]; <span class="org-keyword">then</span>
    <span class="org-variable-name">PROMPT_COMMAND</span>=<span class="org-string">"update_terminal_cwd;$PROMPT_COMMAND"</span>
    update_terminal_cwd
<span class="org-keyword">fi</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org6180ee7" class="outline-3">
<h3 id="org6180ee7"><code>.zshrc</code></h3>
<div class="outline-text-3" id="text-org6180ee7">
<p>
To use this, you must create a short ~/.zshrc file. Here is an example,
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-variable-name">bootstrap</span>=$<span class="org-variable-name">HOME</span>/.nix-profile/etc/zshrc
[ -f $<span class="org-variable-name">bootstrap</span> ] &amp;&amp; <span class="org-builtin">source</span> $<span class="org-variable-name">bootstrap</span>
</pre>
</div>

<p>
Setup ZSH profile. First, we just source the global profile.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-builtin">source</span> @out@/etc/profile
</pre>
</div>

<p>
Handle dumb options.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-keyword">case</span> <span class="org-string">"$TERM"</span><span class="org-keyword"> in</span>
    dumb)
        <span class="org-builtin">unsetopt</span> zle <span class="org-sh-escaped-newline">\</span>
                 prompt_cr <span class="org-sh-escaped-newline">\</span>
                 prompt_subst
        <span class="org-keyword">if </span><span class="org-builtin">whence</span> -w precmd &gt;/dev/null; <span class="org-keyword">then</span>
            <span class="org-builtin">unfunction</span> precmd
        <span class="org-keyword">fi</span>
        <span class="org-keyword">if </span><span class="org-builtin">whence</span> -w preexec &gt;/dev/null; <span class="org-keyword">then</span>
            <span class="org-builtin">unfunction</span> preexec
        <span class="org-keyword">fi</span>
        <span class="org-variable-name">PS1</span>=<span class="org-string">'$ '</span>
        <span class="org-keyword">return</span>
        ;;
<span class="org-keyword">esac</span>
</pre>
</div>

<p>
Load up site-functions in ZSH.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-variable-name">fpath</span>+=(@out@/share/zsh/site-functions)
</pre>
</div>

<p>
Setup ZSH auto suggestions.
</p>

<div class="org-src-container">
<pre class="src src-sh">. @zsh-autosuggestions@/share/zsh-autosuggestions/zsh-autosuggestions.zsh
</pre>
</div>

<p>
Turn on colors.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-builtin">autoload</span> -U colors &amp;&amp; colors
</pre>
</div>

<p>
Turn on ZSH-specific options.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-builtin">setopt</span> always_to_end <span class="org-sh-escaped-newline">\</span>
       append_history <span class="org-sh-escaped-newline">\</span>
       auto_cd <span class="org-sh-escaped-newline">\</span>
       auto_menu <span class="org-sh-escaped-newline">\</span>
       auto_name_dirs <span class="org-sh-escaped-newline">\</span>
       auto_pushd <span class="org-sh-escaped-newline">\</span>
       cdablevarS <span class="org-sh-escaped-newline">\</span>
       complete_in_word <span class="org-sh-escaped-newline">\</span>
       correct <span class="org-sh-escaped-newline">\</span>
       correctall <span class="org-sh-escaped-newline">\</span>
       extended_glob <span class="org-sh-escaped-newline">\</span>
       extended_history <span class="org-sh-escaped-newline">\</span>
       hist_expire_dups_first <span class="org-sh-escaped-newline">\</span>
       hist_find_no_dups <span class="org-sh-escaped-newline">\</span>
       hist_ignore_dups <span class="org-sh-escaped-newline">\</span>
       hist_ignore_space <span class="org-sh-escaped-newline">\</span>
       hist_reduce_blanks <span class="org-sh-escaped-newline">\</span>
       hist_verify <span class="org-sh-escaped-newline">\</span>
       inc_append_history <span class="org-sh-escaped-newline">\</span>
       interactive_comments <span class="org-sh-escaped-newline">\</span>
       long_list_jobs <span class="org-sh-escaped-newline">\</span>
       multios <span class="org-sh-escaped-newline">\</span>
       no_beep <span class="org-sh-escaped-newline">\</span>
       prompt_subst <span class="org-sh-escaped-newline">\</span>
       pushd_ignore_dups <span class="org-sh-escaped-newline">\</span>
       pushdminus <span class="org-sh-escaped-newline">\</span>
       share_history <span class="org-sh-escaped-newline">\</span>
       transient_rprompt
</pre>
</div>

<p>
Setup completions.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-variable-name">ZSH_COMPDUMP</span>=<span class="org-string">"${HOME}/.zcompdump-${SHORT_HOST}-${ZSH_VERSION}"</span>
<span class="org-builtin">autoload</span> -U compaudit compinit &amp;&amp; compinit -d <span class="org-string">"${ZSH_COMPDUMP}"</span>
zmodload -i zsh/complist
</pre>
</div>

<p>
Zstyle completions.
</p>

<div class="org-src-container">
<pre class="src src-sh">zstyle <span class="org-string">':vcs_info:*'</span> actionformats <span class="org-sh-escaped-newline">\</span>
       <span class="org-string">'%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '</span>
zstyle <span class="org-string">':vcs_info:*'</span> formats <span class="org-string">'%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{5}]%f '</span>
zstyle <span class="org-string">':vcs_info:*'</span> enable git

zstyle <span class="org-string">':completion:*'</span> matcher-list <span class="org-string">'r:|=*'</span> <span class="org-string">'l:|=* r:|=*'</span>
zstyle <span class="org-string">':completion:*'</span> matcher-list <span class="org-string">'m:{a-zA-Z-_}={A-Za-z_-}'</span> <span class="org-string">'r:|=*'</span> <span class="org-string">'l:|=*'</span>
zstyle <span class="org-string">':completion:*'</span> list-colors <span class="org-string">''</span>
zstyle <span class="org-string">':completion:*:*:kill:*:processes'</span> list-colors <span class="org-sh-escaped-newline">\</span>
       <span class="org-string">'=(#b) #([0-9]#) ([0-9a-z-]#)*=01;34=0=01'</span>
zstyle <span class="org-string">':completion:*:*:*:*:processes'</span> command <span class="org-sh-escaped-newline">\</span>
       <span class="org-string">"ps -u $USER -o pid,user,comm -w -w"</span>
zstyle <span class="org-string">':completion:*:cd:*'</span> tag-order local-directories directory-stack <span class="org-sh-escaped-newline">\</span>
       path-directories
zstyle <span class="org-string">':completion::complete:*'</span> use-cache 1
zstyle <span class="org-string">':completion::complete:*'</span> cache-path ~/.zsh/cache/$<span class="org-variable-name">HOST</span>
zstyle <span class="org-string">':completion:*'</span> select-prompt <span class="org-sh-escaped-newline">\</span>
       <span class="org-string">'%SScrolling active: current selection at %p%s'</span>
zstyle <span class="org-string">':completion:*::::'</span> completer _expand _complete _ignored _approximate
zstyle <span class="org-string">':completion:*'</span> menu <span class="org-variable-name">select</span>=1 _complete _ignored _approximate
zstyle <span class="org-string">':completion:*:*:-subscript-:*'</span> tag-order indexes parameters
zstyle <span class="org-string">':completion:*'</span> verbose yes
zstyle <span class="org-string">':completion:*:descriptions'</span> format <span class="org-string">'%B%d%b'</span>
zstyle <span class="org-string">':completion:*:messages'</span> format <span class="org-string">'%d'</span>
zstyle <span class="org-string">':completion:*:warnings'</span> format <span class="org-string">'No matches for: %d'</span>
zstyle <span class="org-string">':completion:*:corrections'</span> format <span class="org-string">'%B%d (errors: %e)%b'</span>
zstyle <span class="org-string">':completion:*'</span> group-name <span class="org-string">''</span>
zstyle <span class="org-string">':completion:*:functions'</span> ignored-patterns <span class="org-string">'_*'</span>
zstyle <span class="org-string">':completion:*:scp:*'</span> tag-order files users <span class="org-sh-escaped-newline">\</span>
       <span class="org-string">'hosts:-host hosts:-domain:domain hosts:-ipaddr"IP\ Address *'</span>
zstyle <span class="org-string">':completion:*:scp:*'</span> group-order files all-files users hosts-domain <span class="org-sh-escaped-newline">\</span>
       hosts-host hosts-ipaddr
zstyle <span class="org-string">':completion:*:ssh:*'</span> tag-order users <span class="org-sh-escaped-newline">\</span>
       <span class="org-string">'hosts:-host hosts:-domain:domain hosts:-ipaddr"IP\ Address *'</span>
zstyle <span class="org-string">':completion:*:ssh:*'</span> group-order hosts-domain hosts-host users <span class="org-sh-escaped-newline">\</span>
       hosts-ipaddr
zstyle <span class="org-string">'*'</span> single-ignored show
</pre>
</div>

<p>
Turn on prompt with colors.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-variable-name">PROMPT</span>=<span class="org-string">'%F{blue}%n@%m:%F{cyan}%c%F{yellow} $ %F{reset}'</span>
</pre>
</div>

<p>
ZSH key bindings.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-keyword">if</span> [ <span class="org-string">"$TERM"</span> = xterm-256color ]; <span class="org-keyword">then</span>
    <span class="org-builtin">bindkey</span> <span class="org-string">"^[[H"</span> beginning-of-line
    <span class="org-builtin">bindkey</span> <span class="org-string">"^[[F"</span> end-of-line
    <span class="org-builtin">bindkey</span> <span class="org-string">"^[[3~"</span> delete-char
<span class="org-keyword">fi</span>
</pre>
</div>

<p>
Setup Apple Terminal so that CWD is shown.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-keyword">if</span> [ <span class="org-string">"$TERM_PROGRAM"</span> = Apple_Terminal ] &amp;&amp; [ -z <span class="org-string">"$INSIDE_EMACS"</span> ]; <span class="org-keyword">then</span>
    <span class="org-builtin">autoload</span> add-zsh-hook
    add-zsh-hook chpwd update_terminal_cwd
    update_terminal_cwd
<span class="org-keyword">fi</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org8144709" class="outline-3">
<h3 id="org8144709"><code>etc-profile.sh</code></h3>
<div class="outline-text-3" id="text-org8144709">
<p>
This just sources everything in the <code>/etc/profile.d</code> dir. <code>PREFIX</code> can be
used to reference the Nix output dir.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-builtin">export</span> <span class="org-variable-name">PREFIX</span>=@out@
</pre>
</div>

<p>
This will source everything in <code>/etc/profile.d</code>.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-keyword">if</span> [ -d @out@/etc/profile.d ]; <span class="org-keyword">then</span>
  <span class="org-keyword">for</span> i<span class="org-keyword"> in</span> @out@/etc/profile.d/*.sh; <span class="org-keyword">do</span>
    <span class="org-keyword">if</span> [ -r $<span class="org-variable-name">i</span> ]; <span class="org-keyword">then</span>
      <span class="org-builtin">source</span> $<span class="org-variable-name">i</span>
    <span class="org-keyword">fi</span>
  <span class="org-keyword">done</span>
<span class="org-keyword">fi</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org1cb7cf5" class="outline-3">
<h3 id="org1cb7cf5"><code>.gitignore</code></h3>
<div class="outline-text-3" id="text-org1cb7cf5">
<p>
Some basic gitignore paths.
</p>

<div class="org-src-container">
<pre class="src src-gitignore"><span class="org-keyword">*</span>~
\#<span class="org-keyword">*</span>\#
<span class="org-keyword">*</span>.DS_Store
</pre>
</div>
</div>
</div>
<div id="outline-container-org842b61c" class="outline-3">
<h3 id="org842b61c"><code>.gitconfig</code></h3>
<div class="outline-text-3" id="text-org842b61c">
<div class="org-src-container">
<pre class="src src-gitconfig">[<span class="org-type">core</span>]
        <span class="org-variable-name">editor</span> = emacsclient
        <span class="org-variable-name">excludesfile</span> = @gitignore@

[<span class="org-type">commit</span>]
        <span class="org-variable-name">gpgSign</span> = <span class="org-keyword">true</span>

[<span class="org-type">gpg</span>]
        <span class="org-variable-name">program</span> = <span class="org-string">"@gnupg@/bin/gpg"</span>

[<span class="org-type">push</span>]
        <span class="org-variable-name">default</span> = simple

[<span class="org-type">pull</span>]
        <span class="org-variable-name">rebase</span> = <span class="org-keyword">true</span>

[<span class="org-type">alias</span>]
        <span class="org-variable-name">amend</span> = commit --amend

[<span class="org-type">help</span>]
        <span class="org-variable-name">autcorrect</span> = <span class="org-constant">1</span>

[<span class="org-type">color</span>]
        <span class="org-variable-name">ui</span> = <span class="org-keyword">true</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org99a781c" class="outline-2">
<h2 id="org99a781c">Bootstrapping</h2>
<div class="outline-text-2" id="text-org99a781c">
</div>
<div id="outline-container-org24903ec" class="outline-3">
<h3 id="org24903ec"><code>site-paths.el.in</code></h3>
<div class="outline-text-3" id="text-org24903ec">
<p>
This file provides site-specific paths. However, it must be substituted in
Nix before we can actually run it in Emacs. To prevent Emacs from trying to
run this, I’ve set the syntax to <code>text</code>.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">set-defaults</span><span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">subr-x</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>

<p>
<code>output-directory</code> points to the nix-profile directory created by Nix.
Ideally, this could point to a Nix store path, but the order of building
means that we don’t know this until too late.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defvar</span> <span class="org-variable-name">output-directory</span> <span class="org-rainbow-delimiters-depth-2">(</span>expand-file-name <span class="org-string">".nix-profile"</span> <span class="org-rainbow-delimiters-depth-3">(</span>getenv <span class="org-string">"HOME"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>

<p>
Setup <code>exec-path</code>.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> exec-path <span class="org-rainbow-delimiters-depth-2">(</span>append `<span class="org-rainbow-delimiters-depth-3">(</span>,<span class="org-rainbow-delimiters-depth-4">(</span>expand-file-name <span class="org-string">"bin"</span> output-directory<span class="org-rainbow-delimiters-depth-4">)</span>
                           <span class="org-string">"/usr/sbin"</span> <span class="org-string">"/usr/bin"</span> <span class="org-string">"/sbin"</span> <span class="org-string">"/bin"</span><span class="org-rainbow-delimiters-depth-3">)</span>
                        exec-path<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>

<p>
Setup <code>man-path</code>.
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defvar</span> <span class="org-variable-name">man-path</span> `<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"/usr/share/man"</span>
                   <span class="org-string">"/usr/local/share/man"</span>
                   ,<span class="org-rainbow-delimiters-depth-3">(</span>expand-file-name <span class="org-string">"share/man"</span> output-directory<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>

<p>
This will setup cacert-file var,
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defcustom</span> <span class="org-variable-name">cacert-file</span> <span class="org-string">"/etc/ssl/certs/ca-bundle.crt"</span>
  <span class="org-doc">"Path for SSL certificates."</span>
  <span class="org-builtin">:group</span> 'environment<span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>

<p>
Set env vars provided by Nix,
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span>set-envs
 <span class="org-comment-delimiter">;; </span><span class="org-comment">`("NIX_SSL_CERT_FILE" ,cacert-file)</span>
 `<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"NIX_PATH"</span> <span class="org-string">"nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixpkgs"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 `<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"PATH"</span> ,<span class="org-rainbow-delimiters-depth-3">(</span>string-join exec-path <span class="org-string">":"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 `<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"MANPATH"</span> ,<span class="org-rainbow-delimiters-depth-3">(</span>string-join man-path <span class="org-string">":"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>

<p>
Set paths provided by Nix,
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span>set-paths
 '<span class="org-rainbow-delimiters-depth-2">(</span>company-cmake-executable <span class="org-string">"@cmake@/bin/cmake"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>doc-view-dvipdf-program <span class="org-string">"@ghostscript@/bin/dvipdf"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>cacert-file <span class="org-string">"@cacert@/etc/ssl/certs/ca-bundle.crt"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>doc-view-ps2pdf-program <span class="org-string">"@ghostscript@/bin/ps2pdf"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dired-touch-program <span class="org-string">"@coreutils@/bin/touch"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dired-chmod-program <span class="org-string">"@coreutils@/bin/chmod"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dired-chown-program <span class="org-string">"@coreutils@/bin/chown"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dired-free-space-program <span class="org-string">"@coreutils@/bin/df"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>diff-command <span class="org-string">"@diffutils@/bin/diff"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>find-program <span class="org-string">"@findutils@/bin/find"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>epg-gpg-program <span class="org-string">"@gpg@/bin/gpg"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>epg-gpgconf-program <span class="org-string">"@gpg@/bin/gpgconf"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>epg-gpgsm-program <span class="org-string">"@gpg@/bin/gpgsm"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>explicit-shell-file-name <span class="org-string">"@bash@/bin/bash"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-sh-bash-executable <span class="org-string">"@bash@/bin/bash"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-sh-zsh-executable <span class="org-string">"@zsh@/bin/zsh"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-perl-executable <span class="org-string">"@perl@/bin/perl"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-go-golint-executable <span class="org-string">"@golint@/bin/golint"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-python-flake8-executable <span class="org-string">"@flake8@/bin/flake8"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-asciidoc-executable <span class="org-string">"@asciidoc@/bin/asciidoc"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-less-executable <span class="org-string">"@lessc@/bin/lessc"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-haskell-stack-ghc-executable <span class="org-string">"@stack@/bin/stack"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-c/c++-gcc-executable <span class="org-string">"@gcc@/bin/gcc"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-javascript-eslint-executable <span class="org-string">"@eslint@/bin/eslint"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-javascript-jshint-executable <span class="org-string">"@jshint@/bin/jshint"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-go-build-executable <span class="org-string">"@go@/bin/go"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-go-test-executable <span class="org-string">"@go@/bin/go"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-lua-executable <span class="org-string">"@lua@/bin/luac"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-xml-xmllint-executable <span class="org-string">"@libxml2@/bin/xmllint"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-perl-perlcritic-executable <span class="org-string">"@perlcritic@/bin/perlcritic"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>flycheck-html-tidy-executable <span class="org-string">"@tidy@/bin/tidy"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>fortune-dir <span class="org-string">"@fortune@/share/games/fortunes"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>fortune-file <span class="org-string">"@fortune@/share/games/fortunes/food"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>grep-program <span class="org-string">"@gnugrep@/bin/grep"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ispell-program-name <span class="org-string">"@aspell@/bin/aspell"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>irony-cmake-executable <span class="org-string">"@cmake@/bin/cmake"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>jka-compr-info-compress-program <span class="org-string">"@ncompress@/bin/compress"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>jka-compr-info-uncompress-program <span class="org-string">"@ncompress@/bin/uncompress"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>irony-server-install-prefix <span class="org-string">"@irony@"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>jka-compr-dd-program <span class="org-string">"@coreutils@/bin/dd"</span><span class="org-rainbow-delimiters-depth-2">)</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">'(jdee-server-dir "@jdeeserver@")</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>magit-git-executable <span class="org-string">"@git@/bin/git"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>markdown-command <span class="org-string">"@markdown2@/bin/markdown2"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>manual-program <span class="org-string">"@man@/bin/man"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>man-awk-command <span class="org-string">"@gawk@/bin/awk"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>man-sed-command <span class="org-string">"@gnused@/bin/sed"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>man-untabify-command <span class="org-string">"@coreutils@/bin/pr"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>nethack-executable <span class="org-string">"@nethack@/bin/nethack"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>org-pandoc-command <span class="org-string">"@pandoc@/bin/pandoc"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>pandoc-binary <span class="org-string">"@pandoc@/bin/pandoc"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>remote-shell-program <span class="org-string">"@openssh@/bin/ssh"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ripgrep-executable <span class="org-string">"@ripgrep@/bin/rg"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>rtags-path <span class="org-string">"@rtags@/bin"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>sql-ingres-program <span class="org-string">"@parallel@/bin/sql"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>sql-interbase-program <span class="org-string">"@unixODBC@/bin/isql"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>sql-mysql-program <span class="org-string">"@mariadb@/bin/mysql"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>sql-ms-program <span class="org-string">"@freetds@/bin/osql"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>sql-postgres-program <span class="org-string">"@freetds@/bin/osql"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>sql-sqlite-program <span class="org-string">"@sqliteInteractive@/bin/sqlite3"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>tramp-encoding-shell <span class="org-string">"@bash@/bin/sh"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>tex-shell <span class="org-string">"@bash@/bin/sh"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>xargs-program <span class="org-string">"@findutils@/bin/xargs"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>vc-git-program <span class="org-string">"@git@/bin/git"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>gnutls <span class="org-string">"@gnutls@/bin/gnutls-cli"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>pdf2dsc-command <span class="org-string">"@ghostscript@/bin/pdf2dsc"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>preview-gs-command <span class="org-string">"@texlive@/bin/rungs"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>TeX-command <span class="org-string">"@texlive@/bin/tex"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>LaTeX-command <span class="org-string">"@texlive@/bin/latex"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>luatex-command <span class="org-string">"@texlive@/bin/luatex"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>xetex-command <span class="org-string">"@texlive@/bin/xetex"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>xelatex-command <span class="org-string">"@texlive@/bin/xelatex"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>makeinfo-command <span class="org-string">"@texinfoInteractive@/bin/makeinfo"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>pdftex-command <span class="org-string">"@texlive@/bin/pdftex"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>context-command <span class="org-string">"@texlive@/bin/context"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>bibtex-command <span class="org-string">"@texlive@/bin/bibtex"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dvipdfmx-command <span class="org-string">"@texlive@/bin/dvipdfmx"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>makeindex-command <span class="org-string">"@texlive@/bin/makeindex"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>chktex-command <span class="org-string">"@texlive@/bin/chktex"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>lacheck-command <span class="org-string">"@texlive@/bin/lacheck"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dvipdfmx-command <span class="org-string">"@texlive@/bin/dvipdfmx"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dvips-command <span class="org-string">"@texlive@/bin/dvips"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>dvipng-command <span class="org-string">"@texlive@/bin/dvipng"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ps2pdf-command <span class="org-string">"@ghostscript@/bin/ps2pdf"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>locate-executable <span class="org-string">"@findutils@/bin/locate"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>ag-executable <span class="org-string">"@ag@/bin/ag"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>intero-stack-executable <span class="org-string">"@intero@/bin/intero-nix-shim"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>notmuch-command <span class="org-string">"@notmuch@/bin/notmuch"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>org-export-async-init-file <span class="org-string">"@orginit@"</span><span class="org-rainbow-delimiters-depth-2">)</span>
 <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>

<p>
Set some defaults that depend on the path variables below,
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span>set-defaults
 '<span class="org-rainbow-delimiters-depth-2">(</span>imap-ssl-program `<span class="org-rainbow-delimiters-depth-3">(</span>,<span class="org-rainbow-delimiters-depth-4">(</span>concat gnutls <span class="org-string">" --tofu -p %p %s"</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>tls-program <span class="org-rainbow-delimiters-depth-3">(</span>concat gnutls <span class="org-string">" --tofu -p %p %h"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>preview-pdf2dsc-command
   <span class="org-rainbow-delimiters-depth-3">(</span>concat pdf2dsc-command <span class="org-string">" %s.pdf %m/preview.dsc"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>preview-dvips-command
   <span class="org-rainbow-delimiters-depth-3">(</span>concat dvips-command <span class="org-string">" -Pwww %d -o %m/preview.ps"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>preview-fast-dvips-command
   <span class="org-rainbow-delimiters-depth-3">(</span>concat dvips-command <span class="org-string">" -Pwww %d -o %m/preview.ps"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>preview-dvipng-command
   <span class="org-rainbow-delimiters-depth-3">(</span>concat dvipng-command
           <span class="org-string">" -picky -noghostscript %d -o \"%m/prev%%03d.png\""</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>TeX-engine-alist `<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>xetex <span class="org-string">"XeTeX"</span> xetex-command xelatex-command
                             xetex-command<span class="org-rainbow-delimiters-depth-4">)</span>
                      <span class="org-rainbow-delimiters-depth-4">(</span>luatex <span class="org-string">"LuaTeX"</span> luatex-command
                              ,<span class="org-rainbow-delimiters-depth-5">(</span>concat luatex-command <span class="org-string">" --jobname=%s"</span><span class="org-rainbow-delimiters-depth-5">)</span>
                              luatex-command<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>TeX-command-list
   `<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"TeX"</span>
      <span class="org-string">"%(PDF)%(tex) %(file-line-error) %(extraopts) %`%S%(PDFout)%(mode)%' %t"</span>
      TeX-run-TeX nil
      <span class="org-rainbow-delimiters-depth-5">(</span>plain-tex-mode ams-tex-mode texinfo-mode<span class="org-rainbow-delimiters-depth-5">)</span>
      <span class="org-builtin">:help</span> <span class="org-string">"Run plain TeX"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"LaTeX"</span> <span class="org-string">"%`%l%(mode)%' %t"</span> TeX-run-TeX nil
      <span class="org-rainbow-delimiters-depth-5">(</span>latex-mode doctex-mode<span class="org-rainbow-delimiters-depth-5">)</span>
      <span class="org-builtin">:help</span> <span class="org-string">"Run LaTeX"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Makeinfo"</span> ,<span class="org-rainbow-delimiters-depth-5">(</span>concat makeinfo-command <span class="org-string">" %(extraopts) %t"</span><span class="org-rainbow-delimiters-depth-5">)</span>
      TeX-run-compile nil
      <span class="org-rainbow-delimiters-depth-5">(</span>texinfo-mode<span class="org-rainbow-delimiters-depth-5">)</span>
      <span class="org-builtin">:help</span> <span class="org-string">"Run Makeinfo with Info output"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Makeinfo HTML"</span> ,<span class="org-rainbow-delimiters-depth-5">(</span>concat makeinfo-command <span class="org-string">" %(extraopts) --html %t"</span><span class="org-rainbow-delimiters-depth-5">)</span>
      TeX-run-compile nil
      <span class="org-rainbow-delimiters-depth-5">(</span>texinfo-mode<span class="org-rainbow-delimiters-depth-5">)</span>
      <span class="org-builtin">:help</span> <span class="org-string">"Run Makeinfo with HTML output"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"AmSTeX"</span>
      ,<span class="org-rainbow-delimiters-depth-5">(</span>concat pdftex-command <span class="org-string">" %(PDFout) %(extraopts) %`%S%(mode)%' %t"</span><span class="org-rainbow-delimiters-depth-5">)</span>
      TeX-run-TeX nil
      <span class="org-rainbow-delimiters-depth-5">(</span>ams-tex-mode<span class="org-rainbow-delimiters-depth-5">)</span>
      <span class="org-builtin">:help</span> <span class="org-string">"Run AMSTeX"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"ConTeXt"</span>
      ,<span class="org-rainbow-delimiters-depth-5">(</span>concat context-command <span class="org-string">" --once --texutil %(extraopts) %(execopts)%t"</span><span class="org-rainbow-delimiters-depth-5">)</span>
      TeX-run-TeX nil
      <span class="org-rainbow-delimiters-depth-5">(</span>context-mode<span class="org-rainbow-delimiters-depth-5">)</span>
      <span class="org-builtin">:help</span> <span class="org-string">"Run ConTeXt once"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"ConTeXt Full"</span> ,<span class="org-rainbow-delimiters-depth-5">(</span>concat context-command <span class="org-string">" %(extraopts) %(execopts)%t"</span><span class="org-rainbow-delimiters-depth-5">)</span>
      TeX-run-TeX nil
      <span class="org-rainbow-delimiters-depth-5">(</span>context-mode<span class="org-rainbow-delimiters-depth-5">)</span>
      <span class="org-builtin">:help</span> <span class="org-string">"Run ConTeXt until completion"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"BibTeX"</span> ,<span class="org-rainbow-delimiters-depth-5">(</span>concat bibtex-command <span class="org-string">" %s"</span><span class="org-rainbow-delimiters-depth-5">)</span>
      TeX-run-BibTeX nil t <span class="org-builtin">:help</span> <span class="org-string">"Run BibTeX"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Biber"</span> <span class="org-string">"biber %s"</span> TeX-run-Biber nil t <span class="org-builtin">:help</span> <span class="org-string">"Run Biber"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"View"</span> <span class="org-string">"%V"</span> TeX-run-discard-or-function t t <span class="org-builtin">:help</span> <span class="org-string">"Run Viewer"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Print"</span> <span class="org-string">"%p"</span> TeX-run-command t t <span class="org-builtin">:help</span> <span class="org-string">"Print the file"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Queue"</span> <span class="org-string">"%q"</span> TeX-run-background nil t
      <span class="org-builtin">:help</span> <span class="org-string">"View the printer queue"</span> <span class="org-builtin">:visible</span> TeX-queue-command<span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"File"</span> ,<span class="org-rainbow-delimiters-depth-5">(</span>concat dvips-command <span class="org-string">" %d -o %f "</span><span class="org-rainbow-delimiters-depth-5">)</span>
      TeX-run-dvips t t <span class="org-builtin">:help</span> <span class="org-string">"Generate PostScript file"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Dvips"</span> ,<span class="org-rainbow-delimiters-depth-5">(</span>concat dvips-command <span class="org-string">" %d -o %f "</span><span class="org-rainbow-delimiters-depth-5">)</span>
      TeX-run-dvips nil t <span class="org-builtin">:help</span> <span class="org-string">"Convert DVI file to PostScript"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Dvipdfmx"</span> ,<span class="org-rainbow-delimiters-depth-5">(</span>concat dvipdfmx-command <span class="org-string">" %d"</span><span class="org-rainbow-delimiters-depth-5">)</span>
      TeX-run-dvipdfmx nil t <span class="org-builtin">:help</span> <span class="org-string">"Convert DVI file to PDF with dvipdfmx"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Ps2pdf"</span> ,<span class="org-rainbow-delimiters-depth-5">(</span>concat ps2pdf-command <span class="org-string">" %f"</span><span class="org-rainbow-delimiters-depth-5">)</span>
      TeX-run-ps2pdf nil t <span class="org-builtin">:help</span> <span class="org-string">"Convert PostScript file to PDF"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Index"</span> ,<span class="org-rainbow-delimiters-depth-5">(</span>concat makeindex-command <span class="org-string">" %s"</span><span class="org-rainbow-delimiters-depth-5">)</span>
      TeX-run-index nil t <span class="org-builtin">:help</span> <span class="org-string">"Run makeindex to create index file"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"upMendex"</span> <span class="org-string">"upmendex %s"</span>
      TeX-run-index t t <span class="org-builtin">:help</span> <span class="org-string">"Run mendex to create index file"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Xindy"</span> <span class="org-string">"xindy %s"</span>
      TeX-run-command nil t <span class="org-builtin">:help</span> <span class="org-string">"Run xindy to create index file"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Check"</span> ,<span class="org-rainbow-delimiters-depth-5">(</span>concat lacheck-command <span class="org-string">" %s"</span><span class="org-rainbow-delimiters-depth-5">)</span> TeX-run-compile nil
      <span class="org-rainbow-delimiters-depth-5">(</span>latex-mode<span class="org-rainbow-delimiters-depth-5">)</span>
      <span class="org-builtin">:help</span> <span class="org-string">"Check LaTeX file for correctness"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"ChkTeX"</span> ,<span class="org-rainbow-delimiters-depth-5">(</span>concat chktex-command <span class="org-string">" -v6 %s"</span><span class="org-rainbow-delimiters-depth-5">)</span> TeX-run-compile nil
      <span class="org-rainbow-delimiters-depth-5">(</span>latex-mode<span class="org-rainbow-delimiters-depth-5">)</span>
      <span class="org-builtin">:help</span> <span class="org-string">"Check LaTeX file for common mistakes"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Spell"</span> <span class="org-string">"(TeX-ispell-document \"\")"</span>
      TeX-run-function nil t <span class="org-builtin">:help</span> <span class="org-string">"Spell-check the document"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Clean"</span> <span class="org-string">"TeX-clean"</span>
      TeX-run-function nil t <span class="org-builtin">:help</span> <span class="org-string">"Delete generated intermediate files"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Clean All"</span> <span class="org-string">"(TeX-clean t)"</span> TeX-run-function nil t
      <span class="org-builtin">:help</span> <span class="org-string">"Delete generated intermediate and output files"</span><span class="org-rainbow-delimiters-depth-4">)</span>
     <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"Other"</span> <span class="org-string">""</span> TeX-run-command t t <span class="org-builtin">:help</span> <span class="org-string">"Run an arbitrary command"</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>counsel-grep-base-command
   <span class="org-rainbow-delimiters-depth-3">(</span>concat ripgrep-executable
           <span class="org-string">" -i -M 120 --no-heading --line-number --color never '</span><span class="org-string"><span class="org-constant">%s</span></span><span class="org-string">' %s"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>counsel-rg-base-command
   <span class="org-rainbow-delimiters-depth-3">(</span>concat ripgrep-executable <span class="org-string">" -i --no-heading --line-number %s ."</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>counsel-ag-base-command <span class="org-rainbow-delimiters-depth-3">(</span>concat ag-executable <span class="org-string">" --nocolor --nogroup %s"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>org-preview-latex-process-alist
   `<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>dvipng <span class="org-builtin">:programs</span> <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-string">"latex"</span> <span class="org-string">"dvipng"</span><span class="org-rainbow-delimiters-depth-5">)</span>
             <span class="org-builtin">:description</span> <span class="org-string">"dvi &gt; png"</span>
             <span class="org-builtin">:message</span> <span class="org-string">""</span>
             <span class="org-builtin">:image-input-type</span> <span class="org-string">"dvi"</span>
             <span class="org-builtin">:image-output-type</span> <span class="org-string">"png"</span>
             <span class="org-builtin">:image-size-adjust</span> <span class="org-rainbow-delimiters-depth-5">(</span>1.0 . 1.0<span class="org-rainbow-delimiters-depth-5">)</span>
             <span class="org-builtin">:latex-compiler</span>
             <span class="org-rainbow-delimiters-depth-5">(</span>,<span class="org-rainbow-delimiters-depth-6">(</span>concat LaTeX-command
                       <span class="org-string">" -interaction nonstopmode -output-directory %o %f"</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span>
             <span class="org-builtin">:image-converter</span>
             <span class="org-rainbow-delimiters-depth-5">(</span>,<span class="org-rainbow-delimiters-depth-6">(</span>concat dvipng-command
                       <span class="org-string">" -fg %F -bg %B -D %D -T tight -o %O %f"</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>Info-directory-list `<span class="org-rainbow-delimiters-depth-3">(</span>,<span class="org-rainbow-delimiters-depth-4">(</span>expand-file-name <span class="org-string">"share/info"</span> output-directory<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>tramp-remote-path `<span class="org-rainbow-delimiters-depth-3">(</span>tramp-own-remote-path
                       <span class="org-string">"/run/current-system/sw/bin"</span>
                       tramp-default-remote-path
                       <span class="org-string">"/bin"</span>
                       <span class="org-string">"/usr/bin"</span>
                       <span class="org-string">"/sbin"</span>
                       <span class="org-string">"/usr/sbin"</span>
                       <span class="org-string">"/usr/local/bin"</span>
                       <span class="org-string">"/usr/local/sbin"</span>
                       <span class="org-string">"/opt/bin"</span>
                       <span class="org-string">"/opt/sbin"</span>
                       ,<span class="org-rainbow-delimiters-depth-4">(</span>expand-file-name <span class="org-string">"bin"</span> output-directory<span class="org-rainbow-delimiters-depth-4">)</span>
                       <span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
 '<span class="org-rainbow-delimiters-depth-2">(</span>woman-manpath man-path<span class="org-rainbow-delimiters-depth-2">)</span>
 <span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>

<p>
Provide site-paths,
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">provide</span> '<span class="org-constant">site-paths</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgecefeac" class="outline-3">
<h3 id="orgecefeac"><code>bootstrap.sh</code></h3>
<div class="outline-text-3" id="text-orgecefeac">
<div class="org-src-container">
<pre class="src src-sh"><span class="org-comment-delimiter">#</span><span class="org-comment">!/bin/</span><span class="org-keyword">sh</span>
</pre>
</div>

<p>
Install Nix.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-keyword">if</span> <span class="org-negation-char">!</span> command -v nix-env &gt;/dev/null 2&gt;&amp;1; <span class="org-keyword">then</span>
    <span class="org-variable-name">nix_installer</span>=$(mktemp)
    curl -s https://nixos.org/nix/install &gt; $<span class="org-variable-name">nix_installer</span>
    sh $<span class="org-variable-name">nix_installer</span>
<span class="org-keyword">fi</span>
</pre>
</div>

<p>
Pull into Git repo.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-keyword">if</span> [ -d .git ] &amp;&amp; command -v git &gt;/dev/null 2&gt;&amp;1
<span class="org-keyword">then</span>
    git pull origin master || <span class="org-builtin">true</span>
<span class="org-keyword">fi</span>
</pre>
</div>

<p>
Clone if default.nix doesn’t exist.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-keyword">if</span> <span class="org-negation-char">!</span> [ -f default.nix ] &amp;&amp;  &amp;&amp; command -v git &gt;/dev/null 2&gt;&amp;1; <span class="org-keyword">then</span>
    <span class="org-variable-name">repo_dir</span>=$(mktemp -d)
    git clone https://github.com/matthewbauer/bauer $<span class="org-variable-name">repo_dir</span>
    <span class="org-builtin">cd</span> $<span class="org-variable-name">repo_dir</span>
<span class="org-keyword">fi</span>
</pre>
</div>

<p>
Install current directory
</p>

<div class="org-src-container">
<pre class="src src-sh">nix-env -if .
</pre>
</div>
</div>
</div>
<div id="outline-container-org61da8e6" class="outline-3">
<h3 id="org61da8e6"><code>runemacs.sh</code></h3>
<div class="outline-text-3" id="text-org61da8e6">
<p>
Cross-platform script to execute app.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-comment-delimiter">#</span><span class="org-comment">!/usr/bin/</span><span class="org-keyword">env</span><span class="org-comment"> sh</span>

<span class="org-keyword">case</span> $(uname) <span class="org-keyword">in</span>
    Darwin)
        open @out@/Applications/Emacs.app
    ;;
    *)
        @out@/bin/emacs
    ;;
<span class="org-keyword">esac</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org4f9ea23" class="outline-2">
<h2 id="org4f9ea23">Building</h2>
<div class="outline-text-2" id="text-org4f9ea23">
</div>
<div id="outline-container-orgd422cce" class="outline-3">
<h3 id="orgd422cce"><code>default.nix</code>: the tangler</h3>
<div class="outline-text-3" id="text-orgd422cce">
<div class="org-src-container">
<pre class="src src-nix">{ nixpkgs-url ? <span class="org-string">"nixos.org/channels/nixpkgs-unstable/nixexprs.tar.xz"</span>
, nixpkgs ? builtins.fetchTarball nixpkgs-url
, nixpkgs' ? <span class="org-nix-builtin">import</span> nixpkgs {}
}: <span class="org-nix-keyword">with</span> nixpkgs';
</pre>
</div>

<p>
Now let&rsquo;s tangle README.org&#x2026;
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-builtin">import</span> (runCommand <span class="org-string">"README"</span> { <span class="org-nix-attribute">buildInputs</span> = [ emacs ]; } <span class="org-string">''</span>
<span class="org-string">mkdir -p $out</span>
<span class="org-string">cd $out</span>
<span class="org-string">cp -r </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./lisp</span><span class="org-nix-antiquote">}</span><span class="org-string"> $out/lisp</span>
<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./README.org</span><span class="org-nix-antiquote">}</span><span class="org-string"> README.org</span>
<span class="org-string">emacs --batch --quick \</span>
<span class="org-string">      -l ob-tangle \</span>
<span class="org-string">      --eval "(org-babel-tangle-file \"README.org\")"</span>
<span class="org-string">cp bauer.nix default.nix</span>
<span class="org-string">''</span>) {<span class="org-nix-keyword">inherit</span> nixpkgs';}
</pre>
</div>
</div>
</div>
<div id="outline-container-org0bb5b13" class="outline-3">
<h3 id="org0bb5b13"><code>bauer.nix</code>: the build script</h3>
<div class="outline-text-3" id="text-org0bb5b13">
<p>
<code>nixpkgs</code> should just be a Nix path to the Nixpkgs package set. <code>nixpkgs'</code>
will be <code>nixpkgs</code> instantiated.
</p>

<div class="org-src-container">
<pre class="src src-nix">{ nixpkgs-url ? <span class="org-string">"nixos.org/channels/nixpkgs-unstable/nixexprs.tar.xz"</span>
, nixpkgs ? builtins.fetchTarball nixpkgs-url
, nixpkgs' ? <span class="org-nix-builtin">import</span> nixpkgs {}
}: <span class="org-nix-keyword">with</span> nixpkgs'; <span class="org-nix-keyword">let</span>
</pre>
</div>

<p>
We start out by defining the Nix version to use. nixStable corresponds to the
last released version, 1.11.
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">nix</span> = nixStable;
</pre>
</div>

<p>
Next we start defining some packages. R is one of the simpler ones right now,
so let&rsquo;s start with that.
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">rEnv</span> = pkgs.rWrapper.override {
  <span class="org-nix-attribute">packages</span> = <span class="org-nix-keyword">with</span> pkgs.rPackages; [
    RCurl
  ];
};
</pre>
</div>

<p>
Here we define our package set. This will just give us access to all of the
Emacs packages defined in Nixpkgs.
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">customEmacsPackages</span> = emacsPackagesNg.overrideScope (super: self: {
  <span class="org-nix-keyword">inherit</span> emacs;
});
</pre>
</div>

<p>
Next, we define aspell with the English language. This is used by Emacs
ispell.
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">myAspell</span> = aspellWithDicts (ps : <span class="org-nix-keyword">with</span> ps; [ en ]);
</pre>
</div>

<p>
Tex live provides some LaTeX commads for us.
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">myTex</span> = texlive.combine {
  <span class="org-nix-keyword">inherit</span> (texlive) xetex setspace
    fontspec chktex enumitem xifthen
    ifmtarg filehook wrapfig inconsolata
    upquote minted lastpage collection-basic
    collection-binextra collection-context
    collection-fontsrecommended collection-fontutils
    collection-genericrecommended collection-langenglish
    collection-latex collection-latexrecommended collection-luatex
    collection-mathextra collection-metapost collection-plainextra
    collection-texworks collection-xetex capt-of;
};
</pre>
</div>
</div>
<div id="outline-container-orgbaafdf9" class="outline-4">
<h4 id="orgbaafdf9">Emacs configuration</h4>
<div class="outline-text-4" id="text-orgbaafdf9">
<p>
Here, we start building up the site-paths.el file. This does a simple
substitution of all the attributes set.
</p>

<div class="org-src-container">
<pre class="src src-nix">  <span class="org-nix-attribute">site-paths</span> = runCommand <span class="org-string">"site-paths.el"</span> {
    <span class="org-nix-keyword">inherit</span> rtags ripgrep ag emacs ant nethack fortune gnutls
      coreutils findutils openssh git bash
      zsh perl golint perlcritic
      go asciidoc lessc stack
      lua gcc bashInteractive diffutils
      pandoc clang cmake ghostscript
      gnugrep man gawk gnused
      sqliteInteractive freetds mariadb
      parallel unixODBC ncompress
      texinfoInteractive cacert notmuch;
    <span class="org-nix-keyword">inherit</span> (pythonPackages) flake8;
    <span class="org-nix-keyword">inherit</span> (nodePackages) jshint eslint;
    <span class="org-nix-attribute">intero</span> = haskellPackages.intero-nix-shim;
    <span class="org-nix-attribute">texlive</span> = myTex;
    <span class="org-nix-attribute">markdown2</span> = pythonPackages.markdown2;
    <span class="org-nix-attribute">tidy</span> = html-tidy;
    <span class="org-nix-attribute">irony</span> = irony-server;
    <span class="org-nix-attribute">libxml2</span> = libxml2.bin;
    <span class="org-nix-attribute">gpg</span> = gnupg1compat;
    <span class="org-comment"># jdeeserver = jdee-server;</span>
    <span class="org-nix-attribute">aspell</span> = myAspell;
    <span class="org-nix-attribute">orginit</span> = <span class="org-nix-constant">./org-init.el</span>;
  } <span class="org-string">''</span>
<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./site-paths.el.in</span><span class="org-nix-antiquote">}</span><span class="org-string"> $out</span>
<span class="org-string">substituteAllInPlace $out</span>
<span class="org-string">  ''</span>;
</pre>
</div>

<p>
Emacs building can be divided into phases. Each phase will run through the
Elisp once.
</p>
</div>
<ul class="org-ul">
<li><a id="orgf9e40f8"></a>Phase 1: picking up dependencies<br>
<div class="outline-text-5" id="text-orgf9e40f8">
<p>
myPackages gets a listing of all of the packages that are needed by the Emacs
configuration. use-package-list generates this list automatically.
</p>

<div class="org-src-container">
<pre class="src src-nix">  <span class="org-nix-attribute">package-list</span> = <span class="org-nix-keyword">with</span> customEmacsPackages.melpaPackages;
    runCommand <span class="org-string">"package-list"</span> { <span class="org-nix-attribute">buildInputs</span> = [ emacs ]; } <span class="org-string">''</span>
<span class="org-string">emacs --batch --quick \</span>
<span class="org-string">                -L </span><span class="org-nix-antiquote">${</span>bind-key<span class="org-nix-antiquote">}</span><span class="org-string">/share/emacs/site-lisp/elpa/bind-key-* \</span>
<span class="org-string">                -L </span><span class="org-nix-antiquote">${</span>use-package<span class="org-nix-antiquote">}</span><span class="org-string">/share/emacs/site-lisp/elpa/use-package-* \</span>
<span class="org-string">                -L </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./lisp</span><span class="org-nix-antiquote">}</span><span class="org-string"> -l use-package-list \</span>
<span class="org-string">                --eval "(use-package-list \"</span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./README.el</span><span class="org-nix-antiquote">}</span><span class="org-string">\")" &gt; $out</span>
<span class="org-string">  ''</span>;
  <span class="org-nix-attribute">myPackages</span> = builtins.fromJSON (builtins.readFile package-list);
</pre>
</div>
</div>
</li>
<li><a id="org208e459"></a>Phase 2: byte compiling<br>
<div class="outline-text-5" id="text-org208e459">
<div class="org-src-container">
<pre class="src src-nix">  <span class="org-nix-attribute">default</span> = runCommand <span class="org-string">"default.el"</span> { <span class="org-nix-attribute">buildInputs</span> = [emacs]; } <span class="org-string">''</span>
<span class="org-string">mkdir -p $out/share/emacs/site-lisp</span>

<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./README.el</span><span class="org-nix-antiquote">}</span><span class="org-string"> $out/share/emacs/site-lisp/default.el</span>
<span class="org-string">cp </span><span class="org-nix-antiquote">${</span>site-paths<span class="org-nix-antiquote">}</span><span class="org-string"> $out/share/emacs/site-lisp/site-paths.el</span>

<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./lisp/em-dired.el</span><span class="org-nix-antiquote">}</span><span class="org-string"> $out/share/emacs/site-lisp/em-dired.el</span>
<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./lisp/dired-column.el</span><span class="org-nix-antiquote">}</span><span class="org-string"> \</span>
<span class="org-string">  $out/share/emacs/site-lisp/dired-column.el</span>
<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./lisp/macho-mode.el</span><span class="org-nix-antiquote">}</span><span class="org-string"> $out/share/emacs/site-lisp/macho-mode.el</span>
<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./lisp/nethack.el</span><span class="org-nix-antiquote">}</span><span class="org-string"> $out/share/emacs/site-lisp/nethack.el</span>
<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./lisp/set-defaults.el</span><span class="org-nix-antiquote">}</span><span class="org-string"> \</span>
<span class="org-string">  $out/share/emacs/site-lisp/set-defaults.el</span>
<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./lisp/installer.el</span><span class="org-nix-antiquote">}</span><span class="org-string"> $out/share/emacs/site-lisp/installer.el</span>
<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./lisp/restart-emacs.el</span><span class="org-nix-antiquote">}</span><span class="org-string"> \</span>
<span class="org-string">  $out/share/emacs/site-lisp/restart-emacs.el</span>
<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./lisp/company-eshell-history.el</span><span class="org-nix-antiquote">}</span><span class="org-string"> \</span>
<span class="org-string">  $out/share/emacs/site-lisp/company-eshell-history.el</span>
<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./lisp/use-package-list.el</span><span class="org-nix-antiquote">}</span><span class="org-string"> \</span>
<span class="org-string">  $out/share/emacs/site-lisp/use-package-list.el</span>
</pre>
</div>

<p>
Ideally, we could compile the .el file into a .elc, but it doesn’t work so
well. The below block should do it, but it gives lots of errors.
</p>

<div class="org-src-container">
<pre class="src src-nix">cd $<span class="org-nix-constant">out/share/emacs/site-lisp</span>
export <span class="org-nix-attribute">HOME</span>=$PWD
emacs --batch --quick \
      --eval <span class="org-string">"(let ((default-directory \"</span><span class="org-nix-antiquote">${</span>emacsWrapper
                ((requiredPackages customEmacsPackages myPackages) ++
                  [customEmacsPackages.melpaPackages.use-package])
<span class="org-nix-antiquote">}</span><span class="org-string">/share/emacs/site-lisp\")) (normal-top-level-add-subdirs-to-load-path))"</span> \
      -L . -f batch-byte-compile *.el
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-string">'';</span>
</pre>
</div>
</div>
</li>
<li><a id="orgad6579e"></a>Phase 3: wrapping into Emacs<br>
<div class="outline-text-5" id="text-orgad6579e">
<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">emacsWrapper</span> = explicitRequires: runCommand <span class="org-string">"emacs-packages-deps"</span>
 { <span class="org-nix-keyword">inherit</span> emacs explicitRequires; <span class="org-nix-keyword">inherit</span> (xorg) lndir; }
 <span class="org-string">''</span>
<span class="org-string">   mkdir -p $out/bin</span>
<span class="org-string">   mkdir -p $out/share/emacs/site-lisp</span>
<span class="org-string">   local requires</span>
<span class="org-string">   for pkg in $explicitRequires; do</span>
<span class="org-string">     findInputs $pkg requires propagated-user-env-packages</span>
<span class="org-string">   done</span>
<span class="org-string">   linkPath() {</span>
<span class="org-string">     local pkg=$1</span>
<span class="org-string">     local origin_path=$2</span>
<span class="org-string">     local dest_path=$3</span>
<span class="org-string">     # Add the path to the search path list, but only if it exists</span>
<span class="org-string">     if [[ -d "$pkg/$origin_path" ]]; then</span>
<span class="org-string">       $lndir/bin/lndir -silent "$pkg/$origin_path" "$out/$dest_path"</span>
<span class="org-string">     fi</span>
<span class="org-string">   }</span>
<span class="org-string">   linkEmacsPackage() {</span>
<span class="org-string">     linkPath "$1" "bin" "bin"</span>
<span class="org-string">     linkPath "$1" "share/emacs/site-lisp" "share/emacs/site-lisp"</span>
<span class="org-string">   }</span>
<span class="org-string">   # Iterate over the array of inputs (avoiding nix's own interpolation)</span>
<span class="org-string">   for pkg in "''${requires[@]}"; do</span>
<span class="org-string">     linkEmacsPackage $pkg</span>
<span class="org-string">   done</span>
<span class="org-string">   # Byte-compiling improves start-up time only slightly, but costs nothing.</span>
<span class="org-string">   $emacs/bin/emacs --batch -f batch-byte-compile "$siteStart"</span>
<span class="org-string">''</span>;
</pre>
</div>

<p>
requiredPackages is a function that takes two arguments. 
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">requiredPackages</span> = epkgs: <span class="org-nix-builtin">map</span> (x:
  <span class="org-nix-keyword">if</span> builtins.hasAttr x epkgs.melpaPackages
    <span class="org-nix-keyword">then</span> builtins.getAttr x epkgs.melpaPackages
    <span class="org-nix-keyword">else</span> if builtins.hasAttr x epkgs <span class="org-nix-keyword">then</span> builtins.getAttr x epkgs
    <span class="org-nix-keyword">else</span> if builtins.hasAttr x emacsPackages
    <span class="org-nix-keyword">then</span> builtins.getAttr x emacsPackages
    <span class="org-nix-keyword">else</span> if builtins.hasAttr x epkgs.elpaPackages
    <span class="org-nix-keyword">then</span> builtins.getAttr x epkgs.elpaPackages
    <span class="org-nix-keyword">else</span> builtins.getAttr x pkgs);
</pre>
</div>

<p>
Now we build our Emacs distribution.
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">myEmacs</span> = customEmacsPackages.emacsWithPackages (epkgs:
  (requiredPackages epkgs myPackages)
  ++ [default epkgs.melpaPackages.use-package]
);
</pre>
</div>
</div>
</li>
</ul>
</div>
<div id="outline-container-org6a345d0" class="outline-4">
<h4 id="org6a345d0">The environment</h4>
<div class="outline-text-4" id="text-org6a345d0">
<p>
Finally, we can actually build the environment.
</p>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-attribute">myEnv</span> = buildEnv {
  <span class="org-nix-attribute">buildInputs</span> = [ makeWrapper ];
  <span class="org-nix-attribute">postBuild</span> = <span class="org-string">''</span>
<span class="org-string">if [ -w $out/share/info ]; then</span>
<span class="org-string">  shopt -s nullglob</span>
<span class="org-string">  for i in $out/share/info/*.info $out/share/info/*.info.gz; do # */</span>
<span class="org-string">    </span><span class="org-nix-antiquote">${</span>texinfoInteractive<span class="org-nix-antiquote">}</span><span class="org-string">/bin/install-info $i $out/share/info/dir</span>
<span class="org-string">  done</span>
<span class="org-string">fi</span>

<span class="org-string">mkdir -p $out/etc</span>

<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./gitconfig</span><span class="org-nix-antiquote">}</span><span class="org-string"> $out/etc/gitconfig</span>
<span class="org-string">substituteInPlace $out/etc/gitconfig \</span>
<span class="org-string">  --replace @gitignore@ </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./gitignore</span><span class="org-nix-antiquote">}</span><span class="org-string"> \</span>
<span class="org-string">  --replace @gnupg@ </span><span class="org-nix-antiquote">${</span>gnupg1compat<span class="org-nix-antiquote">}</span><span class="org-string">/bin/gpg \</span>
<span class="org-string">  --replace @out@ $out</span>

<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./bashrc.sh</span><span class="org-nix-antiquote">}</span><span class="org-string"> $out/etc/bashrc</span>
<span class="org-string">substituteInPlace $out/etc/bashrc \</span>
<span class="org-string">  --replace @fortune@ </span><span class="org-nix-antiquote">${</span>fortune<span class="org-nix-antiquote">}</span><span class="org-string"> \</span>
<span class="org-string">  --replace @out@ $out</span>

<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./zshrc.sh</span><span class="org-nix-antiquote">}</span><span class="org-string"> $out/etc/.zshrc</span>
<span class="org-string">substituteInPlace $out/etc/.zshrc \</span>
<span class="org-string">  --replace @zsh-autosuggestions@ </span><span class="org-nix-antiquote">${</span>zsh-autosuggestions<span class="org-nix-antiquote">}</span><span class="org-string"> \</span>
<span class="org-string">  --replace @fortune@ </span><span class="org-nix-antiquote">${</span>fortune<span class="org-nix-antiquote">}</span><span class="org-string"> \</span>
<span class="org-string">  --replace @out@ $out</span>
<span class="org-string">cp $out/etc/.zshrc $out/etc/zshrc</span>

<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./etc-profile.sh</span><span class="org-nix-antiquote">}</span><span class="org-string"> $out/etc/profile</span>
<span class="org-string">substituteInPlace $out/etc/profile \</span>
<span class="org-string">  --replace @out@ $out</span>

<span class="org-string">wrapProgram $out/bin/bash \</span>
<span class="org-string">  --add-flags "--rcfile $out/etc/bashrc"</span>

<span class="org-string">wrapProgram $out/bin/zsh \</span>
<span class="org-string">  --set ZDOTDIR $out/etc</span>

<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./runemacs.sh</span><span class="org-nix-antiquote">}</span><span class="org-string"> $out/bin/run</span>
<span class="org-string">substituteInPlace $out/bin/run \</span>
<span class="org-string">  --replace @out@ $out</span>
<span class="org-string">chmod +x $out/bin/run</span>
<span class="org-string">  ''</span>;
  <span class="org-nix-attribute">meta</span> = {
    <span class="org-nix-attribute">priority</span> = -10;
  };
  <span class="org-nix-attribute">pathsToLink</span> = [
    <span class="org-string">"/bin"</span>
    <span class="org-string">"/etc/profile.d"</span>
    <span class="org-string">"/etc/bash_completion.d"</span>
    <span class="org-string">"/etc/ssl"</span>
    <span class="org-string">"/Applications"</span>
    <span class="org-string">"/share/doc"</span>
    <span class="org-string">"/share/man"</span>
    <span class="org-string">"/share/info"</span>
    <span class="org-string">"/share/zsh"</span>
    <span class="org-string">"/share/bash-completion"</span>
    <span class="org-string">"/share/mime"</span>
  ];

  <span class="org-nix-attribute">extraOutputsToInstall</span> = [ <span class="org-string">"man"</span> <span class="org-string">"info"</span> <span class="org-string">"doc"</span> <span class="org-string">"devdoc"</span> <span class="org-string">"devman"</span> ];
  <span class="org-nix-attribute">name</span> = <span class="org-string">"bauer"</span>;

  <span class="org-nix-attribute">paths</span> = [
    myEmacs
    myTex
    rEnv
    (runCommand <span class="org-string">"my-profile"</span> { <span class="org-nix-attribute">buildInputs</span> = [makeWrapper]; } <span class="org-string">''</span>
<span class="org-string">mkdir -p $out/etc/profile.d</span>
<span class="org-string">cp </span><span class="org-nix-antiquote">${</span><span class="org-nix-constant">./profile.sh</span><span class="org-nix-antiquote">}</span><span class="org-string"> $out/etc/profile.d/my-profile.sh</span>
<span class="org-string">substituteInPlace $out/etc/profile.d/my-profile.sh \</span>
<span class="org-string">  --replace @emacs@ </span><span class="org-nix-antiquote">${</span>myEmacs<span class="org-nix-antiquote">}</span><span class="org-string"> \</span>
<span class="org-string">  --replace @fortune@ </span><span class="org-nix-antiquote">${</span>fortune<span class="org-nix-antiquote">}</span><span class="org-string"> \</span>
<span class="org-string">  --replace @cacert@ </span><span class="org-nix-antiquote">${</span>cacert<span class="org-nix-antiquote">}</span>
<span class="org-string">    ''</span>)
  ] ++ [bashInteractive zsh coreutils git
        gawk gnused gzip gnutar gnupg1compat xz cacert
  ] ++ [nox nix nix-index nix-repl]
    ++ [nodePackages.tern isync notmuch graphviz]
    ++ [stack ghc];
};
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nix"><span class="org-nix-keyword">in</span> myEnv
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgfc2779b" class="outline-3">
<h3 id="orgfc2779b">Invoking it</h3>
<div class="outline-text-3" id="text-orgfc2779b">
<p>
We can build it with <code>nix-build</code>.
</p>

<div class="org-src-container">
<pre class="src src-sh">nix-build
./result/bin/run
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org9b23cdf" class="outline-2">
<h2 id="org9b23cdf">Continuous integration</h2>
<div class="outline-text-2" id="text-org9b23cdf">
<div class="HTML" id="orgb57ce53">
<p>
&lt;a href=<a href="https://travis-ci.org/matthewbauer/bauer">https://travis-ci.org/matthewbauer/bauer</a>&ldquo;&gt;
  &lt;img src=&rdquo;<img src="https://travis-ci.org/matthewbauer/bauer.svg?branch=master" alt="bauer.svg?branch=master">"&gt;&lt;/img&gt;
&lt;/a&gt;
</p>

</div>

<p>
We&rsquo;ll set up Travis support here. We start by configuring <code>.travis.yml</code>.
</p>
</div>
<div id="outline-container-org9dc07bd" class="outline-3">
<h3 id="org9dc07bd"><code>.travis.yml</code></h3>
<div class="outline-text-3" id="text-org9dc07bd">
<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">language</span>: nix
</pre>
</div>

<p>
Next we&rsquo;ll set up nix-build and pass the URL of Nixpkgs with the <code>NIXPKGS</code>.
</p>

<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">script</span>:
  - nix-build -Q --argstr nixpkgs-url $NIXPKGS
  - sh info.sh result
</pre>
</div>

<p>
Setup the OSs. Sadly no Windows support yet.
</p>

<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">git</span>:
  <span class="org-variable-name">depth</span>: 1
<span class="org-variable-name">sudo</span>: <span class="org-constant">false</span>
<span class="org-variable-name">os</span>:
  - linux
  - osx
</pre>
</div>

<p>
Setup some values for <code>NIXPKGS</code> variables.
</p>

<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">env</span>:
  - NIXPKGS=nixos.org/channels/nixos-17.09/nixexprs.tar.xz
  - NIXPKGS=nixos.org/channels/nixpkgs-17.09-darwin/nixexprs.tar.xz
  - NIXPKGS=nixos.org/channels/nixos-unstable/nixexprs.tar.xz
  - NIXPKGS=nixos.org/channels/nixpkgs-unstable/nixexprs.tar.xz
</pre>
</div>

<p>
Configure the matrix&#x2026;
</p>

<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">matrix</span>:
  <span class="org-variable-name">exclude</span>:
    - <span class="org-variable-name">os</span>: linux
      <span class="org-variable-name">env</span>: NIXPKGS=nixos.org/channels/nixpkgs-17.09-darwin/nixexprs.tar.xz
    - <span class="org-variable-name">os</span>: osx
      <span class="org-variable-name">env</span>: NIXPKGS=nixos.org/channels/nixos-17.09/nixexprs.tar.xz
    - <span class="org-variable-name">os</span>: osx
      <span class="org-variable-name">env</span>: NIXPKGS=nixos.org/channels/nixos-unstable/nixexprs.tar.xz
  <span class="org-variable-name">allow_failures</span>:
    - <span class="org-variable-name">env</span>: NIXPKGS=nixos.org/channels/nixos-unstable/nixexprs.tar.xz
    - <span class="org-variable-name">env</span>: NIXPKGS=nixos.org/channels/nixpkgs-unstable/nixexprs.tar.xz
</pre>
</div>

<p>
Setup the cache.
</p>

<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">cache</span>:
  <span class="org-variable-name">directories</span>:
    - /nix/store
</pre>
</div>

<p>
Turn off those annoying Travis notifications.
</p>

<div class="org-src-container">
<pre class="src src-yaml"><span class="org-variable-name">notifications</span>:
  <span class="org-variable-name">email</span>: <span class="org-constant">false</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org5220b45" class="outline-2">
<h2 id="org5220b45">Extra</h2>
<div class="outline-text-2" id="text-org5220b45">
</div>
<div id="outline-container-org85f7661" class="outline-3">
<h3 id="org85f7661"><code>update.sh</code></h3>
<div class="outline-text-3" id="text-org85f7661">
<p>
This is a simple script that I use to make sure I&rsquo;ve updated the generated
files.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-comment-delimiter">#</span><span class="org-comment">!/bin/</span><span class="org-keyword">sh</span>
emacs --batch <span class="org-sh-escaped-newline">\</span>
      -l ob-tangle --eval <span class="org-string">"(org-babel-tangle-file \"README.org\")"</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org259c6db" class="outline-3">
<h3 id="org259c6db"><code>info.sh</code></h3>
<div class="outline-text-3" id="text-org259c6db">
<p>
This file gives us some info on the built derivation. Only arg is optional
and should be a path to a Nix store derivation.
</p>

<div class="org-src-container">
<pre class="src src-sh"><span class="org-comment-delimiter">#</span><span class="org-comment">!/bin/</span><span class="org-keyword">sh</span>
<span class="org-variable-name">out</span>=$<span class="org-variable-name">1</span>

<span class="org-keyword">if</span> [ -z <span class="org-string">"$out"</span> ]; <span class="org-keyword">then</span>
  <span class="org-variable-name">out</span>=$(nix-build)
<span class="org-keyword">fi</span>

<span class="org-keyword">if</span> [ -L <span class="org-string">"$out"</span> ]; <span class="org-keyword">then</span>
  <span class="org-variable-name">out</span>=$(readlink -f $<span class="org-variable-name">out</span>)
<span class="org-keyword">fi</span>

<span class="org-keyword">if</span> [ -e $<span class="org-variable-name">out</span> ]; <span class="org-keyword">then</span>
  <span class="org-builtin">echo</span> Dependencies:
  du -scl $(nix-store -qR $<span class="org-variable-name">out</span>) | sort -n
<span class="org-keyword">fi</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org2700731" class="outline-3">
<h3 id="org2700731"><code>.gitignore</code></h3>
<div class="outline-text-3" id="text-org2700731">
<p>
These set up some paths for <code>.gitignore</code> that we don’t want getting put in
the repo. Start with Emacs/org-mode/LaTeX stuff.
</p>

<div class="org-src-container">
<pre class="src src-gitignore">flycheck_<span class="org-keyword">*</span>.el
<span class="org-keyword">*</span>.elc
<span class="org-keyword">*</span>.pdf
<span class="org-keyword">*</span>.html
<span class="org-keyword">*</span>.tex
<span class="org-keyword">*</span>.log
<span class="org-keyword">*</span>.aux
<span class="org-keyword">*</span>.out
<span class="org-keyword">*</span>.toc
</pre>
</div>

<p>
Nix-related stuff.
</p>

<div class="org-src-container">
<pre class="src src-gitignore"><span class="org-comment"># nix stuff</span>
result
result-<span class="org-keyword">*</span>
</pre>
</div>

<p>
These are all tangled by <a href="./README.html">README.org</a>.
</p>

<div class="org-src-container">
<pre class="src src-gitignore">README.el
bashrc.sh
bauer.nix
zshrc.sh
etc-profile.sh
runemacs.sh
gitconfig
gitignore
default.el
profile.sh
site-paths.el.in
init.el
org-init.el
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf37f57d" class="outline-3">
<h3 id="orgf37f57d"><code>config.nix</code></h3>
<div class="outline-text-3" id="text-orgf37f57d">
<p>
This file is just for convenience if you wanted to build with the Nixpkgs in
your channel. Having this file available means you can place this repo in
~/.nixpkgs and Nixpkgs will have the package <code>userPackages</code> available.
</p>

<div class="org-src-container">
<pre class="src src-nix">{
  <span class="org-nix-attribute">packageOverrides</span> = pkgs: <span class="org-nix-keyword">with</span> pkgs; <span class="org-nix-keyword">rec</span> {
    <span class="org-nix-attribute">bauer</span> = <span class="org-nix-builtin">import</span> <span class="org-nix-constant">./default.nix</span> { <span class="org-nix-attribute">nixpkgs'</span> = pkgs; };
    <span class="org-nix-attribute">userPackages</span> = bauer;
  };
}
</pre>
</div>
</div>
</div>
<div id="outline-container-org67ba774" class="outline-3">
<h3 id="org67ba774"><code>org-init.el</code></h3>
<div class="outline-text-3" id="text-org67ba774">
<div class="org-src-container">
<pre class="src src-emacs-lisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">site-paths</span> nil t<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">use-package</span><span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> use-package-always-demand t
      use-package-always-ensure nil<span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">tex-site</span><span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">emacs-lisp</span><span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">sh-script</span><span class="org-rainbow-delimiters-depth-1">)</span>
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">org</span>
  <span class="org-builtin">:config</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> org-export-in-background t
        org-src-fontify-natively t
        org-src-preserve-indentation t
        <span class="org-comment-delimiter">;; </span><span class="org-comment">org-html-htmlize-output-type (quote css)</span>
        org-latex-listings <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">quote</span> minted<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ox-latex</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ox-beamer</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ox-md</span><span class="org-rainbow-delimiters-depth-2">)</span>
  <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">ox-rss</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
</div>
<div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/bauer.html</link>
  <guid>https://matthewbauer.us/blog/bauer.html</guid>
  <pubDate>Mon, 06 Nov 2017 00:00:00 -0600</pubDate>
</item>
<item>
  <title><![CDATA[Nix and Org]]></title>
  <description><![CDATA[
<p>
This is a guide on getting Org to work with Nix. Specifically, I want to show
how you can write Nix expressions within an Org document. This might not seem
useful at first, but I think by the end of this guide it will become clear how
powerful the combination of these tools are. First, some background on what
these tools are for those unfamiliar.
</p>

<p>
Org was started in 2003 as an extension, or ‘mode’, to the Emacs text editor.
Carsten Dominik, frustrated with Emacs builtin outliner, sought to create
something that he could use to organize all of his notes and projects in a tree
structure. Since then, Org has grown to include features for note-taking,
hyperlinking, todo lists, spreadsheets, literate programming, and even exporting
to HTML and LaTeX (in fact, this blog is composed in Org). It is the <b>literate
programming</b> feature, called <i>Babel</i>, that will be used extensively in this
guide. All of Org’s features are written in extensible Lisp that manipulate
plain-text ‘.org’ files. Carsten’s creation has become extremely popular among
Emacs users and since 2007 has been included in Emacs. The easiest way to start
using Org is to download Emacs directly from <a href="https://www.gnu.org/software/emacs/">the GNU website</a>.
</p>

<p>
Let’s start by creating a new Org file. Once you have Emacs started, you can
create a new file by pressing <code>C‑x C‑f</code>. If you are unfamiliar with this
notation, that means press and hold the Control key, then press x, then press f.
Now we can name the new file at the ‘Find file: ’ prompt. Let’s type ‘demo.org’
here and then press enter. Now we have an empty Org mode file to type into. You
can save it at any time with <code>C‑x C‑s</code>.
</p>

<div class="org-src-container">
<pre class="src src-org"><span class="org-org-document-info-keyword">#+title:</span> <span class="org-org-document-title">Org Demo</span>
<span class="org-org-document-info-keyword">#+date:</span> <span class="org-org-document-info">&lt;2017-10-15 Sun&gt;</span>

This is just a plain-text document. Keep this document open because we&#8217;ll be
editing this file throughout the tutorial.
</pre>
</div>

<p>
Now that you have an Org file setup, make sure you leave Emacs open and we’ll
refer back to this file later. Next, some background on Nix.
</p>

<p>
Nix was started in 2004 as a <i>purely functional package manager</i>. It solves many
problems in traditional package management. For instance, multiple versions of a
package can be used at the same time, each package gets unique dependencies, bad
upgrades can be rolled back, and unused packages can be garbage collected. More
information on Nix is available from the <a href="https://nixos.org/nix/">Nix homepage</a>. Nix can be installed on
both Linux and macOS machines. It is fairly easy to setup, provided you have
<b>sudo</b> access. Run the following in a terminal to install Nix,
</p>

<div class="org-src-container">
<pre class="src src-sh">$ curl https://nixos.org/nix/install | sh
</pre>
</div>

<p>
Once Nix has been installed, we can go back to Emacs and start writing to
<code>demo.org</code>. Let’s append some documentation to the Org file on what we’ll be building.
</p>

<div class="org-src-container">
<pre class="src src-org">
This Org file builds the Nix expression for &#8216;Hello World&#8217;.
</pre>
</div>

<p>
To put source code in our Org file, we’ll need to know some Org syntax. The
directives <code>#+begin_src</code> and <code>#+end_src</code> tell Org that we are writing in another
language. <b>nix</b> is the name of the language and <code>hello.nix</code> is the file that Org
will write (tangle) the code to.
</p>

<div class="org-src-container">
<pre class="src src-org">
#+begin_src nix :tangle hello.nix
<span class="org-italic">/* Nix code goes here */</span>
</pre>
</div>

<p>
Finally, we can write in Nix’s expression language to create a Hello World
package. Nix’s syntax can be confusing to new users so I’ll be as verbose as
possible. Almost everything is a function in Nix, so, let’s define some
arguments for a <i>Hello World</i> function. Functions with multiple arguments are
defined with <code>{ a, b, c }:</code> where each argument is a comma separated identifier
between <code>{</code> and <code>}</code>. We’ll need <code>stdenv</code> (Nix’s standard environment) and
<code>fetchurl</code> (Nix’s function to download a URL) to build Hello World.
</p>

<div class="org-src-container">
<pre class="src src-org">{ stdenv, fetchurl }:
</pre>
</div>

<p>
Next, we need to provide a definition for Hello World. We want to build Hello
World from some source files. That’s called a derivation in Nix and we can
accomplish it by calling the <code>stdenv.mkDerivation</code> function. The keyword <code>rec</code>
tells Nix that our arguments to <code>stdenv.mkDerivation</code> might be recursive,
meaning our args might need to reference each other.
</p>

<div class="org-src-container">
<pre class="src src-org">stdenv.mkDerivation rec {
</pre>
</div>

<p>
Let’s give this derivation a name.
</p>

<div class="org-src-container">
<pre class="src src-org">name = "hello-2.10";
</pre>
</div>

<p>
Then provide a source using fetchurl.
</p>

<div class="org-src-container">
<pre class="src src-org">  src = fetchurl {
    url = "mirror://gnu/hello/${name}.tar.gz";
    sha256 = "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i";
  };
}
<span class="org-org-meta-line">#+end_src</span>
</pre>
</div>

<p>
That’s it! We’ve defined a Nix expression that will build Hello World.
</p>

<p>
Unfortunately, this won’t work on it’s own because Nix doesn’t know what stdenv
and fetchurl refer to. We’ll need to define another Nix expression to bootstrap
this one. Since this is all in Org mode that’s as easy as just adding another
code block. We’ll call it <code>bootstrap.nix</code> and it will just call <code>hello.nix</code> as a
package using the <code>stdenv</code> and <code>fetchurl</code> defined in <a href="https://nixos.org/nixpkgs/">Nixpkgs</a>.
</p>

<div class="org-src-container">
<pre class="src src-org">
<span class="org-org-block-begin-line">#+begin_src nix :tangle bootstrap.nix</span>
<span class="org-org-block">{ nixpkgs ? </span><span class="org-org-block"><span class="org-nix-constant">&lt;nixpkgs&gt;</span></span><span class="org-org-block"> }:</span>

<span class="org-org-block"><span class="org-nix-keyword">with</span></span><span class="org-org-block"> </span><span class="org-org-block"><span class="org-nix-builtin">import</span></span><span class="org-org-block"> nixpkgs {};</span>

<span class="org-org-block">callPackage </span><span class="org-org-block"><span class="org-nix-constant">./hello.nix</span></span><span class="org-org-block"> {}</span>
<span class="org-org-block-end-line">#+end_src</span>
</pre>
</div>

<p>
Let’s see if this works. Type <code>M‑x</code> (which means hold down the meta key and
press x) and then type <code>org‑babel‑tangle‑file</code> followed by enter. After this was
run, you’ll have a file called <code>hello.nix</code> and a file called <code>bootstrap.nix</code> in
the current directory. Open up a terminal and we can build Hello World.
</p>

<div class="org-src-container">
<pre class="src src-sh">$ nix-build
/nix/store/&#8230;-hello-2.10
$ ./result/bin/hello
Hello World!
</pre>
</div>

<p>
This is pretty useful on its own, but I don’t want to have to <i>tangle</i> the file
each time I make a change. Let’s tangle Org within a Nix expression. Is this
possible in Nix?
</p>

<p>
Recently Nix has added a feature called IFD which stands for <b>Import From
Derivation</b>. It allows us to use generated Nix expressions within another Nix
expression. That way we can derive hello.nix from a Nix expression and then
derive hello.nix, avoiding <code>org‑babel‑tangle‑file</code> completely.
</p>

<p>
To do this, we’ll need to create another Nix file that we’ll call <code>default.nix</code>.
Like the boostraper, I won’t break down exactly what’s going on in this post,
but it follows the basic Import From Derivation process outlined above calling
Org’s tangler.
</p>

<div class="org-src-container">
<pre class="src src-org">
<span class="org-org-block-begin-line">#+begin_src nix :tangle default.nix</span>
<span class="org-org-block">{ nixpkgs ? </span><span class="org-org-block"><span class="org-nix-constant">&lt;nixpkgs&gt;</span></span><span class="org-org-block"> }:</span>

<span class="org-org-block"><span class="org-nix-keyword">with</span></span><span class="org-org-block"> </span><span class="org-org-block"><span class="org-nix-builtin">import</span></span><span class="org-org-block"> nixpkgs {};</span>

<span class="org-org-block"><span class="org-nix-builtin">import</span></span><span class="org-org-block"> (runCommand </span><span class="org-org-block"><span class="org-string">"bootstrap.nix-generated"</span></span><span class="org-org-block"> {</span>
<span class="org-org-block">  </span><span class="org-org-block"><span class="org-nix-attribute">buildInputs</span></span><span class="org-org-block"> = [ emacs ];</span>
<span class="org-org-block">} </span><span class="org-org-block"><span class="org-string">''</span></span>
<span class="org-org-block"><span class="org-string">    mkdir -p $out</span></span>
<span class="org-org-block"><span class="org-string">    cd $out</span></span>
<span class="org-org-block"><span class="org-string">    cp </span></span><span class="org-org-block"><span class="org-nix-antiquote">${</span></span><span class="org-org-block"><span class="org-nix-constant">./test.org</span></span><span class="org-org-block"><span class="org-nix-antiquote">}</span></span><span class="org-org-block"><span class="org-string"> test.org</span></span>
<span class="org-org-block"><span class="org-string">    emacs --batch -l ob-tangle --eval "(org-babel-tangle-file \"test.org\")"</span></span>
<span class="org-org-block"><span class="org-string">    cp bootstrap.nix default.nix</span></span>
<span class="org-org-block"><span class="org-string">  ''</span></span>
<span class="org-org-block">) { </span><span class="org-org-block"><span class="org-nix-keyword">inherit</span></span><span class="org-org-block"> nixpkgs; }</span>
<span class="org-org-block-end-line">#+end_src</span>
</pre>
</div>

<p>
We still need to tangle everything one last time. Type <code>M‑x</code> and then type
<code>org‑babel‑tangle‑file</code> followed by enter. A new <code>default.nix</code> file will appear.
That <code>default.nix</code> file along with <code>test.org</code> is all you need to build this
expression. To verify this, let’s first remove those old files so we know they
aren’t being referenced accidentally.
</p>

<div class="org-src-container">
<pre class="src src-sh">$ rm -f hello.nix bootstrap.nix
</pre>
</div>

<p>
Finally, we can build our <i>Hello World</i> expression!
</p>

<div class="org-src-container">
<pre class="src src-sh">$ nix-build
/nix/store/&#8230;-hello-2.10
$ ./result/bin/hello
Hello World!
</pre>
</div>

<p>
In this guide I’ve shown you an easy way to write Nix expressions in Org. Now
that you have this environment setup, you should try hacking around <code>test.org</code>.
You can always run <code>nix‑build</code> to see if a binary builds. Try using other
sources, creating a new derivation, adding other dependencies, or hack something
else up. I recommend reading through <a href="https://nixos.org/nixos/nix-pills/">the Nix Pills series</a> for learning Nix and
<a href="http://orgmode.org/guide/">the Org Mode Guide</a> for learning Org.
</p>
<div class="taglist"></div>]]></description>
  <link>https://matthewbauer.us/blog/nix-and-org.html</link>
  <guid>https://matthewbauer.us/blog/nix-and-org.html</guid>
  <pubDate>Sun, 15 Oct 2017 23:26:00 -0500</pubDate>
</item>
</channel>
</rss>
