В блоке «Командная строка» мы уже встречались с vim — и, скорее всего, это выглядело так: открыли файл, попытались что-то набрать, ничего не печатается, нажали кучу случайных клавиш, запаниковали и загуглили «how to exit vim». Не переживайте — вы в хорошей компании. Этот вопрос на Stack Overflow набрал больше двух миллионов просмотров.
Но vim — это не ошибка дизайна. Это мощнейший редактор, который при серверной работе незаменим: он есть на каждой Linux-машине, работает через SSH, не требует GUI, и когда вы его освоите — редактирование файлов станет быстрее, чем в любом графическом редакторе. Серьёзно.
Сегодня мы разберёмся, как vim думает — и после этого он перестанет казаться безумным. Главное, что нужно понять: vim — это модальный редактор. У него есть режимы, и в каждом режиме клавиши делают разные вещи. Это как коробка передач: на первой скорости педаль газа разгоняет медленно, на пятой — быстро. Та же педаль — разное поведение.
Три режима, которые нужно знать:
| Режим | Для чего | Как войти | Как выйти |
|---|---|---|---|
| Normal | Навигация, удаление, копирование | Запуск vim / Esc |
— |
| Insert | Ввод текста (как обычный редактор) | i, a, o |
Esc |
| Command | Команды: сохранить, выйти, найти | : |
Enter или Esc |
Вот он — ключ ко всему: vim запускается в Normal-режиме. Не в режиме ввода текста. Поэтому, когда вы открываете файл и начинаете печатать — ничего не происходит (или происходит хаос). Нужно сначала нажать i — и только тогда вы в привычном режиме набора текста. Закончили — Esc обратно в Normal.
Правило №1: если что-то идёт не так — жмите
Esc. Один раз, два, три — пока не окажетесь в Normal-режиме. Оттуда можно начать заново.Esc— ваш спасательный круг в vim. Давайте откроем файл и попрактикуемся:
vim test.txt
Вы в Normal-режиме. Вот что умеют клавиши здесь:
Навигация:
h ← влево j ↓ вниз k ↑ вверх l → вправо
# Но стрелки тоже работают — используйте что удобнее
w — прыжок на начало следующего слова
b — прыжок на начало предыдущего слова
0 — в начало строки
$ — в конец строки
gg — в начало файла
G — в конец файла
:42 — перейти на строку 42
Почему h, j, k, l? Потому что vim создавался в 1976 году на терминале, у которого не было клавиш-стрелок. Традиция осталась — и оказалась удобной: пальцы не покидают основной ряд клавиатуры. Но если вам комфортнее со стрелками — используйте стрелки. Никто не осудит.
Вход в режим ввода (Insert):
i — начать ввод перед курсором
a — начать ввод после курсора
o — создать новую строку ниже и начать ввод
O — создать новую строку выше и начать ввод
A — перейти в конец строки и начать ввод
Запомните хотя бы i и o — этого хватит для 90% работы. i — вставить текст здесь. o — добавить строку ниже.
Удаление и редактирование — тоже в Normal-режиме. И вот тут vim начинает показывать свою мощь:
x — удалить символ под курсором
dd — удалить всю строку
dw — удалить слово от курсора
d$ — удалить от курсора до конца строки
u — отменить последнее действие (undo!)
Ctrl+R — повторить отменённое (redo)
Видите паттерн? d — это «удалить», а дальше — куда. dw — удалить слово. d$ — удалить до конца строки. dG — удалить от курсора до конца файла. Это как конструктор: действие + масштаб. Тот же принцип работает для копирования (y — yank):
yy — скопировать строку
yw — скопировать слово
p — вставить после курсора
P — вставить перед курсором
И для замены:
r — заменить один символ (не входя в Insert)
cw — заменить слово (удаляет слово и переходит в Insert)
cc — заменить всю строку
c — change, «заменить». Работает как d, но после удаления переводит в Insert-режим. cw = «удали слово и дай мне набрать новое». Элегантно.
Поиск — одна из самых частых операций при редактировании конфигов:
# Найти текст (вперёд)
/искомый текст (потом Enter)
# Следующее совпадение
n
# Предыдущее совпадение
N
# Найти и заменить все вхождения в файле
:%s/старый/новый/g
# Найти и заменить с подтверждением каждой замены
:%s/старый/новый/gc
:%s/старый/новый/g — выглядит пугающе, но расшифровывается просто: % — весь файл, s — substitute (заменить), g — global (все вхождения в строке). Без g заменится только первое вхождение в каждой строке.
И главное — как сохранить и выйти (наконец-то!):
:w — сохранить
:q — выйти (если нет несохранённых изменений)
:wq — сохранить и выйти
:q! — выйти без сохранения (отбросить изменения)
ZZ — сохранить и выйти (горячая клавиша, без двоеточия)
:q! — «я всё испортил, просто дай мне уйти». Восклицательный знак — «я серьёзно, не спрашивай». ZZ — для ленивых (в хорошем смысле): две клавиши вместо четырёх. Работает из Normal-режима.
Теперь — настройка. По умолчанию vim довольно аскетичен: нет номеров строк, нет подсветки синтаксиса, табуляция — 8 пробелов. Исправим это через ~/.vimrc:
nano ~/.vimrc
(Да, мы настраиваем vim через nano. Ирония.)
" Номера строк
set number
" Подсветка синтаксиса
syntax on
" Подсветка текущей строки
set cursorline
" Размер табуляции — 4 пробела
set tabstop=4
set shiftwidth=4
set expandtab
" Поиск: подсвечивать совпадения, искать по мере набора
set hlsearch
set incsearch
" Показывать парные скобки
set showmatch
" Не создавать файлы бэкапа (~ файлы)
set nobackup
set noswapfile
Сохранили. При следующем открытии vim подхватит настройки — и жить станет значительно приятнее.
Подведём итог. vim — это не баг, а фича. Модальный подход кажется странным первые 30 минут — а потом вы понимаете, что редактировать текст действием+масштабом (dw, cw, yy) быстрее, чем выделять мышкой и нажимать Delete. Но не нужно запоминать всё сразу. Начните с минимума: i — ввод, Esc — выход, :wq — сохранить. Остальное придёт с практикой — каждую неделю вы будете узнавать новый трюк, и через месяц vim станет вашим основным редактором на сервере.
В следующем уроке — настройка оболочки: .bashrc, .profile, и как сделать терминал по-настоящему своим.
vim — модальный редактор с тремя основными режимами: Normal (навигация, удаление), Insert (ввод текста), Command (команды).
Normal-режим: h/j/k/l — навигация, dd — удалить строку, yy — скопировать, p — вставить, u — отмена, dw/cw — удалить/заменить слово.
Insert-режим: i — ввод перед курсором, o — новая строка, Esc — выход в Normal.
Поиск: /текст — найти, n/N — следующее/предыдущее, :%s/старый/новый/g — заменить всё.
Сохранение: :w — сохранить, :q — выйти, :wq — оба, :q! — выйти без сохранения.
~/.vimrc — настройки: номера строк, подсветка, размер табуляции.