LinuxRuLinux без лишней теории
Редактор Vim

Vim для начинающих: как выйти из редактора, сохранить файл и работать без мыши

Редакция LinuxRu7 мин чтенияИнструкции

Чтобы выйти из Vim, нажмите Esc, наберите :q! и Enter, если изменения не нужны, или :wq, если файл надо сохранить. Vim открывается в нормальном режиме, где клавиши выполняют команды, поэтому ниже разобраны режимы, правка, навигация, поиск и замена, а в конце рабочий .vimrc.

Vim для начинающих: как выйти из редактора, сохранить файл и работать без мыши
Фото: Software: Bram Moolenaar et al. Screenshot: VulcanSphere, Public domain, Wikimedia Commons
Содержание
  1. Режимы Vim
  2. Выход и сохранение
  3. Правка текста
  4. Навигация
  5. Поиск и замена
  6. Выделение и буфер
  7. Файл .vimrc
  8. Установка
  9. Частые вопросы

Почему Vim не даёт печатать: четыре режима

Vim открывается в нормальном режиме. Клавиши здесь не вставляют текст, а выполняют команды: d удаляет, y копирует, u отменяет. Поэтому новичок жмёт буквы, на экране творится странное, и кажется, что редактор сломался.

  • Normal - перемещение и команды. Сюда всегда возвращает Esc.
  • Insert - обычный ввод текста. Входим клавишей i, внизу появляется -- INSERT -- (или -- ВСТАВКА -- в русской локали).
  • Visual - выделение: v посимвольно, V строками, Ctrl+v прямоугольным блоком.
  • Command-line - строка внизу экрана после двоеточия :, сюда вводят сохранение, выход, замену.

Главное правило: не понимаете, что происходит, нажмите Esc пару раз. Вы окажетесь в нормальном режиме, откуда работает всё остальное.

Как выйти из Vim и сохранить файл

Выход всегда идёт из нормального режима: сначала Esc, потом команда, потом Enter.

КомандаЧто делает
:qвыйти, если изменений нет
:q!выйти, выбросив все изменения
:wсохранить и остаться в файле
:wqсохранить и выйти
:x или ZZсохранить и выйти, но записать файл только если он менялся
ZQвыйти без сохранения, аналог :q!
:w новое_имя.txtсохранить копию под другим именем
:wa, :qa!сохранить все открытые файлы, закрыть все без сохранения

ZZ и ZQ набираются без двоеточия, заглавными буквами, то есть с Shift.

Ошибки при выходе

  • E37: No write since last change - файл изменён, а вы пытаетесь выйти через :q. Решите: :wq или :q!.
  • E45: 'readonly' option is set - файл открыт только для чтения. Если права на запись есть, сохраните принудительно: :w!.
  • E212: Can't open file for writing - нет прав на файл, обычно системный конфиг открыли без sudo.

Последняя ситуация самая обидная: правки уже сделаны. Спасает запись через sudo прямо из Vim:

:w !sudo tee % > /dev/null

Знак % подставляет имя текущего файла. После записи Vim предупредит, что файл изменился на диске, нажмите L или O, чтобы перечитать, и выходите через :q!. На будущее системные файлы правьте через sudoedit /etc/файл: так редактор работает от вашего пользователя, а сохраняет с правами root. Как устроены sudo и права администратора, разобрано в статье про пользователей и sudo.

Вставка, удаление, копирование и отмена

Способов войти в режим вставки несколько, и каждый экономит пару нажатий:

  • i - перед курсором, a - после курсора;
  • I - в начало строки, A - в конец строки;
  • o - новая строка ниже, O - новая строка выше.

Остальное делается в нормальном режиме:

x       # удалить символ под курсором
dd      # удалить (вырезать) строку
5dd     # удалить пять строк
dw      # удалить до конца слова
D       # удалить до конца строки
yy      # скопировать строку
p       # вставить после курсора, P - перед
u       # отменить
Ctrl+r  # повторить отменённое
.       # повторить последнее действие
ciw     # заменить слово целиком
cc      # переписать строку заново

В Vim команды складываются как слова: действие плюс объект. d (удалить) + w (слово) = dw. c (изменить) + i" (внутри кавычек) = ci", и текст между кавычками исчезает, а вы уже в режиме вставки. Стоит понять этот принцип, и запоминать отдельные сочетания почти не придётся.

Стрелки в Vim работают, но пальцы с основного ряда уходят. Базовые клавиши: h влево, j вниз, k вверх, l вправо. Перед любой из них можно поставить число: 10j опустит курсор на десять строк.

w  b  e      # следующее слово, предыдущее, конец слова
0  ^  $      # начало строки, первый непробельный символ, конец строки
gg  G        # начало файла, конец файла
:120         # перейти на строку 120 (то же 120G)
Ctrl+d       # полэкрана вниз, Ctrl+u - вверх
%            # к парной скобке
fx           # к следующему символу x в строке

Номер строки удобно видеть слева, включите его командой :set number. Когда в журнале ошибок указано "line 87", набираете :87 и сразу оказываетесь на месте. Если хочется прыгать между двумя местами файла, поставьте метку ma и возвращайтесь к ней через `a.

Поиск и замена в Vim

Поиск запускается из нормального режима косой чертой:

/listen      # искать вперёд
?listen      # искать назад
n  N         # следующее и предыдущее совпадение
*            # искать слово под курсором
:noh         # убрать подсветку найденного

Регистр по умолчанию учитывается. Добавьте \c в шаблон, /listen\c, чтобы искать без учёта регистра, или включите это навсегда в .vimrc.

Замена через :s

:s/old/new/          # первое вхождение в текущей строке
:s/old/new/g         # все вхождения в строке
:%s/old/new/g        # во всём файле
:%s/old/new/gc       # во всём файле с подтверждением каждой замены
:10,40s/^/#/         # закомментировать строки с 10 по 40
:%s/\s\+$//e         # удалить пробелы в конце строк

Флаг c полезен при правке конфигов: Vim подсветит каждое совпадение и спросит y/n/a/q. Если в шаблоне есть косые черты, например пути, смените разделитель: :%s#/var/www#/srv/www#g. Неудачную массовую замену отменяет одна клавиша u.

Визуальный режим и системный буфер обмена

Выделите текст через v или V, двигайте курсор, затем жмите y (копировать), d (вырезать) или > (сдвинуть вправо). Блочное выделение Ctrl+v позволяет вписать один и тот же текст в начало нескольких строк: выделите столбец, нажмите I, введите текст и Esc.

С системным буфером обмена путаница частая. Внутренний буфер Vim и буфер рабочего стола разные. Копировать наружу можно через регистр "+: "+y копирует, "+p вставляет. Но только если Vim собран с поддержкой буфера:

vim --version | grep clipboard

Если видите -clipboard, поддержки нет. В Debian и Ubuntu поставьте vim-gtk3, в Fedora vim-X11 и запускайте vimx, в Arch пакет gvim. Под Wayland дополнительно пригодится wl-clipboard. Обходной путь без пересборки: выделить текст мышью в терминале и скопировать через Ctrl+Shift+c, про сочетания эмулятора терминала есть отдельная статья о горячих клавишах терминала.

Базовый .vimrc: минимум, с которым приятно работать

Личные настройки читаются из ~/.vimrc или ~/.vim/vimrc. Есть тонкость из справки :help defaults.vim: пока у вас нет своего vimrc, Vim подгружает разумные умолчания из defaults.vim. Как только файл появился, умолчания отключаются, поэтому подключите их явно первой строкой.

unlet! skip_defaults_vim
source $VIMRUNTIME/defaults.vim

set number            " номера строк
set relativenumber    " относительные номера, удобно для 5j и 3dd
set ignorecase        " поиск без учёта регистра
set smartcase         " но с учётом, если в шаблоне есть заглавные
set hlsearch          " подсветка найденного
set expandtab         " пробелы вместо табуляции
set shiftwidth=4
set tabstop=4
set undofile          " отмена переживает перезапуск Vim
set undodir=~/.vim/undo
syntax on
filetype plugin indent on

Комментарии в vimrc начинаются с двойной кавычки. Для undofile создайте каталог: mkdir -p ~/.vim/undo. Применить изменения без перезапуска можно командой :source ~/.vimrc.

Не тащите в первый же день чужой vimrc на 500 строк с десятком плагинов. Добавляйте по одной настройке, когда реально упёрлись в неудобство. Через месяц у вас будет короткий конфиг, где вы понимаете каждую строку, а это ценнее любой сборки с GitHub.

Установка полного Vim и редактор по умолчанию

Во многих системах команда vi запускает урезанную сборку. В Ubuntu это vim-tiny без подсветки синтаксиса, в Fedora vim-minimal. Полная версия ставится так:

# Debian, Ubuntu
sudo apt install vim
# Fedora
sudo dnf install vim-enhanced
# Arch
sudo pacman -S vim

Чтобы Vim открывался в crontab -e (про расписания есть статья о cron), visudo, git commit и других программах, задайте редактор:

# Debian и Ubuntu: системный выбор
sudo update-alternatives --config editor
# для своего пользователя в ~/.bashrc
export EDITOR=vim
export VISUAL=vim
# только для Git
git config --global core.editor vim

Если вы попали в Vim случайно, например из git commit без сообщения, и учиться прямо сейчас не хотите, выйдите через :q! и назначьте редактором nano. Он описан в статье про nano, а настройку Git для начинающих мы разбирали в материале про основы Git.

Как учиться дальше

Вместе с Vim ставится интерактивный учебник: команда vimtutor в терминале, полчаса практики, и базовые движения уходят в пальцы. Встроенная справка открывается через :help, например :help :s, а полная документация есть на официальном сайте Vim. Если со временем захочется Lua-конфигов и встроенного LSP, присмотритесь к Neovim: базовые команды из этой статьи там те же.

Частые вопросы

Как выйти из Vim без сохранения?

Нажмите Esc, наберите :q! и Enter. Тот же результат даёт ZQ, набранное заглавными буквами без двоеточия.

Чем :wq отличается от :x?

:wq записывает файл всегда, даже без изменений, и меняет время модификации. :x и ZZ записывают только при наличии изменений, а потом выходят.

Как сохранить файл, если забыл sudo?

Выполните :w !sudo tee % > /dev/null, введите пароль, затем перечитайте файл и выйдите через :q!. В следующий раз открывайте системные файлы через sudoedit.

Почему в Vim не работает копирование в буфер обмена?

Скорее всего, сборка без поддержки clipboard. Проверьте vim --version | grep clipboard и поставьте vim-gtk3 в Ubuntu, vim-X11 в Fedora или gvim в Arch.

Что делать с предупреждением о swap-файле?

Оно значит, что файл уже открыт или прошлый сеанс упал. Если другого Vim нет, нажмите R для восстановления, сохраните файл и удалите старый .swp, либо E, чтобы открыть как есть.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.