Vi is the ubiquitous text editor found on virtually every Unix and Linux system. For newcomers, its modal nature—switching between Command mode, Insert mode, and Last Line mode—often creates a steep learning curve. The most common initial hurdle isn't editing text; it is simply figuring out how to leave the editor without losing work or getting stuck. Mastering the exit and save commands transforms Vi from a frustrating trap into a powerful, lightweight tool for system administration and coding.
Understanding Vi Modes: The Prerequisite to Exiting
Before memorizing specific keystrokes, you must understand where you are in the editor. Think about it: vi starts in Command Mode (often called Normal Mode). In this state, keystrokes are interpreted as commands—deleting lines, moving the cursor, or initiating a save—rather than text input. You cannot type text here.
To write content, you press i (insert), a (append), or o (open line) to enter Insert Mode. So the indicator -- INSERT -- usually appears at the bottom left. To run save or quit commands, you must return to Command Mode by pressing the Esc key (sometimes twice). From Command Mode, typing a colon : enters Last Line Mode (Command-Line Mode), where the cursor jumps to the bottom of the screen to accept Ex commands like w (write), q (quit), or wq (write and quit).
Critical Rule: Always press Esc before typing a colon command. If you type :wq while in Insert Mode, you will literally type the characters :wq into your file It's one of those things that adds up..
The Essential Exit Commands
These are the daily drivers for 95% of Vi usage. They assume you are in Command Mode (press Esc first) Worth keeping that in mind..
Save and Exit (The Standard Way)
:wq or :x
:wqstands for Write (save) and Quit. It writes the buffer to disk and closes the editor.:xis a shorter alias. It writes the file only if changes were made and then quits. If the file is unmodified,:xsimply exits without updating the modification timestamp, which is useful for scripts monitoring file changes.
Save Without Exiting
:w or :w filename
- Use
:wfrequently to commit changes to disk without closing the editor. This prevents data loss during long editing sessions. :w filenamesaves the current buffer to a different file name (Save As), leaving the original file untouched and the current buffer associated with the original name.
Exit Without Saving (Discard Changes)
:q! or ZQ
:q!(Quit with force/bang) discards all unsaved changes and exits immediately. The exclamation mark overrides Vi’s protection against accidental data loss.ZQis a Command Mode shortcut (no colon needed) that does the exact same thing: quit without saving.
Exit Only If Unchanged
:q
- This attempts to quit. If you have unsaved modifications, Vi will block the exit and display an error:
E37: No write since last change (add ! to override). This safety net prevents accidental closure.
Command Mode Shortcuts: The Power User Way
Experienced users rarely type full colon commands. They use capital-letter shortcuts directly in Command Mode (no colon, no Enter key required for the first two).
| Shortcut | Action | Equivalent Colon Command |
|---|---|---|
ZZ |
Save (if changed) and Exit | :x |
ZQ |
Quit without Saving | :q! |
ZW |
Write (Save) only | :w |
Pro Tip: ZZ is significantly faster than :wq<Enter>. It requires only two keystrokes, keeps your hands on the home row, and intelligently avoids rewriting unmodified files.
Handling Multiple Files and Buffers
Vi can edit multiple files simultaneously (buffers) or split the screen (windows). Exiting becomes slightly more complex here.
Exiting All Windows/Buffers at Once
:qa (Quit All)
- Attempts to close all open windows and buffers. If any buffer has unsaved changes, the command fails for all of them.
:qa! (Quit All Force)
- Nuclear option. Closes everything immediately, discarding all unsaved changes across all buffers. Use with extreme caution.
:wqa or :xa (Write All and Quit All)
- Saves every modified buffer and exits cleanly. This is the standard "end of workday" command.
Saving Specific Buffers
If you have multiple files open (vi file1.txt file2.txt), :w saves only the current buffer. To save all modified buffers without quitting, use :wa (Write All) No workaround needed..
Forcing Writes: Permissions and Read-Only Files
A common frustration occurs when editing system configuration files (like /etc/fstab or /etc/nginx/nginx.conf) without sudo privileges. You make changes, hit :w, and get: E212: Can't open file for writing It's one of those things that adds up..
The sudo Tee Trick (Save as Root)
You do not need to exit, lose changes, and reopen with sudo. Use this Last Line Mode command:
:w !sudo tee %
Breakdown:
w: Write the buffer.!: Pipe the output to a shell command.sudo tee: Runteewith root privileges (writes stdin to file and stdout).%: Represents the current filename.
Vi will prompt for your sudo password, write the file, and show the content in the command area. Press Enter or type :q! to return to editing (the buffer is now synced with the disk) The details matter here..
Read-Only Override
If you opened a file with vi -R (read-only) or the file permissions are read-only but you own the file (or have write perms on the directory), you can force write:
:w!
This overrides the internal 'readonly' flag or permission checks (where OS allows) Surprisingly effective..
Recovering From Crashes: Swap Files
If Vi crashes, the terminal disconnects (SSH timeout), or the system reboots while you are editing, Vi creates a swap file (usually .swp in the same directory). filename.This preserves your unsaved keystrokes Which is the point..
The Recovery Prompt
Next time you open that file (vi filename), you will see a scary warning:
E325: ATTENTION
Found a swap file by the name ".filename.swp"
owned by: user dated: ...
file name: ~user/filename
modified: YES
user name: user
host name: host
process ID: 12345
Options presented:
[O]pen Read-Only: View the file on disk (ignores swap).[E]dit anyway: Edit the file on disk (ignores swap, deletes swap file—dangerous if you want recovery).[R]ecover: Choose this. Loads the swap file content, restoring your unsaved work.[D]elete it: Deletes swap file, opens file on disk.[Q]uit: Aborts opening the file.