Vim: от продвинутого пользователя к мастеру

Курс для тех, кто уже знает основы Vim и хочет выйти на уровень мастерского владения редактором. Каждая глава сфокусирована на конкретных техниках с практическими примерами и упражнениями.

1. Продвинутые команды редактирования: операторы, текстовые объекты, регистры и marks

Продвинутые команды редактирования: операторы, текстовые объекты, регистры и marks

Операторы и текстовые объекты: язык Vim

Vim устроен как язык с собственной грамматикой: оператор задаёт что сделать, текстовый объект или motionс чем. Понимание этой модели — ключевой шаг от «знаю команды» к «думаю на Vim».

Базовая формула: [счётчик] оператор [счётчик] motion/объект

| Оператор | Действие | |----------|----------| | d | Удалить (delete) | | c | Изменить (change = удалить + войти в Insert) | | y | Скопировать (yank) | | g~ | Переключить регистр | | gu / gU | В нижний / верхний регистр | | = | Автоформатировать отступы | | > / < | Сдвинуть вправо / влево |

Каждый оператор работает с любым motion или текстовым объектом — это и есть сила языка Vim.

Текстовые объекты: точечные операции без мыши

Текстовые объекты (text objects) — это именованные структурные единицы текста. Они работают только в связке с оператором и всегда начинаются с i (inner, внутри) или a (around, вокруг, включая ограничители).

Практический сценарий: курсор стоит где-то внутри строки url = "https://old.example.com". Нужно заменить URL. Вместо того чтобы вручную выделять — просто ci". Vim удалит содержимое кавычек и переключится в Insert. Три нажатия вместо десяти.

Полная таблица текстовых объектов:

| Объект | i (inner) | a (around) | |--------|-------------|--------------| | w | слово | слово + пробел | | s | предложение | предложение + пробел | | p | абзац | абзац + пустая строка | | " ' ` ` | содержимое кавычек | кавычки + содержимое | | ( ) b | содержимое скобок | скобки + содержимое | | { } B | содержимое фигурных скобок | фигурные скобки + содержимое | | [ ] | содержимое квадратных скобок | квадратные скобки + содержимое | | t | содержимое HTML-тега | тег + содержимое |

Счётчики и комбинации

Счётчик перед оператором или объектом умножает действие:

> Повторение оператора дважды применяет его к текущей строке: dd удаляет строку, yy копирует, cc изменяет, >> сдвигает.

---

Регистры: буфер обмена на стероидах

Регистры (registers) — это именованные ячейки памяти Vim. В отличие от единственного системного буфера обмена, в Vim их десятки, и каждый служит своей цели.

Обращение к регистру: "<имя> перед командой. Например, "ayy — скопировать строку в регистр a, "ap — вставить из регистра a.

Типы регистров

Безымянный регистр " — принимает всё, что удаляется или копируется по умолчанию. p вставляет именно из него.

Именованные регистры az — ваши личные ячейки. Строчная буква перезаписывает регистр, прописная добавляет к существующему содержимому:

Сценарий: нужно собрать несколько несмежных строк из разных мест файла. Перейдите к первой строке — "ayy, ко второй — "Ayy, к третьей — "Ayy. Теперь "ap вставит все три строки сразу.

Регистры 09 — история операций. Регистр 0 всегда содержит последнее скопированное (y) значение, даже если после этого что-то удалялось. Регистры 19 — история последних девяти удалений (от новых к старым). Это спасает, когда случайное dd затёрло нужное содержимое безымянного регистра: "1p, "2p и так далее.

Регистр + и — системный буфер обмена. "+y копирует в системный буфер, "+p вставляет из него. Регистр — буфер выделения мышью (актуально в X11/Linux).

Регистр _ — «чёрная дыра» (black hole register). Всё, что туда отправляется, исчезает без следа и не затирает безымянный регистр:

Регистр / — последний поисковый запрос. "/p вставит его в текст.

Регистр : — последняя команда командной строки. Полезно для отладки сложных команд.

Регистр % — имя текущего файла. "%p вставит путь к файлу прямо в текст.

Посмотреть содержимое всех регистров: :registers (или сокращённо :reg).

!Схема регистров Vim: типы, назначение и взаимодействие между ними

---

Marks: навигация с точностью до символа

Marks (метки) — это именованные позиции в файле или между файлами. Метка запоминает строку и столбец, и к ней можно мгновенно вернуться из любого места.

Установить метку: m<буква>. Перейти к метке: <буква> ` (точная позиция: строка + столбец) или '<буква> (начало строки с меткой).

Локальные и глобальные метки

Строчные буквы az — локальные метки, работают в пределах одного файла. При переходе в другой файл они недоступны.

Прописные буквы AZ — глобальные метки (global marks). Они сохраняются между файлами и даже между сессиями Vim. mA в одном файле, затем A ` из любого другого файла — Vim откроет нужный файл и переместит курсор точно на позицию метки.

Типичный рабочий сценарий: вы редактируете большой конфигурационный файл и часто переключаетесь между секцией [database] и секцией [server]. Поставьте md на строку с [database] и ms на [server]. Теперь d ` и s ` — мгновенный телепорт между ними.

Автоматические метки

Vim автоматически выставляет ряд специальных меток:

| Метка | Значение | |-------|----------| | . ` | Последнее место изменения | | ^ ` | Последнее место выхода из Insert-режима | | [ ` и ] ` | Начало и конец последнего изменения или вставки | | < ` и > ` | Начало и конец последнего визуального выделения | | | Позиция до последнего прыжка (очень полезно!) | | '' | Строка до последнего прыжка |

Особенно ценна метка ` (два обратных апострофа): она возвращает курсор туда, откуда вы только что прыгнули — например, после поиска, G, gg или перехода по тегу. Нажмите дважды — и вы пингуете между двумя позициями.

Посмотреть все активные метки: :marks. Удалить метку: :delmarks a или :delmarks a-d для диапазона.

---

Операторы + объекты + регистры: связываем всё вместе

Настоящая мощь раскрывается, когда все три концепции работают вместе. Несколько реальных сценариев:

Сценарий 1 — рефакторинг функции:

Сценарий 2 — замена аргумента функции без потери буфера:

Сценарий 3 — сбор нескольких кусков кода:

Сценарий 4 — быстрая навигация при рефакторинге:

> Профессиональный пользователь Vim не думает «нажму столько-то клавиш» — он думает «удалить внутри скобок», «скопировать абзац в регистр b», «вернуться к метке». Это и есть переход от механического запоминания к языковому мышлению.

Освоив эту тройку — операторы с текстовыми объектами, регистры и метки — вы получаете инструментарий, который делает большинство операций редактирования буквально двух-трёхсимвольными командами. Следующий уровень — макросы, которые позволяют записывать и воспроизводить целые последовательности таких команд.