Vim vs Emacs: Which Editor Should You Learn
Vim and Emacs are the two long-lived terminal editors, built on opposite philosophies — modal editing vs an extensible Lisp environment. How they actually differ.
Vim and Emacs are the two text editors that have outlived every trend in developer tooling since the 1970s, and they’re built on almost opposite ideas of what an editor should be. Vim is a modal editor optimized for fast, composable text manipulation with the keyboard alone. Emacs is an extensible, self-documenting Lisp environment that happens to ship with a text editor inside it. Neither is “the terminal editor” — they’re different tools that solve overlapping problems in different ways.
Both have survived because they run everywhere a terminal does, never require a mouse, and reward the time invested in learning them with an editing speed that graphical editors rarely match once the muscle memory sets in.
Vim: modal editing
Vim’s defining idea is modes. In normal mode, every keystroke is a command — dw deletes a word, ciw changes the word under the cursor, 3j moves down three lines. Insert mode is where you actually type text, and you enter and leave it deliberately. This sounds unusual to anyone coming from a conventional editor, where typing is always typing, but it means most editing operations are compositions of a small number of primitives: a verb (delete, change, yank), a count, and a motion (word, line, paragraph, a search pattern). Once those primitives are internalized, editing speed comes from combining them, not from memorizing hundreds of separate shortcuts.
Vim is also small and fast by default — the base editor starts instantly and is available on nearly every Unix-like system as vi or vim, which matters when you’re editing a file on a remote server over SSH rather than in a full development environment. Modern Vim and its fork Neovim add plugin ecosystems, LSP integration, and Lua-based configuration, but the modal core is unchanged from the original.
Emacs: an extensible environment
Emacs takes a different approach. Its core is a Lisp interpreter (Emacs Lisp), and the editor itself is mostly written in that Lisp, running on top of a small C core. This means nearly everything about Emacs — how it displays text, what a keybinding does, what happens when you open a file of a given type — is a Lisp function you can inspect, redefine, or override at runtime. Emacs ships with a built-in help system that can show you the exact source of any command bound to any key, which is part of why long-time users describe it as “self-documenting.”
That extensibility is also why Emacs has grown well beyond text editing: mail clients, IRC clients, org-mode’s outlining and literate-programming tools, and full IDE-like configurations (via packages like Evil mode, which layers Vim’s modal keybindings on top of Emacs) all live inside the same Lisp environment. The tradeoff is a heavier startup cost and a steeper initial learning curve — Emacs’s default keybindings use modifier-key chords (Ctrl+X Ctrl+S to save) rather than Vim’s mode switches, and are widely considered harder to type quickly without configuration.
Comparing the two
| Vim | Emacs | |
|---|---|---|
| Core paradigm | Modal editing (normal/insert/visual modes) | Extensible Lisp environment |
| Default keybindings | Mode-switch + composable commands | Modifier-key chords |
| Startup time | Near-instant | Slower, especially with a large config |
| Extensibility | Plugins (Vimscript or Lua in Neovim) | Full Lisp interpreter; can redefine anything |
| Learning curve | Steep at first, plateaus once modes click | Steep and ongoing — the ecosystem is huge |
| Availability | Present on nearly every Unix system by default | Usually needs a separate install |
| Best fit | Fast edits, remote servers, editing as a discrete task | An entire configurable workspace, not just editing |
Neither ranking is really about raw editing power — both, in experienced hands, can edit text about as fast as the keyboard allows. The real difference is what each one asks you to buy into: Vim’s modal grammar, or Emacs’s willingness to become whatever you configure it to be.
Where they fit today
Most developers now reach for a graphical editor with a language server, integrated terminal, and built-in debugger for day-to-day work — and both Vim and Emacs keybindings are available as extensions inside those editors, which is often how people first encounter modal editing without committing to the standalone tool. Vim’s modal bindings in particular have become a de facto standard, showing up as an optional mode in nearly every modern editor.
Where the standalone editors still earn their place is anywhere a full IDE isn’t available or isn’t worth the overhead: editing a config file during an SSH session, working inside a minimal devcontainer, or resolving a merge conflict from a git rebase directly in the terminal. In those contexts, an editor that starts in milliseconds and never needs a mouse is still hard to beat.
Which one to learn
If the goal is fast, precise editing with minimal setup — especially on remote machines — Vim’s modal commands pay off quickly and transfer to any environment with vim or a Vim-emulation plugin installed. If the goal is a single configurable environment that can absorb your entire workflow, from email to project notes to a Makefile-driven build, Emacs’s Lisp core offers a ceiling Vim’s plugin system doesn’t try to match. Plenty of developers eventually use both: Emacs with Evil mode for daily work, and raw Vim for anything over SSH.
The takeaway
Vim and Emacs solve the same basic problem — editing text efficiently from a keyboard — with different philosophies: Vim’s composable modal commands versus Emacs’s fully extensible Lisp environment. Vim tends to win for fast, portable editing, especially over a remote connection; Emacs tends to win when you want one configurable tool that grows to cover far more than text editing. Both have plugin ecosystems mature enough that the “wrong” choice mostly costs you a bit of relearning, not a dead end.
Tagged
Keep reading
Takina · · 4 min read Web Streams API Explained: Readable, Writable, Transform
The Streams API lets JavaScript process data as chunks arrive instead of buffering it all in memory. How ReadableStream, WritableStream, and pipes work.
Takina · · 4 min read npm and pnpm Workspaces: Managing a Monorepo
Workspaces let npm and pnpm manage multiple packages in one repository, sharing a single dependency tree and letting packages reference each other locally.
Takina · · 5 min read toSorted, toReversed, with(): JS's New Array Methods
toSorted(), toReversed(), toSpliced(), and with() copy an array instead of mutating it, fixing a long-standing footgun in JavaScript's Array API.