Редактор vi и vim [103.8]

Рейтинг: 72.2% · 10 голосов
Полный курс LPIC-1 (экзамены 101-500 и 102-500): архитектура, загрузка, пакеты, команды и текст, ФС и права, шелл-скрипты, пользователи, сервисы, сеть, безопасность. Debian и RHEL.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Редактор vi и vim [103.8]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-1 и как устроен путь администратора
  2. Железо, устройства и модули ядра [101.1]
  3. Загрузка системы: от BIOS до systemd [101.2]
  4. systemd, цели и уровни выполнения [101.3]
  5. План разметки диска и swap [102.1]
  6. Загрузчик GRUB 2 [102.2]
  7. Разделяемые библиотеки [102.3]
  8. Управление пакетами в Debian: dpkg и apt [102.4]
  9. Управление пакетами RPM, DNF и Zypper [102.5]
  10. Linux как гость виртуализации [102.6]
  11. Командная строка Bash [103.1]
  12. Обработка текста фильтрами [103.2]
  13. Базовое управление файлами [103.3]
  14. Потоки, конвейеры и перенаправление [103.4]
  15. Процессы: создание, мониторинг, сигналы [103.5]
  16. Приоритеты выполнения процессов [103.6]
  17. Регулярные выражения [103.7]
  18. Редактор vi и vim [103.8] (вы здесь)
  19. Разделы и создание файловых систем [104.1]
  20. Целостность и обслуживание ФС [104.2]
  21. Монтирование файловых систем [104.3]
  22. Урок 21. Права доступа и владение: rwx, chmod, umask и специальные биты
  23. Жёсткие и символические ссылки
  24. FHS и поиск файлов в системе [104.7]
  25. Окружение и кастомизация оболочки [105.1]
  26. Урок 25. Написание простых bash-скриптов [105.2]
  27. Графика, рабочие столы и доступность
  28. Учётные записи пользователей и групп
  29. Автоматизация задач: cron, at, таймеры [107.2]
  30. Локализация и интернационализация [107.3]
  31. Системное время и синхронизация [108.1]
  32. Системное логирование [108.2]
  33. Основы почтового агента (MTA) [108.3]
  34. Печать и CUPS [108.4]
  35. Основы интернет-протоколов [109.1]
  36. Постоянная конфигурация сети [109.2]
  37. Диагностика сети [109.3]
  38. DNS на стороне клиента [109.4]
  39. Задачи администрирования безопасности [110.1]
  40. Настройка безопасности хоста [110.2]
  41. Шифрование данных: SSH и GnuPG [110.3]
Урок 17. Редактор vi и vim [103.8]

Рано или поздно вы попадёте на сервер, где нет ни вашего любимого редактора, ни графики, ни даже nano. Зато vi там есть всегда: это часть стандарта POSIX, и даже минимальный busybox несёт его внутри. Задача этого урока - научиться не паниковать в vi: войти, поправить конфиг, сохранить и выйти, не сломав файл. Разберём режимы, навигацию, базовую правку, поиск и замену, а в конце скажем пару слов про nano как запасной аэродром.

Изображение

Как это работает

Главная идея, которая ломает мозг новичкам: vi - модальный редактор. В большинстве редакторов клавиша a печатает букву a. В vi всё зависит от текущего режима. По сути это два мира: в одном вы двигаетесь и командуете, в другом - набираете текст.

Режимов фактически четыре. Командный (он же нормальный) - стартовый режим: тут буквы это не текст, а команды (h - влево, x - удалить символ, dd - удалить строку). Режим вставки - сюда входят по i, a, o и здесь уже печатают как обычно. Визуальный режим (это уже расширение vim, в чистом vi его не было) выделяет блоки текста: входим по v, выделяем движением курсора, потом применяем операцию. И ex-режим, он же режим командной строки - всё, что начинается с двоеточия: :w, :q, :s///. Исторически ex - это строчный редактор-предок, а команды через двоеточие это обращение к нему.

Связующий клавиша - Esc. Она почти всегда возвращает в командный режим из любого другого. Привыкайте жать Esc рефлекторно, когда не уверены, где находитесь: лишний Esc в командном режиме безвреден (только пискнет).

Важно понимать разницу между vi и vim. На современных системах /usr/bin/vi - это почти всегда симлинк или обёртка на vim (Vi IMproved). Vim добавил подсветку синтаксиса, многоуровневый undo, визуальный режим, плагины. В RHEL и Fedora из коробки ставится урезанный vim-minimal (команда vi), полноценный пакет называется vim-enhanced. В Debian и Ubuntu базовый пакет vim-tiny, а полный - vim. Это объясняет, почему на одном сервере u отменяет много шагов, а на другом - только один.

Команды и примеры

Установка полной версии там, где её нет:

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

# Debian / Ubuntu
sudo apt install vim

# RHEL 10 / Fedora 41+
sudo dnf install vim-enhanced
Навигация в командном режиме (курсорные стрелки тоже работают, но привыкайте к hjkl - они под пальцами):

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

h j k l   влево, вниз, вверх, вправо
w / b     на слово вперёд / назад
0 / $     в начало / конец строки
gg / G    в начало / конец файла
:42       перейти на строку 42 (можно и 42G)
Ctrl-f    страница вниз, Ctrl-b - вверх
Вход в режим вставки - выбирайте по тому, КУДА хотите печатать:

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

i  перед курсором       a  после курсора
I  в начало строки      A  в конец строки
o  новая строка снизу   O  новая строка сверху
Базовая правка в командном режиме:

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

x      удалить символ под курсором
dd     удалить (вырезать) строку целиком
yy     скопировать (yank) строку в буфер
p / P  вставить после / перед курсором
u      отменить последнее действие
Ctrl-r вернуть отменённое (redo)
.      повторить последнюю команду правки
Команды vi комбинируются как оператор + объект, и это их сила. Цифра задаёт повтор: 3dd удалит три строки, 5x - пять символов. dw удалит слово, d$ - до конца строки, dG - до конца файла. yy/p и счётчики работают так же: 2yy скопирует две строки.

Поиск и замена. Поиск - слэш вперёд, вопрос назад; n повторяет в ту же сторону, N в обратную:

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

/error      искать error вниз
?error      искать вверх
n / N       следующее / предыдущее совпадение
Замена через ex-команду :s. Синтаксис: :диапазон s/что/на_что/флаги.

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

:s/foo/bar/        заменить ПЕРВЫЙ foo в текущей строке
:s/foo/bar/g       заменить ВСЕ foo в текущей строке (g = global по строке)
:%s/foo/bar/g      во ВСЁМ файле (% = все строки)
:%s/foo/bar/gc     то же, но спрашивать подтверждение каждой замены
:10,20s/foo/bar/g  только в строках с 10 по 20
Сохранение и выход - самое нужное:

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

:w        записать (сохранить), остаться в файле
:q        выйти, если нет несохранённых правок
:wq       записать и выйти (то же, что :x или ZZ)
:q!       выйти БЕЗ сохранения, отбросить правки
:w!       записать принудительно (если права позволяют)
:w файл   сохранить под другим именем
Если файл открыт без прав на запись (забыли sudo), спасает трюк с записью через sudo прямо из vim:

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

:w !sudo tee % > /dev/null
Частые грабли
  • Печатаете команды в режиме вставки и наоборот. Признак: в тексте вдруг появляются буквы dd, :wq. Лекарство одно - Esc, потом u для отката.
  • Застряли и не можете выйти. Классика. Жмёте Esc, затем :q! - выход без сохранения гарантированно работает.
  • Вставка из буфера обмена терминала ломает отступы: автоиндент дублирует пробелы лесенкой. Перед вставкой включите :set paste, после - :set nopaste.
  • Caps Lock включён - hjkl превращаются в команды H, J, L, M (это другие действия), правка едет вкривь.
  • Открыли файл, vim ругается на .swp (swap-файл): значит, прошлая сессия рухнула или файл уже открыт в другом окне. Выберите (R)ecover чтобы восстановить, или (D)elete если правок там не было.
  • :wq на файле, открытом без прав, молча не сохраняет или ругается E212. Это не баг - просто нет прав; выходите через sudoedit или трюк с tee.
  • Путаете :s/// без флага g (меняет только первое вхождение в строке) с полной заменой. Для всего файла нужно именно :%s///g.
Мини-лаба
  • Создайте файл командой printf 'one\ntwo\nthree\nfour\nfive\n' > lab.txt и откройте его: vi lab.txt.
  • Перейдите на последнюю строку (G), создайте под ней новую строку (o), впишите six, вернитесь в командный режим (Esc).
  • Скопируйте первую строку: gg, потом yy. Перейдите в конец (G) и вставьте (p). Удалите вставленную строку (dd).
  • Сделайте замену по всему файлу: :%s/o/0/g - посмотрите, как поменялись все o на нули. Отмените всё это несколькими u.
  • Найдите слово five через /five, нажмите n и посмотрите, как поиск зацикливается.
  • Сохраните и выйдите через :wq. Откройте заново и попробуйте выйти без изменений через :q, затем внесите правку и выйдите через :q!.
Контрольные вопросы
  • Чем командный режим vi отличается от режима вставки и какой клавишей всегда возвращаются в командный?
  • Что делает команда :%s/old/new/gc и за что отвечают флаги g и c?
  • Какая команда удалит три строки за раз и как она устроена (оператор плюс счётчик)?
  • Чем :q отличается от :q! и :wq?
  • Что означает swap-файл при открытии и какие действия предлагает vim, если он найден?
  • Почему на минимальном сервере стоит рассчитывать именно на vi, а не на nano?
👍4 ❤️2 🔥1 😄 🤔1
Аватара пользователя
Telpuhovskij
Сообщения: 1
Зарегистрирован: 11 май 2026, 10:19

Re: Редактор vi и vim [103.8]

Сообщение Telpuhovskij »

А есть быстрый способ выйти, когда вообще не помнишь, менял файл или нет? Я по привычке всегда :wq жму, а если открыл случайно чужой конфиг - не хочется его перезаписать.
👍1 ❤️1 🔥 😄 🤔2
Аватара пользователя
myrrh
Сообщения: 1
Зарегистрирован: 18 май 2026, 20:28

Re: Редактор vi и vim [103.8]

Сообщение myrrh »

Заметил что на проде vi отменяет только одно действие, а на ноуте откатывает хоть весь файл. Так это и есть разница vim-minimal против полного vim, дошло наконец.
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Регулярные выражения [103.7]
Следующая глава →
Разделы и создание файловых систем [104.1]

Все главы курса «LPIC-1: администратор Linux (101 + 102)»

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

Вернуться в «LPIC-1: администратор Linux»

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

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