HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>15 сен 2022</li>
2 <ul><li>15 сен 2022</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Мы запустили бесплатный курс по легендарному редактору кода Vim. В нём 16 уроков. Сегодня - регулярные выражения, управление окнами, макросы.</p>
4 </ul><p>Мы запустили бесплатный курс по легендарному редактору кода Vim. В нём 16 уроков. Сегодня - регулярные выражения, управление окнами, макросы.</p>
5 <p>Иллюстрация: Polina Vari для Skillbox Media</p>
5 <p>Иллюстрация: Polina Vari для Skillbox Media</p>
6 <p>Журналист, редактор. Фанат виртуальности во всех её видах - потому о ней и пишет.</p>
6 <p>Журналист, редактор. Фанат виртуальности во всех её видах - потому о ней и пишет.</p>
7 <p>За 16 уроков мы рассмотрим всё, что нужно для старта работы с Vim:</p>
7 <p>За 16 уроков мы рассмотрим всё, что нужно для старта работы с Vim:</p>
8 <ul><li>историю текстовых редакторов;</li>
8 <ul><li>историю текстовых редакторов;</li>
9 <li>работу в режиме вставки, в командном режиме, режиме командной строки, визуальном режиме;</li>
9 <li>работу в режиме вставки, в командном режиме, режиме командной строки, визуальном режиме;</li>
10 <li>использование регулярных выражений и создание макросов;</li>
10 <li>использование регулярных выражений и создание макросов;</li>
11 <li>плагины, пакетные менеджеры плагинов;</li>
11 <li>плагины, пакетные менеджеры плагинов;</li>
12 <li>конфигурацию Vim, работу с файлом .vimrc (в том числе на примере файла .vimrc автора курса);</li>
12 <li>конфигурацию Vim, работу с файлом .vimrc (в том числе на примере файла .vimrc автора курса);</li>
13 <li>работу с Neovim;</li>
13 <li>работу с Neovim;</li>
14 <li>настройку автодополнения.</li>
14 <li>настройку автодополнения.</li>
15 </ul><p>Сегодня будет три видеоурока. Подробно разберём, для чего нужны регулярные выражения, как управлять окнами Vim и задавать макросы.</p>
15 </ul><p>Сегодня будет три видеоурока. Подробно разберём, для чего нужны регулярные выражения, как управлять окнами Vim и задавать макросы.</p>
16 <p>Мы публикуем видеоуроки и текстовые расшифровки - вы можете смотреть или читать теорию.</p>
16 <p>Мы публикуем видеоуроки и текстовые расшифровки - вы можете смотреть или читать теорию.</p>
17 <p><strong>Автор курса</strong></p>
17 <p><strong>Автор курса</strong></p>
18 <h3>Паша Калашников</h3>
18 <h3>Паша Калашников</h3>
19 <p>Тимлид в Purple Magic, продюсер видео в Red Magic, соведущий IT Way Podcast, автор курсов по этому вашему программированию. Любит Ruby.</p>
19 <p>Тимлид в Purple Magic, продюсер видео в Red Magic, соведущий IT Way Podcast, автор курсов по этому вашему программированию. Любит Ruby.</p>
20 <p>У нас нет задачи научить вас всем возможностям регулярных выражений: мы покажем несколько примеров их использования именно в Vim. Потому что кейсы использования регулярок, которые применяются для текстовых редакторов, не всегда очевидны с первого взгляда.</p>
20 <p>У нас нет задачи научить вас всем возможностям регулярных выражений: мы покажем несколько примеров их использования именно в Vim. Потому что кейсы использования регулярок, которые применяются для текстовых редакторов, не всегда очевидны с первого взгляда.</p>
21 <p>Мы с вами уже поговорили о возможностях замены в Vim. Повторим - это делается через s:</p>
21 <p>Мы с вами уже поговорили о возможностях замены в Vim. Повторим - это делается через s:</p>
22 Замена в Vim<em>Скриншот: Skillbox Media</em><p>Из предыдущих уроков мы знаем, что к этой команде можно добавить g - и тогда заменяться будет каждое вхождение в строке. Поговорим о других аргументах.</p>
22 Замена в Vim<em>Скриншот: Skillbox Media</em><p>Из предыдущих уроков мы знаем, что к этой команде можно добавить g - и тогда заменяться будет каждое вхождение в строке. Поговорим о других аргументах.</p>
23 <p>Добавление аргумента с (confirm) позволит самостоятельно выбрать, какие замены делать, какие нет. Вводим, например, команду : s/user/admin/gc - и меняем все user в строке на admin с подтверждением каждой замены:</p>
23 <p>Добавление аргумента с (confirm) позволит самостоятельно выбрать, какие замены делать, какие нет. Вводим, например, команду : s/user/admin/gc - и меняем все user в строке на admin с подтверждением каждой замены:</p>
24 Замена в Vim с помощью аргумента сСкриншот: Skillbox Media<p>Редактор будет последовательно выделять их и просить подтверждения. Подтверждение производится клавишей<strong>y</strong>(yes), отклонение - клавишей<strong>n</strong>(no). Можно также заменить все оставшиеся вхождения, нажав клавишу<strong>a</strong>.</p>
24 Замена в Vim с помощью аргумента сСкриншот: Skillbox Media<p>Редактор будет последовательно выделять их и просить подтверждения. Подтверждение производится клавишей<strong>y</strong>(yes), отклонение - клавишей<strong>n</strong>(no). Можно также заменить все оставшиеся вхождения, нажав клавишу<strong>a</strong>.</p>
25 <p>Аргумент i позволит игнорировать регистр букв. Попробуем ввести его для текущей строки : s/user/admin/gi:</p>
25 <p>Аргумент i позволит игнорировать регистр букв. Попробуем ввести его для текущей строки : s/user/admin/gi:</p>
26 Замена в Vim с помощью аргумента i<em>Скриншот: Skillbox Media</em><p>Как мы видим, заменились все слова user вне зависимости от регистра.</p>
26 Замена в Vim с помощью аргумента i<em>Скриншот: Skillbox Media</em><p>Как мы видим, заменились все слова user вне зависимости от регистра.</p>
27 <p>В предыдущих уроках мы уже говорили о том, что перед использованием специализированных символов в регулярных выражениях нужно вставлять обратный слеш. Но иногда сделать это довольно сложно - например, для замены длинного пути файла придётся писать что-то типа такого:</p>
27 <p>В предыдущих уроках мы уже говорили о том, что перед использованием специализированных символов в регулярных выражениях нужно вставлять обратный слеш. Но иногда сделать это довольно сложно - например, для замены длинного пути файла придётся писать что-то типа такого:</p>
28 Не самая удобная конфигурация с обратными слешами<em>Скриншот: Skillbox Media</em><p>Много обратных слешей и сложно читается. В таких ситуациях проще использовать лайфхак: вместо слешей в команде s ставить двоеточия:</p>
28 Не самая удобная конфигурация с обратными слешами<em>Скриншот: Skillbox Media</em><p>Много обратных слешей и сложно читается. В таких ситуациях проще использовать лайфхак: вместо слешей в команде s ставить двоеточия:</p>
29 То же самое после лайфхака с двоеточиями<em>Скриншот: Skillbox Media</em><p>Тогда можно напрямую использовать слеши. Естественно, при таком написании перед двоеточиями нужно вставлять обратный слеш.</p>
29 То же самое после лайфхака с двоеточиями<em>Скриншот: Skillbox Media</em><p>Тогда можно напрямую использовать слеши. Естественно, при таком написании перед двоеточиями нужно вставлять обратный слеш.</p>
30 <p>Использование пайпа поможет найти строки, которые содержат два и больше регулярных выражения. Например, мы хотим найти все строки со словами user или admin. Вводим /user\|admin:</p>
30 <p>Использование пайпа поможет найти строки, которые содержат два и больше регулярных выражения. Например, мы хотим найти все строки со словами user или admin. Вводим /user\|admin:</p>
31 Поиск строк, содержащих два или больше регулярных выражения<em>Скриншот: Skillbox Media</em><p>Обратите внимание, что в выражении есть обратный слеш. Если его не поставить, регулярка начнёт искать user|admin.</p>
31 Поиск строк, содержащих два или больше регулярных выражения<em>Скриншот: Skillbox Media</em><p>Обратите внимание, что в выражении есть обратный слеш. Если его не поставить, регулярка начнёт искать user|admin.</p>
32 <p>Чтобы найти все слова, которые заканчиваются определённым регулярным выражением, можно использовать угловую скобку. Например, мы хотим увидеть все слова, которые заканчиваются на er. Вводим /er\&gt;:</p>
32 <p>Чтобы найти все слова, которые заканчиваются определённым регулярным выражением, можно использовать угловую скобку. Например, мы хотим увидеть все слова, которые заканчиваются на er. Вводим /er\&gt;:</p>
33 Поиск слов, заканчивающихся на er<em>Скриншот: Skillbox Media</em><p>Обратите внимание, что и здесь есть обратный слеш. С началом слова примерно то же самое, только используем открывающую угловую скобку.</p>
33 Поиск слов, заканчивающихся на er<em>Скриншот: Skillbox Media</em><p>Обратите внимание, что и здесь есть обратный слеш. С началом слова примерно то же самое, только используем открывающую угловую скобку.</p>
34 <p>Естественно, это лишь часть лайфхаков, которые доступны в регулярных выражениях Vim. Поищите сами - и найдите те, которые пригодятся именно вам.</p>
34 <p>Естественно, это лишь часть лайфхаков, которые доступны в регулярных выражениях Vim. Поищите сами - и найдите те, которые пригодятся именно вам.</p>
35 <p>Напоследок покажем несколько часто используемых команд, связанных с регулярными выражениями.</p>
35 <p>Напоследок покажем несколько часто используемых команд, связанных с регулярными выражениями.</p>
36 <p>Удаление всех пустых строк в файле производится командой : g/^$/d. Каждая строка, даже если она пустая, имеет начало и конец. Соответственно, строки, состоящие только из начала и конца, считаются пустыми.</p>
36 <p>Удаление всех пустых строк в файле производится командой : g/^$/d. Каждая строка, даже если она пустая, имеет начало и конец. Соответственно, строки, состоящие только из начала и конца, считаются пустыми.</p>
37 <p>Если так получилось, что в вашем файле есть строки, в которых, например, только пробелы, символы табуляции и так далее, используем команду : g/^\s*$/d. Комбинация \s в этой команде означает пробельные символы. Всё выражение в итоге читается так: удалить строки, в которых между началом и концом только пробельные символы в любом количестве (в том числе и нулевом). Ведь звёздочка, или астериск, обозначает любое количество символов, в том числе и нулевое.</p>
37 <p>Если так получилось, что в вашем файле есть строки, в которых, например, только пробелы, символы табуляции и так далее, используем команду : g/^\s*$/d. Комбинация \s в этой команде означает пробельные символы. Всё выражение в итоге читается так: удалить строки, в которых между началом и концом только пробельные символы в любом количестве (в том числе и нулевом). Ведь звёздочка, или астериск, обозначает любое количество символов, в том числе и нулевое.</p>
38 <p>Кстати, для этого кейса есть ещё один вариант. Можно использовать команду : v/\S/d, где \S означает любой символ, кроме пробельных, а : v - это аналог команды g, с тем отличием, что регулярное выражение инвертируется. Это хорошая фича для простых регулярок.</p>
38 <p>Кстати, для этого кейса есть ещё один вариант. Можно использовать команду : v/\S/d, где \S означает любой символ, кроме пробельных, а : v - это аналог команды g, с тем отличием, что регулярное выражение инвертируется. Это хорошая фича для простых регулярок.</p>
39 <p>Ранее мы уже рассмотрели команды и способы манипуляции окнами: научились открывать файлы в текущем и в новом окне, в горизонтальном и вертикальном расположении. Попробуем ещё несколько возможностей управления окнами в Vim.</p>
39 <p>Ранее мы уже рассмотрели команды и способы манипуляции окнами: научились открывать файлы в текущем и в новом окне, в горизонтальном и вертикальном расположении. Попробуем ещё несколько возможностей управления окнами в Vim.</p>
40 <p>Чтобы перейти в соседнее окно, по умолчанию используется комбинация клавиш<strong>Ctrl + w</strong>и направление, в какое окно перейти. Например,<strong>Ctrl + w l</strong>переместит вас в окно правее:</p>
40 <p>Чтобы перейти в соседнее окно, по умолчанию используется комбинация клавиш<strong>Ctrl + w</strong>и направление, в какое окно перейти. Например,<strong>Ctrl + w l</strong>переместит вас в окно правее:</p>
41 Перемещение в правое окно<em>Скриншот: Skillbox Media</em><p>Обратите внимание, что направление нужно нажимать, отжав<strong>Ctrl + w</strong>. Это не совсем удобно, поэтому лучше вспомнить<a>предыдущий урок</a>, где мы обсуждали, как настроить этот переход на <strong>Ctrl + направление</strong>. Так будет проще.</p>
41 Перемещение в правое окно<em>Скриншот: Skillbox Media</em><p>Обратите внимание, что направление нужно нажимать, отжав<strong>Ctrl + w</strong>. Это не совсем удобно, поэтому лучше вспомнить<a>предыдущий урок</a>, где мы обсуждали, как настроить этот переход на <strong>Ctrl + направление</strong>. Так будет проще.</p>
42 <p>Команда : split открывает новое окно с горизонтальным разделением:</p>
42 <p>Команда : split открывает новое окно с горизонтальным разделением:</p>
43 Открытие нового окна с горизонтальным разделением<em>Скриншот: Skillbox Media</em><p>По умолчанию оно будет расположено ниже текущего окна.</p>
43 Открытие нового окна с горизонтальным разделением<em>Скриншот: Skillbox Media</em><p>По умолчанию оно будет расположено ниже текущего окна.</p>
44 <p>Команда : vsplit открывает новое окно с вертикальным разделением:</p>
44 <p>Команда : vsplit открывает новое окно с вертикальным разделением:</p>
45 Открытие нового окна с вертикальным разделением<em>Скриншот: Skillbox Media</em><p>По умолчанию оно откроется справа. Обратите внимание, что, если в текущем окне уже открыт файл, в новом он откроется тоже.</p>
45 Открытие нового окна с вертикальным разделением<em>Скриншот: Skillbox Media</em><p>По умолчанию оно откроется справа. Обратите внимание, что, если в текущем окне уже открыт файл, в новом он откроется тоже.</p>
46 <p>По умолчанию новые окна делят предыдущее пополам по вертикали или горизонтали. Существует набор команд, которые позволяют менять размер окна.</p>
46 <p>По умолчанию новые окна делят предыдущее пополам по вертикали или горизонтали. Существует набор команд, которые позволяют менять размер окна.</p>
47 <p><strong>Ctrl + w 10 +</strong>увеличит высоту окна на 10 строк.<strong>Ctrl + w 10 -</strong> - соответственно, уменьшит.</p>
47 <p><strong>Ctrl + w 10 +</strong>увеличит высоту окна на 10 строк.<strong>Ctrl + w 10 -</strong> - соответственно, уменьшит.</p>
48 <p><strong>Ctrl +w _</strong>увеличит высоту окна до возможного максимума, оставив всем остальным окнам по одной строке:</p>
48 <p><strong>Ctrl +w _</strong>увеличит высоту окна до возможного максимума, оставив всем остальным окнам по одной строке:</p>
49 Увеличение высоты текущего окна до максимума<em>Скриншот: Skillbox Media</em><p>Эта команда может быть полезна, если вы хотите временно посмотреть больше содержимого в текущем файле. После этого вы можете вернуть размер всех окон к стандартному с помощью команды<strong>Ctrl + w =</strong>:</p>
49 Увеличение высоты текущего окна до максимума<em>Скриншот: Skillbox Media</em><p>Эта команда может быть полезна, если вы хотите временно посмотреть больше содержимого в текущем файле. После этого вы можете вернуть размер всех окон к стандартному с помощью команды<strong>Ctrl + w =</strong>:</p>
50 Возврат к стандартным размерам окон<em>Скриншот: Skillbox Media</em><p>Увеличить ширину окна на один символ можно, нажав сочетание<strong>Ctrl + w &gt;</strong>, уменьшить - соответственно,<strong>Ctrl + w &lt;</strong>. Если вы хотите задать другое число символов, на которое хотите расширить или сузить своё окно, добавьте его к указанным выше комбинациям. Например,<strong>Ctrl + w 10 &gt;</strong>увеличит размер вашего окна на 10 символов. Советуем всегда выставлять ширину окна по максимальной длине строки вашего кода. Допустим, в Ruby-проектах она составляет обычно 80 или 120 символов.</p>
50 Возврат к стандартным размерам окон<em>Скриншот: Skillbox Media</em><p>Увеличить ширину окна на один символ можно, нажав сочетание<strong>Ctrl + w &gt;</strong>, уменьшить - соответственно,<strong>Ctrl + w &lt;</strong>. Если вы хотите задать другое число символов, на которое хотите расширить или сузить своё окно, добавьте его к указанным выше комбинациям. Например,<strong>Ctrl + w 10 &gt;</strong>увеличит размер вашего окна на 10 символов. Советуем всегда выставлять ширину окна по максимальной длине строки вашего кода. Допустим, в Ruby-проектах она составляет обычно 80 или 120 символов.</p>
51 <p>Чтобы увеличить максимально ширину окна, используют команду<strong>Ctrl + w |</strong>.</p>
51 <p>Чтобы увеличить максимально ширину окна, используют команду<strong>Ctrl + w |</strong>.</p>
52 <p>Безусловно, большинство фич, которые мы перечислили, можно делать в Vim и с помощью мыши, если она включена. Но моё мнение, что даже в управлении окнами она будет скорее мешать работе. С другой стороны, освоив описанные выше команды, вы научитесь думать, как использовать каждый пиксель на мониторе с максимальной пользой, а не просто увеличивать и уменьшать размеры как получится.</p>
52 <p>Безусловно, большинство фич, которые мы перечислили, можно делать в Vim и с помощью мыши, если она включена. Но моё мнение, что даже в управлении окнами она будет скорее мешать работе. С другой стороны, освоив описанные выше команды, вы научитесь думать, как использовать каждый пиксель на мониторе с максимальной пользой, а не просто увеличивать и уменьшать размеры как получится.</p>
53 <p>Наконец, главный лайфхак: весь набор клавиш можно забиндить в одну команду и сразу раскрывать нужное количество окон при открытии редактора. Или, например, сделать разные настройки для разных проектов. Со временем это станет настолько обыденным, что вы перестанете считать это чем-то сложным. В следующем уроке мы с вами попробуем одну из самых крутых фич Vim - макросы!</p>
53 <p>Наконец, главный лайфхак: весь набор клавиш можно забиндить в одну команду и сразу раскрывать нужное количество окон при открытии редактора. Или, например, сделать разные настройки для разных проектов. Со временем это станет настолько обыденным, что вы перестанете считать это чем-то сложным. В следующем уроке мы с вами попробуем одну из самых крутых фич Vim - макросы!</p>
54 - <p>Макросы - штука, которую начинающие специалисты почему-то игнорируют не только в Vim, но и во всех языках программирования, а также в Excel и других программных продуктах. А зря, ведь макросы позволяют творить магию: весто того чтобы долго и муторно ковырять что-то вручную, можно кое-что подкрутить - и всё будет делаться само!</p>
54 + <p>Макросы - штука, которую начинающие специалисты почему-то игнорируют не только в Vim, но и во всех языках программирования, а также в Excel и других программных продуктах. А зря, ведь макросы позволяют творить магию: вместо того чтобы долго и муторно ковырять что-то вручную, можно кое-что подкрутить - и всё будет делаться само!</p>
55 <p>Для Vim это в первую очередь возможность настроить повторяющиеся действия. Давайте попробуем перепоручить их макросу. Например, на <a>седьмом уроке про визуальный режим</a>мы рассматривали CSV-файл с данными пользователей, в котором, прежде чем удалить столбцы, их нужно было выделять вручную:</p>
55 <p>Для Vim это в первую очередь возможность настроить повторяющиеся действия. Давайте попробуем перепоручить их макросу. Например, на <a>седьмом уроке про визуальный режим</a>мы рассматривали CSV-файл с данными пользователей, в котором, прежде чем удалить столбцы, их нужно было выделять вручную:</p>
56 Закат Солнца вручную. Удаление столбцов в визуальном режиме Vim<em>Скриншот: Skillbox Media</em><p>Теперь представим подобный CSV-файл на 10 тысяч строк, в каждой из которых чья-то фамилия, инициалы телефоны и ID в формате UUID:</p>
56 Закат Солнца вручную. Удаление столбцов в визуальном режиме Vim<em>Скриншот: Skillbox Media</em><p>Теперь представим подобный CSV-файл на 10 тысяч строк, в каждой из которых чья-то фамилия, инициалы телефоны и ID в формате UUID:</p>
57 CSV длиною в жизнь<em>Скриншот: Skillbox Media</em><p>Допустим, нам по какой-то причине потребовалось перенести данные из этого CSV в консоль Ruby как массив массивов. Более того: после инициалов нужно поставить точки, во всех телефонах 8 заменить на +7 и каждую строку обрамить в кавычки, потому что в Ruby так принято по умолчанию.</p>
57 CSV длиною в жизнь<em>Скриншот: Skillbox Media</em><p>Допустим, нам по какой-то причине потребовалось перенести данные из этого CSV в консоль Ruby как массив массивов. Более того: после инициалов нужно поставить точки, во всех телефонах 8 заменить на +7 и каждую строку обрамить в кавычки, потому что в Ruby так принято по умолчанию.</p>
58 <p>Конечно, можно написать в Ruby скрипт со сложной командой замены через режим командной строки, который соберёт данные из CSV и сделает всё, что описано выше. Но нам лень - поэтому давайте используем макросы.</p>
58 <p>Конечно, можно написать в Ruby скрипт со сложной командой замены через режим командной строки, который соберёт данные из CSV и сделает всё, что описано выше. Но нам лень - поэтому давайте используем макросы.</p>
59 <p>Переходим на первую строку, нажимаем<strong>Shift + o</strong>, ставим открывающую квадратную скобку, потому что именно так обозначаются массивы в Ruby. Это будет скобка нашего основного массива:</p>
59 <p>Переходим на первую строку, нажимаем<strong>Shift + o</strong>, ставим открывающую квадратную скобку, потому что именно так обозначаются массивы в Ruby. Это будет скобка нашего основного массива:</p>
60 Макрос: начало<em>Скриншот: Skillbox Media</em><p>Переходим на следующую строку в командном режиме. Чтобы начать запись макроса, нажимаем<strong>q a</strong>, где<strong>q</strong> - это команда начала записи макроса,<strong>a</strong> - имя макроса; впрочем, вы можете назвать его любым другим символом:</p>
60 Макрос: начало<em>Скриншот: Skillbox Media</em><p>Переходим на следующую строку в командном режиме. Чтобы начать запись макроса, нажимаем<strong>q a</strong>, где<strong>q</strong> - это команда начала записи макроса,<strong>a</strong> - имя макроса; впрочем, вы можете назвать его любым другим символом:</p>
61 Переходим в макрос<em>Скриншот: Skillbox Media</em><p>Подумаем, какие действия предстоит повторять макросу. Строки CSV-файла разделены запятыми - будем ориентироваться на них. Сперва нужно поставить первую кавычку для имени пользователя:</p>
61 Переходим в макрос<em>Скриншот: Skillbox Media</em><p>Подумаем, какие действия предстоит повторять макросу. Строки CSV-файла разделены запятыми - будем ориентироваться на них. Сперва нужно поставить первую кавычку для имени пользователя:</p>
62 <em>Скриншот: Skillbox Media</em><p>Далее ищем пробел с помощью команды<strong>f пробел</strong>:</p>
62 <em>Скриншот: Skillbox Media</em><p>Далее ищем пробел с помощью команды<strong>f пробел</strong>:</p>
63 <em>Скриншот: Skillbox Media</em><p>Конечно, мы можем прыгнуть на одно слово вперёд с помощью<strong>w</strong>, но тогда макрос отработает неправильно на двойных фамилиях, потому что технически это два слова. Значит, доходим до пробела. Переходим на один знак вперёд, чтобы поставить точку после первого инициала, ставим точку после второго инициала. Далее переходим к первой запятой с помощью<strong>f,</strong>:</p>
63 <em>Скриншот: Skillbox Media</em><p>Конечно, мы можем прыгнуть на одно слово вперёд с помощью<strong>w</strong>, но тогда макрос отработает неправильно на двойных фамилиях, потому что технически это два слова. Значит, доходим до пробела. Переходим на один знак вперёд, чтобы поставить точку после первого инициала, ставим точку после второго инициала. Далее переходим к первой запятой с помощью<strong>f,</strong>:</p>
64 <em>Скриншот: Skillbox Media</em><p>Ставим закрывающую кавычку для имени пользователя, переходим к цифре 8 в телефонах:</p>
64 <em>Скриншот: Skillbox Media</em><p>Ставим закрывающую кавычку для имени пользователя, переходим к цифре 8 в телефонах:</p>
65 <em>Скриншот: Skillbox Media</em><p>Нажимаем<strong>s" + 7</strong>, где<strong>"</strong> - первая кавычка в обозначении телефона как строки:</p>
65 <em>Скриншот: Skillbox Media</em><p>Нажимаем<strong>s" + 7</strong>, где<strong>"</strong> - первая кавычка в обозначении телефона как строки:</p>
66 <em>Скриншот: Skillbox Media</em><p>После каждого ввода самое главное - не забывать нажимать<strong>Esc</strong>, чтобы возвращаться обратно в командный режим. Макрос запоминает и переходы между режимами. Переходим к концу телефона. Тут можно использовать<strong>w</strong>, потому что мы считаем, что в телефонах разделителей у нас нет:</p>
66 <em>Скриншот: Skillbox Media</em><p>После каждого ввода самое главное - не забывать нажимать<strong>Esc</strong>, чтобы возвращаться обратно в командный режим. Макрос запоминает и переходы между режимами. Переходим к концу телефона. Тут можно использовать<strong>w</strong>, потому что мы считаем, что в телефонах разделителей у нас нет:</p>
67 <em>Скриншот: Skillbox Media</em><p>Ставим вторую кавычку для телефона, переходим к запятой. Ставим первую кавычку, нажимаем<strong>Esc</strong>и <strong>Shift + a</strong>, чтобы вставить последнюю кавычку, закрывающую квадратную скобку и запятую:</p>
67 <em>Скриншот: Skillbox Media</em><p>Ставим вторую кавычку для телефона, переходим к запятой. Ставим первую кавычку, нажимаем<strong>Esc</strong>и <strong>Shift + a</strong>, чтобы вставить последнюю кавычку, закрывающую квадратную скобку и запятую:</p>
68 <em>Скриншот: Skillbox Media</em><p>Переходим на следующую строку в то же место, где мы начали записывать макрос:</p>
68 <em>Скриншот: Skillbox Media</em><p>Переходим на следующую строку в то же место, где мы начали записывать макрос:</p>
69 <em>Скриншот: Skillbox Media</em><p>Важно, чтобы макрос сам переходил на следующую строку каждый раз. Много действий, да. Более того, если вы опечатаетесь в середине записи, ничего страшного, в некоторых ситуациях можно сделать исправление. Макрос тоже будет ошибаться и делать исправление. Вы сами с опытом поймёте, когда можно исправлять действия макроса, а когда лучше начать сначала. Теперь запускаем макрос с помощью команды @a. @ вызывает макросы, a - это имя макроса:</p>
69 <em>Скриншот: Skillbox Media</em><p>Важно, чтобы макрос сам переходил на следующую строку каждый раз. Много действий, да. Более того, если вы опечатаетесь в середине записи, ничего страшного, в некоторых ситуациях можно сделать исправление. Макрос тоже будет ошибаться и делать исправление. Вы сами с опытом поймёте, когда можно исправлять действия макроса, а когда лучше начать сначала. Теперь запускаем макрос с помощью команды @a. @ вызывает макросы, a - это имя макроса:</p>
70 <em>Скриншот: Skillbox Media</em><p>Макрос применился один раз. Чтобы выполнить его до конца файла, выполняем 10000@a:</p>
70 <em>Скриншот: Skillbox Media</em><p>Макрос применился один раз. Чтобы выполнить его до конца файла, выполняем 10000@a:</p>
71 <em>Скриншот: Skillbox Media</em><p>Магия! Самое главное - что все изменения после выполнения 10 000 повторений макроса можно отменить с помощью единичного нажатия<strong>u</strong>:</p>
71 <em>Скриншот: Skillbox Media</em><p>Магия! Самое главное - что все изменения после выполнения 10 000 повторений макроса можно отменить с помощью единичного нажатия<strong>u</strong>:</p>
72 <em>Скриншот: Skillbox Media</em><p>Есть и более простые применения макроса. Допустим, вот эта строка кода слишком длинная, потому что в вызове этой функции слишком много аргументов. Мы хотим распределить их в столбик:</p>
72 <em>Скриншот: Skillbox Media</em><p>Есть и более простые применения макроса. Допустим, вот эта строка кода слишком длинная, потому что в вызове этой функции слишком много аргументов. Мы хотим распределить их в столбик:</p>
73 <em>Скриншот: Skillbox Media</em><p>Некоторые литеры в языках программирования или плагины для форматирования могут это делать сами. Но если такой опции нет, просто записываем такой макрос:</p>
73 <em>Скриншот: Skillbox Media</em><p>Некоторые литеры в языках программирования или плагины для форматирования могут это делать сами. Но если такой опции нет, просто записываем такой макрос:</p>
74 <em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><p>Потом повторяем его восемь раз:</p>
74 <em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><p>Потом повторяем его восемь раз:</p>
75 <em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><p>Макросы - сильный инструмент, позволяющий быстро менять не только исходный код, но также и строковые файлы с большим количеством данных.</p>
75 <em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><p>Макросы - сильный инструмент, позволяющий быстро менять не только исходный код, но также и строковые файлы с большим количеством данных.</p>
76 <p>В следующем уроке мы поговорим об инфраструктуре вокруг Vim.</p>
76 <p>В следующем уроке мы поговорим об инфраструктуре вокруг Vim.</p>
77 <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
77 <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>