Dotfiles review, September 2025
I gave Neovim one column of empty space. It fixed a kind of slowness no benchmark records.
- Published
- Updated
- Reading time
- 5 min read
- Series
- Dotfiles
In September 2025, I chose to leave one character-wide strip of Neovim empty. The editor lost a column of usable width and became faster to work in.
That trade makes sense only if speed includes the person looking at the screen. I care about response time, but I also care about how quickly I can understand what changed and continue without finding my place again.
Calm tools are fast tools
I like tools with little visual movement. I turn off animations wherever I can, prefer immediate switches between states, and want layouts and text positions to remain stable. This lets my eyes rest. It also lets me develop habits, muscle memory, and a visual map of where to look.
When that map remains dependable, I can navigate my work environment almost without thinking. I know where a tmux pane begins, where a shell prompt will appear, and where the code under my cursor sits in the editor. I can act in a blink because I do not first have to work out where the interface moved something.
An animation does not have to take long enough to appear in a benchmark to slow me down. A window that slides into place still asks me to wait for its destination. A layout that changes width makes me relocate the text I was reading. The expensive part is not rendering the movement. It is reorientation.
Neovim’s sign column is a small, precise example. Signs show useful information beside a line, including diagnostics from a language server. With the default auto behavior, Neovim draws the column only when it has a sign to display. The first diagnostic therefore inserts a new column at the left and shifts every line of code one character to the right. When the last sign disappears, the content shifts back.
The diagnostic is useful. The jump is not.
My September change was one line:
set signcolumn=yes
The setting reserves the column even when it is empty. A diagnostic now appears inside space that already belongs to it. The code, indentation, and line numbers stay where I expect them. My eye can notice the new symbol, find its line, and keep its position in the buffer.
One column is a cheap price for that stability. On a narrow screen, reclaiming every character can look efficient. In practice, the extra width was not helping if the whole editing surface moved whenever feedback arrived.
I had solved the same problem once before. My old CoC configuration contained a comment that said the sign column should remain visible because otherwise it shifted the text. After I stopped loading that plugin-specific configuration, the behavior went with it. Putting the setting in Neovim’s common configuration made the layout independent of whichever completion or diagnostic plugin happened to be active.
That detail matters beyond this one setting. Stable behavior should belong to a stable layer. Diagnostics may come from different language servers over time, but their screen space should not depend on one plugin’s configuration file.
The preference is much older than this September commit. The Makefile in my dotfiles records the defaults I use when setting up macOS. It disables Finder animations, disables the Dock’s launch animation, and disables automatic window animations globally. It sets Cocoa window resizing to 0.001 seconds. Keyboard repeat starts sooner and runs close to the fastest rate macOS allows.
Those defaults describe what I mean by fast more accurately than a collection of application benchmarks. Opening, resizing, switching, and repeating should happen when I ask. The computer does not need to perform the transition for me. I already know that I changed windows.
This preference also explains why I continue to feel at home in tmux, Bash, and other text-based tools. Their interfaces are dense, but density is not the opposite of calm. A terminal can show a great deal of information while keeping pane boundaries, prompts, and text in predictable places. Calm does not mean sparse or silent. It means that feedback arrives where I expect it.
Text interfaces can still violate that expectation. The sign-column jump did. Full-screen terminal programs can redraw badly, logs can erase context, and prompts can change shape for decorative reasons. I keep adjusting my own configuration when one of these details interrupts the visual map I have built.
Interfaces that do not respect this tend to push me away, even when they have useful features. The repeated cost is hard to ignore once a stable tool has shown the alternative. A calm tool lets me spend attention on the work. It does not keep asking me to watch the tool itself.
Other changes in September
September contained three other changes in my public dotfiles repository:
- Run Mix tests when files change. I added an eight-line
twixscript that watcheslib,test, and matching umbrella directories withfswatch, then pipes change notifications intomix test --listen-on-stdin. Mix runs the full suite once and reruns it after each newline. This is the watcher pattern from the Mix documentation, extended for umbrella projects. The script remains unchanged. - Migrate Alacritty from YAML to TOML. Alacritty 0.13 changed its configuration format to TOML. I moved the configuration, enabled live reload, and made maximized startup explicit rather than carrying the old YAML file forward.
- Move word navigation into Readline. I removed terminal-level mappings for
Altplus the arrow keys andAlt-HorAlt-L, then bound their actual input sequences to Readline’sbackward-wordandforward-wordcommands in.inputrc. The terminal no longer had to translate a shell-editing preference.