Код
#статьи

Курс по Vim. Часть 2. Режимы Vim: командный, командной строки, вставки и визуальный

Мы запустили бесплатный видеокурс по легендарному редактору кода — Vim. В нём 16 небольших уроков. Сегодня — подробный обзор разных режимов Vim.

Иллюстрация: Polina Vari для Skillbox Media

За 16 уроков мы рассмотрим всё, что нужно для старта работы с Vim:

  • историю текстовых редакторов;
  • работу в режиме вставки, в командном режиме, режиме командной строки, визуальном режиме;
  • использование регулярных выражений и создание макросов;
  • плагины, пакетные менеджеры плагинов;
  • конфигурацию Vim, работу с файлом .vimrc (в частности, на примере файла .vimrc автора курса);
  • работу с Neovim;
  • настройку автодополнения.

Сегодня будет пять видеоуроков. Подробно разберём, как работать в разных режимах Vim, чем они различаются и какие команды помогают работать быстрее.

Как устроен курс

Мы публикуем видеоуроки и текстовые расшифровки — вы можете смотреть или читать теорию.

Автор курса

Паша Калашников

Тимлид в Purple Magic, продюсер видео в Red Magic, соведущий IT Way Podcast, автор курсов по этому вашему программированию. Любит Ruby.

Урок 3


Обзор режимов Vim

Профессиональный вимер никогда не перейдёт в режим редактирования для изменения текста, а режим Insert будет использовать только для добавления текста (максимум — использует клавишу Backspace).

Большинство видео и статей про Vim на русском языке рассказывают о том, что режимов в Vim три. Частично это правда, потому что популярных режимов, которые точно должен использовать каждый пользователь редактора, действительно три: Normal mode (командный режим), Visual mode (визуальный режим), Insert mode (режим вставки). На деле их больше.

Чтобы узнать список режимов, которые доступны в версии Vim, установленной у вас на машине, открываем Vim и вводим команду :help vim-modes. Давайте попробуем.

Список режимов Vim
Скриншот: Skillbox Media

Перед вами на экране находится мой рабочий Vim. Ваш Vim, скорее всего будет выглядеть по-другому. Вводим :help vim-modes. Нас сразу же встречает надпись, которая прямым текстом сообщает: «Vim имеет 7 ОСНОВНЫХ режимов». Ниже видим ещё одно сообщение: «Vim также содержит 7 дополнительных режимов». В сумме выходит 14.

Быстро пройдёмся по ним.

Normal mode — русскоязычные пользователи называют его командным режимом. Командный режим включён по умолчанию, когда вы открываете редактор, однако эту настройку можно изменить. Это же Vim — в нём вы можете использовать стандартные и дополнительные команды редактора.

Visual mode — визуальный режим. В этом режиме вы можете выделять текст и применять к нему стандартные и дополнительные команды редактора. Мы подробно рассмотрим визуальный режим в этом курсе.

Insert mode — режим вставки или режим ввода. В этом режиме пользователь печатает текст. Мы подробно рассмотрим режим ввода в этом курсе.

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

Command-line mode — режим командной строки. Почему-то про него всегда забывают, когда рассказывают про Vim. Этот режим включается, когда мы начинаем ввод в командной строке внизу экрана Vim.

Список режимов Vim
Скриншот: Skillbox Media

Ex mode — режим использования редактора ex. В предыдущем видео мы не упомянули, что Билл Джой перед тем, как начать разрабатывать vi, занимался разработкой строковых текстовых редакторов. Один из редакторов, разработанных им, назывался ex. Это модификация редактора em, который, в свою очередь, был модификацией редактора ed. Было принято решение оставить возможность использовать редактор ex в Vim через один из базовых режимов. Большинство фич ed в нём реализованы. Я знаю специалистов, которые вместо sed в терминале используют ex прямо из Vim, — просто потому, что им так удобнее.

Terminal mode — режим терминала. То есть вы можете, не открывая терминал вашей операционной системы, выполнить одну любую команду терминала прямо из Vim — а терминал откроется уже с результатом выполнения.

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

Replace mode — режим замены. То же, что и режим ввода, только каждый следующий символ будет заменяться на тот, что вы вводите прямо сейчас. Такое поведение очень похоже на то, что происходит в обычных редакторах после нажатия кнопки Insert.

Visual Replace mode — визуальный режим. Тоже режим замены, но с дополнительными фичами и возможностью управления заменой.

Insert Normal mode — даёт возможность выполнить одну команду в режиме ввода.

То есть если вы что-то печатаете, хотите выполнить какую-либо команду — например, передвинуть курсор на 5 строк ниже, — то переходите в Insert Normal mode через стандартную комбинацию Ctrl + о. Это очень ускоряет работу.

Обращаем внимание на то, что вы можете самостоятельно прочитать про возможности этих режимов в документации к Vim. Для каждого режима есть разделы Help, в которых описаны подробности и команды. Например, при вводе :help Select-mode можно почитать про режим Select.

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

Урок 4


Командный режим

Если вы только начинаете работать с Vim, первое, что вам нужно сделать, — это распечатать Vim Cheatsheet.

Шпаргалка по сочетаниям клавиш в Vim
Изображение: ViEmu

Распечатайте его, закатайте в ламинат, чтобы не тёрся, как бумажки с чит-кодами для GTA, и положите на стол. А если что-то непонятно — посмотрите перевод этой шпаргалки на русский.

Сколько команд доступно в этом режиме? Очень много. Я не знаю ни одного специалиста, который запомнил все. Каждый специалист имеет в голове свой набор команд, которые он использует постоянно. Даже если вы работаете с Vim много лет, всё равно будут случаться ситуации, когда вы наблюдаете за работой другого вимера и замечаете использование какой-то команды, о которой вы не знали. В этом видео мы рассмотрим только основные команды.

Я встретил как-то ролик, где были объяснены все команды командного режима. Он длился 2 часа 57 минут. Есть ещё важный момент: плагины очень часто добавляют команды в командный режим, а также в режим командной строки.

Итак, перед нами файл с Ruby-кодом и моими настройками подсветки. Вот базовые команды при работе в командном режиме.

Настройки подсветки в Vim Павла
Скриншот автора

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

Есть ещё два способа базовой навигации по тексту. Если мы хотим перейти на 5 строк вниз, нажимаем просто 5j. На 5 строк вверх — 5k. Для более удобного использования этой фичи советую настроить нумерацию строк так, как вы видите на экране. Здесь показан номер текущей строки и ведётся счёт вверх и вниз. В итоге не надо в уме складывать или вычитать числа.

Второй способ навигации — по номеру строки. Большинство компиляторов, интепретаторов и анализаторов кода показывают файл и номер строки, в котором они увидели проблему. Поэтому, если вам нужно перейти на строку 145, просто введите :145.

Чтобы перейти в начало файла — gg, в конец файла — Shift + g (или, как иногда пишут, — заглавную G).

Есть ещё интересный способ навигации — центрирование экрана. Вводим zz, и строка, на которой мы находимся сейчас, оказывается в центре экрана.

Shift + h двигает курсор на первую строку экрана (именно экрана, а не файла). Shift + l — в низ экрана.

Хотите перейти на одно слово вперёд, нажмите w, на одно слово назад — b. Если вы находитесь в середине слова, курсор переместится на конец этого слова для w и на начало для b).

Можно перемещаться по принципу «до вхождения символа». Нажимаем f (find) и символ, на который хотим перекинуть курсор. Перейти на следующее вхождение можно по клавише n, а обратно — по Shift + n. Можно перейти на второе вхождение 2fw. Та же логика работает для комбинации Shift + f. Только если в случае с клавишей f поиск производился от курсора и до конца файла, Shift + f будет искать от текущего положения курсора и до начала файла.

Клавиша u — это клавиша отмены. Она отменяет любое действие, которое вы совершили в Vim, будь то вставка, использование регулярного выражения, вызов команды плагина или макроса.

Далее клавиша . (точка). Она повторяет практически любое действие, которое вы совершили в Vim, — например, вставку или выполнение команды. Не повторяет она только клавишу отмены u. Ещё иногда повтор может быть некорректным — некоторые плагины самостоятельно форматируют или каким-то другим образом меняют ваш код.

Клавиша x удаляет символ, под которым находится.

Клавиша d служит для удаления, однако ей нужны аргументы. В качестве аргументов выступают нажатия других клавиш. Повторное нажатие на d — удаление текущей строки. Чтобы удалить три строки от курсора вниз от курсора, надо ввести d3j, чтобы удалить три строки вверх — d3k. Можно удалить текст до какого-то символа — используем d вместе с f. Например, если надо удалить всё до закрывающей скобки, вводим df). До второй закрывающей скобки — d2f). Если необходимо удалить текущее слово до конца — dw, текущее слово до начала — db.

Важный момент — это не совсем удаление. По сути, клавиша d не удаляет, а вырезает. Если после удаления, например, строки мы нажмём клавишу p (paste), вырезанный фрагмент появится в том месте, где мы находимся. Это работает не только со строками, но и с любым количеством текста, который мы вырезали с помощью клавиши d и её аргументов.

Точно так же работает и копирование — только через клавишу y (yank). Чтобы скопировать строку, нажимаем yy. После этого переходим в нужное место в файле и нажимаем p. Для копирования работают те же аргументы, что и для клавиши d. Можно удалить несколько строк вверх или вниз, отдельное слово и так далее.

Пара лайфхаков в конце.

  • Мы можем изменить регистр буквы, на которой находится курсор, с помощью комбинации Shift + ~. Если нажать это сочетание, нужный символ изменит регистр, а курсор автоматически передвинется на один шаг вперёд.
  • Если ваш курсор находится на числе, то комбинация клавиш Ctrl + a увеличит это число на 1, а Ctrl + x — уменьшит на 1. Работает это не только для однозначных чисел, но и для любых чисел в этом диапазоне — от -18446744073709551615 до 18446744073709551615.

В следующем видео поговорим о режиме командной строки.

Урок 5


Режим командной строки

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

Из командного режима вы можете легко перейти в командную строку, главное — начать вводить команду. Как правило, все команды начинаются со слеша, двоеточия или знака вопроса. Чтобы выйти из режима командной строки, нажимаем Esc.

Если с помощью клавиши f в командном режиме мы с вами могли искать один символ, с помощью командной строки вы можете найти слово и любой другой набор символов. Для поиска вводим /, а после него — слово, которое хотим найти. Далее по клавише n и Shift + n, как в случае с командой f, можно перейти на следующие или предыдущие вхождения этого слова в файле.

Поиск слова в командном режиме

Поиск по слешу производится от курсора и до конца файла. Если вы хотите осуществить поиск от курсора к началу файла, то тут работает та же логика, что и с поиском в командном режиме. Только использовать нужно не слеш, а знак вопроса.

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

Экранирование специальных символов

Чтобы подсветить все вхождения слова, произведите поиск /слово. Потом введите :set hlsearch. Чтобы отключить подсветку, введите :set nohlsearch. Не совсем удобно, согласен, — но вы можете либо забиндить эти команды на кнопки или комбинации клавиш в настройках Vim, либо включить подсветку в Vim по умолчанию. Конфигурацию Vim мы разберём в следующих видео.

Переход на определённую строку в файле. Мы уже упоминали эту возможность в предыдущем видео, но, по сути, это возможность режима командной строки. Вводим : и номер строки.

Кроме того, в Vim можно вызывать команды стандартного терминала. Вводим :! и команду, которую хотим выполнить. После нажатия на Enter перед нами откроется терминал с ответом от этой команды. Это удобно, когда надо выполнить одну команду, — чтобы не тратить время на открытие терминала.

Кроме того, есть стандартный набор команд Vim, которые можно использовать в командной строке. Самая популярная из них — поиск и замена. Допустим, мы хотим заменить название одной переменной на другую. Вводим :%s/old_variable/new_variable/g, где : — это приглашение к вводу команд, % — указание выполнить команду для всех строк, s — указание на то, что мы будем делать замены. /old_variable — слово, которое мы хотим заменить, а /new_variable — новое слово. Буква g говорит Vim, что необходимо заменить все вхождения слова в каждой строке.

Поиск и замена
Скриншот автора

Если вы введёте эту команду без g, то она заменит только первое вхождение на каждой строке. Будьте осторожны: эта функция работает не как замена переменной в обыкновенных редакторах. Она заменит абсолютно все слова, которые найдёт. Поэтому, если заменить слово user на admin, а слово user будет встречаться в названиях других переменных и функций, Vim заменит его везде.

Чтобы выполнить замену в рамках одной строки, используйте тот же синтаксис, только без %.

Здесь тоже можно использовать регулярные выражения. Допустим, я хочу заменить только слова, которые встречаются в своих строках только один раз. Тогда используем ^$ и изменим нашу команду :s/^old_variable$/new_variable/g.

Ещё одна популярная фича — g (global). Она позволяет редактировать строки, которые попадают под регулярное выражение. Например, команда :g/user/d удалит все строки, в которых есть слово user. Потому что d в конце команды, как можно догадаться, означает delete.

Чтобы открыть файл в новом окне, вводим :new адрес_файла. В текущем окне — :e адрес_файла. По умолчанию новые окна создаются с горизонтальным разделением. Чтобы открыть файл «вертикально», необходимо ввести :vs адрес_файла. Относительный адрес файла отсчитывается отдиректории, в которой вы открыли Vim.

Как и в стандартном терминале, историю команд можно посмотреть по нажатию клавиш вверх и вниз. А ещё есть возможность вывести список всех предыдущих команд — для этого необходимо ввести :his (сокращённо от :history)

Команда :q закроет текущее окно Vim. Помните, в самом начале мы шутили, что для закрытия Vim нужно просто нажать :q. Так вот, на самом деле :q (quit) закрывает только текущее окно. Для закрытия всех окон в команду нужно добавить букву a — :qa.

Если вы хотите сохранить файл, открытый в текущем окне, введите :w, чтобы сохранить все файлы — :wa. Чтобы сохранить и выйти из текущего окна — :wq, чтобы сохранить и выйти из всех окон — :wqa.

Сохранение и выход из всех окон
Скриншот автора

Я советую сразу забиндить команды :q и :wq на клавиши или комбинации клавиш. У меня они висят на F3 и F4. Как это сделать — изучим в следующих видеоуроках.

Урок 6


Режим Insert

В этом видео мы с вами поговорим про режим ввода — и наконец-то попишем код.

Важный момент. Настоящий вимер в режиме ввода только вводит текст. Редактирование текста он должен производить с помощью возможностей других режимов.

Если вы будете постоянно находиться в режиме ввода и редактировать текст тоже в нём, вы будете тратить время впустую. Запомните — в режиме ввода мы только вводим текст. Максимум, что тут можно сделать дополнительно, — нажать Backspace, когда вы случайно опечатались. Остальные изменения привыкайте вносить в других режимах. Перемещаться по файлу тоже следует не в режиме ввода, а в командном или каком-то другом режиме.

Есть несколько способов перейти из командного режима в режим ввода. Первый, самый простой, — клавиша i. Нажав её, вы получите возможность вводить текст в месте, где находится курсор. Чтобы выйти из режима ввода, достаточно нажать Esc — так вы вернётесь в командный режим.

Insert-режим
  • Если вы хотите начать ввод со следующего после курсора символа, введите a.
  • Чтобы заменить текущий символ и перейти в режим ввода, нажмите s.
  • Чтобы начать ввод с новой строки ниже — нажмите клавишу o, с новой строки выше — Shift + o.
  • Перейти в режим ввода и сразу перебросить курсор на конец строки — Shift + a.
  • Удалить всё от курсора и до конца строки и войти в режим ввода —
    Shift + c.
  • Удалить строку и сразу перейти в режим ввода — cc.

Кстати, если у вас есть настройки форматирования для конкретного языка программирования, курсор перекинет не в самое начало строки, а в место, где должен начинаться код (то есть отступы Vim соблюдает).

Однако можно начать печатать с начала текущей строки — для этого нажмите
Shift + i.

О самом режиме редактирования рассказывать особенно нечего — в нём вы просто печатаете текст. Ввод любых символов воспринимается именно как ввод символов. Единственный момент — форматирование. Если у вас настроено форматирование для конкретного языка программирования, редактор будет это учитывать и при нажатии Enter делать нужный отступ.

Очевидно, что в этом режиме клавиши hjkl не будут работать в качестве клавиш навигации — тут вам доступны только стрелочки (но мы с вами договорились их отключить). Поэтому у вас нет возможности двигать курсор в режиме ввода — кроме как с помощью Backspace. Однако вам это и не нужно — остальные команды вы можете спокойно выполнять с помощью других режимов.

Урок 7


Визуальный режим

В этом видео мы поговорим про визуальный режим в Vim, а также посмотрим на разницу между визуальным режимом и режимом выделения.

Вообще, визуальный режим помогает изменять большие блоки текста. Для перехода в визуальный режим из командного нажимаем v. Для выхода — Esc. После входа в визуальный режим все передвижения с помощью клавиш навигации будут изменять выделение текста. При этом в визуальном режиме будут работать не только hjkl, но и почти все остальные способы навигации. Например, при нажатии 10j выделятся 10 строк вниз от текущего положения курсора. После выделения вы можете исполнять команды из командного режима.

Например, чтобы заменить переменную user на admin, нажимаем v, переходим к концу функции и через двоеточие используем те же команды, что и в командном режиме: :s/user/admin/g. Замена произошла только в выделенной области. Если у вас есть команды для комментирования и раскомментирования кода, в этом режиме можно использовать и их. Применяться они будут только к выделенной области.

Визуальный режим

Режим выделения работает практически так же — только в визуальном режиме выделяются строки целиком, а с помощью режима выделения вы можете управлять прямоугольными блоками кода.

Он подходит для некоторых особенных юзкейсов — допустим, если у меня есть CSV-файл, в котором содержатся имена, номера телефонов и какой-то неизвестный мне ID, а нам нужно вытянуть оттуда только имена и номера телефонов.

Я могу написать команду в командном режиме, а перейти в режим выделения с помощью Ctrl + v. Потом выделяю на первой строке ID и ввожу 10000j. После этого нажимаем x — и вуаля, всё удалилось. Наглядно, понятно, быстро, и не надо придумывать регулярное выражение.

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

Проверьте свой английский. Бесплатно ➞
Нескучные задания: small talk, поиск выдуманных слов — и не только. Подробный фидбэк от преподавателя + персональный план по повышению уровня.
Пройти тест
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована