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

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

Буфер это текст файла в памяти, видимый или нет

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

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

:e файл.txt      открыть файл - создаётся буфер, прежний прячется
:ls              перечислить все открытые буферы с их номерами
:bnext           перейти к следующему буферу
:bprevious       к предыдущему буферу
:bdelete         закрыть буфер

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

:set hidden      разрешить прятать несохранённые буферы в фон

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

Окно это вьюпорт на буфер, и их можно делить

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

Разделение бывает горизонтальным и вертикальным. Горизонтальное делит окно на верхнее и нижнее, вертикальное - на левое и правое. В каждое окно можно загрузить свой буфер, а можно один и тот же буфер открыть в нескольких окнах сразу, чтобы видеть разные его места.

:split файл      горизонтальное разделение, новый файл сверху
:vsplit файл     вертикальное разделение, новый файл слева
<C-w>s           разделить текущее окно горизонтально
<C-w>v           разделить вертикально

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

<C-w>h           перейти к окну слева
<C-w>j           к окну снизу
<C-w>k           к окну сверху
<C-w>l           к окну справа
<C-w>=           уравнять размеры всех окон

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

Вкладка это набор окон, а не отдельный файл

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

:tabnew          открыть новую пустую вкладку
:tabedit файл    открыть файл в новой вкладке
gt               перейти к следующей вкладке
gT               к предыдущей вкладке
:tabclose        закрыть текущую вкладку

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

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

Мысленная модель из трёх уровней снимает путаницу

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

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

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

Полезные мелочи и частые промахи

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

:set laststatus=2     всегда показывать строку состояния

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

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

Что унести с собой

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

Практика складывается отсюда сама. Буферами оперируют постоянно, держа открытыми много файлов и переключаясь между ними. Сплитами раскладывают то, что нужно видеть одновременно. Вкладками пользуются скупо, под разные компоновки и крупные задачи.

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