linux view-edit

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 на базовом уровне.

Синтаксис и режимы

vi [ОПЦИИ] [ФАЙЛ]... vim [ОПЦИИ] [ФАЙЛ]...

Основные режимы

Normal Нажмите Esc для входа. Режим по умолчанию. Навигация и команды.
Insert i, a, o, I, A, O для входа. Ввод текста.
Visual v (символы), V (строки), Ctrl+V (блок). Выделение.
Command : для входа. Команды сохранения, поиска, замены.

Переход между режимами

# Из Normal в Insert: i — вставить ПЕРЕД курсором a — вставить ПОСЛЕ курсора o — новая строка НИЖЕ и войти в Insert O — новая строка ВЫШЕ и войти в Insert I — вставить в начало строки A — вставить в конец строки # Выход из Insert в Normal: Esc (или Ctrl+[ или Ctrl+C) # Из Normal в Command: : — ввести команду # Из Normal в Visual: v — визуальный режим (символы) V — визуальный режим (строки) Ctrl+V — блочный визуальный режим

Базовые команды в Normal-режиме

# Навигация h j k l — влево/вниз/вверх/вправо w — следующее слово b — предыдущее слово 0 — начало строки $ — конец строки gg — начало файла G — конец файла :N — перейти к строке N (напр. :42) # Редактирование dd — удалить строку (вырезать) yy — скопировать строку p — вставить после курсора u — отменить (undo) Ctrl+r — повторить (redo) . — повторить последнюю команду # Команды сохранения/выхода :w — сохранить :q — выйти (если нет несохранённых изменений) :wq — сохранить и выйти :q! — выйти БЕЗ сохранения ZZ — сохранить и выйти (аналог :wq) ZQ — выйти без сохранения (аналог :q!)

Флаги и опции запуска

Флаг Описание Пример
+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 (самый частый вопрос)
Если вы случайно оказались в 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 для перехода в режим вставки.
Предупреждение: sudo vim vs sudoedit
При редактировании системных файлов предпочитайте sudoedit /etc/config вместо sudo vim /etc/config. Команда sudoedit безопаснее: она запускает редактор с правами текущего пользователя, а не root, что исключает риск случайного повреждения системных файлов через плагины vim.