mirror of
https://github.com/vim/vim.git
synced 2026-02-01 11:34:23 +01:00
closes: #19090 Signed-off-by: RestorerZ <restorer@mail2k.ru> Signed-off-by: Christian Brabandt <cb@256bit.org>
340 lines
21 KiB
Plaintext
340 lines
21 KiB
Plaintext
# ДОБРО ПОЖАЛОВАТЬ НА ЗАНЯТИЯ ПО РЕДАКТОРУ 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
|