Vim — текстовый редактор
Vim — один из самых мощных текстовых редакторов. Он установлен в каждом Linux и доступен даже по SSH. Порог входа высокий, но привыкнув, ты будешь редактировать файлы быстрее, чем в любой IDE.
1. Философия Vim
- руки не покидают клавиатуру — никакой мыши;
- режимы вместо комбинаций с Ctrl;
- команды = глагол + объект (удалить слово, поменять до скобки);
- всё настраивается в одном файле
.vimrc.
2. Режимы
| Режим | Что делает | Как войти |
|---|---|---|
| Normal | навигация и команды | по умолчанию; клавиша [ESC] |
| Insert | печать текста | i, a, o |
| Visual | выделение блока | v (по символам), V (по строкам) |
| Command-line | команды вида :wq | : |
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/gset 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 покажет автора и коммит каждой строки.
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 одновременно.
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.vue16. Командный режим: диапазоны и :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 # оставить только строки без patternCtrl+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 даже после новой правки, + — системный буфер, % — имя текущего файла, : — последнюю команду.
- обмен фрагментами между файлами через именованный регистр:
"ayyв одном сплите,"ap— в другом; - выражение
"=вставляет результат вычисления — от арифметики до вызова функций; - при включённом
clipboard=unnamedplusобычные операции сразу работают с системным буфером.
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 spellsetlocalизменяет опцию только для текущего буфера — на другие файлы не влияет;- основные правила выноси в
~/.vim/ftplugin/<тип>.vim, чтобы не плодить длинные автокоманды; - для отступов удобно хранить modeline прямо в файле:
vim: set ts=2 sw=2:.
autocmd BufWritePre * :%s/\s\+$//e # убрать хвостовые пробелы при сохранении20. Большие файлы и логи
Vim справляется с гигабайтными логами, если заранее отключить тяжёлый парсинг. Подсветка по всей строке и автоотступы — главные тормоза на больших файлах:
set synmaxcol=200 # подсвечивать только первые 200 символов строки
syntax off # совсем отключить для логов
vim -R big.log # открыть только для чтения- фолды
zf/zRпрячут разобранные куски, режимset foldmethod=manual; /регулярка+:gфильтрует строки лога, не загружая файл целиком;:grepи quickfix из раздела 15 работают и с логами, если задатьgrepformatпод их формат.
set lazyredraw и выключи относительные номера на гигантских файлах через автокоманду — навигация станет заметно плавнее.21. Чек-лист первой недели в Vim
За семь дней Vim входит в мышечную память, если разбить практику на маленькие шаги. Минимум, который закрывает 90% повседневных задач:
| Умение | Команды | День |
|---|---|---|
| Движение без стрелок | h j k l, w b, 0 $ | 1–2 |
| Вставка и удаление | i a o, dd yy p, u | 2–3 |
| Поиск и замена | / ? n, :%s///g | 3–4 |
| Сплиты и буферы | :vsplit, :b имя, Ctrl+w | 5 |
| Макросы и git | qaq @a, :Gstatus | 6–7 |
vimtutor # интерактивный курс внутри редактора- в первый день запрети себе стрелки и мышь — только
h j k l; - по одной новой команде в день, а не всё сразу;
- настоящий тест — «рабочие файлы», а не учебник: переписывай на Vim рутину из других редакторов.
Что дальше
Используй Vim при настройке Linux, работе с Ansible и Docker-конфигами. Все курсы — на главной странице.