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
hillelwayne.com
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!
hillelwayne.com
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%)
hillelwayne.com
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.
hillelwayne.com
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.
hillelwayne.com
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.
hillelwayne.com
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
hillelwayne.com
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...
peterlyons.com
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.
hillelwayne.com
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...
hazelweakly.me
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
hillelwayne.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...
womancorn.bsky.social
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.
hillelwayne.com
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...
nickcanzoneri.com
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(
hillelwayne.com
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...
hillelwayne.com
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...
oppi.li
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
hillelwayne.com
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
hillelwayne.com
Too many tips, more tomorrow
hillelwayne.com
In insert mode you can press `ctrl-R {register}` to paste that register. In command mode `ctrl-R ctrl-W` will put in the command line the word under your cursor. There are a few other commands, too, it's quite useful!

bsky.app/profile/josh...
joshfinnis.bsky.social
"Full line completion" `i_<C-X><C-L>` is very useful to repeat lines like console.logs. All my notes are in Nvim and I find ad-hoc uses for this constantly.

I map all completions to <tab> (so `i_<tab>l`) in insert mode because I've never wanted to type a tab on purpose.
hillelwayne.com
`ctrl-w _` makes the window take all the vertical space on the screen, `ctrl-w |` makes it take all horizontal. Good for temporarily focusing one window

Also TIL about `z{count}`, which sets the window to {count} high

bsky.app/profile/josh...
joshfinnis.bsky.social
Splits resize when window size changes. Useful because I often have multiple splits alongside tmux panes (logs, test runner, etc) and resize those if they need more focus:

vim.api.nvim_create_autocmd('VimResized', {
command = 'wincmd =',
})
hillelwayne.com
Is the § on your keyboard?
hillelwayne.com
I think without that, you populate the argument list instead? Forget the specifics.

Regardless, you can run a command on every arglist, quickfixlist, window, or buffer with `argdo/cdo/windo/bufdo". GREAT for mass interactive find/replace

bsky.app/profile/norm...
normalmo.de
Vim’s -q argument allows you to prepopulate the quickfix list directly on startup.

e.g. using ripgrep via bash’s process substitution:

vim -q <(rg --vimgrep needle)
hillelwayne.com
Capital marks (set with `mA`, `mB`, etc) are global between files. I have `tmp.md` always set to the T mark, and regularly use marks A and B for when I need to come back to some random file multiple times in a session.

You can also use these with macros!

bsky.app/profile/norm...
normalmo.de
Vim has a built in MRU list.

Use :oldfiles to view it, and e.g. :e #<5 to open the fifth entry in the list.
hillelwayne.com
One of my favorite tricks is

`:10,29co .`

To copy lines 10-29 to under the cursor. Makes it really easy to duplicate tests for modification or move stuff around (with `move` instead of `co`)

bsky.app/profile/buff...
buffaloshuffle.bsky.social
Idk if it's much of a script but setting typewriter mode (scrolloff = 999) and j/k to gj and gk to move by row are my like two favorite settings lol
hillelwayne.com
Protip: instead of `noremap j gj`, try `noremap <expr> j v:count == 0 ? 'gj' : 'j'`. That way you can still use `10j` and `10k` to jump multiple lines like you'd expect
hillelwayne.com
:wqa! saves and quits all buffers, even if you have multiple windows open. `:q!` doesn't save and only works one at a time

bsky.app/profile/mb21...
mb21.bsky.social
:q!

what else do you need to know?!
hillelwayne.com
You can create customer pickers! I got one for "open neovim files"

bsky.app/profile/arac...
All my cool telescope mappings, like "local marks" and "everything in my vimrc folder"
hillelwayne.com
For every cool (neo/)vim tip or script someone shares with me I will share one in return