Vim is not just a text editor—it is an entirely different language for editing text. First released in 1991, Vim remains one of the most powerful, ubiquitous, and efficient tools a developer or system administrator can master.
If you have ever found yourself constantly reaching for the mouse to navigate a file, or getting wrist strain from stretching to the arrow keys, learning Vim will completely transform how you work.
In this comprehensive guide, we will walk through everything from installing Vim to understanding its unique “modal” design, basic movements, text manipulation, and finally customizing it to act like a modern IDE.
Why Learn Vim?
With modern, feature-rich editors like VS Code and JetBrains available, why bother learning a terminal-based editor from the 90s?
- Unmatched Speed: Vim is entirely keyboard-driven. By keeping your hands on the home row and eliminating the mouse, your editing speed drastically increases.
- Everywhere You Go: Vim (or its predecessor,
vi) is pre-installed on virtually every Linux, macOS, and Unix system in the world. If you SSH into a remote server, Vim will be there waiting for you. - Ergonomics: Constantly moving your right hand to the mouse or arrow keys causes strain. Vim’s home-row navigation is significantly better for your wrists.
- The Power of the Vim Language: Vim treats editing like speaking. Once you learn the “verbs” (delete, change, yank) and the “nouns” (words, paragraphs, tags), you can perform massive edits with just three keystrokes.
Installation & First Launch
Installing Vim is incredibly simple across all major operating systems.
For Linux (Debian/Ubuntu):
sudo apt update
sudo apt install vim
For macOS:
brew install vim
(macOS comes with a default vi installation, but using Homebrew gives you the latest, full-featured version.)
For Windows:
The best way to use Vim on Windows is through WSL (Windows Subsystem for Linux), where you can simply use the Linux apt command above.
Launching Vim
To open a file (or create a new one), simply type:
vim my-document.txt
The Secret to Vim: Modal Editing
Most modern text editors only have one mode: you press a key, and that letter appears on the screen.
Vim is a modal editor, meaning the keys on your keyboard do different things depending on which “mode” you are currently in.
- Normal Mode: This is the default mode. Here, your keys act as commands to navigate the file, delete text, copy, and paste. You should spend 90% of your time in Normal Mode.
- Insert Mode: This is where you actually type text. Press
ito enter Insert Mode. When you are done typing, immediately pressEscto return to Normal Mode. - Visual Mode: Used for highlighting text. Press
vto enter Visual Mode. - Command Mode: Used for saving files, quitting, and searching. Press
:from Normal Mode to enter Command Mode.
Crucial Rule: If you ever get confused or stuck, aggressively mash the
Esckey a few times. This guarantees you are safely back in Normal Mode.
Basic Movement (Ditch the Arrow Keys)
To move around effectively in Vim, you must stop using the arrow keys. Keep your right hand on the home row and use these four keys in Normal Mode:
h- Move Leftj- Move Downk- Move Upl- Move Right
This feels incredibly unnatural at first, but after a few days, it will become pure muscle memory.
Faster Navigation
Moving one character at a time is slow. Use these shortcuts to fly across the file:
w- Jump forward to the start of the next word.b- Jump backward to the start of the previous word.0(Zero) - Jump to the absolute beginning of the line.$- Jump to the absolute end of the line.gg- Jump to the very top of the file.G- Jump to the very bottom of the file.
The Vim Language: Verbs and Nouns
Vim becomes incredibly powerful when you combine an action (verb) with a movement (noun).
The Verbs
d- Delete (Cut)c- Change (Delete the text and immediately drop you into Insert Mode)y- Yank (Copy)p- Put (Paste)
The Magic Combinations
Let’s combine them! If d is delete, and w is word, what happens if you type dw?
You guessed it: Delete Word.
dd- Deletes the entire current line.d$- Deletes from your cursor to the end of the line.yy- Copies the entire current line.c$- Changes text from the cursor to the end of the line.
”Inside” and “Around”
Vim also understands the structure of your code. You can use i (inside) and a (around) to target specific text blocks.
ciw- Change Inside Word: Instantly deletes the word your cursor is currently on and puts you in Insert Mode.di"- Delete Inside ”: Deletes everything inside the nearest set of double quotes. Absolutely brilliant for editing strings in code!ya(- Yank Around (: Copies everything inside a set of parentheses, including the parentheses themselves.
Saving, Quitting, and Undoing
To interact with the file itself, ensure you are in Normal Mode (Esc), type a colon :, and then type your command:
:w- Write (Save) the file.:q- Quit Vim.:wq- Save and Quit.:q!- Force quit and destroy any unsaved changes.
Made a mistake while editing?
- Press
uin Normal Mode to Undo. - Press
Ctrl + rto Redo.
Searching and Replacing
Searching
To search for a word, press / in Normal Mode, type your word, and hit Enter.
For example: /function
- Press
nto jump to the next match. - Press
Nto jump to the previous match.
Replacing Text
Vim uses a powerful substitution command. To replace the word “apple” with “orange” everywhere in your file, type:
:%s/apple/orange/g
%means the entire file.sstands for substitute.gmeans global (replace all occurrences on a line, not just the first one).
Advanced Editing: Vim Registers & Macros
Vim does not use a single system clipboard. Instead, it has a series of registers—memory locations where deleted, yanked, or copied text is stored. Understanding registers is essential for complex editing without losing your cut history.
Types of Registers
To view all current registers and their values, type :reg in Command Mode.
- The Unnamed Register (
""): By default, any text you delete (withdorx) or yank (withy) is stored here. This register is overwritten with every deletion, which is why pasting text after deleting something else can be frustrating. - Named Registers (
"ato"z): You can store text in a specific register by prefixing your command with a double quote"and the register letter. For example,"aydcopies the current line into registera. You can retrieve it later with"ap. - The System Clipboard Registers (
"*and"+): These registers interface with your operating system clipboard. If you want to copy text from Vim and paste it into a web browser, use"+yto yank it to the system clipboard. Conversely,"+ppastes text from your system clipboard into Vim. - The Search Pattern Register (
"/): Stores the last search query. - The Read-Only Registers: For example,
"%stores the current file name.
Recording Keyboard Macros
Macros allow you to record a sequence of keystrokes and replay them multiple times. This is incredibly useful for repetitive editing tasks.
- Start Recording: In Normal Mode, press
qfollowed by a register name (e.g.,qato record into registera). You will seerecording @ain the status line. - Execute Edits: Perform the sequence of edits (e.g., jump to the start of the line with
0, add a character, move down a line). - Stop Recording: Press
qin Normal Mode. - Replay Macro: Move to the line you want to edit and press
@a. You can prepend a number to repeat the macro multiple times (e.g.,50@aruns the macro 50 times).
Split Windows & Tab Page Management
Vim’s workspace can be divided into multiple view panes, allowing you to edit different files or different sections of the same file concurrently.
Splitting the Screen
- Horizontal Split: Type
:splitor:sp(or pressCtrl + w, s) to split the screen horizontally. - Vertical Split: Type
:vsplitor:vsp(or pressCtrl + w, v) to split the screen vertically. - Open Another File in a Split: Type
:vsp other-file.txtto split the screen vertically and openother-file.txt.
Navigating Splits
To move the cursor between split windows, press Ctrl + w followed by a directional movement key:
Ctrl + w, h- Move to the split on the left.Ctrl + w, j- Move to the split below.Ctrl + w, k- Move to the split above.Ctrl + w, l- Move to the split on the right.Ctrl + w, w- Cycle through active splits sequentially.
Resizing Splits
Ctrl + w, =- Resize all splits to equal width and height.Ctrl + w, >- Increase split width.Ctrl + w, <- Decrease split width.:resize +5- Increase height by 5 lines.
Using Tab Pages
While splits slice a single screen, tabs act like separate browser windows.
:tabnew filename- Open a file in a new tab.gt- Jump to the next tab page.gT- Jump to the previous tab page.:tabclose- Close the current tab page.
Advanced Navigation & Text Mutating
For maximum editing efficiency, Vim provides tools to mark specific lines, jump across editing histories, and execute complex search-and-replace patterns.
Marking Locations (Marks)
You can bookmark specific locations in a file to jump back to them instantly.
- Create a Local Mark: Press
mfollowed by a lowercase letter (e.g.,masets markaat the cursor position). - Jump to a Mark: Press
'a(single quote) to jump to the beginning of the line of marka, or “a(backtick) to jump to the exact cursor position of marka`. - Global Marks: Using an uppercase letter (e.g.,
mB) creates a global mark. This allows you to jump to that specific file and line from any other open file in Vim.
Navigating Jumps (Jumplist and Changelist)
Vim remembers every significant cursor jump and edit.
Ctrl + o- Go back to the previous cursor location in the jump list.Ctrl + i- Go forward to the next location in the jump list.:jumps- View the entire jump list history.g;- Jump back to the last edited location.g,- Jump forward through the edit history list.
Advanced Regex Substitution
Vim’s search-and-replace command supports powerful regular expression anchors:
\zsand\ze(Match Start and End): Used to isolate the replacement target. For example, if you want to replace only the value of the port inport=8080without changing the wordport=, use::%s/port=\zs8080\ze/9090/g- Capture Groups: Use
\(and\)to capture patterns and\1,\2to reference them.:%s/\(FirstName\) \(LastName\)/\2, \1/g
Customizing Vim with Modern Plugins
While Vim can be configured entirely through .vimrc, configuring plugins elevates the editor to a fully featured IDE with syntax linting, autocomplete, file explorer trees, and fuzzy search.
Modern Plugin Managers
Historically, developers used tools like Vundle or Pathogen. Today, the industry standard is vim-plug for classic Vim, and lazy.nvim for Neovim.
Installing vim-plug
To install vim-plug on Linux/macOS, run:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
Configuring Plugins in .vimrc
Open your ~/.vimrc and add the plugin block:
call plug#begin('~/.vim/plugged')
" A file explorer tree
Plug 'preservim/nerdtree'
" Modern Status bar theme
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
" Git integration showing diff markers in the gutter
Plug 'airblade/vim-gitgutter'
" Fuzzy Finder tool for finding files instantly
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
call plug#end()
Save the file, restart Vim, and run :PlugInstall to automatically download and compile the listed extensions.
- To toggle the file explorer sidebar, type
:NERDTreeToggle. - To search for files instantly, type
:Files.
Customizing Vim (.vimrc)
Vim looks incredibly plain out of the box. You can customize its behavior by creating a configuration file located at ~/.vimrc.
Open the file:
vim ~/.vimrc
Here is a great beginner configuration to make Vim look and feel modern. Paste this into the file and save it:
" Show line numbers
set number
" Show relative line numbers (makes jumping easier)
set relativenumber
" Use 4 spaces instead of tabs
set tabstop=4
set shiftwidth=4
set expandtab
" Enable syntax highlighting
syntax on
" Highlight search results
set hlsearch
set incsearch
" Enable mouse support (helpful for beginners!)
set mouse=a
Frequently Asked Questions (FAQs) About Vim
1. How do I exit Vim if I get stuck?
The classic programmer’s joke is that no one knows how to exit Vim. If you are stuck:
- Press the
Esckey several times to ensure you are in Normal mode. - Type
:q!and pressEnterto quit immediately, discarding any changes you made. - Type
:wqand pressEnterto write (save) your changes and quit. - If you have multiple files open, use
:qa!to quit all files without saving.
2. What is the difference between Vi, Vim, and Neovim?
- Vi: The original visual text editor created by Bill Joy in 1976 for BSD Unix. It is extremely minimal and found on almost every Unix-like system.
- Vim (Vi Improved): Created by Bram Moolenaar in 1991. It adds features like multi-level undo, syntax highlighting, visual mode, command history, and a robust plugin ecosystem while maintaining backward compatibility with Vi.
- Neovim: A modern fork of Vim designed to be more extensible. It features built-in LSP support, Lua configuration out of the box, asynchronous task execution, and improved defaults, making it popular for IDE-like setups.
3. Why does Vim use HJKL instead of the arrow keys?
When Bill Joy created Vi, he used a Lear Siegler ADM-3A terminal. This terminal did not have dedicated arrow keys; instead, the arrow symbols were printed on the H, J, K, and L keys. Today, keeping your hands on the home row (HJKL) is considered a major efficiency boost because you do not have to move your hand away to reach the arrow keys.
4. How do I copy text from Vim to my system clipboard?
By default, Vim has its own internal registers. To copy to the system clipboard, Vim must be compiled with clipboard support (check with vim --version | grep +clipboard). If supported:
- Use
"+yto yank selected text to the system clipboard register. - Use
"+pto paste text from the system clipboard into Vim. - Alternatively, you can set
set clipboard=unnamedplusin your.vimrcto make Vim use the system clipboard for all yank and delete operations.
5. How do I fix the “E325: ATTENTION” swap file error?
This error happens when Vim detects a .swp file, which occurs if Vim crashed or if the file is already open in another terminal.
- If the file is open elsewhere, close that session.
- If Vim crashed, open the file and press
rto recover the changes, save, and exit. Then manually delete the hidden swap file (e.g.,rm .filename.swp) to stop the error from appearing.
Conclusion: The Learning Curve
Learning Vim is like learning to play an instrument. For the first three days, you will feel incredibly slow, frustrated, and tempted to go back to VS Code.
Push through that barrier.
Force yourself to use Vim for all your configuration file edits and minor scripts. Once your fingers memorize ciw and hjkl, you will never want to edit text any other way.
If you are looking to practice safely, type vimtutor into your terminal right now. It is a built-in, interactive lesson that takes about 30 minutes to complete and is the absolute best way to build your initial muscle memory. Happy Vimming!



Discussion
Loading comments...