One of my coworkers is thinking about writing another programming book, and he was asking around about Scrivener, which reminded me that a long time ago I wrote a blog post sort of about Scrivener and why I wasn’t using it anymore (and what I was at that time using instead). I sent that to him (at the risk of exposing myself — although I’m still sure it’s only my mom and my Grandpa Doug who really read this blog) and thought that it might be nice to write about what I’m using now, and why, and how it’s an extension of what I’d been doing previously, but also in many ways different based on my new needs and interests.

(Those were two pretty awful introductory sentences, but you’ll forgive me.)

If nothing else, it might be an interesting opportunity for me to interrogate my current processes and justify them to myself again (not that they really need justification: if I’m doing the writing, then however I manage to get it done is the justification).[1]


I started a new role last year and had some in-between time where I was mostly sitting in meetings, learning the new thing I was going to be working on, and thinking that it might be time to make some changes to my workflow. A few things happened around the same time: it had recently been announced that Atom was finally going to be put to pasture, I was growing increasingly tired of VS Code,[2] I had this time to learn new things and tinker, I was writing much more code for both work and Alia’s bakery website,[3] and I’d recently gotten hold of a copy of Learning the VI and VIM Editors.[4] I was also setting up a new-to-me personal laptop and realized that it was becoming challenging to keep my environments consistent across that laptop, my work laptop, the Raspberry Pi that I was shelling into from my work laptop,[5] and though I know that there are ways to share a VS Code config across environments, I was looking for something a little more…​ nerdy. And ideally genuinely open source.

An Aside About VS Code and It Being Not Really Open Source

So, Microsoft sort of pulled a Google. They provide VS Code (like Chrome), which is built on top of VSCodium (like Chromium), which means that the guts are (more or less) open source, but they add all the nice-to-haves and telemetry stuff on top in the "official" version, so it’s sort of open source, but also not. And it’s still built on top of Electron, which is slow(ish), and a complaint of many people on Reddit (even if it runs perfectly fine on most modern, reasonably fast computers). And yes, you can turn Microsoft’s telemetry off. But still — there are alternatives, it turns out it’s way faster to navigate via some vim or emacs like hands-don’t-leave-you-keyboard system, and, well, I am just tired of VS Code.[6]

At some point, anyway, I happened upon this blog post about "Why Neovim is the best code editor / IDE for developers," and fell deep down the rabbit hole. There was that post and then probably about a dozen or so other posts that all more or less said that the "best" thing was some mix of (n)vim and tmux on top of some better-than-built-in terminal emulator. Git is more or less taken for granted, and since I talked about that previously, I won’t go into that again. I will go into the other stuff. But the best thing about all of this? I was able to make the whole thing more or less look like Atom, which I still dearly miss.[7]

Maybe because I’ve been hanging out with too many lapsed Catholics lately, but I’ve been sort of thinking about it in terms of the "holy trinity," by which I mean I definitely read it somewhere but can’t remember where or when and so am unable to cite it. Nevertheless and as alluded to earlier, the trinity is some combination of a terminal emulator (the environment), a terminal multiplexer (the manager), and a terminal editor (the…​ editor). For me, it’s Alacritty, Tmux, and Neovim.

The Environment: Alacritty

Ah, Alacritty. A good TTY (teletypewriter) pun on top of a "brisk and cheerful readiness" and extraordinarily well-suited to my cross-platform needs. And admittedly, I didn’t spend a whole lot of time exploring other options. I’m not so fussy, and frankly had never had any issues with the good ol' mac "Terminal" app, until I wanted to make everything look like Atom (which I’ll get to in a minute). A lot of folks were recommending iTerm2, but I wanted something that I could also use on Linux. A lot of other folks were recommending kitty, but honestly it seemed like it was doing more than I wanted my terminal to do (i.e., I didn’t want to read through all the docs). Alacritty fit the bill, in particular that its configuration was all YAML and so could be versioned in git (yes, I’ll get to the dotfiles in a minute, too). You can, it turns out, share configs from the "Terminal" app, but again we run into the Linux thing, and also the configs themselves aren’t as clearly editable. Alacritty, on the other hand:

window:
  title: Alacritty
  decorations: buttonless
  dynamic_title: false
  dimensions:
    columns: 120
    lines: 45
  padding:
    x: 15
    y: 15

scrolling:
  history: 1000
  multiplier: 3

font:
  normal:
    family: "SauceCodePro Nerd Font"
  size: 13
  use_thin_strokes: true

It’s plenty fast for my needs (I couldn’t tell the difference anyway), and I really like the "buttonless" window style (which, admittedly, only works on macOS). The portability is nice, in that I basically just drop my config file into wherever it’s supposed to live for a given platform (e.g., ~/.config/alacritty/), and then BOOM, we’re all set, mostly.

An Aside About Fonts

I’ve been making (I won’t say "developing") websites since I was like 12 or something, and I’ve been making "literary journals" since at least the fifth grade. I also had, at one point, some pretensions toward being an artist or at least having some sense of design. And while I’ve mostly given up the latter, I do still think about fonts a reasonable amount. I’m not really a "font guy," but I have seen "Helvetica". I like other serif fonts, but I’ve spent so much time in school and so much time sending manuscripts to places that want only that one thing, and so am perfectly comfortable with your standard "Times New Roman, 12pt font." But I must say, now that I’ve seen the light, I do really love a nerd font.

Admittedly, now that I’ve more or less stopped automagically showing a file explorer in my editor every time it opens up, I wouldn’t really see what glyphs I’m missing so often, but it’s nice to know they’re there. It’s nice that, when I use my very half-baked dotfiles container, which as I write this I realize I don’t actually install the nerd font into, I see the nice little ⎈ helm character above my terminal prompt (which as I write this I realize probably won’t show up well on this blogsite, which also doesn’t have a nerd font provided), reminding me where I am, and it’s just nice, you know?

The other piece of my environment, which maybe isn’t all that exciting, is that on top of the now-recommended zsh shell that macOS strongly suggests you use, I got into Oh My Zsh, which though maybe a little slow to start up sometimes, is likewise configurable, fun, and I really love a few of the plugins. There are other shell frameworks that are more cross-platform (or even cross-shell), but this one is very "batteries included," well-documented, easy, and I like it.

So that’s more or less the environment piece.

The Manager: Tmux

Good old tmux. This one took some effort (like, I literally read a book about it), but dear lord is it wonderful.

The "tl;dr" is that, essentially, you can have "sessions" that exist independently of your actual terminal window, so you can close it, open a new one, and then log back into a session and everything will still be there, exactly as you left it. Furthermore, you can split the window vertically, horizontally, in multiple pieces, really anyway your heart desires so you can have, see, and interact with as many separate terminal instances as you need. This is not something I use much for writing, but it’s super helpful when coding, since I can run tests in one pane and code in the other. And you can, of course, switch between these panes via keyboard commands, so you don’t have to move your hands to touch the mouse (such an inconvenience, I know). There are also different "windows," which essentially function as tabs, so you can work on multiple projects in the same session, which is helpful when, for example, you want to keep all your "work work" windows in one session, and your "personal work" windows in another session, and switch deftly between them when one of your coworkers walks by.[8]

Really the benefit is the "multiple terminals at once" thing and the "reentering a session" thing. Also, it’s likewise configurable via dotfiles, meaning that it’s very portable across environments, machines, etc. While I hope someday to be less spread out, machine-wise, I most likely will always at least have a personal computer and a work computer, and it’s nice to keep some familiar feeling across them. The one thing I now have to remember to do is always remap the Caps Lock key to Ctrl (since this makes moving between all the things and making new things much, much easier), but beyond that: it’s plug and play.

Really, there’s not all that much to say about tmux (without getting into tutorial land, which I am loath to do) other than that it works. Really well.

The Editor: Neovim

But really, though I have no interest in the editor wars (mostly because I never bothered trying emacs in the first place), I have really come to love our dear (very) old friend vim. I read about half of the aforementioned book, did a bit of vimtutor, and mostly played and played until it became second nature. I’m admittedly a bit of a grouch (see: my thoughts about bikes), so I first learned plain-Jane vim, built up a proper .vimrc, played with a few plugins, and basically went about happily for about a month or so.

But then I wanted to do something else, and Vimscript is hard, and I kept reading about Neovim, so I gave that a try, and that’s more or less where I’ve landed. Ultimately I think it’s all a "tool," and I do think there’s perhaps an overabundance of discourse around configs, setups, etc., but I like Neovim in part because I can separate out my configs in a somewhat (though certainly imperfect) manner, Lua isn’t something I write but something that’s easy enough to read and then write against (in other words: copy with a few minor modifications), and it works for me. It’s easy enough to install, and also has the added benefit of keeping my now much more minimal .vimrc minimal so I can pull that into anywhere that I need to shell into but don’t necessarily have administrator access on (but still want a nice editing experience).

Because this isn’t really meant for a technical audience (ha: the thought that I’d have an audience), I’ll keep it relatively high-level here,[9] but I have found through trial and error some plugins that extend Neovim in much the same way that you can extend VS Code, but in a much nerdier, and I think targeted and intentional, way. These include:

  • NERDTree, which I don’t actually load on startup anymore, but is nice to be able to call every now and again.

  • onedark.vim, which gives me colors (more on this, still, in a minute).

  • vim-asciidoctor, which I have mixed feelings about but still is ultimately better than the built-in asciidoc support.[10]

  • zen-mode and twilight, which are newer additions that, with some tweaking, provide a similar sort of experience as my beloved iA Writer’s focus mode.

  • …​and then a bunch of things that turn Neovim into more of a light-weight IDE for writing code.

There’s a guy I work with who used to have my job (and before that, had my old job, too), who also uses vim, and when I was getting started down this road to insanity (or enlightenment; two sides of a coin and all), I asked him about tinkering with his configs. He said he hadn’t touched them in years, and I really appreciated that. It’s not how I tend to be, and since I was learning new things and really excited, I was tinkering with them constantly. But now that the dust has settled and I’m a little more than a year into this workflow, I find that I, too, rarely putz with them anymore. Occasionally I’ll see something interesting on r/neovim and try it out (thus the recent addition of zen-mode), but for the most part it’s become what a tool should be: transparent and ready to hand.[11]

Pulling It All Together: COLORS!!!

Really, though, what’s most important is getting back to something like Atom, which means getting our colors all in order. As mentioned, onedark.vim gets us pretty much all the way there so far as (n)vim is concerned. But in order to make that work, you need to do some fancy-footwork elsewhere. For example, depending on your settings, it can look like hot steamy garbage in the "Terminal" app. And there are a few lines you need/want to add to your tmux configuration, but that’s all okay, since ultimately it means you’re going to have some fine looking colors.

Likewise, since it’s all just hex values, I provided the colors from onedark.vim to Alacritty, overriding the default terminal colors ensuring that any purple will look like the purple I want, any red any red, etc. This provides a pleasing sameness across all the things, and I love that it looks a lot like Atom did. Sure, it’s not exactly one-for-one, but color things never are. It’s close enough. And even though the asciidoc syntax highlighting isn’t quite as nice as it was in Atom, it’s still pretty darn good (and, IMO, preferable to the way VS Code does it), and writing in languages that leverage the Neovim language server protocol is a very beautiful experience.

It’s a small thing, and though at times I’ve flirted with changing color schemes and so on (there is a Lua/Neovim-"native" version of One Dark, for example, which I didn’t think was as good, and there are, you know, other colors), but it’s a thing that provides some visual continuity and I appreciate that. I don’t have to think about it, which really, at the end of the day, is the goal.


"So what?"

This question, which my high school AP Comp teacher, the formidable Mrs. Singer, would often ask, haunts me less and less every year as I spiral further into form– and conceit-based fictions. Still, it’s worth asking. I don’t ask it too much about what I post here since, as mentioned elsewhere, I write it mostly for myself. I give myself, assuredly, far too much leeway. Still.

Though I’ve written before about why a previous version of this setup makes good sense for me, this toolset is like the old one except on steroids. The vim keybindings alone make me frightfully more efficient (and means that I now have to consciously slow down when sharing my screen during code-paring sessions). But also, if you’ll excuse a little lit-kid indulgence, it’s essentially the software equivalent of choosing "the perfect notebook."[12] Except instead of trying to find something that provides an excellent balance of pretense (the formidable Moleskine) with (a different pretense but also) excellent functionality (the Standard Issue Notebook No. 3), which as we all know now is the basic, green-tinted page, college-rule spiral from Bob Slate Stationer in Harvard Square, you can actually dig into the guts of the thing and choose any rule, any dot-pattern, any bullet-template card, any paper, any perfect pen,[13] and fine-tune and make the thing perfectly to your liking.

And like all good tinkerable-things and grail-quests, the journey never ends.[14]


1. There is an aside, probably, about this really interesting article I read a few days ago, and how I miss the sort of philosophical interrogation of everything that it implies (even if this is, clearly, a very idiosyncratic case), but I haven’t had enough coffee this morning, and really it’s maybe too beside the point.
2. I don’t really remember why I was getting tired of VS Code, but maybe it was its ubiquity, my skepticism of anything having too much market share, my feeling that it just wasn’t right, maybe.
3. Which, someday, I swear, I will clean up and open source.
4. There are benefits to working for a publisher, even if, "We’re not a publisher."
5. Because, you know, keeping my work and personal life separate. And also that Raspberry Pi had been functioning as my personal computer for a while.
6. That said, I still do have that asciidoc extension for VS Code that you should definitely use if you’re using VS Code and writing in asciidoc.
7. Even if I’ll be happy to never write another line of coffeescript ever again (even if I really didn’t mind coffeescript as such).
8. Just kidding, I don’t care and neither do my coworkers.
9. And if you want more details, you can just look at the dotfiles.
10. For a discussion of why asciidoc, see the first iteration of this post.
11. That is a pretty hilariously bad explanation of the "ready to hand" IMO, and I’m sorry for that, not that I’m particuarly a Heiddeger person because of the whole, you know, Nazi thing. That said, some of his shit is useful, and the facdt of his affair with Hannah Arendt is intersting if nothing else.
12. A quest that, I learned only a few years ago, is inheritable, as I have apparently inherited it from my mother.
13. Another inheritable quest.
14. Along with its corollary that someday, once it’s just right, I will then write the perfect novel, I will!