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 вставляет именно из него.
Именованные регистры a–z — ваши личные ячейки. Строчная буква перезаписывает регистр, прописная добавляет к существующему содержимому:
Сценарий: нужно собрать несколько несмежных строк из разных мест файла. Перейдите к первой строке — "ayy, ко второй — "Ayy, к третьей — "Ayy. Теперь "ap вставит все три строки сразу.
Регистры 0–9 — история операций. Регистр 0 всегда содержит последнее скопированное (y) значение, даже если после этого что-то удалялось. Регистры 1–9 — история последних девяти удалений (от новых к старым). Это спасает, когда случайное dd затёрло нужное содержимое безымянного регистра: "1p, "2p и так далее.
Регистр + и — системный буфер обмена. "+y копирует в системный буфер, "+p вставляет из него. Регистр — буфер выделения мышью (актуально в X11/Linux).
Регистр _ — «чёрная дыра» (black hole register). Всё, что туда отправляется, исчезает без следа и не затирает безымянный регистр:
Регистр / — последний поисковый запрос. "/p вставит его в текст.
Регистр : — последняя команда командной строки. Полезно для отладки сложных команд.
Регистр % — имя текущего файла. "%p вставит путь к файлу прямо в текст.
Посмотреть содержимое всех регистров: :registers (или сокращённо :reg).
!Схема регистров Vim: типы, назначение и взаимодействие между ними
---
Marks: навигация с точностью до символа
Marks (метки) — это именованные позиции в файле или между файлами. Метка запоминает строку и столбец, и к ней можно мгновенно вернуться из любого места.
Установить метку: m<буква>. Перейти к метке: <буква> ` (точная позиция: строка + столбец) или '<буква> (начало строки с меткой).
Локальные и глобальные метки
Строчные буквы a–z — локальные метки, работают в пределах одного файла. При переходе в другой файл они недоступны.
Прописные буквы A–Z — глобальные метки (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», «вернуться к метке». Это и есть переход от механического запоминания к языковому мышлению.
Освоив эту тройку — операторы с текстовыми объектами, регистры и метки — вы получаете инструментарий, который делает большинство операций редактирования буквально двух-трёхсимвольными командами. Следующий уровень — макросы, которые позволяют записывать и воспроизводить целые последовательности таких команд.