Hillelogram
@hillelwayne.com
4.8K followers 100 following 4.4K posts
Formal methods, software history, chocolatiering. DMs open and happy to meet up in Chicago. Currently writing *Logic for Programmers* (out Q1 2026) Newsletter: https://buttondown.email/hillelwayne/
Posts Media Videos Starter Packs
Sphinx doesn't support putting captions *below* code blocks in LaTeX, and after looking at how many edgecases they hardcoded into the latex stylesheets I can kinda see why
Building on this tip: Vim macros are stored in registers, meaning if you make a mistake in a macro, you can paste the register, modify the keystrokes, and copy it back into the register to fix the macro.

Also I highly recommend `nnoremap Q @@` to make Q "run last macro"

bsky.app/profile/mwm1...
Really an old "vi" tidbit: learn to use '@'; you insert some series of commands as text, and delete it into a letter-named buffer with, say 'add and now you can @a to execute that series of commands -- you can have like 26 hanging temporary macros that way for stuff you need to do repeatedly.
Short newsletter this week, 'The Phase Change', about two years of running and what it taught me about teaching software. buttondown.com/hillelwayne/...
The Phase Change
buttondown.com
If you have word wrap enabled (good for editing prose like markdown) j moves by one "total"/newline while gj moves by one visual line
The more quotes you use the more sarcastic it is. Compare `AI "Thought Leaders"` to `AI """"Thought Leaders""""`
Aww man I doomscrolled today and now I'm bummed
Reposted by Hillelogram
Something that I think people need to consider is that when Pinochet lost the 1990 referendum he refused to cede power and ordered his military to rally and oppress the people. Pinochet had full unilateral control of the military with no meaningful legal checks. He wrote their paychecks.
Just signed up and convinced two other people to go
still blocking literally anyone who says “don’t sign up for protests”

you should sign up for no kings

if you reply to this to argue i’m gonna block you!
The "/ register stores the last search, and the ": register stores the last command. I use `":p` to paste commands into buffers all the time

"% stores the filename but I prefer to do `let @+=expand("%:p")` to copy that to clipboard

bsky.app/profile/yati...
1. [[ and ]] in the `:terminal` jumps between invocations of your shell
2. :verb :map <mapping> tells you where in your config a mapping was set. :verb :set <option> tells you where an option was set
3. Don't provide a pattern to :s style cmds (:s//foo) and the most recently used pattern is applied
`[[` is insanely cool but sadly I don't think works with powershell
Ran into a hard wall trying to improve a plugin, because plugin panels can only have buttons and no other interactives
I think "is it fun for you to tinker with this config" is a big differentiator on this. Like I love tinkering with neovim but hate tinkering with OSes
Almost 1500 people have purchased copies of *Logic for Programmers*! Has anybody had any experiences trying to apply the ideas in practice? Want to know if the book is doing its job!
IE, I'm willing to invest the time and effort into configuring Neovim and reap the benefits from that. But I'm unwilling to embrace the complexity of linux distros. My 1% is different from Julia's 1%, and ours is different from your 1%.

(Maybe for some people the ratio is different, not 99%/1%)
I always thought the choice was about mindsets: 99% of people were best with simple, usable, software, 1% were best with highly tweakable, customizable software.

But I assumed @b0rk.jvns.ca was in the 1%, but she also is switching to Helix!

More likely it's 99% of contexts, not 99% of people.
Compare installing plugins for Neovim and VScode. Setting up a plugin in Neovim is painful, though it'll be better in the next release. Adding a plugin to VScode is easy. It's easier because VScode is so much less customizable, so can make more assumptions in the code.
Vim is incredibly, insanely customizable. You can, if you really want to, make your keybindings depend on the colorscheme and day of the week. This customizability comes at the cost of complexity. I am convinced that for 99% of developers, the tradeoff is not worth it.
I find this article by @b0rk.jvns.ca really fascinating: "Notes on switching to Helix from Vim"

I see Julia as a "tinkerer" who's really good at customizing her environments, *and also* she very much enjoys how she doesn't have to configure Helix.

Some thoughts:

jvns.ca/blog/2025/10...
Notes on switching to Helix from vim
Notes on switching to Helix from vim
jvns.ca
you can define custom insert mode mappings, too!

map('i', ';r', '+') -- insert the clipboard
map('i', ';D', [[=strftime('%D')]]) -- insert the current date in US-format

bsky.app/profile/pete...
You can use abbreviations in insert mode for pure beauty like I type qv<space> (mnemonic quote variable) in insert mode and get "${}" with cursor between the braces.
While you should ALMOST ALWAYS use `noremap`, regular recursive `map` is great for integrating with plugins. Like making `\`` surround a word with backticks, by mapping to the vim-surround (or nvim-surround) keystrokes

bsky.app/profile/haze...
Darn, you already posted about ctrl R. Hmm… let’s see, I do fun things with auto commands that might be useful to people

github.com/hazelweakly/...

Same for maps

github.com/hazelweakly/...

go and gO in normal mode are some favorites
github.com
`n.` is good but for trickier things I prefer `%s//replacement/cg`, which copies the word under the cursor into a search/replace

In general I don't use `.` very much, despite its power

bsky.app/profile/woma...
n. Is the precursor to refactoring.

Suppose you want to rename a variable: /varname will put you at the start of the next instance. ce replaces the variable with whatever you type.

n repeats the last search and . repeats the last whole edit motion, so you can repeat n. to change the next one.
No tip this time, just emphasizing this one. Discovering text objects is what made vim go from "that thing everybody keeps telling me is amazing" to "amazing"

bsky.app/profile/nick...
Text objects! Perform an action inside/around parens/bracket/tag

ie to yank everything inside an html tag where the cursor is: yit

To delete everything in parens (including the parens): da(
This one works because vim doesn't just have an undo stack, it has an undo TREE. I love love love this plugin for that reason github.com/mbbill/undot...

bsky.app/profile/imbi...
Morning nerds

I have :b# mapped to `\w`. I like having TWO leader keys: I use for general stuff and `\` for telescope + saving + a few others

bsky.app/profile/oppi...
ctrl+^ to switch to the most recently used buffer! similar to :b# on command mode.

i use it all to time to switch back and forth between docs and work.

ctrl-o and ctrl-i to jump back and forth betwwen items in the jumplist.

`gf` to follow a path under the cursor; nice with langs that import paths
After spending twenty minutes hopelessly confusing myself with an induction misproof I have concluded that inductive proofs is best taught with sets and lists, not numbers