alexkarle.com

Source for alexkarle.com
git clone git://git.alexkarle.com/alexkarle.com.git
Log | Files | Refs | README | LICENSE

commit a6a7c07c8189cc463edb3109305a4b0d9d3603cc (patch)
parent d90be6ee2ceb57cd55af7245bd7ddb4e72f8086d
Author: Alex Karle <alex@alexkarle.com>
Date:   Wed, 20 Apr 2022 00:52:26 -0400

blog: Publish post on Plan 9, Acme, and NO_COLOR

This has been a long time coming! Read the post for more
context :)

Diffstat:
Awww/blog/exploring-plan9.txt | 198+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mwww/blog/index.txt | 4++++
2 files changed, 202 insertions(+), 0 deletions(-)

diff --git a/www/blog/exploring-plan9.txt b/www/blog/exploring-plan9.txt @@ -0,0 +1,198 @@ +# Exploring Acme, Plan 9, and `NO_COLOR` + +_Published: April 19, 2022_ + +For the past couple months I've been exploring Plan 9, a distributed +operating system from Bell Labs from the same group that developed +UNIX and C. It's been a pretty deep rabbit hole, so I thought I'd +write about it here. + +## How it Started + +It all started with an interest in tooling. I'm generally really +interested in human-computer interaction, and Plan 9 presents a +radically different approach to using a computer. I watched Russ +Cox's [Tour of Acme](https://research.swtch.com/acme) (a text editor +that was written for Plan 9) and was blown away by the way the +plumber allowed hyperlinking plain text through a simple rule-based +system. If you haven't seen Acme in use, I'd highly recommend +watching that first. + +After reading everything I could about Acme, I knew I wanted to +give it a try, so I downloaded +[plan9port](https://9fans.github.io/plan9port/) (a userspace port +of many Plan 9 programs) and tried to integrate it into my workflow. + +## Early Days: Trying out Acme + +Trying to code in Acme was immediately jarring. I had grown fond +of dark themes and syntax highlighting, so the cream colored +background with plain black text seemed washed out. + +After the shock of the colors came the reality check: I'm no good +with a mouse, and Acme requires precise mouse use. Acme not only +needs a three button mouse (select, execute, and plumb/open), but +common operations like copy/paste use mouse chording (i.e. button 1 +and 3 at the same time). + +Now, I've invested countless hours into learning Vim and have years +of muscle memory built up. I've chosen keyboard-driven tools wherever +possible. So to type on something that lacks what would be considered +primitive keyboard motions (up/down scroll, don't move the cursor) +was a huge adjustment. + +Even so, that wasn't the end of my trial. I swapped my trackball +for a real mouse and gave it an earnest shot. I really enjoyed the +right-click to plumb and grew fond of the colors and simple stacking +interface. + +There was also a certain appeal to it's take on extensions--rather +than have an extension language like VimL or Emacs Lisp, Acme +presents it's contents to other processes as files on a filesystem. +The user can write programs in any language to interact with Acme, +which is so cool. + +Unfortunately, I didn't have the time to invest into fully customizing +Acme via scripts. And given the spartan interface, I really did +need to to continue to use it. For example, the TAB key inputs TAB +characters. To write Python you'd need to use a script to convert +them to spaces. Ultimately, I chose to crawl back to tools I was +familiar with. + +## Middle Ground: Bringing Acme to my Tools + +Acme was too hard to transition to, but I was still bent on bringing +the benefits to my existing tools. I focused on two things: + +1. Building a "plumber" (to decide how to open/display things) +2. Trying out the monochrome colors + +### Building The Plumber + +This turned out to be rather easy. The key realization was that +`tmux(1)` allows external programs to manipulate the session. So +with `tmux` as my replacement for acme-windows, I was able to write +a [`plumb`](https://git.sr.ht/~akarle/dotfiles/tree/main/item/bin/plumb) +script that takes in text from the `tmux` selection and opens it +in the browser if it's a URL, `vi` in a new split if it's a file, +`man` if it's a man-page, `git show` if it's a SHA, etc. + +To make this useful, I paired it with several hotkeys that use the +`search-backward` `tmux` command to search for all instances of a +`plumb`-able object. For example, `prefix-H` finds URLs in the +scrollback: + + bind-key H copy-mode \; send-keys -X search-backward "http[^ ]*" + +Then the `'a'` key in `copy-mode` (while searching) sends the URL +to `plumb`: + + bind-key -T copy-mode-vi a send-keys -X copy-pipe-no-clear "plumb #{pane_current_path}" + +After a couple months of use, I've found that while searching for +man pages and git-sha's are a cool screensharing trick, I only +really use the URL search. For files, it's nifty that I can teach +`tmux` to open the output of `grep -n` to the exact line, but I've +found that I generally don't want that many Vim's kicking around. + +In other words: Acme did it better. `tmux` can create the splits, +but it doesn't feel cohesive since not all splits are editable. + +### My Life in Monochrome + +This was a fun experiment. Apologies upfront to Cal, my work friend +who had to go through it with me while we paired a feature :) + +Rob Pike (the author of Acme, amongst many other achievements) has +been +[quoted](https://groups.google.com/g/golang-nuts/c/hJHCAaiL0so/m/kG3BHV6QFfIJ) +saying that "syntax highlighting is juvenile". I wanted to know +why. Could monochrome code really make me a better programmer? + +So, one evening I configured all of my tools to disable color using +the `NO_COLOR` environment variable and individual settings as +described at [https://no-color.org]. I updated my terminal to be +Acme-cream colored and wrote a Vim +[colorscheme](https://git.sr.ht/~akarle/dotfiles/tree/main/item/.config/nvim/colors/acme.lua) +to match. I was ready to take the plunge. + +The initial feeling of switching to `syntax off` was that of being +lost. I had become so used to the same colorscheme that the colors +themselves act as guideposts to navigate the code. Red for +keywords--helps find the `else` block. Green for strings--easy to +see the end of it. And so on. + +When I disabled syntax highlighting and looked at our codebase, it +felt completely overwhelming and unfamiliar. I had lost my ability +to read it efficiently. + +What followed was interesting--I had to read more intently, and +in doing so I understood the code better. It took longer, but +frequently the time was worth it. Over time, I adjusted and started +to rely on different signposts--the structure of the code (whitespace, +newlines, etc) proved much more important. I never got up to my +full skimming speed though, possibly due to code styles that don't +lend themselves to good visual structure (i.e. super long variable +names causing wrapped lines). + +To my surprise, I actually really enjoyed programming without syntax +highlighting. It made the little bits of color still there really +stick out in a way that would otherwise get lost in the sea of +color. Color became a much more intentional indicator, and things +like blue for matching parenthesis and pink for compile errors stood +out. I felt focused and I do think my code might have been slightly +better structured. + +However, after a few weeks like this, I switched back because, as +Cal put it, "we evolved to see color for a reason". I think there's +definitely a scale of "useful color" and less is more in many cases, +but being able to skim code is super powerful when on a timecrunch. +Plus, it involves less explanation when I pop into a pairing session +and share my screen :) + +## Going All In: Bare Metal Install + +A month or so ago, still interested in the non-tooling bits of Plan 9, +I decided it was time to give it a true install. I found an old +SSD and put [9front](https://9front.org) on my X220 ThinkPad. + +I was greeted by the now familiar face of Acme, but a lot of other +things about the system felt unfamiliar. For example, while in UNIX +the shell has a bunch of complexity to handle line-editing, in Plan 9 +this is all built into the windowing system. The window for the +terminal allows editing any text, and that's the mechanism used to, +say, rerun the previous command with changes. + +Likewise, there was no pager like `less` to capture and scroll in +the terminal. Instead, the terminal doesn't scroll by default, so +`man` just prints the whole manual and lets the user scroll. + +I didn't get to dive too deep into the actual distributed nature, +since this was a single computer install. That said, I was left in +awe by the realization that the original authors of UNIX had +envisioned a different (and better in many ways) future. + +I find this so interesting because I think it's easy to put one's +favorite technologies on a pedestal. But to see the original authors +create something so different and imagine what could have been... +It really drove home that there's a certain network effect for +software. Once it's used it gets stuck. CLI tools for example-- +`git` would take years to change `checkout` due to the number of +scripts that use it. + +It made me wonder--what are the quirks of UNIX that we put up with +as "the way things are"? How could it be better? Plan 9 was the +closest look at the original authors' responses to these questions. + +## Going Forward + +I'm writing this now on my OpenBSD install. I spent multiple evenings +getting 9front to work and kept a somewhat detailed log that I've +published on my gopherhole: +[plan9-journal.txt](gopher://alexkarle.com/0/notes/all/plan9-journey.txt) + +Installing and perusing Plan 9 has changed the way I think about +UNIX, mouses, and how I've idolized certain software. It's refreshing +to peek into an alternate universe in which all things truly are +files and resources can be distributed seamlessly across machines, +but it's always nice to come home to the familiar. diff --git a/www/blog/index.txt b/www/blog/index.txt @@ -10,6 +10,10 @@ If you'd like to get notifications on new articles, I publish an For an up to date list of software/hardware I use, see [my "uses" page](/uses.html). +## 2022 + +- 04/22 [Exploring Acme, Plan 9, and `NO_COLOR`](/blog/exploring-plan9.html) + ## 2021 - 12/21 [Writing a Custom Markup Parser for this Site](/blog/mdoc-to-nihdoc.html)