Работа с кодом редко идёт строго сверху вниз. То и дело приходится отскочить в другое место файла - посмотреть определение функции, свериться с настройкой, поправить связанный кусок - и вернуться обратно. Без подспорья каждый такой отскок оборачивается мучительным поиском пути назад: прокруткой, отсчётом строк, попытками вспомнить, где же был курсор. Редактор vim предлагает решение, знакомое по закладкам в книге, - метки. Они запоминают позицию, чтобы вернуться к ней двумя нажатиями откуда угодно.

Метка - это сохранённая позиция в тексте, помеченная буквой. Поставил метку в нужном месте, ушёл куда понадобилось, а потом одним коротким движением снова там. Причём метки бывают двух родов: одни живут внутри файла, другие перепрыгивают между файлами и даже переживают закрытие редактора. Разберём, как ставить и вызывать метки, чем отличаются их виды, и какие приёмы навигации они открывают.

Установка метки и два способа прыгнуть обратно

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

ma     поставить метку a в текущей позиции

Прыгнуть к метке можно двумя похожими, но не одинаковыми командами, и разница между ними важна. Обратная кавычка с буквой метки возвращает курсор точно туда, где метка стояла, - и на ту строку, и в тот столбец. Апостроф с буквой метки возвращает на ту же строку, но к её началу, к первому непробельному символу, игнорируя столбец.

`a     прыгнуть точно в позицию метки a (строка и столбец)
'a     прыгнуть на строку метки a, к её началу

Выбор между ними зависит от задачи. Обратная кавычка нужна, когда важна точная позиция в строке. Апостроф удобен, когда достаточно попасть на нужную строку, а столбец неважен. Многие по привычке используют один из них, но знание обоих даёт точность там, где она требуется.

Стоит запомнить эту пару: обратная кавычка - точно, апостроф - на строку. Команды похожи внешне, и их легко перепутать, но поведение у них разное.

Строчные буквы метят места внутри одного файла

Метки делятся на два рода по регистру буквы, и это деление принципиально. Строчные буквы от a до z создают локальные метки - они привязаны к конкретному файлу и работают лишь внутри него. Это идеальный инструмент для быстрого перемещения по одному файлу: пометить определение функции, важную переменную, секцию настроек.

Локальность означает, что одна и та же буква в разных файлах указывает на разные места. Если в двух открытых файлах поставить метку с одной буквой, в каждом она своя. Находясь в первом файле, прыжок по этой букве уведёт к метке первого файла, во втором - к метке второго. Это ровно то поведение, которого ждёшь: метка живёт там, где поставлена.

Установка метки с уже занятой буквой молча перезаписывает прежнюю. Редактор не предупреждает, что под этой буквой уже что-то было, - новая позиция просто заменяет старую. Поэтому буквы для меток выбирают осмысленно, чтобы не затирать нужное случайно.

Заглавные буквы создают глобальные метки между файлами

Заглавные буквы от A до Z работают иначе - они создают глобальные метки, перепрыгивающие между файлами. Глобальная метка запоминает не только позицию, но и сам файл. Прыжок к ней из любого другого файла переключит редактор на тот файл, где метка поставлена, и встанет на нужное место.

mA     поставить глобальную метку A (запомнит файл и позицию)
`A     прыгнуть к метке A, переключившись на её файл откуда угодно

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

Полезный приём - использовать глобальную метку как быстрый доступ к часто правимому файлу. Например, поставить глобальную метку на файле настроек редактора, выбрав букву по смыслу для запоминания. Тогда открыть этот файл из любого места можно прыжком к метке, без навигации по каталогам.

Ещё одно достоинство глобальных меток - они сохраняются между сеансами работы. Редактор хранит их в служебном файле, поэтому метка, поставленная сегодня, будет доступна и после перезапуска редактора. Это позволяет вернуться к нужному месту проекта даже после закрытия редактора - метка переживёт сеанс.

Список меток и автоматические специальные метки

Чтобы не держать все метки в памяти, есть команда их перечисления. Она показывает все установленные метки с их позициями - и локальные, и глобальные, и особые.

:marks     показать все установленные метки и их позиции

Помимо буквенных меток, которые ставит человек, редактор автоматически ведёт несколько особых меток. Они помечены не буквами, а специальными знаками, и отслеживают точки интереса сами. Особенно полезны метки недавно правленных файлов - они хранят позицию, где курсор был при последнем выходе из файла. Прыжок к такой особой метке открывает последний правленный файл прямо на том месте, где работа была прервана.

Это превращает возобновление работы в одно движение: открыл редактор, прыгнул к метке последнего файла - и снова там, где остановился в прошлый раз. Не нужно искать каталог проекта и нужный файл вручную.

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

Метки задают диапазон для команд и навигацию по тропе

Метки не только переносят курсор - они задают границы для команд, работающих с диапазоном строк. Между двумя метками можно удалить, изменить или скопировать всё, указав их как начало и конец диапазона. Это удобно, когда нужный кусок длинный, и проще пометить его края, чем выделять целиком.

:'a,'b d     удалить все строки от метки a до метки b включительно

Здесь метки служат не для прыжка, а для очерчивания участка, над которым выполняется команда. Указание диапазона метками избавляет от отсчёта строк или прокрутки при выделении.

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

Что складывается в навык

Картина выстраивается ясно. Метка ставится клавишей установки с буквой и вызывается прыжком - обратной кавычкой для точной позиции или апострофом для начала строки. Строчные буквы создают локальные метки внутри файла, удобные для перемещения по одному документу. Заглавные буквы создают глобальные метки, перепрыгивающие между файлами и сохраняющиеся между сеансами работы.

Команда перечисления показывает все метки разом, а автоматические особые метки отслеживают точки интереса сами - в частности, позволяют вернуться к последнему правленному файлу на нужном месте. Метки задают и диапазоны для команд, очерчивая участок без выделения вручную.

Главная мысль: метка - это закладка, превращающая возврат к нужному месту из мучительного поиска в два нажатия. Строчные метки держат навигацию внутри файла, заглавные связывают весь проект, перенося курсор между файлами одним движением. Стоит завести привычку помечать важные точки и освоить разницу между точным и строчным прыжком, и перемещение по коду из утомительной прокрутки превращается в точные броски к заранее расставленным закладкам.