# ДОБРО ПОЖАЛОВАТЬ НА ЗАНЯТИЯ ПО РЕДАКТОРУ Vim # ГЛАВА ВТОРАЯ Что‐то неожиданное и непонятное? Если это ваше первое знакомство с редактором Vim и вы планировали начать с вводной главы учебника, не расстраивайтесь и сделайте вот что. Наберите в командной строке редактора Vim следующую команду ~~~ cmd :Tutor vim-01-beginner ~~~ Или просто откройте по ссылке [первую главу](@tutor:vim-01-beginner) учебника. Приблизительное время, необходимое для изучения второй главы учебника, составляет около 8–10 минут, и зависит от того, сколько времени вы посвятите выполнению заданий. # Урок 2.1.1. ОСВОЕНИЕ ТЕКСТОВЫХ ОБЪЕКТОВ ** Точечные операции с логическими частями текста используя текстовые объекты ** 1. Попрактикуйтесь в аккуратной работе со словами: - Поместите каретку на любое слово в строке помеченной ✓ - Наберите `diw`{normal}, чтобы удалить ТОЛЬКО слово (слово без окружающих пробелов) - Наберите `daw`{normal}, чтобы удалить СЛОВО (включая конечные пробелы) - Попробуйте другие операторы: `ciw`{normal} (изменить), `yiw`{normal} (копировать), `gqiw`{normal} (форматировать) Потренируйтесь здесь на словах: «Vim'овский», (text_object) и 'мощный'. 2. Работа с содержимым скобок: - Поместите каретку внутри любой пары () {} [] <> в строке помеченной ✓ - Наберите `di(`{normal} или `dib`{normal} (удалить всё, что внутри круглых скобок) - Наберите `da(`{normal} или `dab`{normal} (удалить внутри круглых скобок и сами скобки) - Попробуйте то же самое с `i"`{normal} и `a"`{normal} для машинописных кавычек или `it`{normal} и `at`{normal} для тегов HTML и XML. Примеры: {фигурные}, [прямоугольные], <угловые>, (круглые) и "quoted". 3. Операции с абзацами и предложениями: - Наберите `dip`{normal} для удаления ТОЛЬКО абзаца (каретка может быть в любом месте абзаца) - Наберите `vap`{normal} для визуального выделения всего абзаца - Попробуйте `das`{normal} для удаления предложения (работает при наличии знаков препинания .!? ) 4. Расширенные комбинации: - `ciwnew`{normal} — изменить текущее слово на «new» - `ciw"-"`{normal} — обернуть всю строку в кавычки - `gUit`{normal} — преобразовать внутреннее содержимое HTML-тега в верхний регистр - `va"p`{normal} — выделить текст в кавычках и вставить поверх него Итоговое задание: (Измените "этот" текст) [применив {различные} операции]< # Урок 2.1.2. ИМЕНОВАННЫЕ РЕГИСТРЫ В РЕДАКТОРЕ Vim ** Копирование с сохранением двух разных слов и последующая их вставка в текст ** 1. Переместите каретку к строке помеченной ✓ 2. Установите каретку на любом символе слова «Эдуард» и наберите команду `"ayiw`{normal} Эта команда означает следующее: *в регистр(") с названием(a) скопировать(y) только(i) слово(w)* 3. Сдвиньте каретку вперёд на слово «печенье» (это можно сделать одним из следующих способов: `fп`{normal} или `3fч`{normal}, или `$`{normal}, или `/пе`{normal}) и наберите команду `"byiw`{normal} 4. Переместите каретку на любой символ слова «Виктор» и наберите на клавиатуре `ciwa`{normal} Эта команда означает следующее: *изменить(c) только(i) слово(w) на <содержимое регистра(r)> с названием(a)* 5. Установите каретку на любой символ слова «тортов» и наберите `ciwb`{normal} а) Отныне Эдуард будет отвечать за раздачу печенья б) Таким образом Виктор имеет единоличные права по распределению тортов **Примечание.** Регистры можно использовать также и для вырезания текста, например, по команде `"sdiw`{normal} будет выполнено удаление слова под кареткой в регистр с названием «s». Разделы документации: [регистры](registers) [именованные регистры](quote_alpha) [перемещение](text-objects) [CTRL-R](i_CTRL-R) # Урок 2.1.3. РЕГИСТР РЕЗУЛЬТАТА ВЫЧИСЛЕНИЙ ** Вставка результатов вычислений напрямую в текст ** 1. Переместите каретку к строке помеченной ✗ 2. Установите каретку на любой цифре приведённого числа 3. Наберите на клавиатуре `ciw=60*60*24`{normal} ``{normal} 4. Переместите каретку в конец следующей строки, переключите редактор в режим вставки, и добавьте сегодняшнюю дату с помощью следующей команды `=`{normal}`system('date')`{vim} ``{normal} Примечание. Результат вызова функции `system()`{vim} зависит от текущей операционной системы, например, в ОС Windows необходимо использовать такую команду `system('date /t')`{vim} или `:r!date /t`{vim} Правильно ли я помню, что в сутках 84600 секунд? Сегодняшняя дата Примечание. Тот же результат можно получить с помощью такой команды `:pu=`{normal}`system('date')`{vim} или более короткой команды `:r!date`{vim} Разделы документации: [регистр результата вычислений](quote=) # Урок 2.1.4. НУМЕРОВАННЫЕ РЕГИСТРЫ В РЕДАКТОРЕ Vim ** Как команды `yy`{normal} и `dd`{normal} влияют на содержимое регистров ** 1. Переместите каретку к строке помеченной ✓ 2. Скопируйте строку, начинающуюся с цифры 0, и проверьте состояние регистров с помощью команды `:reg`{vim} ``{normal} 3. Удалите строку, начинающуюся с цифры 0, с помощью команды `"cdd`{normal} и ещё раз проверьте состояние регистров (где будет строка, начинающаяся с цифры 0?) 4. Продолжайте удалять все последующие нумерованные строки, проверяя состояние регистров после каждой операции. **Примечание.** В ходе этих действий вы заметите, что ранее удалённые строки смещаются вниз по мере того, как новые удалённые строки добавляются в перечень регистров. 5. Теперь вставьте содержимое регистров в следующем порядке: c, 7, 4, 8, 2. То есть наберите команды `"cp`{normal}, `"7p`{normal} и так далее. 0. Здесь 9. шататься 8. секретное 7. будет 6. на 5. шесте 4. это 3. войны 2. послание 1. наградой **Примечание.** Целые строки, удалённые по команде `dd`{normal}, дольше сохраняются в нумерованных регистрах, чем строки, которые были скопированы или когда с оператором удаления указывается объект текста для перемещения каретки. Разделы документации: [нумерованные регистры](quote_number) # Урок 2.1.5. СПЕЦИАЛЬНЫЕ РЕГИСТРЫ ** Применение регистров буфера обмена и «чёрная дыра» для расширенной правки ** Примечание. Для использования системного буфера обмена в системе Linux требуются библиотеки X11 или Wayland, и сам редактор Vim должен быть скомпилирован с включённым компонентом «+clipboard» (обычно это максимальная версия). Это можно проверить с помощью следующих команд редактора Vim: `:version`{vim} и `:echo has('clipboard_working')`{vim} 1. Регистры буфера обмена `+`{normal} и `*`{normal}: - `"+y`{normal} — копирование в системный буфер обмена (например, по команде `"+yy`{normal} будет скопирована текущая строка) - `"+p`{normal} — вставка из системного буфера обмена - `"*`{normal} — основной выбор в X11 (средняя кнопка «мыши»), а `"+`{normal} — буфер обмена "+yy в этой строке, затем вставьте в другое приложение по Ctrl+V или Cmd+V 2. Регистр «чёрная дыра» `_`{normal} стирает текст: - `"_daw`{normal} — сотрёт слово без сохранения в регистре - Полезно, когда вы не хотите перезаписывать регистр по умолчанию `"`{normal} - Обратите внимание, что здесь используется текстовый объект «a Word», описанный в предыдущем уроке - `"_dd`{normal} — сотрёт строку без сохранения - `"_dap`{normal} — сотрёт абзац без сохранения - Комбинируйте со счётчиками: `3"_dw`{normal} "_diw на любом слове, чтобы удалить его, не затрагивая историю копирования 3. Совместите с визуальным выделением: - Выделите текст с помощью , a затем `"+y`{normal} - Чтобы вставить из буфера обмена в режиме вставки — `+`{normal} - Попробуйте открыть другое приложение и вставить из системного буфера обмена 4. Запомните: - Регистры буфера обмена доступны между разными экземплярами редактора Vim - Регистр буфера обмена не всегда работает - Регистр «чёрная дыра» предотвращает случайную перезапись других регистров - Регистр `"`{normal} по-прежнему доступен для копирования и вставки - Именованные регистры (a-z) остаются частными для каждой сессии Vim 5. Устранение неполадок с буфером обмена: - Проверьте доступность с помощью команды `:echo has('clipboard_working')`{vim} - При выводе 1 — означает доступно, 0 — означает, что компонент не включен - В системе Linux может потребоваться пакет vim-gtk или vim-x11 (посмотрите вывод команды `:version`{vim}) # Урок 2.1.6. ИЗЯЩЕСТВО ЗАКЛАДОК ** Избегайте действий, свойственных для дятлокодеров ** **Примечание.** При написании программ часто возникает необходимость перемещения больших фрагментов кода. Приём, приведённый далее, поможет избежать подсчёта номеров строк, требуемых для операций вроде `"a147d`{normal} или `:945,1091d a`{vim}, или даже хуже — `i=1091-935`{normal}, как первое действие. 1. Переместите каретку к строке помеченной ✓ 2. Установите каретку на следующую строку, где начинается описание функции, и поставьте закладку, воспользовавшись командой `ma`{normal} **Примечание.** Неважно где будет находиться каретка в этой строке. 3. С помощью следующей команды `$%`{normal} установите каретку на последний символ в этой строке с последующим перемещением на окончание блока кода 4. Удалите весь это блок кода в регистр с названием «a» с помощью команды `"ad'a`{normal} Эта команда означает следующее: *в регистр(") с названием (a) поместить удалённые строки от позиции каретки до строки, в которой установлена закладка(') с названием (a)* 5. Вставьте удалённый блок между символами BBB и CCC с помощь команды `"ap`{normal} ~~~ cmd AAA function ItGotRealBigRealFast() { if ( somethingIsTrue ) { doIt() } // таксономия нашей функции изменилась, и её текущее положение больше // не имеет привязки к алфавитному порядку // а теперь представьте, что здесь сотни строк кода // было бы глупо искать начальную и конечную строку этого блока кода, // чтобы записывать или запоминать номер строки для каждой из них } BBB CCC ~~~ **Примечание.** Пространство именования закладок и регистров не пересекаются между собой, поэтому регистр «a» полностью независим от закладки с таким же названием «a». Это правило не распространяется на регистры и макросы. Разделы документации: [закладки](marks) [перемещение к закладкам](mark-motions) (различие между \` и ') # РЕЗЮМЕ УРОКА 2.1 1. Текстовые объекты обеспечивают точное редактирование: - `iw`{normal} или `aw`{normal} — только или включая слово - `i[`{normal} или `a[`{normal} — внутри или включая скобки - `i"`{normal} или `a"`{normal} — внутри или включая кавычки - `it`{normal} или `at`{normal} — внутри или включая теги - `ip`{normal} или `ap`{normal} — только или включая абзаца - `is`{normal} или `as`{normal} — только или включая предложения 2. Чтобы сохранить (при удалении или копировании) текст для последующей вставки, используйте имеющиеся 26 именованных регистра (a-z). 3. Чтобы скопировать целое слово при нахождении каретки на любом символе в этом слове, воспользуйтесь командой `yiw`{normal} 4. Чтобы изменить целое слово при нахождении каретки на любом символе в этом слове, воспользуйтесь командой `ciw`{normal} 5. Чтобы в режиме вставки вставить текст непосредственно из регистра, воспользуйтесь командой `a`{normal} 6. Чтобы в режиме вставки вставить результат вычисления простых математических операций, воспользуйтесь командой `=60*60`{normal} 7. Чтобы в режиме вставки вставить результат выполнения команд системы, воспользуйтесь командой `=`{normal}`system('ls -l')`{vim} 8. Чтобы просмотреть содержимое регистров, воспользуйтесь командой `:reg`{vim} 9. Учитывайте распределение удалённых целиком строк по команде `dd`{normal} — это нумерованные регистры в порядке убывания, т. е. от 1 до 9. Помните, что в нумерованных регистрах дольше хранятся те строки, которые были удалены целиком, в отличие от любых других операций 10. Учитывайте, что в нумерованных регистрах кратковременно сохраняется всё что скопировано. 11. Чтобы установить закладку в режиме команд, воспользуйтесь командой `m[a-zA-Z0-9]`{normal} 12. Чтобы переместить каретку на строку в которой установлена закладка, воспользуйтесь командой `'`{normal} 13. Специальные регистры: - `"+`{normal} и `"*`{normal} — системный буфер обмена (зависит от ОС) - `"_`{normal} — «чёрная дыра» (стирание удалённого или скопированного текста) - `"=`{normal} — регистр результата вычислений - `"-`{normal} — регистр малых удалений # ЗАКЛЮЧЕНИЕ На этом пока заканчивается вторая глава учебника по редактору Vim. Работа над этой главой будет продолжена. Вторая глава учебника была написана Полом Д. Паркером (Paul D. Parker). и Кристианом Брабандт (Christian Brabandt). Restorer, перевод на русский язык, 2025, restorer@mail2k.ru