В блоке «Командная строка» мы уже встречались с 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 — настройки: номера строк, подсветка, размер табуляции.

Обсуждение урока

0
Комментарии видны всем. Чтобы участвовать в обсуждении, войдите или зарегистрируйтесь.
Модерация сообщества

Пожаловаться на комментарий

Расскажите модераторам, что именно требует внимания.