How To Use Vim Editor In Linux

How To Use Vim Editor In Linux

Reading time1 min
#Linux#Coding#Productivity#Vim#VimEditor#LinuxEditing

Mastering Vim Editor in Linux: Essential Commands, Customization, and Real-World Usage

Vim turns up everywhere: servers without X11, embedded recovery shells, remote admin sessions, or commit hooks that abort until the message is “properly” edited. When efficiency matters—editing /etc/fstab, iterating through a codebase over SSH, or resolving a merge conflict—Vim’s modal approach eliminates friction.

Contrary to outdated opinions, Vim is not just a relic. It’s a high-performance editor, designed for surgical editing and rapid navigation, deeply customizable, and scriptable to fit complex engineering workflows. Below: the fundamentals, practical shortcuts, and customization patterns that help Vim earn its reputation among seasoned Linux engineers.


Fast Context Switching: Modal Editing

Vim’s core strength is its modal interface. Forget Ctrl/Alt gymnastics found in classic editors—every mode in Vim reassigns key behavior for precise control.

Quick reference:

ModeEntry KeyPrimary Purpose
NormalStart / EscNavigation, commands, bulk actions
Inserti, a, oText input/edit
Visualv, V, Ctrl-vRegion/block selection
Command-line:File/save/search, Ex commands

Note: Always press Esc to ensure you’re in Normal mode before issuing commands. Many beginner mistakes stem from issuing commands in the wrong mode.


File Operations: Launch, Save, Quit

vim /etc/ssh/sshd_config

Edit as root via sudo when required. Don’t ignore permission errors—Vim will warn:

E212: Can't open file for writing

Common saves/quits:

  • :w
    Save buffer.
  • :wq
    Save and exit.
  • :q!
    Exit, discard edits.
  • :x
    Save and exit (only if changes made).

Side note: If you forget to open with sudo, recover edits with :w !sudo tee % >/dev/null. This writes the buffer via elevated permissions—useful after editing a root-owned file by mistake.


Precise Navigation

A few keystrokes replace entire mouse workflows:

ActionVim KeyResult
Left / Down / Up / Righth / j / k / lSingle-char or single-line movement
Start of line0Column zero
End of line$Last character on current line
Next wordwJump one word right
Previous wordbJump one word left
Jump page down<Ctrl-d>Half-screen down
Jump page up<Ctrl-u>Half-screen up
Go to line N:NE.g., :42 to line 42

Repeat motions as needed, e.g. 10j jumps ten lines down.

Gotcha: Relying on arrow keys trains slow habits—hjkl is faster, especially when working over SSH, where lag compounds cursor slowness.


Editing: Inserting, Deleting, Undo

Insertion shortcuts:

  • i Before cursor.
  • a After cursor.
  • o New line below.
  • O New line above.

Deletion:

  • x Delete character under cursor.
  • dd Delete current line.
  • d$ Delete from cursor to end-of-line.
  • u Undo last change.
  • <Ctrl-r> Redo change (after undo).

Batch edits:

  • cw Change word under cursor.
  • C Change to end of line.

Practical example: Change ‘prod’ to ‘dev’ throughout config.

:%s/prod/dev/gc

This substitutes every ‘prod’ with ‘dev’, confirming each (c for “confirm”).


Searching: Targeted and Fast

Global search:

/config\s
  • /pattern Forward search.
  • ?pattern Backward search.
  • n Repeat in same direction.
  • N Repeat, opposite direction.

Regex is supported. For example, /^\s*listen\s finds indented ‘listen’ directives in config files.

Known issue: Complex search patterns sometimes require escaping special chars (\/, \*). Always validate the regex.


Copy, Paste, and Registers

Yanking (copying):

  • yy Yank whole line.
  • 3yy Yank three lines.
  • y$ Yank from cursor to end-of-line.

Pasting:

  • p Paste after cursor.
  • P Paste before cursor.

Vim supports named registers (e.g., "ayy to yank to register a, "ap to paste from a)—critical when working with multiple buffer contents.


Customization: .vimrc and Beyond

Complex editing warrants a tailored setup. The .vimrc file, located in the home directory, tunes Vim at startup.

Sample .vimrc for daily engineering (Vim 8.x+):

set number              " Show line numbers
syntax on               " Enable syntax highlighting
set shiftwidth=4        " Indent with 4 spaces
set tabstop=4
set expandtab           " Tabs are spaces
set autoindent
set mouse=a             " Mouse in all modes
set hlsearch
set ignorecase
set smartcase
set incsearch           " Highlight incrementally
set clipboard=unnamedplus " Use system clipboard (requires 'vim-gtk' variant)

Practical note: On minimal servers, system clipboard integration requires Vim compiled with +clipboard. On Debian, prefer vim-gtk or vim-gtk3 for GUI+clipboard support:

sudo apt install vim-gtk3

Plugin Management (vim-plug Example)

Plugins enable advanced features: file explorers, fuzzy finders, LSP support.

Install vim-plug (latest commit as of June 2024):

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
     https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

Inside .vimrc:

call plug#begin('~/.vim/plugged')
Plug 'preservim/nerdtree'         " Tree-style explorer
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } " Fuzzy search (requires fd/rg binaries)
call plug#end()

Reload Vim, then :PlugInstall to fetch plugins.

Alternative: Manual plugin management is possible (copying .vim/plugin/ directories), but harder to maintain. For clean engineering environments, automate via your dotfiles repository.


Custom Key Bindings & Macros

Example: Save with F5 instead of :w.

nnoremap <F5> :w<CR>

Map common boilerplate, e.g., insert shebang for Bash scripts:

autocmd BufNewFile *.sh 0r ~/.vim/templates/bash_shebang.sh

Real-World Edit: NGINX Configuration

Consider batch-modifying /etc/nginx/nginx.conf:

sudo vim /etc/nginx/nginx.conf

Steps:

  1. Jump to the server blocks: /server {
  2. Select multiple lines for bulk comment/uncomment: Mark with Ctrl-v, then I# plus Esc for column insert.
  3. Yank and duplicate sections: Visual select (V), y, move cursor, p.
  4. Validate config without quitting Vim:
:!nginx -t

If you see:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

all edits are syntactically valid.

Trade-off: Editing large or included configs (with include directives) in a single Vim session requires buffer management (:n, :bnext, :bprev). Not perfect—most Vim builds lack project-wide search out of the box; install fzf.vim or similar for cross-file grep.


Next Level: Efficiency and Extensibility

  • Record macros (q[c] ... q, replay via @c) for automating tedious transitions.
  • Native Git integration with plugins like tpope/vim-fugitive—not just status, but staged-edit-diff flows.
  • LSP support (CoC, ALE)—not trivial to configure but transforms code navigation and completion, especially for languages like Go or Rust.

Non-obvious tip: When editing files in /tmp or other ephemeral locations, configure Vim with set backupdir and set undodir to prevent data loss if you crash or lose SSH connectivity.


Conclusion

Vim endures because it’s engineered for focus and adaptability. Once core navigation and batch-edit commands become second nature, time lost to repetitive editing tasks plummets. Heavy customization isn’t required—just identify friction points and remove them incrementally via .vimrc tweaks or targeted plugins.

No single “best” Vim config exists: each engineer evolves their setup over months, sometimes years. The real value? The time returned from every edit thereafter.


No exclamation marks needed. Faster text editing is its own reward.