15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
08.10.2024

Как использовать редактор Vi/Vim в Ubuntu: полное техническое руководство

Vi и Vim (Vi Improved) — это модальные текстовые редакторы с управлением с клавиатуры, работающие исключительно в терминале, что делает их незаменимыми для администрирования серверов, редактирования удалённых конфигураций и работы со скриптами в Ubuntu и других дистрибутивах Linux. Vim расширяет Vi подсветкой синтаксиса, многоуровневой отменой действий, разделёнными окнами, поддержкой плагинов и настраиваемым конфигурационным слоем — при этом потребляя минимальные системные ресурсы.

Если вы управляете средой VPS Хостинга или физическим сервером, свободное владение Vim — не опция, а базовый навык. SSH-сессии не всегда предоставляют доступ к GUI, а Vim практически повсеместно доступен на каждой Unix-системе, с которой вам когда-либо придётся работать.

Почему Vim по-прежнему доминирует в серверных средах

Современные IDE мощны, но бесполезны, когда вы подключены к headless-серверу Ubuntu по SSH в 2 часа ночи и отлаживаете сломанную конфигурацию Nginx. Модальная архитектура Vim означает, что каждое нажатие клавиши — это команда: никакой зависимости от мыши, никаких накладных расходов на рендеринг и никакой задержки, вносимой графическим слоем.

Основные причины, по которым системные администраторы полагаются на Vim:

  • Отсутствие внешних зависимостей: Работает через любое SSH-соединение, включая каналы с низкой пропускной способностью или высокой задержкой
  • Стабильная доступность: Предустановлен или легко устанавливается на Debian, Ubuntu, CentOS, Alpine и практически в любом дистрибутиве Linux
  • Скорость при работе с большими файлами: Редактирование конфигурационных файлов, лог-файлов или скриптов на несколько тысяч строк в Vim быстрее, чем в любом GUI-редакторе, после выработки мышечной памяти
  • Возможность написания скриптов: Встроенный язык сценариев Vim (Vimscript) и поддержка Lua (в Neovim) позволяют полностью автоматизировать повторяющиеся задачи редактирования

Установка Vim на Ubuntu

Ubuntu поставляется с минимальным пакетом `vim-tiny`, в котором отсутствуют подсветка синтаксиса, поддержка нескольких файлов и многие расширенные функции. Для полной функциональности установите полный пакет:

“`bash

sudo apt update

sudo apt install vim -y

“`

Чтобы проверить установленную версию и убедиться в полной поддержке функций:

“`bash

vim –version

“`

Найдите `+syntax`, `+clipboard`, `+python3` и `+multi_byte` в списке флагов функций. Префикс `-` означает, что данная функция была исключена из бинарного файла при компиляции. Если вам нужны эти функции, а они отсутствуют, установите вместо этого `vim-gtk3` или `vim-nox`:

“`bash

sudo apt install vim-nox -y # Headless full-feature build

sudo apt install vim-gtk3 -y # GTK3 build with clipboard integration

“`

Критический граничный случай: На минимальных образах Ubuntu Server — например, используемых в Docker-контейнерах или на Выделенных серверах, инициализированных через cloud-init — даже `vi` может отсутствовать. В этом случае явно установите `vim` перед попыткой редактирования каких-либо конфигурационных файлов.

Открытие, создание и восстановление файлов

“`bash

vim filename.txt # Open existing file or create new one

vim /etc/nginx/nginx.conf # Open a system configuration file (use sudo if needed)

sudo vim /etc/ssh/sshd_config # Edit privileged files

vim +42 filename.txt # Open file and jump directly to line 42

vim +/searchterm file.txt # Open file with cursor on first match of searchterm

“`

Восстановление из swap-файла: Vim автоматически создаёт скрытый swap-файл (`.filename.txt.swp`) во время редактирования. Если ваша сессия завершилась аварийно или SSH-соединение прервалось, снова откройте тот же файл, и Vim предложит восстановить несохранённые изменения. Всегда сначала выбирайте `(R)ecover`, сохраните восстановленное содержимое, затем удалите swap-файл с помощью `:e`, после чего нажмите `:!rm ~/.filename.txt.swp` или выполните `vim -r filename.txt`.

Этот механизм восстановления особенно ценен при редактировании критических конфигурационных файлов на рабочих серверах — обрыв соединения не означает потерю работы.

Понимание модальной архитектуры Vim

Модальная архитектура Vim — это единственная наиболее важная концепция для усвоения. В отличие от стандартных редакторов, где каждое нажатие клавиши вставляет символ, Vim разделяет навигацию, редактирование и выполнение команд на отдельные режимы.

РежимАктивацияОсновное назначение
**Normal**`Esc` (по умолчанию при открытии)Навигация, удаление, копирование, вставка, выполнение макросов
**Insert**`i`, `a`, `o`, `O`, `I`, `A`Ввод и вставка текста
**Visual**`v` (посимвольный), `V` (построчный), `Ctrl+v` (блочный)Выделение диапазонов текста
**Visual Block**`Ctrl+v`Выделение и редактирование по столбцам
**Command-Line**`:`Операции с файлами, поиск/замена, настройки, внешние команды
**Replace**`R`Перезапись существующих символов
**Ex**`Q`Пакетное выполнение команд (редко используется в интерактивном режиме)

Наиболее распространённая ошибка новичков — нажимать клавиши в режиме Normal в ожидании появления текста, а затем паниковать, когда `dd` удаляет строку или `gg` перемещает курсор в начало файла. Всегда проверяйте текущий режим в левом нижнем углу экрана — в режиме Insert отображается `– INSERT –`, в режиме Visual — `– VISUAL –`, а в режиме Normal ничего не отображается.

Команды навигации в режиме Normal

Эффективная навигация — это то, что отличает пользователя Vim, который просто справляется, от того, кто работает действительно быстро. Изучайте их в порядке приоритета:

Базовое перемещение курсора

КлавишаДействие
`h`Переместить на один символ влево
`l`Переместить на один символ вправо
`j`Переместить на одну строку вниз
`k`Переместить на одну строку вверх
`w`Перейти к началу следующего слова
`b`Перейти к началу предыдущего слова
`e`Перейти к концу текущего слова
`0`Перейти к началу строки
`^`Перейти к первому непробельному символу строки
`$`Перейти к концу строки

Навигация по файлу

КлавишаДействие
`gg`Перейти к первой строке файла
`G`Перейти к последней строке файла
`:42`Перейти к строке 42
`Ctrl+f`Прокрутить на одну полную страницу вперёд
`Ctrl+b`Прокрутить на одну полную страницу назад
`Ctrl+d`Прокрутить на полстраницы вниз
`Ctrl+u`Прокрутить на полстраницы вверх
`%`Перейти к соответствующей скобке, круглой или фигурной скобке
`*`Перейти к следующему вхождению слова под курсором
`#`Перейти к предыдущему вхождению слова под курсором

Совет для опытных пользователей: Добавьте перед любой командой движения число, чтобы повторить её. `5j` перемещает вниз на 5 строк. `3w` перемещает вперёд на 3 слова. `10dd` удаляет 10 строк. Этот числовой множитель применяется практически к каждой команде режима Normal и является ключом к скоростному редактированию.

Вход и выход из режима Insert

КлавишаПоведение
`i`Вставить перед курсором
`a`Добавить после курсора
`I`Вставить в начале строки
`A`Добавить в конце строки
`o`Открыть новую строку ниже и перейти в режим Insert
`O`Открыть новую строку выше и перейти в режим Insert
`s`Удалить символ под курсором и перейти в режим Insert
`S`Удалить всю строку и перейти в режим Insert
`Esc` или `Ctrl+[`Вернуться в режим Normal

Критически важная привычка: Выработайте рефлекс нажимать `Esc` сразу после завершения ввода текста. Оставаться в режиме Insert, когда вы намерены перемещаться по файлу, — источник большинства случайных правок.

Сохранение, выход и управление файлами

Эти команды выполняются из режима Command-Line (сначала нажмите `:`):

КомандаДействие
`:w`Сохранить (записать) текущий файл
`:w filename.txt`Сохранить под новым именем файла
`:q`Выйти (только если нет несохранённых изменений)
`:q!`Принудительный выход с отменой всех несохранённых изменений
`:wq` или `:x`Сохранить и выйти
`ZZ`Сохранить и выйти (сочетание клавиш в режиме Normal)
`ZQ`Выйти без сохранения (сочетание клавиш в режиме Normal)
`:w !sudo tee %`Сохранить файл, открытый без привилегий sudo

Трюк с `:w !sudo tee %` — обязательное знание для системных администраторов. Когда вы открываете системный файл, например `/etc/fstab`, без sudo и вносите изменения, сохранить с помощью `:w` не получится. Эта команда передаёт содержимое буфера через `sudo tee` для записи файла с повышенными привилегиями — без необходимости закрывать и повторно открывать Vim.

Операции редактирования: удаление, копирование, вставка и отмена

Модель редактирования Vim построена на принципе операторы + движения. Оператор (например, `d` для удаления или `y` для копирования) в сочетании с движением (например, `w` для слова или `$` для конца строки) создаёт точное действие редактирования.

Основные команды редактирования

КомандаДействие
`x`Удалить символ под курсором
`X`Удалить символ перед курсором
`dd`Удалить (вырезать) всю текущую строку
`D`Удалить от курсора до конца строки
`dw`Удалить от курсора до конца слова
`d$`Удалить от курсора до конца строки
`d0`Удалить от курсора до начала строки
`yy` или `Y`Скопировать (yank) всю текущую строку
`yw`Скопировать от курсора до конца слова
`p`Вставить после курсора (или ниже текущей строки для построчных копирований)
`P`Вставить перед курсором (или выше текущей строки)
`u`Отменить последнее изменение
`Ctrl+r`Повторить последнее отменённое изменение
`.`Повторить последнее изменение (одна из самых мощных команд в Vim)
`~`Переключить регистр символа под курсором
`>>`Увеличить отступ текущей строки на один уровень
`<<`Уменьшить отступ текущей строки на один уровень

Команда `.` (точка) — пожалуй, наиболее недооценённая функция Vim среди новичков. Она повторяет ваше последнее составное действие — если вы удалили слово с помощью `dw`, нажатие `.` удалит следующее слово. Если вы изменили слово с помощью `cw` и ввели замену, `.` применит ту же замену к следующему вхождению. Это устраняет необходимость в повторяющихся ручных правках в больших файлах.

Режим Visual: точное выделение текста

Режим Visual предоставляет три степени детализации выделения:

  • `v` — Посимвольное визуальное выделение
  • `V` — Построчное визуальное выделение (выделяет целые строки)
  • `Ctrl+v` — Блочное визуальное выделение (редактирование по столбцам)

После выделения применяйте операторы:

КлавишаДействие над выделением
`d`Удалить выделенный текст
`y`Скопировать (yank) выделенный текст
`c`Изменить (удалить и перейти в режим Insert)
`>`Увеличить отступ выделения
`<`Уменьшить отступ выделения
`~`Переключить регистр выделения
`:`Перейти в режим Command-Line с предварительно заполненным диапазоном

Практический пример использования блочного визуального режима (`Ctrl+v`): У вас есть конфигурационный файл, в котором нужно закомментировать 15 последовательных строк, добавив в начало `#`. Выделите первый столбец этих строк с помощью `Ctrl+v`, переместитесь вниз с помощью `j`, нажмите `I` (заглавная i), введите `#`, затем нажмите `Esc`. Vim применит вставку ко всем выделенным строкам одновременно. В большинстве других редакторов для этого потребовалось бы регулярное выражение или ручное повторение.

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

Поиск

“`

/pattern Search forward for pattern (regex supported)

?pattern Search backward for pattern

n Jump to next match

N Jump to previous match

  • Search forward for word under cursor

Search backward for word under cursor

:noh Clear search highlighting

“`

Синтаксис поиска и замены

“`

:%s/old/new/g Replace all occurrences in entire file

:%s/old/new/gc Replace all with confirmation prompt for each

:%s/old/new/gi Case-insensitive replace across entire file

:10,20s/old/new/g Replace only within lines 10 through 20

:'<,'>s/old/new/g Replace within visually selected range

:%s/bwordb/new/g Replace whole word only (word boundary anchors)

“`

Поддержка регулярных выражений: Vim использует собственный диалект регулярных выражений. Доступны `b` для границы слова, `d` для цифр, `s` для пробельных символов и `+` (один или более). Для расширенного синтаксиса регулярных выражений добавьте префикс `v`: `:%s/v(foo|bar)/baz/g` соответствует «foo» или «bar» и заменяет на «baz».

Работа с несколькими файлами, буферами и разделёнными окнами

Именно здесь мощь Vim становится наиболее очевидной при сложных сессиях редактирования.

Буферы

Буфер — это представление файла в памяти. Vim может одновременно держать открытыми множество буферов.

“`

:e filename Open a file into a new buffer

:ls or :buffers List all open buffers

:b2 Switch to buffer number 2

:bnext or :bn Switch to next buffer

:bprev or :bp Switch to previous buffer

:bd Delete (close) current buffer

“`

Разделённые окна

“`

:split filename Horizontal split, open file in upper pane

:vsplit filename Vertical split, open file in right pane

Ctrl+w h/j/k/l Navigate between split panes

Ctrl+w = Equalize split pane sizes

Ctrl+w q Close current pane

“`

Вкладки

“`

:tabnew filename Open file in a new tab

:tabnext or gt Switch to next tab

:tabprev or gT Switch to previous tab

:tabclose Close current tab

“`

Практический сценарий: При редактировании конфигурации веб-сервера на VPS с cPanel вам может потребоваться сверяться с основным файлом `nginx.conf` при редактировании файла виртуального хоста. Откройте оба в вертикальном разделении с помощью `:vsplit /etc/nginx/nginx.conf` и переключайтесь между панелями с помощью `Ctrl+w l` и `Ctrl+w h` — без необходимости закрывать один файл для просмотра другого.

Настройка Vim с помощью .vimrc

Файл `.vimrc` в вашем домашнем каталоге — это постоянная конфигурация Vim. Он выполняется как Vimscript при каждом запуске Vim.

“`bash

vim ~/.vimrc

“`

Рекомендуемая конфигурация для рабочего сервера

“`vim

" Display settings

set number " Show absolute line numbers

set relativenumber " Show relative line numbers (great for jump commands)

set cursorline " Highlight the current line

set scrolloff=8 " Keep 8 lines visible above/below cursor when scrolling

" Indentation

set autoindent " Copy indent from current line on new line

set smartindent " Context-aware indentation for code

set expandtab " Convert tabs to spaces

set tabstop=4 " Tab width = 4 spaces

set shiftwidth=4 " Indentation width for >> and <<

" Search behavior

set hlsearch " Highlight all search matches

set incsearch " Show matches as you type

set ignorecase " Case-insensitive search

set smartcase " Override ignorecase if search contains uppercase

" Usability

set mouse=a " Enable mouse in all modes

syntax on " Enable syntax highlighting

set encoding=utf-8 " Default encoding

set clipboard=unnamedplus " Use system clipboard for yank/paste

set undofile " Persist undo history across sessions

set undodir=~/.vim/undo " Directory for persistent undo files

" Visual

set showmatch " Briefly jump to matching bracket

set laststatus=2 " Always show status line

set wildmenu " Enhanced command-line completion

“`

Важно: Директива `set undofile` создаёт постоянную историю отмен, хранящуюся на диске. Это означает, что вы можете закрыть файл, открыть его через несколько дней и всё равно отменить изменения из предыдущей сессии. Создайте каталог для хранения истории отмен перед включением этой функции:

“`bash

mkdir -p ~/.vim/undo

“`

Это особенно ценно при внесении постепенных изменений в конфигурационные файлы на рабочих системах — например, при настройке параметров PHP-FPM или корректировке параметров SSL на сервере, использующем SSL-сертификаты для нескольких доменов.

Макросы: автоматизация повторяющихся правок

Макросы — одна из самых мощных и наименее используемых функций Vim. Макрос записывает последовательность нажатий клавиш и воспроизводит её.

“`

qa Start recording macro into register 'a'

[actions] Perform any sequence of Normal/Insert mode commands

q Stop recording

@a Replay macro stored in register 'a'

@@ Replay the last executed macro

10@a Replay macro 'a' ten times

“`

Практический пример: У вас есть CSV-файл из 200 строк, и вам нужно заключить второе поле каждой строки в двойные кавычки. Запишите макрос на первой строке, воспроизведите его 199 раз с помощью `199@a`, и преобразование будет завершено менее чем за секунду. Никаких скриптов не требуется.

Метки и переходы

Метки позволяют отмечать позиции в файле и мгновенно возвращаться к ним.

“`

ma Set mark 'a' at current cursor position

'a Jump to the line of mark 'a'

`a Jump to the exact position of mark 'a'

'' Jump back to position before last jump

Ctrl+o Jump to previous position in jump list

Ctrl+i Jump to next position in jump list

:marks List all current marks

“`

Vim vs. Nano vs. Emacs: выбор подходящего терминального редактора

ФункцияVimNanoEmacs
**Кривая обучения**Крутая (модальная система)МинимальнаяОчень крутая
**Время запуска**Почти мгновенноеПочти мгновенноеМедленнее
**Использование памяти**Очень низкоеОчень низкоеОт умеренного до высокого
**Подсветка синтаксиса**ПолнаяБазоваяПолная
**Экосистема плагинов**ОбширнаяМинимальнаяОбширная
**Поддержка макросов**Встроенная, мощнаяОтсутствуетВстроенная
**Разделённые окна**ДаНетДа
**Удалённое редактирование**Через SSH нативноЧерез SSH нативноПротокол TRAMP
**Сложность конфигурации**Умеренная (.vimrc)МинимальнаяВысокая (Elisp)
**Лучше всего подходит для**Опытных пользователей, системных администраторовБыстрых правок, начинающихРазработчиков, пользователей Lisp

Для задач администрирования серверов — редактирования конфигурационных файлов, написания shell-скриптов, просмотра логов — Vim обеспечивает наилучший баланс мощности, доступности и скорости. Nano приемлем для разовых правок, когда вы не можете позволить себе когнитивные затраты. Emacs — законный выбор для разработчиков, живущих в терминале, но его потребление ресурсов и время запуска делают его менее практичным в ограниченных серверных средах.

Распространённые ошибки и способы их избежать

1. Редактирование рабочих файлов без резервной копии

Всегда создавайте резервную копию перед редактированием критических системных файлов:

“`bash

sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

sudo vim /etc/nginx/nginx.conf

“`

2. Забыть использовать sudo

Если вы открыли привилегированный файл без sudo и внесли изменения, используйте `:w !sudo tee %` для сохранения без потери правок.

3. Путаница с регистрами

Когда вы удаляете текст с помощью `dd`, он попадает в регистр по умолчанию `"`. Если затем вы копируете что-то с помощью `yy`, удалённый текст перезаписывается. Чтобы сохранить скопированное перед удалением, используйте именованные регистры: `"ayy` копирует в регистр `a`, а `"ap` вставляет из него.

4. Оставление swap-файлов на общих системах

Swap-файлы Vim в `/tmp` или рабочем каталоге могут вводить в заблуждение других пользователей или автоматизированные процессы. Настройте выделенный каталог для swap-файлов в `.vimrc`:

“`vim

set directory=~/.vim/swap//

“`

Двойная завершающая косая черта заставляет Vim кодировать полный путь к файлу в имени swap-файла, предотвращая коллизии.

5. Проблемы с окончаниями строк в кросс-платформенных файлах

Если вы редактируете файл, созданный в Windows, в нём могут быть окончания строк CRLF (`rn`). Vim будет отображать `^M` в конце каждой строки. Исправьте это с помощью:

“`bash

:%s/r//g

“`

Практический контрольный список ключевых выводов

Используйте его как краткую справочную матрицу решений до и во время сессий Vim:

  • Перед редактированием любого рабочего файла: Создайте резервную копию с временной меткой с помощью `cp file file.$(date +%Y%m%d%H%M%S).bak`
  • Осознание режима: Если нажатия клавиш не вставляют текст, нажмите `Esc` и проверьте текущий режим
  • Привычка быстрого сохранения: Нажимайте `Esc`, затем `:w` после каждого значительного изменения — не ждите до конца
  • Используйте `:set number` временно, если вам нужно перейти к определённой строке, а в `.vimrc` это не настроено
  • Для глобального поиска/замены: Всегда проверяйте с помощью `:%s/old/new/gc` (с подтверждением) перед слепым запуском `:%s/old/new/g`
  • Запрос swap-файла при открытии: Всегда выбирайте `(R)ecover`, сохраните содержимое, затем удалите swap-файл
  • Для редактирования по столбцам: Используйте блочный визуальный режим `Ctrl+v` вместо ручного повторения
  • Постоянная история отмен: Настройте `set undofile` в `.vimrc` на любом сервере, которым вы регулярно управляете
  • Интеграция с буфером обмена: Если `p` вставляет неожиданное содержимое, проверьте, что установлен `set clipboard=unnamedplus` и что `xclip` или `xsel` установлен
  • В случае сомнений: `:help keyword` открывает встроенную документацию для любой команды или параметра

Независимо от того, управляете ли вы конфигурационными файлами в средах Виртуального веб-хостинга или поддерживаете сложную инфраструктуру на Выделенных серверах, эффективность Vim накапливается со временем — каждая усвоенная команда навсегда устраняет трение из вашего рабочего процесса.

FAQ

В: В чём разница между Vi и Vim в Ubuntu?

`vi` в современных системах Ubuntu, как правило, является символической ссылкой на `vim` в режиме совместимости с ограниченными возможностями или на `vim-tiny`. Настоящий Vi — это оригинальный редактор 1976 года без подсветки синтаксиса, многоуровневой отмены действий и поддержки плагинов. Vim добавляет более 100 функций поверх Vi, оставаясь при этом полностью обратно совместимым с сочетаниями клавиш Vi.

В: Как выйти из Vim, если я полностью застрял?

Нажмите `Esc` несколько раз, чтобы убедиться, что вы находитесь в режиме Normal, затем введите `:q!` и нажмите Enter. Это принудительно завершит работу без сохранения. Если даже это не помогает (редко, но возможно в состояниях рекурсивных команд), сначала нажмите `Ctrl+c`, затем `:q!`.

В: Может ли Vim редактировать файлы по SSH без их локального копирования?

Да. Используйте `vim scp://user@hostname//path/to/file` для прямого редактирования удалённых файлов через SCP. Vim прозрачно обрабатывает передачу. Альтернативно используйте `rsync` для загрузки файла, редактирования локально и отправки обратно — это быстрее для больших файлов.

В: Как включить подсветку синтаксиса для определённого типа файла, который Vim не распознаёт?

Выполните `:set filetype=nginx` (или `python`, `yaml`, `bash` и т.д.), чтобы вручную назначить тип файла для текущей сессии. Чтобы сделать это постоянным для определённого расширения файла, добавьте `autocmd BufRead,BufNewFile *.conf set filetype=nginx` в ваш `.vimrc`.

В: Является ли Neovim лучшим выбором, чем Vim, для использования на сервере?

Для задач чистого администрирования серверов стандартного Vim достаточно, и он более универсально доступен. Neovim предлагает конфигурацию на основе Lua, лучшую поддержку асинхронных плагинов и встроенный LSP-клиент — преимущества, которые важны прежде всего для рабочих процессов разработки. На рабочих серверах, где вы устанавливаете только необходимое, Vim остаётся прагматичным выбором.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать