Свёртки, автодополнение и аббревиатуры (встроенные)

Рейтинг: 67.6% · 8 голосов
Исчерпывающий курс по Vim и Neovim: модальное редактирование и грамматика (операторы, движения, текстовые объекты, точка-команда), регистры, метки, макросы, поиск и :substitute, :global, буферы/окна/quickfix, визуальный режим, конфигурация на Lua, маппинги, плагины (lazy.nvim), LSP, автодополнение (blink.cmp), Treesitter, fuzzy-поиск, Git, эргономика и антипаттерны. 34 главы, актуально на 2026 (Vim 9.1, Neovim 0.11/0.12).
Ответить
Аватара пользователя
Roman_Vim
Сообщения: 34
Зарегистрирован: 11 май 2026, 05:31

Свёртки, автодополнение и аббревиатуры (встроенные)

Сообщение Roman_Vim »

Оглавление курса (34)
  1. Философия Vim: модальное редактирование и почему это актуально в 2026
  2. Установка и выживание: первый запуск, режимы, как выйти
  3. Перемещение по тексту: движения как основа эффективности
  4. Базовое редактирование: вставка, удаление, копирование
  5. Грамматика Vim: операторы + движения = команды
  6. Текстовые объекты: оперируем структурой, а не символами
  7. Точка-команда и повторяемость: "один штрих, чтобы повторить"
  8. Регистры: продвинутая работа с буфером обмена
  9. Метки и прыжки: навигация по истории перемещений
  10. Поиск: /, ?, *, # и магия паттернов
  11. Замена :substitute и регулярные выражения Vim
  12. Команда :global - оружие массового редактирования
  13. Буферы, окна и вкладки: организация рабочего пространства
  14. Quickfix и location list: пакетная работа по всему проекту
  15. Навигация по файлам: netrw, fuzzy-поиск и проекты
  16. Макросы: автоматизация повторяющихся правок
  17. Визуальный режим и блочное редактирование
  18. Трюки режима вставки
  19. Свёртки, автодополнение и аббревиатуры (встроенные) (вы здесь)
  20. Конфигурация с нуля: init.lua и разумные дефолты 2026
  21. Маппинги: leader, which-key и здравые привычки
  22. Скриптинг: основы Vimscript и Lua для Neovim
  23. Менеджеры плагинов: lazy.nvim и lazy-loading
  24. Neovim в 2026: чем отличается и почему выбирают
  25. LSP в Neovim: умные возможности языка
  26. Автодополнение 2026: blink.cmp против nvim-cmp
  27. Treesitter: точная подсветка и структурное редактирование
  28. Fuzzy-поиск: Telescope, fzf-lua и snacks.picker
  29. Git внутри редактора: fugitive, gitsigns и lazygit
  30. Дистрибутивы, отладка и терминал: быстрый старт и интеграции
  31. Vim повсюду: IDE, браузер и shell
  32. Эргономика и антипаттерны: как не навредить себе и не застрять
  33. Рабочие рецепты, тренажёры и план обучения
  34. Шпаргалка-справочник: все ключевые команды одним списком
В этой главе мы собираем три на первый взгляд несвязанные, но очень полезные встроенные возможности Vim/Neovim: свёртки (folding) - чтобы прятать неинтересные куски кода и видеть структуру файла; встроенное автодополнение (Ctrl-N/Ctrl-P) - чтобы дописывать слова без LSP и сторонних плагинов; и аббревиатуры (:iabbrev) - миниатюрные сниппеты и автозамены, встроенные в ядро.

Объединяет их одно: всё это работает "из коробки", без единого плагина. На голом Vim на чужом сервере, в Docker-контейнере, в режиме восстановления после сбоя - эти инструменты всегда с вами. Полноценный LSP-автокомплит и современные сниппет-движки мы разберём позже (см. главы 25 и 26), а здесь освоим тот фундамент, на котором они стоят и который незаменим, когда "тяжёлой артиллерии" под рукой нет.

Часть 1. Свёртки (folding)

Зачем это нужно

Большой файл редко интересен целиком. Когда вы правите один метод в классе на 800 строк, остальные 750 строк - визуальный шум. Свёртки позволяют схлопнуть блок в одну строку-заголовок, оставив на экране только структуру: список функций, секции конфига, заголовки Markdown. Это и навигация, и "карта" файла одновременно.

Главная концепция: foldmethod определяет, ОТКУДА берутся свёртки

Ключевое решение при работе со свёртками - выбор foldmethod (можно сокращённо fdm). Эта опция отвечает на вопрос "по какому признаку Vim решает, где начинается и кончается свёртка". От неё зависит всё остальное поведение.

Код: Выделить всё

Значение foldmethod  |  Откуда берутся свёртки                                         |  Когда использовать
---------------------+-----------------------------------------------------------------+------------------------------------------------
manual               |  Вы создаёте свёртки вручную через zf                           |  Разовые задачи, временное скрытие кусков
indent               |  По уровню отступа: глубже отступ - глубже свёртка              |  Python, YAML, любой код с осмысленным отступом
syntax               |  По правилам подсветки синтаксиса                               |  Языки с хорошим syntax-файлом (C, Vimscript)
expr                 |  По вашему выражению foldexpr (вычисляется для каждой строки)   |  Гибкая логика; основа Treesitter-фолдинга
marker               |  По текстовым маркерам в самом тексте (по умолчанию {{{ и }}})  |  Конфиги, заметки, ручная разметка секций
diff                 |  Автоматически в режиме vimdiff                                 |  Включается само при сравнении файлов
Важная деталь: foldmethod - локальная для окна опция. Один и тот же буфер в двух окнах может иметь разные методы свёртки. Менять её можно на лету, например :setlocal foldmethod=indent.

По умолчанию foldmethod=manual и foldenable включён, но без созданных свёрток ничего не происходит. Поэтому новички часто вообще не подозревают, что фолдинг существует.

Команды управления свёртками

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

Код: Выделить всё

Клавиша     |  Действие
------------+-------------------------------------------------------------------------------------------------------
zf{motion}  |  Создать свёртку (только при foldmethod=manual/marker); работает как оператор
zo          |  Открыть свёртку под курсором (open)
zO          |  Открыть свёртку под курсором и все вложенные
zc          |  Закрыть свёртку под курсором (close)
zC          |  Закрыть свёртку и все вложенные
za          |  Переключить (toggle) свёртку: открыть закрытую, закрыть открытую
zA          |  То же рекурсивно
zR          |  Открыть ВСЕ свёртки в буфере (Reduce folding - меньше свёрнутого, foldlevel поднимается до максимума)
zM          |  Закрыть ВСЕ свёртки (Maximum folding)
zr          |  Открыть на один уровень глубже (поднять foldlevel на 1)
zm          |  Закрыть на один уровень (опустить foldlevel на 1)
zj          |  Прыгнуть к началу СЛЕДУЮЩЕЙ свёртки
zk          |  Прыгнуть к концу ПРЕДЫДУЩЕЙ свёртки
zd          |  Удалить свёртку под курсором (manual)
zE          |  Удалить все свёртки в окне (Eliminate; только при foldmethod=manual/marker)
zv          |  Открыть ровно столько свёрток, чтобы стала видна строка с курсором
Мнемоники, которые стоит запомнить навсегда: za (toggle) - рабочая лошадка на каждый день, её удобно нажимать одной рукой; zR распахивает весь файл (Reduce folding - "меньше свёрнутого", foldlevel поднимается до максимума), zM схлопывает его в оглавление. Пары zo/zc и zr/zm отличаются регистром: строчная - про одну свёртку (или один уровень), прописная - рекурсивно/полностью.

Разница между zc/zo (одна свёртка) и zm/zr (один уровень для всего буфера через foldlevel) тонкая, но важная. foldlevel=0 значит "закрыть всё, что на уровне 0 и глубже", то есть весь файл свёрнут до верхнего уровня. foldlevel=99 - "ничего не закрывать", всё открыто.

Полезные опции

Код: Выделить всё

Опция               |  Что делает
--------------------+-------------------------------------------------------------------------
foldcolumn          |  Ширина левой колонки с индикаторами свёрток (например set foldcolumn=1)
foldlevel           |  Уровень, до которого свёртки открыты при входе в буфер
foldlevelstart      |  С каким foldlevel открывать новые буферы (-1 = всё открыто)
foldnestmax         |  Максимальная вложенность свёрток (для indent/syntax)
foldtext            |  Функция/выражение, формирующее текст строки-заголовка свёртки
foldenable (nofen)  |  Глобальный выключатель: zi переключает его
Частая "sane default" комбинация для Neovim 2026, чтобы файлы открывались полностью развёрнутыми, но фолдинг при этом был доступен:

Код: Выделить всё

set foldlevelstart=99
Практика: было -> нажимаем -> стало

Ручная свёртка функции. Курсор на первой строке функции из 10 строк (foldmethod=manual):

Код: Выделить всё

было:
  function calc(a, b) {       <- курсор здесь
    ...8 строк...
  }
  function next() { ... }

нажимаем:  zf}              (zf + motion "до конца абзаца")

стало:
  +--  10 lines: function calc(a, b) {-----
  function next() { ... }
Свёртка по отступам в Python.

Код: Выделить всё

:setlocal foldmethod=indent
Теперь zM схлопнет все тела функций/классов, оставив только их сигнатуры - мгновенное оглавление модуля. za на нужной строке развернёт конкретный блок.

Маркерная свёртка в конфиге. В ~/.bashrc размечаем секции:

Код: Выделить всё

# Aliases {{{
alias ll='ls -lah'
alias gs='git status'
# }}}
# Functions {{{
mkcd() { mkdir -p "$1" && cd "$1"; }
# }}}
При foldmethod=marker (включается :setlocal fdm=marker или модлайном) Vim автоматически свернёт оба блока по комментариям-маркерам. Это самый портативный способ: разметка живёт в самом файле и переносится между машинами.

Сохранение manual-свёрток между сессиями: :mkview/:loadview

Главная боль foldmethod=manual - свёртки живут только в памяти и пропадают, как только вы закрыли окно или сменили метод. Решение - команды :mkview и :loadview: первая сохраняет "вид" окна (свёртки, позицию курсора, локальные опции) в файл в viewdir (по умолчанию ~/.vim/view или ~/.local/state/nvim/view), вторая - восстанавливает.

Что именно сохраняется, регулирует опция 'viewoptions'. Чтобы хранить только свёртки и курсор, но не тащить с собой локальные опции и рабочий каталог (частый источник сюрпризов), сузьте её:

Код: Выделить всё

set viewoptions=folds,cursor
Делать это руками каждый раз неудобно, поэтому :mkview/:loadview обычно вешают на автокоманды - сохранять вид при уходе из окна и восстанавливать при возврате:

Код: Выделить всё

augroup remember_folds
  autocmd!
  autocmd BufWinLeave *.* mkview
  autocmd BufWinEnter *.* silent! loadview
augroup END
BufWinLeave срабатывает, когда буфер убирается из окна (закрытие, переход на другой файл), BufWinEnter - когда буфер показывается в окне. silent! глушит ошибку при первом открытии файла, у которого ещё нет сохранённого вида. Этот рецепт делает manual- и marker-свёртки фактически персистентными без перехода на плагины. На практике паттерн *.* иногда сужают (или исключают спец-буферы вроде git-коммитов), чтобы view-файлы не плодились для временных буферов.

Современный фолдинг: Treesitter и nvim-ufo (Neovim, 2026)

foldmethod=syntax исторически был лучшим вариантом для кода, но он медленный на больших файлах и зависит от качества syntax-файла языка. В Neovim 2026 канонический подход - фолдинг на основе Treesitter через foldmethod=expr:

Код: Выделить всё

vim.wo.foldmethod = 'expr'
vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()'
vim.o.foldlevelstart = 99
Treesitter строит AST и точно знает границы функций, классов, блоков - свёртки получаются по реальной структуре кода, а не по эвристике отступов. Подробнее про Treesitter - в главе 27.

Поверх этого многие ставят плагин nvim-ufo (kevinhwang91/nvim-ufo). Он решает две болевые точки встроенного фолдинга:
  • "мигающие" свёртки: ufo подтягивает информацию о свёртках лениво (через LSP foldingRange или Treesitter), не пересчитывая всё при каждой правке;
  • красивый foldtext: вместо унылого +-- 10 lines показывает первую строку блока с подсветкой и счётчиком скрытых строк.
ufo переопределяет zR/zM своими версиями, которые учитывают "peek"-просмотр свёрнутого содержимого. Это удобная опция 2026 года, но не обязательная: голый foldexpr + vim.treesitter.foldexpr() уже даёт отличный результат. На чистом Vim 9.1 Treesitter недоступен - там остаются indent/syntax/marker.

Часть 2. Встроенное автодополнение (insert-mode completion)

Зачем это нужно

Vim умеет дополнять слова в режиме вставки сам, без LSP и плагинов. Это не "умное" дополнение с пониманием типов, но оно мгновенно, всегда доступно и покрывает 80% бытовых случаев: дописать длинное имя переменной, путь к файлу, слово из словаря. На чужом сервере без интернета и плагинов это единственный доступный автокомплит.

Главная концепция: два базовых триггера и "источники"

Базовое дополнение в режиме вставки запускается двумя клавишами:

Код: Выделить всё

Клавиша (в режиме вставки)  |  Действие
----------------------------+------------------------------------------------------------------------
Ctrl-N                      |  Следующий (Next) кандидат: ищет слова в буферах и заполняет popup-меню
Ctrl-P                      |  Предыдущий (Previous) кандидат: то же, но листает список вверх
По умолчанию Ctrl-N/Ctrl-P ищут слова в текущем буфере, других открытых буферах, включённых файлах и тегах - это диктует опция complete. Когда меню открыто, Ctrl-N/Ctrl-P листают его, Ctrl-Y принимает выбор (Yes), Ctrl-E отменяет и возвращает то, что вы набрали (Exit).

Специализированные виды дополнения: семейство Ctrl-X

Кроме общего Ctrl-N, есть "прицельные" режимы, которые запускаются префиксом Ctrl-X (в режиме вставки). Это мощная и недооценённая часть Vim.

Код: Выделить всё

Комбинация     |  Что дополняет
---------------+--------------------------------------------------------------------------------
Ctrl-X Ctrl-N  |  Слова только из текущего файла
Ctrl-X Ctrl-F  |  Имена файлов и путей (по содержимому ФС)
Ctrl-X Ctrl-L  |  Целые строки (Line) - дополняет по совпадающим строкам
Ctrl-X Ctrl-K  |  Слова из словаря (dictionary)
Ctrl-X Ctrl-T  |  Синонимы из тезауруса (thesaurus)
Ctrl-X Ctrl-I  |  Слова из включённых (include) файлов
Ctrl-X Ctrl-]  |  Дополнение по тегам (ctags)
Ctrl-X Ctrl-O  |  "Омни"-дополнение (omnifunc) - самое умное, его задают плагины/синтаксис-файлы
Ctrl-X Ctrl-V  |  Дополнение команд Vim (в командной строке Ex)
Ctrl-X Ctrl-S  |  Орфографические подсказки (по словам со spell)
Ctrl-X Ctrl-F (пути) и Ctrl-X Ctrl-L (строки) стоит запомнить отдельно - это самые полезные "ручные" режимы на каждый день. После любого Ctrl-X Ctrl-* можно нажимать Ctrl-N/Ctrl-P для перелистывания кандидатов внутри выбранного источника.

Чтобы Ctrl-X Ctrl-K (словарь) реально что-то дополнял, опция 'dictionary' должна указывать на файл со словами - по одному на строку. На большинстве Linux это уже лежащий в системе словарь:

Код: Выделить всё

set dictionary+=/usr/share/dict/words
На Debian/Ubuntu файл появляется после apt install words, на macOS аналог - /usr/share/dict/words (есть из коробки). Можно указать и свой проектный словарь (термины, имена API):

Код: Выделить всё

setlocal dictionary+=~/.config/nvim/dict/api-terms.txt
После этого Ctrl-X Ctrl-K в режиме вставки предложит слова из словаря по набранному префиксу. Тот же файл 'dictionary' подхватывается флагом k в опции complete, если хотите, чтобы словарь участвовал и в обычном Ctrl-N.

Опция completeopt: как ведёт себя меню

Поведение popup-меню настраивается опцией completeopt. Это влияет на "ощущение" автокомплита сильнее всего.

Код: Выделить всё

Флаг completeopt  |  Эффект
------------------+----------------------------------------------------------------------------------------
menu              |  Показывать popup-меню (по умолчанию)
menuone           |  Показывать меню даже при единственном кандидате
noinsert          |  Не вставлять текст автоматически, пока вы не выберете явно
noselect          |  Не выделять кандидата автоматически - ничего не выбрано, пока не нажмёте
preview           |  Показывать доп. информацию о кандидате в preview-окне
popup             |  Показывать инфо во всплывающем окне вместо preview-окна (есть и в Vim 9.1, и в Neovim)
fuzzy             |  Нечёткий (fuzzy) поиск кандидатов вместо префиксного (есть и в Vim 9.1, и в Neovim)
nosort            |  Не сортировать кандидатов (полезно вместе с fuzzy; доступен в Vim 9.1 и Neovim)
Рекомендуемая база 2026 года для предсказуемого поведения:

Код: Выделить всё

set completeopt=menuone,noinsert,noselect
С такими флагами меню всплывает всегда, ничего не подставляется и не выбирается "за вас", и вы полностью контролируете вставку через Ctrl-N/Ctrl-Y. Флаг fuzzy добавляют, если хочется опечатко-устойчивого поиска; он доступен и в современном Vim 9.1, и в Neovim (как и popup/nosort). В Vim 9.1 рядом есть и опция 'completefuzzycollect' - она включает fuzzy уже на этапе СБОРА кандидатов для части Ctrl-X-режимов (а не только при фильтрации), что меняет состав списка. Имейте в виду нюанс: fuzzy и longest (вставка общего префикса) плохо сочетаются - при нечётком поиске "общего префикса" как такового нет, поэтому longest фактически перестаёт иметь смысл.

Нативный автокомплит Neovim 0.12 (факт 2026)

В Neovim 0.12 (вышел 29 марта 2026) появилась экспериментальная опция 'autocomplete' - встроенное автодополнение в режиме вставки без сторонних UI вроде nvim-cmp/blink.cmp: меню всплывает само по мере набора. Это "тише" и проще, чем полноценный движок, и помечено экспериментальным - закладываться на него в продакшен-конфиге пока рано. Кроме того, начиная с 0.11, есть vim.lsp.completion.enable() - базовый LSP-автокомплит через omnifunc без плагинов. Полноценное сравнение движков (blink.cmp против nvim-cmp) - в главе 26.

Практика: было -> нажимаем -> стало

Дополнение длинного имени. В буфере уже встречается userAuthenticationToken:

Код: Выделить всё

было (режим вставки):  const token = userA|
нажимаем:              Ctrl-N
стало:                 const token = userAuthenticationToken|
Дополнение пути к файлу.

Код: Выделить всё

было:    source ~/.config/nvim/lua/conf|
нажимаем: Ctrl-X Ctrl-F
стало:    source ~/.config/nvim/lua/config/   (и меню с файлами каталога)
Копирование целой строки. Нужно повторить похожую строку из соседнего блока:

Код: Выделить всё

было:    logger.info(|
нажимаем: Ctrl-X Ctrl-L
стало:    logger.info("request received", { id })   (подставлена совпавшая строка)
Часть 3. Аббревиатуры (:abbreviate и :iabbrev)

Зачем это нужно

Аббревиатуры - встроенный механизм автозамены: вы набираете короткую последовательность, и Vim заменяет её на длинную при вводе разделителя (пробел, точка, Enter и т.п.). Два главных применения:
  1. Автоисправление опечаток: вечно печатаете teh вместо the или recieve вместо receive - пусть Vim чинит это сам.
  2. Мини-сниппеты: sig -> ваша подпись, lorem -> абзац рыбного текста, pr -> print().
Это "бедный человек сниппеты", но они не требуют ни одного плагина и работают в любом Vim.

Главная концепция: три области действия

Код: Выделить всё

Команда            |  Где работает
-------------------+--------------------------------------------------------------------
:abbreviate (:ab)  |  Везде: и в режиме вставки, и в командной строке :
:iabbrev (:iab)    |  Только в режиме вставки (insert) - это то, что нужно в 95% случаев
:cabbrev (:ca)     |  Только в командной строке (для алиасов команд)
Почему почти всегда нужен именно :iabbrev, а не :abbreviate? Потому что :abbreviate срабатывает и в командной строке тоже. Если вы завели аббревиатуру ms -> MyService, то при вводе :s/ms/.../ обычная :abbreviate испортит вам команду замены. :iabbrev ограничен режимом вставки и таких сюрпризов не даёт.

Есть non-recursive варианты - :noreabbrev/:inoreabbrev/:cnoreabbrev (правая часть, rhs, не подвергается дальнейшему ремаппингу аббревиатур и мэппингов). Это не про "точное совпадение слова", а про отсутствие рекурсии в подстановке. А вот тип срабатывания (full-id / end-id / non-id) зависит от того, состоит ли сам триггер из keyword-символов (по 'iskeyword') - именно поэтому неслово-триггеры вроде @@ удобны и предсказуемы. Отдельно есть флаг <buffer> (аббревиатура только для текущего буфера) - он идеален для языко-специфичных сниппетов через ftplugin.

Как именно срабатывает аббревиатура (важно для ловушек)

Аббревиатура разворачивается, когда вы набираете символ-разделитель после ключевого слова: пробел, ., ,, (, Enter и т.д. Сам разделитель при этом вставляется. Если нужно вставить слово БЕЗ разворачивания, нажмите Ctrl-V перед разделителем - это подавит срабатывание. Также Ctrl-] в режиме вставки принудительно разворачивает аббревиатуру без ввода разделителя.

Практика: исправления и сниппеты

Автоисправления опечаток (в init.lua/.vimrc):

Код: Выделить всё

iabbrev teh the
iabbrev recieve receive
iabbrev fro for
iabbrev adn and
iabbrev functino function

Код: Выделить всё

было (вставка):  for teh|
нажимаем:        <Space>
стало:           for the |
Сниппеты-расширения:

Код: Выделить всё

iabbrev @@ dev2.khovanskiy@gmail.com
iabbrev ssig -- \nИван Хованский\nCyberlake
iabbrev cl console.log()

Код: Выделить всё

было:     contact: @@|
нажимаем: <Space>
стало:    contact: dev2.khovanskiy@gmail.com |
Буфер-локальный сниппет (только для Python, кладётся в ftplugin/python.vim или эквивалент):

Код: Выделить всё

iabbrev <buffer> ifmain if __name__ == "__main__":
Лучшие практики 2026
  • Всегда :iabbrev, а не :abbreviate для текстовых замен - чтобы не ломать командную строку.
  • Триггер должен быть "несловом": используйте сочетания, которые вы никогда не наберёте как настоящее слово - @@, ;sig, pr;. Иначе аббревиатура сработает там, где не нужно.
  • Языко-специфичное - через <buffer> в ftplugin, чтобы cl (console.log) не разворачивалось в Markdown.
  • Не путайте аббревиатуры со сниппет-движками. Для сложных сниппетов с табстопами, плейсхолдерами и динамикой нужен LuaSnip / нативный vim.snippet + friendly-snippets (глава 26). Аббревиатуры - для простых одношаговых замен.
Частые ошибки с аббревиатурами
  • Триггер - обычное слово. iabbrev no number означает, что вы больше никогда не напишете слово "no" - оно всегда станет "number". Берите неслова.
  • Ожидание срабатывания без разделителя. Аббревиатура не развернётся, пока вы не введёте пробел/знак препинания/Enter. Если нужно немедленно - Ctrl-].
  • Использование :abbreviate и удивление, почему :command ведёт себя странно. Это та самая ловушка области действия.
  • Лишний пробел/символ в значении. iabbrev cl console.log( с хвостовым пробелом вставит лишний пробел - следите за концом строки.
Часть 4. Проверка орфографии (:set spell)

Зачем это нужно

Встроенная проверка орфографии Vim подсвечивает слова с ошибками и предлагает замены - без плагинов, в комментариях кода, в Markdown, в коммит-сообщениях. Работает на десятках языков.

Включение и навигация

Код: Выделить всё

set spell
set spelllang=en,ru        " несколько языков сразу

Код: Выделить всё

Клавиша/команда  |  Действие
-----------------+---------------------------------------------------------------------
]s               |  Прыгнуть к СЛЕДУЮЩЕМУ слову с ошибкой
[s               |  Прыгнуть к ПРЕДЫДУЩЕМУ слову с ошибкой
]S / [S          |  То же, но только "плохие" слова (без редких/региональных)
z=               |  Показать список вариантов замены для слова под курсором
zg               |  Добавить слово в личный словарь (good - считать правильным)
zw               |  Пометить слово как ошибочное (wrong)
zug / zuw        |  Отменить (undo) добавление слова в словарь
1z=              |  Сразу заменить на ПЕРВЫЙ вариант без показа меню (быстрый автофикс)
Категории подсветки: SpellBad (неизвестное слово), SpellCap (слово с маленькой буквы там, где ожидается заглавная), SpellRare (редкое), SpellLocal (другой регион языка).

Практика

Код: Выделить всё

было:     This sentance has a typo.    (sentance подчёркнуто)
нажимаем: ]s     (прыгаем на слово)
нажимаем: z=     (видим список: 1 sentence, 2 ...)
вводим:   1<Enter>
стало:    This sentence has a typo.
Для быстрого исправления без меню удобно 1z= - заменить на самый вероятный вариант одним движением. Чтобы добавить технический термин (например Treesitter) в словарь - zg на нём, и он перестанет подсвечиваться.

Хорошая привычка

Включать spell локально через автокоманду только для текстовых файлов, чтобы он не мешал в коде:

Код: Выделить всё

vim.api.nvim_create_autocmd('FileType', {
  pattern = { 'markdown', 'gitcommit', 'text' },
  callback = function() vim.opt_local.spell = true end,
})
Про autocommands и augroups подробнее - в главе 20.

Лучшие практики 2026 (сводно)
  • Фолдинг на Treesitter, а не на syntax. В Neovim используйте foldexpr='v:lua.vim.treesitter.foldexpr()' и foldlevelstart=99, чтобы файлы открывались развёрнутыми, но структура была доступна по zM/za. На чистом Vim 9.1 - indent или marker.
  • nvim-ufo - приятная, но не обязательная опция. Берите его за красивый foldtext и отсутствие "мигания" свёрток; базовый Treesitter-фолдинг и так хорош.
  • Встроенный автокомплит - ваш аварийный комплект. Ctrl-N, Ctrl-X Ctrl-F, Ctrl-X Ctrl-L спасают на серверах без плагинов. Настройте completeopt=menuone,noinsert,noselect (флаг fuzzy доступен и в Vim 9.1, и в Neovim).
  • Нативный 'autocomplete' Neovim 0.12 - экспериментальный. Полезно знать, что он есть, но в стабильный конфиг лучше брать blink.cmp (глава 26).
  • :iabbrev для опечаток и микро-сниппетов, неслова в качестве триггеров. Сложные сниппеты - отдельным движком, не аббревиатурами.
  • spell включайте автокомандой по типу файла, а не глобально, чтобы не подчёркивало половину кода.
Частые ошибки (сводно)
  • Меняют foldmethod на manual, создают свёртки, потом переключают метод - и свёртки пропадают (manual-свёртки не сохраняются при смене метода). Для постоянных свёрток используйте marker или :mkview/:loadview (с viewoptions=folds,cursor и автокомандами BufWinLeave/BufWinEnter - см. раздел выше).
  • Жалуются, что "фолдинг не работает", хотя foldmethod=manual и ни одной свёртки не создано. Выберите осмысленный метод (indent/expr).
  • Ждут "умного" дополнения от Ctrl-N - но это всего лишь поиск слов по буферам, не LSP. Для умного нужен omni (Ctrl-X Ctrl-O) или LSP (глава 25).
  • Заводят аббревиатуру на обычное слово и потом не могут его напечатать.
  • Используют :abbreviate вместо :iabbrev и ломают ввод команд в :.
  • Включают spell глобально и тонут в подчёркиваниях внутри кода.
Упражнения
  1. Фолдинг по отступам. Откройте любой Python- или YAML-файл, выполните :setlocal foldmethod=indent, нажмите zM, затем zR. Походите по свёрткам через zj/zk и раскройте одну через za.
  2. Маркеры. В своём ~/.vimrc/init.vim разметьте две-три секции маркерами {{{ }}}, поставьте :setlocal foldmethod=marker и убедитесь, что секции схлопываются.
  3. Treesitter-фолдинг (Neovim). Включите foldmethod=expr с vim.treesitter.foldexpr() для одного буфера и сравните границы свёрток с вариантом indent на том же файле.
  4. Автокомплит путей и строк. В режиме вставки начните набирать путь к существующему файлу и допишите его через Ctrl-X Ctrl-F. Затем повторите длинную строку из буфера через Ctrl-X Ctrl-L.
  5. Свой набор автоисправлений. Добавьте 5-7 iabbrev для слов, в которых вы регулярно делаете опечатки, и одну сниппет-аббревиатуру с неслово-триггером (например ;date).
  6. Орфография. Включите :set spell spelllang=en, найдите ошибки через ]s, исправьте через z=/1z=, добавьте один технический термин в словарь через zg.
Главное из главы
  • Свёртки управляются опцией foldmethod (manual/indent/syntax/expr/marker) и командами на z: za (toggle), zo/zc (одна), zR/zM (раскрыть всё / схлопнуть всё через foldlevel), zj/zk (навигация), zf (создать). В Neovim 2026 - фолдинг на Treesitter (foldexpr), опционально nvim-ufo.
  • Встроенное автодополнение - Ctrl-N/Ctrl-P (слова из буферов) плюс прицельное семейство Ctrl-X Ctrl-* (пути, строки, омни, теги). Поведение меню настраивается completeopt. Это аварийный комплект без плагинов.
  • Аббревиатуры :iabbrev - встроенные автозамены для опечаток и мини-сниппетов; ключевое правило - неслово-триггеры и именно :iabbrev, а не :abbreviate.
  • Орфография :set spell с навигацией ]s/[s, заменами z=/1z= и словарём zg.
Всё это работает на голом Vim где угодно. Умные надстройки - LSP-дополнение (глава 25), движки автокомплита (глава 26) и Treesitter (глава 27) - строятся ровно на этих встроенных механизмах.
👍4 ❤️3 🔥2 😄 🤔2
✔ Лучший ответ сформирован автоматически — Thing163
Roman_Vim писал(а):Также Ctrl-] в режиме вставки принудительно разворачивает аббревиатуру без ввода разделителя о, вот это то что искал. триггер @@ на почту иногда хочется развернуть прям перед закрывающей скобкой без пробела, а Ctrl-V наоборот подавляет. теперь понятно как в обе стороны
Перейти к ответу →
Аватара пользователя
eannine
Сообщения: 1
Зарегистрирован: 04 июн 2026, 06:23

Re: Свёртки, автодополнение и аббревиатуры (встроенные)

Сообщение eannine »

вот этот рецепт с mkview/loadview через BufWinLeave и BufWinEnter прям спас, у меня manual-свёртки всё время пропадали при переходе на другой файл и я думал что это баг. оказалось они просто в памяти живут. поставил viewoptions=folds,cursor чтобы локальные опции с собой не таскало - и норм
👍2 ❤️ 🔥1 😄 🤔1
Аватара пользователя
hallowb0y
Сообщения: 1
Зарегистрирован: 08 июн 2026, 17:28

Re: Свёртки, автодополнение и аббревиатуры (встроенные)

Сообщение hallowb0y »

а у меня iabbrev cl console.log() не разворачивался хоть тресни, минут десять тупил. оказалось в markdown я его и проверял, а оно у меня под <buffer> в ftplugin для js только. перечитал часть про языко-специфичное - всё логично, сам себе злодей
👍1 ❤️1 🔥 😄 🤔
Аватара пользователя
Thing163
Сообщения: 1
Зарегистрирован: 14 май 2026, 10:44

Re: Свёртки, автодополнение и аббревиатуры (встроенные)

Сообщение Thing163 »

✔ Лучший ответ — сформирован автоматически
Roman_Vim писал(а):Также Ctrl-] в режиме вставки принудительно разворачивает аббревиатуру без ввода разделителя
о, вот это то что искал. триггер @@ на почту иногда хочется развернуть прям перед закрывающей скобкой без пробела, а Ctrl-V наоборот подавляет. теперь понятно как в обе стороны
👍 ❤️1 🔥 😄 🤔1
Аватара пользователя
strangelaw
Сообщения: 1
Зарегистрирован: 28 май 2026, 08:33

Re: Свёртки, автодополнение и аббревиатуры (встроенные)

Сообщение strangelaw »

спасибо, про zR/zM наконец дошло почему они через foldlevel работают а zo/zc нет. раньше путал и бесился когда zc закрывал не то что ждал
👍1 ❤️3 🔥 😄 🤔
Аватара пользователя
dreamv
Сообщения: 1
Зарегистрирован: 31 май 2026, 22:24

Re: Свёртки, автодополнение и аббревиатуры (встроенные)

Сообщение dreamv »

делюсь лайфхаком: повесил za на пробел в нормал моде, жать za двумя пальцами надоело. ну и foldlevelstart=99 поставил по совету, файлы открываются развёрнутыми. на голом виме без тс это indent спасает, на нвиме уже foldexpr с тришиттером
👍 ❤️ 🔥 😄 🤔1
Аватара пользователя
tcpkun
Сообщения: 1
Зарегистрирован: 07 июн 2026, 18:18

Re: Свёртки, автодополнение и аббревиатуры (встроенные)

Сообщение tcpkun »

вопрос про Ctrl-X Ctrl-K - у меня словарь молчит. dictionary указал на /usr/share/dict/words но файла нет, это нормально? на убунте надо apt install words ставить выходит, а то я думал из коробки везде есть
👍1 ❤️ 🔥 😄 🤔1
Ответить
← Предыдущая глава
Трюки режима вставки
Следующая глава →
Конфигурация с нуля: init.lua и разумные дефолты 2026

Все главы курса «Vim и Neovim: модальное редактирование от основ до современного Neovim»

Поделиться темой: ✈ Telegram VK
  • Похожие темы

Вернуться в «Vim и Neovim: модальное редактирование от основ до Neovim 2026»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость