vi / vim
Мощный модальный текстовый редактор с командным интерфейсом
Описание
vi (visual editor) — один из старейших и наиболее распространённых текстовых редакторов в Unix-мире. Создан Биллом Джоем (Bill Joy) в 1976 году как визуальный режим для строчного редактора ex. vim (Vi IMproved) — расширенная версия, созданная Брамом Мооленааром (Bram Moolenaar) в 1991 году и ставшая стандартом на большинстве Linux-систем. На современных системах команда vi обычно является псевдонимом vim.
Ключевая особенность vi/vim — модальное редактирование: редактор имеет несколько режимов работы, и одни и те же клавиши выполняют разные действия в зависимости от текущего режима. Это позволяет выполнять сложные операции редактирования без использования мыши, что делает vim невероятно эффективным для опытных пользователей. Кривая обучения крутая, но вложение времени окупается многократно.
vi/vim присутствует практически в каждой Unix/Linux-системе «из коробки», что делает его незаменимым при работе с серверами по SSH, в контейнерах Docker и минималистичных окружениях, где другие редакторы могут быть недоступны. Системный администратор обязан уметь работать с vi на базовом уровне.
Синтаксис и режимы
Основные режимы
Переход между режимами
Базовые команды в Normal-режиме
Флаги и опции запуска
| Флаг | Описание | Пример |
|---|---|---|
+N |
Открыть файл и сразу перейти к строке N. | vi +42 script.py |
+/pattern |
Открыть файл и перейти к первому вхождению pattern. | vim +/TODO app.py |
-R |
Режим только для чтения. Файл нельзя изменить случайно. Эквивалентно команде view. |
vim -R /etc/passwd |
-r |
Восстановить файл после краша редактора. Без аргументов — список доступных для восстановления файлов. | vim -r file.txt |
-n |
Не создавать swap-файл (файл восстановления). Ускоряет работу, но при краше изменения будут потеряны. | vim -n /tmp/quick.txt |
-u NONE |
Запустить vim без загрузки конфигурационного файла ~/.vimrc. Полезно для отладки. |
vim -u NONE file.txt |
-c "cmd" |
Выполнить vim-команду сразу после открытия файла. | vim -c "set nu" file.txt |
-d file1 file2 |
Открыть в режиме diff (сравнение файлов). Эквивалент vimdiff. |
vim -d old.py new.py |
-O |
Открыть несколько файлов в вертикально разделённых окнах. | vim -O file1.txt file2.txt |
-o |
Открыть несколько файлов в горизонтально разделённых окнах. | vim -o file1.txt file2.txt |
--version |
Вывести информацию о версии vim и скомпилированных функциях. | vim --version |
Паттерны использования
Минимальный сеанс работы
Базовый цикл «открыть — изменить — сохранить — выйти»:
# 1. Открыть файл vim config.yml # 2. Перейти к нужной строке: G (конец), # gg (начало), /search, :42 # 3. Войти в режим вставки: i или o # 4. Написать текст # 5. Выйти из режима вставки: Esc # 6. Сохранить и выйти: :wq # Или выйти без сохранения: :q!
Поиск и замена
Мощные команды поиска и массовой замены:
# Поиск вперёд /pattern ← ввести после / n ← следующее совпадение N ← предыдущее совпадение # Замена в текущей строке :s/old/new/g # Замена во всём файле :%s/old/new/g # С подтверждением каждой замены :%s/old/new/gc # С флагом i — без учёта регистра :%s/old/new/gi
Работа со строками
Быстрые операции удаления, копирования и перемещения строк:
# В Normal-режиме: dd — удалить текущую строку 3dd — удалить 3 строки yy — скопировать строку 5yy — скопировать 5 строк p — вставить после курсора P — вставить перед курсором # Диапазон строк (Command-режим) :5,10d — удалить строки 5–10 :5,10y — скопировать строки 5–10 :5,10m 20 — переместить 5–10 после 20
Редактирование конфигов на сервере
Типичный сценарий: быстрое изменение конфига по SSH:
# Открыть конфиг nginx sudo vim /etc/nginx/nginx.conf # Перейти к настройке worker_processes /worker_processes # Изменить значение: # cw — удалить слово и войти в Insert # затем написать новое значение # Проверить синтаксис nginx не выходя: :!nginx -t # Сохранить и выйти :wq # Перезапустить сервис :!systemctl reload nginx
Vimdiff — сравнение файлов
Визуальное сравнение двух версий файла:
# Открыть diff двух файлов vimdiff original.py modified.py # или vim -d original.py modified.py # Навигация между изменениями: ]c — следующее отличие [c — предыдущее отличие # Принять изменение из другого окна: do (diff obtain) — взять из соседнего dp (diff put) — отдать в соседнее # Переключение между окнами: Ctrl+w w
Полезные команды в Command-режиме
Команды, которые часто нужны в повседневной работе:
# Показать номера строк :set nu :set number # Скрыть номера строк :set nonu # Включить подсветку поиска :set hlsearch :noh — убрать подсветку до следующего поиска # Установить количество пробелов для табуляции :set tabstop=4 :set expandtab — заменять Tab пробелами # Выполнить внешнюю команду :!ls -la :!python % — запустить текущий файл
Советы и предупреждения
Если вы случайно оказались в vim и не знаете как выйти: нажмите Esc несколько раз (чтобы вернуться в Normal-режим), затем введите
:q! и нажмите Enter. Двоеточие означает переход в командный режим, q! — выход без сохранения. Если хотите сохранить изменения — :wq.
Клавиша . (точка) в Normal-режиме повторяет последнее изменение. Это мощная функция: например, если вы изменили слово командой
cw и написали новое слово, переместите курсор на следующее вхождение старого слова и нажмите . — оно тоже будет заменено.
Vim автоматически создаёт swap-файл (например,
.file.txt.swp) во время редактирования. Если редактор завершился аварийно, при следующем открытии файла vim предложит восстановление. Ответьте R для восстановления. После успешного восстановления удалите swap-файл: vim -r file.txt, затем :wq, затем rm .file.txt.swp.
Самая частая ошибка новичков — печатать текст в Normal-режиме. Если вы видите, что нажатия клавиш выполняют странные действия (удаляют строки, перемещают курсор), значит вы в Normal-режиме. Нажмите Esc и u для отмены нежелательных изменений, затем i для перехода в режим вставки.
При редактировании системных файлов предпочитайте
sudoedit /etc/config вместо sudo vim /etc/config. Команда sudoedit безопаснее: она запускает редактор с правами текущего пользователя, а не root, что исключает риск случайного повреждения системных файлов через плагины vim.