Vim умеет сделать вас быстрее. Но та же интенсивность работы с клавиатурой, которая даёт скорость, способна навредить - если вы сидите криво, держите запястья под углом и часами не отрываетесь от экрана. И ещё одна ловушка подстерегает в самом редакторе: можно годами "пользоваться Vim", так и не научившись им пользоваться. Стрелочки вместо движений, зажатый j вместо прыжка, ручное выделение вместо текстовых объектов - всё это работает, но держит вас на уровне "текстовый редактор с модальным режимом" вместо "инструмент-усилитель".Часть VII. Мастерство
Эта глава - про две вещи, которые редко обсуждают на старте, хотя именно они определяют, останетесь ли вы в Vim надолго и с пользой: эргономика (как не сломать себе руки и спину) и антипаттерны (как не закрепить вредные привычки, которые потом придётся переучивать). Закрепляющие практики и тренажёры - в главе 33, а полный справочник команд - в главе 34.
Зачем об этом думать отдельно
Скорость в Vim - это не "быстро нажимать", а "нажимать мало и осмысленно". Если вы печатаете правильную команду один раз вместо того, чтобы двадцать раз тыкать стрелку, вы экономите не только время, но и количество движений пальцами - а значит, снижаете механическую нагрузку. Эргономика и хорошие привычки редактирования - это две стороны одной медали: грамотный мышечный навык бережёт и время, и сухожилия.
Поэтому глава устроена так: сначала разберёмся с физикой (тело, руки, клавиатура), потом - с привычками (что вы делаете внутри редактора и как переучиться).
Часть 1. Эргономика и профилактика RSI
RSI (repetitive strain injury, травма от повторяющейся нагрузки) - собирательное название для проблем вроде туннельного синдрома, тендинита и общего перенапряжения кистей и предплечий. Программист - группа риска по определению: тысячи нажатий в день, статичная поза, мышь.
Хорошая новость: модальное редактирование само по себе работает на вас. Когда большая часть навигации и правок идёт с домашнего ряда клавиатуры, вы резко сокращаете обращения к мыши - по разным оценкам, до ~70% меньше кликов. Меньше дотягиваний до мыши - меньше отведений плеча и нагрузки на запястье. Но это лишь фундамент; на нём всё ещё можно сидеть неправильно.
Положение тела и рук
Базовые ориентиры, которые стоит держать в голове:
Код: Выделить всё
Зона | Как должно быть | Почему
------------+-----------------------------------------------------------------------------+--------------------------------------------------------------
Запястья | Нейтрально, примерно 0° разгиба - не задраны вверх и не провалены вниз | Разгиб запястья сдавливает срединный нерв в запястном канале
Локти | Угол ~90-100°, предплечья примерно параллельны полу | Снимает нагрузку с плеч и трапеций
Клавиатура | Центрирована так, чтобы домашний ряд (зона hjkl) был прямо перед корпусом | Убирает скручивание корпуса и боковое отведение кистей
Плечи | Расслаблены, не подняты | Хроническое напряжение трапеций - частый спутник RSI
Экран | Верхняя треть на уровне глаз | Чтобы не наклонять шею вниз
Перемаппинг Caps Lock - самый недооценённый апгрейд
Caps Lock - это огромная клавиша под левым мизинцем, которую в работе вы используете примерно никогда. А Esc, наоборот, нужен в Vim постоянно для выхода из режима вставки, и тянуться к нему в дальний верхний угол - это и неудобно, и нагружает кисть.
Решение: переназначить Caps Lock. Два популярных варианта:
- Caps Lock -> Ctrl (а лучше - "двойная роль": коротко нажал - Esc, держишь - Ctrl). Это снимает нагрузку с мизинца, который иначе тянется к Ctrl в нижнем углу.
- Caps Lock -> Esc - самый прямой выигрыш для Vim.
- macOS: "Системные настройки -> Клавиатура -> Модификаторные клавиши" - назначить Caps Lock на Escape или Control. Для двойной роли - утилита вроде Karabiner-Elements.
- Linux (X11): setxkbmap -option caps:escape (или caps:ctrl_modifier). Для двойной роли - xcape либо демон interception-tools (caps2esc).
- Linux (Wayland): через keyd или штатные опции окружения.
- Windows: через реестр (Scancode Map) или PowerToys -> Keyboard Manager.
Раскладки и "тяжёлые" клавишиАльтернатива, о которой полезно знать: вместо Esc можно использовать Ctrl-[ - это буквально тот же скан-код, что и Esc, но прямо на домашнем ряду. Многие предпочитают именно его и вообще не тянутся к Esc. Комбо jk/jj для выхода из вставки тоже работает, но у него есть подвох с задержкой - см. главу 21 и раздел "Частые ошибки" ниже.
Vim проектировался под QWERTY, и большинство мнемоник (hjkl, w, b, e) к ней привязаны. Если вы используете Dvorak/Colemak/Workman, готовьтесь либо переучивать часть мувментов, либо ремапить - это осознанный компромисс, а не "само заработает".
Отдельная боль - нерусская/русская раскладка. Если вы переключились на кириллицу и забыли вернуться, нормальный режим Vim превращается в набор бессмысленных символов. Лечится либо дисциплиной, либо настройкой keymap / langmap в Vim, чтобы команды нормального режима работали и в русской раскладке (тема для самостоятельного изучения через :help langmap).
Если вы много печатаете и серьёзно относитесь к RSI - присмотритесь к сплит- и орто-клавиатурам (Dygma, ZSA Moonlander, Keychron Q-серии с раскладкой и т.п.). Они позволяют развести руки на ширину плеч (нейтральное положение предплечий) и часто имеют удобные большие клавиши под большой палец - куда логично вешать Esc/слой/модификаторы.
Перерывы - не роскошь, а профилактика
Самая дешёвая и самая игнорируемая мера. Микропаузы по 20-30 секунд каждые 10-25 минут заметно снижают накопление нагрузки: по отдельным исследованиям, они заметно уменьшают компрессию срединного нерва и нагрузку на сухожилия-сгибатели. Встаньте, отпустите кисти, потрясите ими, сведите лопатки.
Полезное правило для глаз - 20-20-20: каждые 20 минут смотрите 20 секунд на объект в ~20 футах (6 метрах). И не забывайте просто вставать: статичная поза вредит не меньше, чем повторяющиеся движения.
Поставьте напоминалку (таймер Pomodoro, утилиты вроде Stretchly/Workrave). Сила воли тут не работает - работает внешний сигнал.
Часть 2. Антипаттерны редактирования
Антипаттерн - это привычка, которая "вроде работает", но мешает вам стать быстрее и часто ещё и нагружает руки лишними нажатиями. Ниже - главные из них и чем их заменить.
Антипаттерн №1: стрелки вместо движений
Стрелки Up Down <- -> уводят правую руку с домашнего ряда в дальний угол клавиатуры. Каждое такое дотягивание - потеря позиции пальцев и лишняя нагрузка. К тому же стрелками вы двигаетесь только по одному символу/строке.
Лечение радикальное: отключите стрелки в нормальном режиме, чтобы рука физически не могла за них спрятаться.
Код: Выделить всё
nnoremap <Up> <Nop>
nnoremap <Down> <Nop>
nnoremap <Left> <Nop>
nnoremap <Right> <Nop>
Близкий по духу радикальный приём - против привычки тянуться к мыши. По умолчанию Neovim включает мышь во всех режимах (mouse=nvi), и рука по старой памяти нет-нет да и уходит к ней для клика/выделения. Если хотите отучиться - выключите мышь полностью:
Код: Выделить всё
set mouse=
Антипаттерн №2: спам hjkl вместо слов и поиска
Перейти со стрелок на hjkl - только половина дела. 8j нажатый как jjjjjjjj, или путешествие по слову через llllll - это тот же антипаттерн, просто на домашнем ряду. hjkl - это "последняя миля", точная доводка курсора на 1-3 позиции, а не основной транспорт.
Чем заменять перемещение внутри строки и по тексту:
Код: Выделить всё
Хочу | Антипаттерн | Правильно
--------------------------------+----------------+-------------------------------
На следующее слово | lllll | w / W
К концу слова | lll | e
К конкретному символу в строке | lllllll | f<char> / t<char>, повтор ; ,
К началу/концу строки | hhhh/llll | 0 / ^ / $
К известному тексту | долистывание | /текст<CR>, n/N
К слову под курсором по файлу | - | * / #
Антипаттерн №3: hjkl на дальние дистанции
Прыжок на 30 строк вниз через j (даже с count 30j, если вы его не посчитали навскидку) - медленно. Для дальних перемещений есть специализированные инструменты:
Код: Выделить всё
Дистанция | Инструмент
--------------------------+-------------------------------------------------
Несколько строк | <count>j / <count>k с включённым relativenumber
По абзацам/блокам | { и }
Полэкрана | Ctrl-d / Ctrl-u
Целый экран | Ctrl-f / Ctrl-b
Верх/середина/низ экрана | H / M / L
В начало/конец файла | gg / G
К строке N | :N<CR> или <N>G
Код: Выделить всё
было: курсор на строке "func main() {"
номера слева показывают: целевая строка помечена как "5" вниз
нажимаем: 5j
стало: курсор ровно на нужной строке, один прыжок вместо пяти
Count (число перед командой) - это множитель, который превращает одну команду в N. 3dd удалит три строки, 5w прыгнет на пять слов вперёд. Counts перемножаются: 3d2w эквивалентно d6w.
Игнорировать counts - значит дробить одно действие на повторы. Сравните:Отдельно про count с текстовыми объектами скобок: сам i(/a( и без count работает "из произвольной точки" - он находит ближайшую охватывающую пару скобок. А count перед ним увеличивает уровень вложенности наружу: 2i( берёт не ближайшую пару, а ту, что на один уровень выше (3i( - на два уровня и т.д.). То есть count здесь - это "насколько наружу", а не "поиск ближайших скобок".
Код: Выделить всё
Удалить 4 строки.
антипаттерн: dd dd dd dd (или j dd, j dd ...)
правильно: 4dd
Код: Выделить всё
Сдвинуть курсор на 12 слов.
антипаттерн: w w w w w w w w w w w w
правильно: 12w
Антипаттерн №5: ручное выделение вместо текстовых объектовЕсли вы пишете собственные мапы, которые читают count, помните разницу: v:count возвращает реальный 0 при отсутствии счётчика, а v:count1 - единицу. Для "однократного по умолчанию" берите v:count1, иначе мап без count выполнит нулевое (сломанное) действие. Подробнее про скриптинг - глава 22.
Это, пожалуй, самый дорогой антипаттерн. Привычка из обычных редакторов - "выделить мышкой/Shift, потом удалить" - переносится в Vim как v + куча движений. Но Vim умеет оперировать структурой: словом, скобками, кавычками, абзацем, тегом.
Грамматика "оператор + текстовый объект" (d/c/y/gU + iw/i(/a"/ip/it) работает из любой точки объекта и прекрасно дружит с . (точка-повтор). Это курсор-независимо: ci( поменяет содержимое скобок, где бы внутри них вы ни стояли.
Код: Выделить всё
Поменять содержимое строки в кавычках.
текст: greet("hello world")
курсор: где угодно внутри кавычек
антипаттерн: найти начало -> v -> доехать до конца -> d -> напечатать
правильно: ci" -> сразу печатаешь новое ("inner quotes")
Код: Выделить всё
Удалить аргументы вызова вместе со скобками.
текст: do_thing(a, b, c)
правильно: da( ("around parens" - убирает и скобки)
Код: Выделить всё
Объект | i (внутри) | a (вокруг)
----------------+--------------+------------
Слово | iw | aw
Кавычки | i" i' i | a" a' a
Скобки | i( i[ i{ | a( a[ a{
Тег (HTML/XML) | it | at
Абзац | ip | ap
Антипаттерн №6: чрезмерный визуальный режимНа современном Neovim 2026 арсенал объектов расширяют плагины: mini.ai добавляет "следующий/предыдущий" объект (in/an/il/al) для редактирования "на расстоянии", а текст-объекты по AST для функций, классов и параметров даёт плагин nvim-treesitter-textobjects (через свои queries). Важно не путать: встроенный в Neovim treesitter (он есть в ядре ещё с 0.5) сам по себе предоставляет лишь парсеры и API (vim.treesitter) - готовых мапов вроде af/if/ac он по умолчанию не вешает даже в 0.12; чтобы получить точные по AST границы, нужны либо queries этого плагина, либо собственные на базе vim.treesitter. Подробнее - глава 27.
Визуальный режим (v, V, Ctrl-v) - мощный инструмент, особенно для блочного редактирования и случаев, когда нужно видеть выделение глазами. Но превращать его в способ делать всё - антипаттерн.
Каждый раз, когда вы делаете v + движение + оператор, спросите: нельзя ли это записать как "оператор + объект" напрямую?
Код: Выделить всё
антипаттерн: viwd (визуально выделить слово, потом удалить)
правильно: diw (на одно нажатие короче, и dot-repeatable)
Код: Выделить всё
антипаттерн: v$d (выделить до конца строки, удалить)
правильно: D (или d$)
- Короче - на одно нажатие (нет отдельного входа в режим).
- Повторяемо - . повторит diw, но не повторит цепочку визуальных действий так же предсказуемо.
- Переносимо - именно эта грамматика работает в IdeaVim, vscode-neovim, vi-mode шелла (см. главу 31).
Антипаттерн №7: не пользоваться точкой-повтором (.)
Точка-повтор (.) повторяет последнее изменение целиком - это один из самых недооценённых навыков Vim, и не пользоваться им - отдельный антипаттерн. Симптом - когда вместо . человек снова и снова делает либо то же редактирование руками, либо чинит результат связкой u/Ctrl-r ("сделал - отменил - переделал чуть иначе"). u и Ctrl-r - это аварийный откат/возврат, а не инструмент итеративного редактирования.
Классический рабочий паттерн "изменил один - повторил точкой на остальных":
Код: Выделить всё
Заменить слово foo на bar в нескольких местах.
делаешь один раз: cwbar<Esc> (change word -> печатаешь bar)
дальше на каждом вхождении: n . n . n . (нашёл -> повторил то же изменение)
Антипаттерн-спутник - спам u/Ctrl-r вместо точечного редактирования: вместо того чтобы сразу сделать аккуратную правку через оператор и повторить её ., человек правит "грязно", откатывает и пробует заново. Если вы часто пляшете на u/Ctrl-r - это сигнал, что изменение стоило выразить одной командой и повторить точкой.
Антипаттерн №8: перегруженный конфиг новичка
Очень частая ошибка: не освоив базовых движений, человек тащит в конфиг 40 плагинов, копирует чужой init.lua целиком и получает "магический ящик", который непонятно как чинить.
Симптомы:
- Конфиг на сотни строк, из которых вы понимаете дай бог половину.
- Каждая проблема решается гуглением "как сделать X в моём дистрибутиве", а не пониманием.
- Стартап тормозит, потому что всё грузится сразу (нет lazy-loading).
- При первой ошибке после :Lazy update непонятно, что сломалось.
- Если вы только начинаете - берите kickstart.nvim как обучающий старт: это один комментированный файл, который полезно прочитать целиком и понять, как устроены LSP, treesitter, автодополнение. Подробнее про дистрибутивы - глава 30.
- Если хотите рабочую IDE "из коробки" - LazyVim, один из самых популярных пресетов на сегодня: рабочий сетап на lazy.nvim, где blink.cmp уже стал дефолтным движком автодополнения, плюс система :LazyExtras. Но принимайте его соглашения осознанно.
- Не смешивайте "магию дистрибутива" с непониманием основ. Рабочий приём: жить на LazyVim, а в свободное время разобрать kickstart, чтобы не зависеть от чужих абстракций.
- Стройте конфиг инкрементально: добавили плагин - поняли, зачем он, как его выключить, и что он биндит. Используйте lazy-loading по event/ft/cmd/keys (см. главу 23).
Как ломать вредные привычки
Знать, как правильно, - мало. Привычки лечатся не силой воли, а изменением среды и системным дриллом.
Метод "привычка-ломатель" через плагин
В экосистеме Neovim 2026 стандартный инструмент - hardtime.nvim (m4xshen/hardtime.nvim). Он:
- предупреждает и блокирует спам одной клавиши (hjkl, стрелки), если вы жмёте её слишком много раз подряд;
- подсказывает более эффективные движения и counts в реальном времени;
- настраивается по строгости.
Код: Выделить всё
-- пример подключения через lazy.nvim
{
"m4xshen/hardtime.nvim",
dependencies = { "MunifTanjim/nui.nvim" },
opts = {},
}
Метод "одна-две команды в неделю"
Не пытайтесь выучить весь Vim за выходные - это антипаттерн обучения. Возьмите 1-2 новые команды/объекта на неделю, наклейте стикер на монитор и сознательно применяйте их в реальной работе, пока не уйдут в мышечную память. Потом - следующие. План обучения подробно - в главе 33.
Метод "Vim повсюду"
Один и тот же набор движений в редакторе, IDE (IdeaVim), браузере (Vimium/Tridactyl) и шелле (set -o vi) закрепляет навык быстрее любого тренажёра - потому что вы практикуетесь весь день, а не на специальных сессиях. Это глава 31.
Лучшие практики 2026
- Caps Lock - на Ctrl/Esc на уровне ОС. Самый дешёвый эргономический апгрейд; делайте его в первый же день.
- Отключите стрелки в нормальном режиме (<Nop>) и включите relativenumber - это два мува, которые ломают сразу два главных антипаттерна.
- Поставьте hardtime.nvim, если ловите себя на спаме hjkl. Не полагайтесь на дисциплину - полагайтесь на среду.
- Думайте "глагол + объект", а не "выдели и сделай". ci(, daw, yap, dit - это ядро продуктивности, которое к тому же переносится во все vim-совместимые среды.
- Освойте точку-повтор (.) как отдельный навык. "Изменил один раз - повторил . на остальных" экономит уйму нажатий; стройте правки так, чтобы они повторялись предсказуемо (diw вместо dw, оператор+объект вместо визуала).
- Микропаузы по таймеру. Модальное редактирование снижает работу мышью, но без нейтральных запястий и пауз перенапряжение всё равно копится.
- Конфиг - инкрементально. Новичку - kickstart.nvim для понимания или LazyVim для готового сетапа; не тащите 40 плагинов, не освоив базу.
- Используйте Ctrl-[ как Esc на домашнем ряду, если не хотите возиться с двойной ролью Caps Lock.
- "Переучусь потом". Чем дольше живёте с антипаттерном, тем дороже переучивание. Ломайте привычки сразу, пока навык не зацементировался.
- Считать модальное редактирование достаточной защитой от RSI. Оно снижает работу мышью, но не исправит задранные запястья, поднятые плечи и отсутствие перерывов.
- Урезать timeoutlen до 100 мс ради jk->Esc. Это ломает многоклавишные leader-последовательности: вы не успеваете дожать вторую клавишу. Либо ставьте better-escape.nvim (детектит комбо без таймаута), либо используйте Ctrl-[. См. главу 21.
- Брать v:count вместо v:count1 в своих мапах. При вызове без счётчика получите 0 и пустое действие.
- Лечить дальние прыжки счётом j без relativenumber. Прикидывать "на глаз, сколько строк" - медленно и неточно; пусть номера считают за вас.
- Перегружать конфиг "на всякий случай". Каждый непонятый плагин - это будущая поломка, которую вы не сможете диагностировать.
- Делать перемап Caps Lock внутри Vim, а не в ОС. Тогда он работает только в редакторе, а вы хотите эффект во всей системе.
- Жить в визуальном режиме. Для большинства правок "оператор + объект" короче и лучше повторяется точкой.
- Не пользоваться точкой-повтором и плясать на u/Ctrl-r. Если вы переделываете одно и то же изменение руками или "правлю - откатываю - пробую заново", вы не используете .: выразите правку одной командой и повторяйте её точкой.
- Отруби стрелки. Добавь в конфиг <Nop> на четыре стрелки в нормальном режиме и поработай так один полный день. Запиши, в каких сценариях рука всё ещё "тянулась" к стрелкам - это твои слабые места в движениях.
- Перемап Caps Lock. Настрой Caps Lock на Esc или на двойную роль (Esc/Ctrl) средствами своей ОС. Проверь, что это работает не только в Neovim, но и в браузере, и в терминале.
- Охота на визуал. Возьми любой свой рабочий файл и пять раз поймай себя на связке v + движение + оператор. Каждый раз перепиши то же действие через "оператор + объект" (diw, ci(, da{, dit, yap). Замерь разницу в количестве нажатий.
- relativenumber + counts. Включи :set number relativenumber. Открой файл строк на 100 и перемещайся по нему только прыжками: <count>j/k, {/}, Ctrl-d/u, gg/G, :N. Запрети себе одиночные j/k на эту сессию.
- Поставь hardtime.nvim (или вручную ограничь себя) на неделю. В конце недели сравни ощущения: где привычки уже изменились, а где плагин всё ещё ругается.
- Аудит конфига. Пройди по своему init.lua/.vimrc и для каждого плагина ответь: зачем он, что биндит, как его выключить. Удали всё, на что не смог ответить.
- Эргономика - это инвестиция в долголетие навыка. Нейтральные запястья, локти ~90°, центрированная по корпусу клавиатура, расслабленные плечи и микропаузы каждые 10-25 минут.
- Caps Lock -> Esc/Ctrl на уровне ОС - обязательный первый шаг. Альтернатива для Esc - Ctrl-[ на домашнем ряду.
- Модальное редактирование снижает работу мышью (до ~70%), но не отменяет правильную позу и перерывы.
- Главные антипаттерны: стрелки и тяга к мыши, спам hjkl, hjkl на дальние дистанции, отказ от counts и текстовых объектов, чрезмерный визуал, отказ от точки-повтора (.), перегруженный конфиг новичка.
- Замена: движения и поиск вместо стрелок/спама, relativenumber + counts + {/}/Ctrl-d/u для дистанций, "оператор + объект" вместо ручного выделения, инкрементальный конфиг.
- Привычки ломаются средой, а не волей: отключение стрелок, hardtime.nvim, "1-2 команды в неделю", "Vim повсюду".