# Режим ввода Vi

Задача режима ввода Vi состоит не в том, чтобы полностью заменить Vim, обеспечив поддержку всех возможностей Vim. Она заключается в том, чтобы в программах, которые используют текстовый редактор &kappname; в качестве встроенного, было возможно выполнять редактирование в стиле Vim и применять изученные приёмы работы с Vim.

Режим ввода Vi прекрасно интегрируется в сторонние программы и отклоняется от поведения Vim там, где это имеет смысл. Например, команда ``:w`` в режиме Vi &kappname; позволяет открыть диалог сохранения.

Включить режим ввода Vi для всех новых областей просмотра возможно с помощью пункта меню Настройка Настроить &kappname;... Редактирование Режим ввода Vi. На этой вкладке возможно установить параметры режима ввода Vi, а также определить и отредактировать привязки клавиш. Также режим ввода Vi возможно включать или отключать с помощью пункта Режим ввода Vi в меню Правка. (Комбинация клавиш по умолчанию: &Meta;&Ctrl;V, где &Meta; обычно представляет собой клавишу Windows.)

В отличие от большинства комбинаций клавиш &kde;, многие клавиатурные команды режима Vi зависят от регистра символов. Это означает, что команды `y` и `Y` имеют совершенно разное назначение. Чтобы ввести команду `y` (копировать), убедитесь, что режим Caps Lock отключён, и нажмите клавишу Y. Чтобы ввести команду `Y` (копировать до конца строки), воспользуйтесь комбинацией клавиш &Shift;Y.

Вышеприведённое замечание не касается команд, в которых используется клавиша &Ctrl;. Эти команды возможно вводить независимо от состояния режима Caps Lock и без нажатия клавиши &Shift;. Тем не менее, для ввода некоторых команд требуется использовать &Ctrl;-комбинацию, за которой следует другая клавиша, регистр которой следует принимать во внимание. Например, чтобы ввести &Ctrl;W, `h` (переключиться на левую створку в разделённой области просмотра), убедитесь, что режим Caps Lock отключён, используйте комбинацию клавиш &Ctrl;W, затем отпустите эти клавиши и нажмите клавишу H.

### Расхождения с Vim

C Vim несовместимы лишь несколько функций режима ввода Vi &kappname; (не принимая во внимание различные функции, которые просто не реализованы). Их перечень (с указанием соответствующих причин несовместимости) приводится далее.

- &kappname;: `U` и &Ctrl;R — повторное выполнение отменённой команды.

  Vim: &Ctrl;R — обычное повторение действия, U — отмена всех последних изменений в одной строке.

  Клавиша U привязана к повторению отменённого действия в режиме Vi &kappname;, потому что комбинация клавиш &Ctrl;R по умолчанию используется для функции замены &kappname; (поиск и замена). По умолчанию режим Vi не переопределяет комбинации клавиш &kappname; (это возможно сделать вручную: Настройка Настроить &kappname;... Редактирование Режим ввода Vi), следовательно, возврат действия должен быть доступен в обычном режиме нажатия комбинаций клавиш. Кроме того, поведение команды `U` в Vim не очень хорошо совпадает с внутренней системой отмены &kappname;, поэтому её поддержка была бы довольно сложной задачей.

- &kappname;: ``print`` — открытие диалога Печать.

  Vim: ``print`` — печать строк указанного диапазона (как в ed).

  Такие команды, как ``:print``, доступны не только в режиме Vi, но и в обычном режиме ввода &kappname;. Следовательно, при использовании команды ``:print`` будет открыт диалог печати (соблюдается принцип однородности, а не имитируется поведение Vim).

- &kappname;: `Y` — копирование данных до конца строки.

  Vim: `Y` — копирование всей строки, аналогично `y` `y`.

  Поведение команды `Y` в режиме Vi на самом деле является внутренней ошибкой. Для обеих команд, изменения и удаления, `c` `c`/ `d` `d` выполняет действие над текущей строкой, а `C`/`D` выполняет действие над данными от позиции курсора до конца строки. Но обе команды, `y` `y` и `Y`, копируют текущую строку. В режиме Vi &kappname; `Y` копирует данные до конца строки. Такое поведение описывается как более логичное в документации Vim.

- &kappname;: `O` и `o` — открытие [`количество`] новых строк и переход в режим вставки.

  Vim: `O` и `o` — открытие новой строки и вставка текста [`количество`] раз при выходе из режима вставки.

  Так сделано в результате обобщения опыта многих людей, которые выражали удивление поведением Vim на соответствующем канале в &irc; (#vim на Libera Chat).

### Переключение режимов

- В обычном режиме возможно вводить команды для навигации по документу или его редактирования. Этот режим используется по умолчанию. Чтобы вернуться в этот режим из любого другого, нажмите клавишу &Esc;.

- Визуальный режим позволяет выделять цветом текст в документе. В этом режиме также возможно применять большинство команд обычного режима. Чтобы перейти в этот режим, нажмите клавишу `v` (для выбора символов) или `V` (для выбора строк).

- Режим вставки позволяет выполнять непосредственное редактирование документа. Чтобы перейти в этот режим, нажмите клавишу `i` или введите одну из нескольких перечисленных далее команд.

- Режим команд позволяет вызвать командную строку &kappname; для выполнения значительной части команд, доступных в реализациях Vi, а также некоторых специфичных для &kappname; команд. Более подробные сведения об этих командах: advanced-editing-tools-commandline. Чтобы перейти в этот режим, нажмите клавишу :, введите команду и нажмите клавишу &Enter;.

### Интеграция с командами &kate;

- Визуальный режим автоматически включается при выборе текста с помощью мыши. Переход в этот режим также выполняется при использовании команд выбора текста &kate;, например, «Выделить все» (при выборе соответствующего пункта меню или нажатии комбинации клавиш &Ctrl;A ).

- Предусмотрена поддержка отметок Vi и закладок &kate;. Когда в режиме Vi создаётся отметка, также создаётся и соответствующая закладка &kate;, доступная в меню Закладки. И наоборот: при создании закладки &kate; создаётся соответствующая отметка Vi в нулевой позиции строки.

### Поддерживаемые команды обычного/визуального режимов

`a` | Перейти в режим вставки, добавлять символы после курсора
`A` | Перейти в режим вставки, добавлять символы после строки
`i` | Перейти в режим вставки, добавлять символы перед курсором
&Ins; | Перейти в режим вставки, добавлять символы перед курсором
`I` | Перейти в режим вставки, вставлять символы перед первым непустым символом строки
`gi` | Перейти в режим вставки, вставлять символы перед местом, в котором был совершён последний выход из режима вставки
`v` | Перейти в визуальный режим, обозначить символы
`V` | Перейти в визуальный режим, обозначить строки
&Ctrl;v | Перейти в визуальный режим, обозначить блоки
`gb` | Перейти в визуальный режим, повторно обозначить последний обозначенный фрагмент
`o` | Открыть новую строку под текущей
`O` | Открыть новую строку над текущей
`J` | Объединить строки
`c` | Изменить: с определением позиции для удаления и переходом в режим вставки
`C` | Изменить до конца строки: удалить текст до конца строки и перейти в режим вставки
`cc` | Изменить строку: удалить строку и перейти в режим вставки
`s` | Заменить символ
`S` | Заменить строку
`dd` | Удалить строку
`d` | С определением позиции для удаления
`D` | Удалить до конца строки
`x` | Удалить символ справа от курсора
∇ | Удалить символ справа от курсора
`X` | Удалить символ слева от курсора
`gu` | С определением позиции для перевода в нижний регистр
`guu` | Перевести текущую строку в нижний регистр
`gU` | С определением позиции для перевода в верхний регистр
`gUU` | Перевести текущую строку в верхний регистр
`y` | С определением позиции для копирования
`yy` | Копировать строку
`Y` | Копировать строку
`p` | Вставить после курсора
`P` | Вставить перед курсором
`]p` | Вставить после курсора с отступом
`[p` | Вставить перед курсором с отступом
`r` | С определением символа, который должен заменить символ, следующий за курсором
`R` | Перейти в режим замены
`:` | Перейти в режим команд
`/` | Поиск
`u` | Отменить
&Ctrl;R | Повторить
`U` | Повторить
`m` | Установить отметку (возможно использовать для последующих определений позиции)
`n` | Найти следующее совпадение
`N` | Найти предыдущее совпадение
`>>` | Увеличить отступ строки
`<<` | Уменьшить отступ строки
`>` | Увеличить отступ строк
`<` | Уменьшить отступ строк
&Ctrl;F | Страница вниз
&Ctrl;B | Страница вверх
`ga` | Вывести &ASCII;-значение символа
`.` | Повторить последнее изменение
`==` | Команда выравнивания строки
`=` | Команда выравнивания строк
`~` | Изменить регистр текущего символа
&Ctrl;S | Разделить область просмотра по горизонтали
&Ctrl;V | Разделить область просмотра по вертикали
&Ctrl; W, `w` | Циклический переход к следующей части разделённой области просмотра
&Ctrl; W, `h` &Ctrl; W Влево | Перейти к левой части разделённой области просмотра
&Ctrl; W, `l` &Ctrl; W Вправо | Перейти к правой части разделённой области просмотра
&Ctrl; W, `k` &Ctrl; W Вверх | Перейти к верхней части разделённой области просмотра
&Ctrl; W, `j` &Ctrl; W Вниз | Перейти к нижней части разделённой области просмотра

### Поддерживаемые команды перемещения

Эти команды возможно использовать для перемещения по документу в обычном или визуальном режимах, а также совместно с какой-либо из вышеприведённых команд. Эти команды могут предваряться числом, которое обозначает количество соответствующих перемещений.

`h` | Влево
Влево | Влево
&Backspace; | Влево
`j` | Вниз
Вниз | Вниз
`k` | Вверх
Вверх | Вверх
`l` | Вправо
Вверх | Вправо
Пробел | Вправо
`$` | Конец строки
&End; | Конец строки
`0` | Первый символ в строке (позиция 0)
&Home; | Первый символ в строке
`^` | Первый непустой символ в строке
`f` | С определением символа, к которому следует перейти справа от курсора
`F` | С определением символа, к которому следует перейти слева от курсора
`t` | С определением символа, к которому следует перейти справа от курсора, поместив курсор на символ перед ним
`T` | С определением символа, к которому следует перейти слева от курсора, поместив курсор на символ перед ним
`gg` | Первая строка
`G` | Последняя строка
`w` | Следующее слово
`W` | Следующее слово, отделённое пробелом
`b` | Предыдущее слово
`B` | Предыдущее слово, отделённое пробелом
`e` | Конец слова
`E` | Конец слова, отделённого пробелом
`ge` | Конец предыдущего слова
`gE` | Конец предыдущего слова, отделённого пробелом
`|` | С определением номера позиции в строке для перехода
`%` | С определением элемента для перехода
``` | Отметка
`‘` | Первый непробельный символ строки с отметкой
`[[` | Предыдущая открывающая скобка
`]]` | Следующая открывающая скобка
`[]` | Предыдущая закрывающая скобка
`][` | Следующая закрывающая скобка
&Ctrl;I | Перейти к следующему расположению
&Ctrl;O | Вернуться к предыдущему расположению
`H` | Перейти к первой строке на экране
`M` | Перейти к строке в середине экрана
`L` | Перейти к последней строке на экране
`%`(значение в процентах)`` | Перейти к указанной в процентах позиции в документе
`gk` | Перейти на строку выше визуально (в случае использования динамического переноса строк)
`gj` | Перейти на строку ниже визуально (в случае использования динамического переноса строк)
&Ctrl;Влево | Перейти на слово влево
&Ctrl;Вправо | Перейти на слово вправо

### Поддерживаемые текстовые объекты

Текстовые объекты возможно использовать для выбора определённых частей документа.

`iw` | Блок слова: слово с пробелами
`aw` | Слово: слово без пробелов
`i"` | От предыдущих двойных кавычек (`"`) до следующих, включая сами кавычки
`a”` | От предыдущих двойных кавычек (`"`) до следующих, исключая сами кавычки
`i'` | От предыдущих одинарных кавычек (`'`) до следующих, включая сами кавычки
`a'` | От предыдущих одинарных кавычек (`'`) до следующих, исключая сами кавычки
`i(` | От предыдущей открывающей круглой скобки [`(`] до следующей закрывающей круглой скобки [`)`], включая сами скобки
`a(` | От предыдущей открывающей круглой скобки [`(`] до следующей закрывающей круглой скобки [`)`], исключая сами скобки
`i[` | От предыдущей открывающей квадратной скобки (`[`) до следующей закрывающей квадратной скобки (`]`), включая сами скобки
`a[` | От предыдущей открывающей квадратной скобки (`[`) до следующей закрывающей квадратной скобки (`]`), исключая сами скобки
`i{` | От предыдущей открывающей фигурной скобки (`{`) до следующей закрывающей фигурной скобки (`}`), включая сами скобки
`a{` | От предыдущей открывающей фигурной скобки (`{`) до следующей закрывающей фигурной скобки (`}`), исключая сами скобки
`i<` | От предыдущей открывающей угловой скобки (`<`) до следующей закрывающей угловой скобки (`>`), включая сами скобки
`a<` | От предыдущей открывающей угловой скобки (`<`) до следующей закрывающей угловой скобки (`>`), исключая сами скобки
`i`` | От предыдущего обратного апострофа (```) до следующего, включая сами обратные апострофы
`a`` | От предыдущего обратного апострофа (```) до следующего, исключая сами обратные апострофы

### Поддерживаемые команды режима вставки

&Ctrl;D | Уменьшить отступ
&Ctrl;T | Увеличить отступ
&Ctrl;E | Вставить снизу
&Ctrl;Y | Удалить слово
&Ctrl;W | Удалить слово
&Ctrl;U | Удалить строку
&Ctrl;J | Новая строка
&Ctrl;H | Удалить символ в обратном направлении
&Ctrl;&Home; | Перейти к первому символу в документе
&Ctrl;R `n` | Вставить содержимое регистра `n`
&Ctrl;O, `команда` | Перейти в обычный режим только для одной команды
&Ctrl;A | Увеличить текущее выбранное число
&Ctrl;X | Уменьшить текущее выбранное число

### Текстовый объект, ограниченный запятыми

Этого объекта нет в Vim. Текстовый объект, ограниченный запятыми, упрощает изменение списков параметров на C-подобных языках и других списков, разделённых запятыми. Таким текстовым объектом является фрагмент текста между двумя запятыми или между запятой и скобкой. На снимке обозначены красным фоном три диапазона текстовых объектов.

Пример текстового объекта, ограниченного запятыми Пример текстового объекта, ограниченного запятыми

Диапазоны текстовых объектов. Если курсор находится в пределах ⪚ `arg2`, при нажатии клавиш `ci`, (изменить между запятыми) текст `double arg2` будет удалён, а курсор — помещён между двумя запятыми в режиме вставки. Это очень удобный способ изменения параметров функции.

### Нереализованные возможности

Как было отмечено выше, задачей режима Vi &kappname; не является стопроцентная поддержка возможностей Vim.