Vim — текстовый редактор

Продолжительность: 17 уроков · Уровень: с нуля

Vim — один из самых мощных текстовых редакторов. Он установлен в каждом Linux и доступен даже по SSH. Порог входа высокий, но привыкнув, ты будешь редактировать файлы быстрее, чем в любой IDE.

1. Философия Vim

2. Режимы

РежимЧто делаетКак войти
Normalнавигация и командыпо умолчанию; клавиша [ESC]
Insertпечать текстаi, a, o
Visualвыделение блокаv (по символам), V (по строкам)
Command-lineкоманды вида :wq:
Большая ошибка новичка — обходить Vim кнопками-стрелками в режиме ввода. Учись возвращаться в Normal клавишей [ESC] и двигаться буквами h j k l.

3. Открытие и закрытие файла

vim app.py        # открыть
:q                # выйти (если нет изменений)
:q!               # выйти без сохранения
:w                # сохранить
:wq               # сохранить и выйти
:split file2.txt  # открыть второй файл в сплите

4. Навигация

h j k l           # влево, вниз, вверх, вправо
w b               # слово вперёд / назад
0 ^ $             # начало / первый символ / конец строки
gg G              # в начало файла / в конец
:42               # перейти на строку 42
Ctrl+d Ctrl+u     # пол-экрана вниз / вверх

5. Вставка и редактирование

i                 # вставить перед курсором
a                 # вставить после курсора
o / O             # новая строка снизу / сверху
I A               # в начало / в конец строки
caw               # заменить слово (change a word)
cw ci) ci"        # заменить слово / внутри скобок / внутри кавычек
r                 # заменить один символ

6. Удаление и копирование

x                 # удалить символ
dd                # удалить строку
2dd               # удалить две строки
dw                # удалить слово
yy                # скопировать строку (yank)
p / P             # вставить после / до курсора
u Ctrl+r          # отменить / повторить
v  → y            # выделить и скопировать

7. Поиск и замена

/pattern          # поиск вперёд
?pattern          # поиск назад
n N               # следующее / предыдущее совпадение
*                 # искать слово под курсором

# замена одного слова во всех строках
:%s/old/new/g

# замена в выделенном блоке (выдели V, затем :и выполни)
:'<,'>s/old/new/g
Классика настройки: set hlsearch подсветит совпадения, а noh снимает подсветку.

8. Работа с несколькими окнами

:split file.py     # горизонтальный сплит
:vsplit file.py    # вертикальный сплит
Ctrl+w w           # переключиться между окнами
Ctrl+w q           # закрыть окно
:tabnew file.py    # новая вкладка

9. Настройка .vimrc

Файл конфигурации лежит в домашнем каталоге. Минимальный комфортный набор:

" ~/.vimrc
set number                  " номера строк
set relativenumber          " относительные номера
syntax on                   " подсветка синтаксиса
set tabstop=4 shiftwidth=4 expandtab   " 4 пробела вместо таба
set smartindent             " умные отступы
set hlsearch                " подсветка поиска
set incsearch               " поиск по мере ввода
set mouse=a                 " поддержка мыши
set clipboard=unnamedplus   " общий буфер обмена
set ignorecase smartcase    " умный учёт регистра в поиске

10. Плагины и экосистема

Современный Vim усиливается менеджером плагинов, например vim-plug:

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
  https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

В .vimrc:

call plug#begin()
Plug 'preservim/nerdtree'        " дерево файлов
Plug 'sheerun/vim-polyglot'      " подсветка для десятков языков
Plug 'tpope/vim-fugitive'        " интеграция с Git
call plug#end()

:PlugInstall   " затем выполнить эту команду в vim

Не выходить из Vim

Есть вертикальная разработка с помощью vim + tmux: один редактор, много панелей, всё в терминале даже по SSH.

11. Макросы и повторы

Макрос — записанная последовательность команд, которую можно воспроизводить сколько угодно раз. Запись начинается с q и имени регистра (qa), а завершается повторным нажатием q:

qa                # начать запись в регистр a
...                 # выполняешь нужные команды
q                   # остановить запись
@a                  # воспроизвести макрос один раз
5@a                 # пять раз подряд
@@                  # повторить последний

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

Относись к макросу как к «функции для редактирования»: если одну и ту же правку приходится повторять больше двух раз — запиши макрос, а не жми одни и те же клавиши руками.

12. Git прямо в Vim: fugitive

Плагин vim-fugitive превращает Vim в полноценный Git-клиент без выхода из редактора. Основные команды:

:Gstatus          # окно состояния, - переключает stage/unstage
:Gdiff            # сравнение двух версий в сплите
:Gcommit          # коммит с сообщением
:Gblame           # кто и когда менял строку
:Glog             # история файла списком
:Git push         # любая git-команда прямо из Vim

В режиме :Gdiff слева — рабочая версия, справа — сравниваемая. Переноси правки комбинациями dp и do, а :Gblame покажет автора и коммит каждой строки.

Fugitive не заменяет базовые знания Git: сначала разберись с ветками, коммитами и pull/push в курсе Git, а потом переноси их в Vim.

13. Vim как IDE: LSP и автодополнение

Автодополнение и переход к определению обеспечивает языковой сервер (LSP). Самый популярный вариант для Vim — coc.nvim:

Plug 'neoclide/coc.nvim', {'branch': 'release'}
// coc-settings.json
{"languageserver": {"typescript": {"command": "typescript-language-server", "filetypes": ["typescript", "vue"]}}}
<Tab>                # следующее предложение автодополнения
gd                  # go to definition
gr                  # поиск ссылок на символ
:Format             # отформатировать файл
:call CocAction('diagnosticInfo')  # описание ошибки под курсором

Дерево файлов добавляет NERDTree или netrw, а готовые дистрибутивы вроде LunarVim упрощают старт. Помни про разделение ролей: LSP отвечает за типы и навигацию, линтер — за правила кода, поэтому держи и ESLint, и LSP одновременно.

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

14. Буферы: скрытое состояние файлов

Буфер — это файл, загруженный Vim в память. Разница с окнами и вкладками: вкладка — это раскладка окон, окно — область просмотра, а буфер — сами данные. Один буфер можно показывать сразу в нескольких окнах, и правки будут общими.

:ls               # список буферов, % — текущий, # — предыдущий
:bnext / :bprev   # следующий / предыдущий буфер
:b app.py         # перейти к буферу по имени
:b#               # прыгнуть к предыдущему (как Ctrl+Tab)
:bd               # закрыть буфер, окно останется
:e ./file.txt     # загрузить файл без выхода
Новички путают буферы с вкладками и плодят окна вместо буферов. Запомни правило: вкладок обычно немного, а буферов — сколько файлов в проекте. Включи строку статуса (set ls=2), чтобы видеть текущий буфер.

15. Быстрый поиск по проекту: grep и :find

За поиск в файле отвечает /, а по всему проекту — внешний поисковик. Vim умеет вызывать ripgrep и складывать результаты в список quickfix:

set grepprg=rg\ --vimgrep\ --smart-case
:grep todo src/
:copen            # открыть окно результатов
:cn / :cp         # следующее / предыдущее совпадение
:cfdo s/foo/bar/g # заменить во всех файлах из списка

Команда :find ищет файл по имени, обходя путь из path. Ленивый рекурсивный поиск по всему проекту включается так:

set path+=**
:find ProductCard.vue
Схема «собрать quickfix → масштабировать через :cfdo» заменяет IDE-инструмент «Find in files» и спасает при крупном рефакторинге без выхода из терминала.

16. Командный режим: диапазоны и :global

Большинство команд в Vim работают не со всей строкой, а с диапазонами. Диапазоны открывают точные правки и сортировку:

:1,5s/foo/bar/g     # заменить только в строках 1–5
:%s/foo/bar/g       # во всём файле (%)
:'<,'>s/foo/bar/g   # в выделенном блоке (V)
:.,.+10d            # удалить 11 строк с текущей
:-2,+2y             # скопировать окрестность курсора

А :g (global) выполняет команду для каждой строки, подходящей под шаблон — это «цикл по строкам» на минимализме:

:g/^#/d             # удалить все строки-комментарии
:g/todo/norm I- [ ] # добавить чекбокс к строкам с todo
:g!/pattern/d       # оставить только строки без pattern
Относительные адреса (. = текущая строка, +2 — две вниз) зависят от позиции курсора. Перед массовой операцией проверь номер строки командой Ctrl+g, иначе рискуешь удалить не тот фрагмент.

17. Частые ошибки и безопасность

Типичные ошибки новичка и их решения:

ОшибкаРешение
«Метод тыка»: стрелки и Esc вместо командИзучи навигацию h j k l и буферы
Потерял изменения после сбояswap-файл .file.swp: vim -r file
Испортил двоичный файл переносами строкОткрывай так: vim -b file
Не помню команду:help — встроенная документация: :h list
:set noswapfile       # не хранить копии: для секретов
:verbose set shiftwidth  # кто последним менял опцию
:%!sudo tee % >/dev/null # сохранить под sudo (не везде работает)
Не выполняй команды из непроверенных статей: :%!команда и сетевые плагины могут перезаписать файл или удалить данные. Сначала прочитай, потом исполняй.
Держи рабочий .vimrc в Git — регрессии после экспериментов откатываются мгновенно, а настройки синхронизируются между машинами.

18. Регистры: несколько буферов обмена

Vim хранит удалённое и скопированное не в одном «буфере», а в наборе регистров. По умолчанию d, x и y пишут в безымянный регистр " — и предыдущее значение теряется. Именованные регистры a–z хранят сразу несколько фрагментов:

"ayy                # скопировать строку в регистр a
"bdd                # вырезать строку в регистр b
"bp                 # вставить из регистра b
:reg a              # показать содержимое регистра a
"+yy                # скопировать в системный буфер обмена

Спецрегистры: 0 хранит последний yank даже после новой правки, + — системный буфер, % — имя текущего файла, : — последнюю команду.

Регистр 0 спасает в частом сценарии «скопировал, потом что-то вырезал»: безымянный регистр перезаписан, а последний yank всё ещё в нулевом.

19. Автокоманды и настройки под тип файла

Рукам нужно меньше движений, когда контекст меняется автоматически. Включи определения типов и добавляй контекстные настройки:

filetype plugin indent on
autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtab
autocmd FileType yaml setlocal tabstop=2 shiftwidth=2
autocmd FileType markdown setlocal wrap spell
autocmd BufWritePre * :%s/\s\+$//e   # убрать хвостовые пробелы при сохранении
Осторожно с автокомандами, меняющими файл: обработка может сработать на чужом буфере. Ограничивай действие типами и каталогами, а не одним звёздочным шаблоном.

20. Большие файлы и логи

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

set synmaxcol=200      # подсвечивать только первые 200 символов строки
syntax off             # совсем отключить для логов
vim -R big.log         # открыть только для чтения
Для чтения 100 МБ текста быстрее обычного редактора окажется less — для просмотра редактор не всегда нужен.
Поставь set lazyredraw и выключи относительные номера на гигантских файлах через автокоманду — навигация станет заметно плавнее.

21. Чек-лист первой недели в Vim

За семь дней Vim входит в мышечную память, если разбить практику на маленькие шаги. Минимум, который закрывает 90% повседневных задач:

УмениеКомандыДень
Движение без стрелокh j k l, w b, 0 $1–2
Вставка и удалениеi a o, dd yy p, u2–3
Поиск и замена/ ? n, :%s///g3–4
Сплиты и буферы:vsplit, :b имя, Ctrl+w5
Макросы и gitqaq @a, :Gstatus6–7
vimtutor        # интерактивный курс внутри редактора
Пройди vimtutor на 5-й день повторно — с новым опытом многое в нём заиграет иначе, а пробелы закроются сами собой.

Что дальше

Используй Vim при настройке Linux, работе с Ansible и Docker-конфигами. Все курсы — на главной странице.

← Вернуться к курсам