#		ДОБРО  ПОЖАЛОВАТЬ  НА  ЗАНЯТИЯ  ПО  РЕДАКТОРУ  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<ESC>`{normal}  — изменить текущее слово на «new»
     - `ciw"<CTRL-R>-"<ESC>`{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}, или `/пе<ENTER>`{normal})
     и наберите команду
     `"byiw`{normal}

  4. Переместите каретку на любой символ слова «Виктор» и наберите на клавиатуре
     `ciw<CTRL-R>a<ESC>`{normal}

Эта команда означает следующее:
    *изменить(c) только(i) слово(w) на <содержимое регистра(r)> с названием(a)*

  5. Установите каретку на любой символ слова «тортов» и наберите
     `ciw<CTRL-R>b<ESC>`{normal}

а) Отныне Эдуард будет отвечать за раздачу печенья
б) Таким образом Виктор имеет единоличные права по распределению тортов

**Примечание.**
    Регистры можно использовать также и для вырезания текста, например,
    по команде `"sdiw`{normal} будет выполнено удаление слова под кареткой
    в регистр с названием «s».

Разделы документации:
	[регистры](registers)
	[именованные регистры](quote_alpha)
	[перемещение](text-objects)
	[CTRL-R](i_CTRL-R)


#	    Урок 2.1.3. РЕГИСТР РЕЗУЛЬТАТА ВЫЧИСЛЕНИЙ

** Вставка результатов вычислений напрямую в текст **

  1. Переместите каретку к строке помеченной ✗

  2. Установите каретку на любой цифре приведённого числа

  3. Наберите на клавиатуре `ciw<CTRL-R>=60*60*24`{normal} `<ENTER>`{normal}

  4. Переместите каретку в конец следующей строки, переключите редактор в режим
     вставки, и добавьте сегодняшнюю дату с помощью следующей команды
    `<CTRL-R>=`{normal}`system('date')`{vim} `<ENTER>`{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} `<ENTER>`{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. Совместите с визуальным выделением:
   - Выделите текст с помощью <SHIFT-V>, a затем `"+y`{normal}
   - Чтобы вставить из буфера обмена в режиме вставки — `<CTRL-R>+`{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<CTRL-R>=1091-935<ENTER>`{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. Чтобы в режиме вставки вставить текст непосредственно из регистра,
     воспользуйтесь командой `<CTRL-R>a`{normal}

  6. Чтобы в режиме вставки вставить результат вычисления простых математических
     операций, воспользуйтесь командой `<CTRL-R>=60*60<ENTER>`{normal}
  7. Чтобы в режиме вставки вставить результат выполнения команд системы,
     воспользуйтесь командой `<CTRL-R>=`{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
