Режим Vi
Введение

Режим VI в Kate — это проект по внедрению модального редактирования в стиле Vim в текстовый редактор Kate и, как следствие, в другие приложения KDE, использующие тот же компонент редактора. Проект стартовал в рамках Google Summer of Code в 2008 году, когда была написана вся базовая функциональность. С тех пор я продолжаю поддерживать и развивать этот код, и количество функций Vim, которые ещё не реализованы, постепенно сокращается. Большинство пользователей Vim уже смогут продуктивно работать в режиме VI Kate. Список отсутствующих возможностей приведён внизу страницы.
На этой странице представлен обновлённый обзор этой работы.
Параметры → Настроить Kate… → Редактирование → Режим ввода VI.
Его также можно переключить с помощью параметра «Режим ввода VI» в меню «Правка». (Комбинация клавиш по умолчанию — Meta+Ctrl+V, где Meta обычно является клавишей Windows).
Цели
Цель режима VI — не полная замена Vim и поддержка всех его возможностей. Его задача — сделать «вимовский» способ редактирования текста и привычки, усвоенные в Vim, доступными для приложений, использующих текстовый редактор Kate в качестве встроенного. К таким приложениям относятся
- Текстовый редактор Kate
- KWrite — простой текстовый редактор KDE
- KDevelop — расширенная среда разработки для многих языков программирования
- Kile — редактор LaTeX
Режим VI предназначен для удобной интеграции с приложениями и в разумных пределах отклоняется от поведения Vim. Например, команда :w в режиме VI Kate откроет диалог сохранения.
Несовместимость с Vim
В режиме VI редактора Kate есть лишь несколько функций, несовместимых с Vim (не считая отсутствующих). Они перечислены ниже вместе с соответствующими причинами.
- Kate:
UиCtrl+R— повтор
Vim:Ctrl+R— обычный повтор,Uиспользуется для отмены всех последних изменений в строке
В режиме VI KateUдействует как повтор, поскольку комбинацияCtrl+Rпо умолчанию занята функцией замены Kate (поиск и замена). По умолчанию режим VI не переопределяет комбинации клавиш Kate (это можно настроить в «Настройки → Настроить Kate… → Редактирование → Режим ввода VI»), поэтому действие повтора должно быть доступно и как «обычное» нажатие клавиши. Кроме того, поведение командыUв Vim плохо соотносится с внутренней системой отмены Kate, так что её поддержка была бы нетривиальной. - Kate:
:printоткрывает диалог «Печать»
Vim::printвыводит строки заданного диапазона, как в его предке ed. Команды вроде:printдоступны не только в режиме VI, но и для пользователей «обычной» Kate. Поэтому было решено, что команда:printбудет открывать диалог печати — следуя принципу наименьшего удивления, а не копируя поведение Vim. - Kate:
Yкопирует до конца строки.
Vim:Yкопирует всю строку, как иyy. Поведение VI для командыYфактически является ошибкой; для команд изменения и удаленияcc/ddвыполняют действие над текущей строкой, аC/Dработают от позиции курсора до конца строки. Однако иyy, иYкопируют текущую строку. В режиме VI Kate командаYкопирует до конца строки. Это описано как «более логичное» в документации Vim. - Kate:
:mapизменяет выбранные строки документа с помощью заданного выражения JavaScript.
Vim::mapдобавляет заданное сопоставление в обычный и визуальный режимы. Команда «map» уже была зарезервирована Kate; начиная с версии 4.12, для её замены можно использовать комбинацию:nmapи:vmap.
Поддерживаемые команды
Поддерживаемые команды обычного/визуального режимов
| Клавиша | Описание |
|---|---|
| a | Включить режим вставки и добавить |
| A | Включить режим вставки и добавить в конец строки |
| i | Включить режим вставки |
| I | Вставить перед первым непробельным символом в строке |
| v | Включить визуальный режим |
| V | Включить режим визуальных строк |
| <c-v> | Включить режим визуального блока |
| gv | Повторный выбор визуального режима |
| o | Открыть строку под курсором |
| O | Открыть новую строку сверху |
| J | Объединить строки |
| c | Изменить |
| C | Изменить символ конца строки |
| cc | Изменить строку |
| с | Замена символа |
| S | Замена строки |
| dd | Удалить строку |
| d | Удалить |
| D | Удалить до конца строки |
| x | Удалить символ |
| X | Удалить предыдущий символ |
| gu | Перевести в нижний |
| guu | Перевести строку в нижний регистр |
| gU | Перевести в верхний регистр |
| gUU | Перевести строку в верхний регистр |
| y | Вырезать |
| yy | Вырезать строку |
| Y | Вырезать до конца строки |
| p | Вставить |
| P | Вставить перед |
| r. | Замена символа |
| R | Перейти в режим замены |
| : | Переключиться в командную строку |
| / | Поиск |
| u | Отменить |
| <c-r> | Повторить |
| U | Повторить |
| м. | Установить метку |
| >> | Увеличить отступ строки |
| << | Уменьшить отступ строки |
| > | Увеличить отступ строк |
| < | Уменьшить отступ строк |
| <c-f> | Прокрутить на страницу вниз |
| <pagedown> | Прокрутить на страницу вниз |
| <c-b> | Прокрутить на страницу вверх |
| <pageup> | Прокрутить на страницу вверх |
| <c-u> | Прокрутить на половину страницы вверх |
| <c-d> | Прокрутить на половину страницы вниз |
| zz | Центрировать вид по курсору |
| ga | Вывести код символа |
| . | Повторить последнее изменение |
| == | Выровнять строку |
| = | Выровнять строки |
| ~ | Смена регистра |
| <c-a> | Прибавить к числу |
| <c-x> | Вычесть из числа |
| <c-o> | Перейти к предыдущей позиции |
| <c-i> | Перейти к следующей позиции |
| <c-w>h | Перейти в створку слева |
| <c-w><c-h> | Перейти в створку слева |
| <c-w><влево> | Перейти в створку слева |
| <c-w>j | Перейти в створку снизу |
| <c-w><c-j> | Перейти в створку снизу |
| <c-w><вниз> | Перейти в створку снизу |
| <c-w>k | Перейти в створку вверху |
| <c-w><c-k> | Перейти в створку вверху |
| <c-w><вверх> | Перейти в створку вверху |
| <c-w>l | Перейти в створку справа |
| <c-w><c-l> | Перейти в створку справа |
| <c-w><вправо> | Перейти в створку справа |
| <c-w>w | Перейти в следующую створку |
| <c-w><c-w> | Перейти в следующую створку |
| <c-w>s | Разделить по горизонтали |
| <c-w>S | Разделить по горизонтали |
| <c-w><c-s> | Разделить по горизонтали |
| <c-w>v | Разделить по вертикали |
| <c-w><c-v> | Разделить по вертикали |
| gt | Перейти к следующей вкладке |
| gT | Перейти к предыдущей вкладке |
| gqq | Форматировать строку |
| gq | Форматировать строки |
| q. / q | Начать/завершить запись макроса в именованный регистр макросов. |
Поддерживаемые перемещения
| Клавиша | Описание |
|---|---|
| h | Влево |
| <влево> | Влево |
| <backspace> | Влево |
| j | Вниз |
| <вниз> | Вниз |
| <ввод> | Вниз к первой непустой строке |
| k | Вверх |
| <вверх> | Вверх |
| — | Вверх к первой непустой строке |
| l | Справа |
| <справа> | Справа |
| <пробел> | Справа |
| $ | В конец строки |
| <end> | В конец строки |
| В столбец 0 | |
| <home> | В столбец 0 |
| ^ | В начало строки |
| f. | Найти символ |
| F. | Найти символ в обратном направлении |
| t. | До символа |
| Т. | До символа в обратном направлении |
| ; | Повторить последнюю команду t. или f. |
| , | Повторить последнюю команду t. или f. |
| n | Найти далее |
| N | Найти предыдущее |
| gg | К первой строке |
| G | К последней строке |
| w | На слово вперёд |
| W | На СЛОВО вперёд |
| б | На слово назад |
| Б | На СЛОВО назад |
| e | В конец слова |
| Е | В конец СЛОВА |
| ge | To end of prev word |
| gE | To end of prev WORD |
| % | To matching item |
| `[a-zA-Z><] | To mark |
| '[a-zA-Z><] | To mark line |
| [[ | To previous brace block start |
| ]] | To next brace block start |
| [] | To previous brace block end |
| ][ | To next brace block end |
| * | To next occurrence of word under cursor |
| # | To prev occurrence of word under cursor |
| H | To first line of window |
| M | To middle line of window |
| L | To last line of window |
| gj | To next visual line |
| gk | To prev visual line |
Supported text objects
| Клавиша | Описание |
|---|---|
| iw | Inner word |
| aw | A word |
| iW | Inner WORD |
| aW | A WORD |
| i" | Inner double quote |
| a" | A double quote |
| i’ | Inner single quote |
| a’ | A single quote |
| i` | Inner back quote |
| a` | A back quote |
| ib | Inner paren |
| i) | Inner paren |
| i( | Inner paren |
| ab | A paren |
| a) | A paren |
| a( | A paren |
| iB | Внутренняя фигурная скобка |
| о} | Внутренняя фигурная скобка |
| i{ | Внутренняя фигурная скобка |
| aB | Фигурная скобка |
| а} | Фигурная скобка |
| a{ | Фигурная скобка |
| i< | Внутренний знак неравенства |
| i> | Внутренний знак неравенства |
| a< | Знак неравенства |
| a> | Знак неравенства |
| i[ | Внутренняя скобка |
| I] | Внутренняя скобка |
| a[ | A bracket |
| a] | A bracket |
| i, | Внутренняя запятая |
| a, | Запятая |
Поддерживаемые команды режима вставки
| Клавиша | Описание |
|---|---|
| <c-d> | Убрать отступ |
| <c-t> | Отступ |
| <c-e> | Вставить снизу |
| <c-y> | Вставить сверху |
| <c-w> | Удалить слово |
| <c-r>. | Вставить содержимое регистра |
| <c-o> | Переключение в нормальный режим для одной команды |
| <c-a> | Увеличить число под курсором |
| <c-x> | Уменьшить число под курсором |
Текстовый объект, ограниченный запятыми
Это то, чего мне не хватало в Vim. Текстовый объект, ограниченный запятыми, упрощает изменение списков параметров в языках, подобных C, и других списков, разделённых запятыми. По сути, это область между двумя запятыми или между запятой и скобкой. В строке, показанной на иллюстрации справа, три диапазона, которые может охватывать этот текстовый объект, выделены красным.

Диапазоны текстовых объектов с запятыми. Если курсор находится, например, над «arg2», при нажатии c i , («изменить внутреннюю запятую») удаляется «double arg2», и курсор помещается между двумя запятыми в режиме вставки. Очень удобный способ изменения параметров функции.
Эмулированная командная строка Vim
В Kate 4.11 добавлен скрытый параметр, позволяющий символам «/», «?» и «:» открывать новую панель поиска/команд вместо обычной панели поиска, замены и командной строки Kate. Панель предназначена для воспроизведения многих функций командной строки Vim, а также для устранения множества проблем взаимодействия режима Vim в Kate с панелью поиска и замены Kate (интерактивная замена не работает; инкрементный поиск не позиционирует курсор правильно; не может использоваться в назначениях/макросах и т. д.).
The following shortcuts are provided by the emulated command bar; as with Vim, these can be remapped with cmap, cnoremap, etc:
| Клавиша | Описание |
|---|---|
| <c-r>. | insert contents of register. |
| <c-r><c-w> | Insert word under the (document) cursor. |
| <c-p> | Invoke context-specific completion (see below) move back/ up in the completion list. |
| <c-p> | Move forward/ down in the completion list. |
| <c-space> | Kate Vim Extension. Auto-complete word from document. |
| <c-d> | Kate Vim Extension. In a sed-replace expression (i.e. s/find/replace/[g][c][i]), clear the "find" term and place the cursor there. |
| <c-f> | Kate Vim Extension. In a sed-replace expression (i.e. s/find/replace/[g][c][i]), clear the “replace” term and place the cursor there. |
| <c-g>. | Kate Vim Extension. As with ., insert the content of the named register, but escape it in such a way that when used with a search, we search for the literal content of the register; not the content of the register interpreted as a regex. |
The "context-specific completion" is decided as follows:
- In a search bar (
/or?), auto-complete from search history (which includes searches initiated via*; and#; searches done in sed-replace expressions; etc.) - В пустой командной строке (
:) выполняется автодополнение из журнала команд (NB: автодополнение имён команд вызывается автоматически при начале ввода). - В командной строке, содержащей выражение замены sed (например,
:s/find/replace/ gc), при нахождении курсора над «find» выполняется автодополнение из истории поиска; при нахождении над «replace» — из истории замен.
При выполнении в командной строке выражения замены в стиле sed с флагом «c» (например, s/find/replace/gc) будет запущено интерактивное выражение поиска/замены в стиле Vim.
Некоторые примеры использования эмулированной командной строки с GIF-анимацией приведены в этом блоге. В версии 4.11 эмулированную командную строку можно включить, установив скрытый параметр «Vi Input Mode Emulate Command Bar» в значение true в ваших katerc/kwriterc/kdeveloprc.
Нереализованные возможности
As stated earlier, the goal of Kate's VI Mode is not to support 100% of Vim's features, however, there are some features which are sorely missed
- Visual block mode – especially the ability to prepend/append text to the visual block selection.
- Having ex commands available in other programs than the Kate application.
- The search code needs improvement and the * and # commands should just be regular searches.
If you miss other features or want to help on the ones mentioned above, feel free to contact me or send patches! :-)
Change Log
- 2010-05-16:
Initial version. Collected the information from blog entries and README files to make a single source of current information. - 2010-05-17:
Ctrl+AandCtrl+Xadded (increment/decrement number under cursor). - 2010-08-30:
Moved page to kate-editor.org. - 2010-09-10:
Fixed the text on the comma text object and made some formatting fixes - 2021-02-03:
Converted key-binding tables to markdown for hugo.