Режим 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> | Increase number under cursor |
| <c-x> | Decrease number under cursor |
The Comma Text Object
This is something that I have been missing in Vim. The comma text object makes it easy to modify parameter lists in C-like languages and other comma separated lists. It is basically the area between two commas or between a comma and a bracket. In the line shown in the illustration to the right, the three ranges this text object can span are highlighted in red.

Comma text object ranges. If the cursor is over, say, “arg2”, pressing c i , (“change inner comma”) would delete “double arg2” and place the cursor between the two commas in insert mode. A very convenient way to change a function's parameters.
Emulated Vim Command Bar
Kate 4.11 introduced a hidden config option that make /, ? and : bring up a new search/ command in place of the usual Kate Find / Replace / Command-line bar. The bar is intended to replicate many of the features of Vim's command bar, and also to fix many of the issues with Kate Vim mode's interaction with Kate's Find/Replace bar (interactive replace not working; incremental search not positioning the cursor correctly; not usable in mappings/macros; etc).
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.) - In an empty command bar (
:), auto-complete from command history (NB: auto-completion of command names is invoked automatically when you begin typing). - In a command-bar containing a sed-replace expression (e.g.
:s/find/replace/gc), if the cursor is positioned over "find", auto-complete from the "search" history; if over the "replace", auto-complete from the history of "replace" terms.
When executing a sed-replace expression in the command bar with the "c" flag (e.g. s/find/replace/gc), a Vim-style interactive search/replace expression will be initiated.
Some example usages of the emulated command bar, with GIF animations, are given in this blog. In 4.11, the emulated command bar can be enabled by setting the hidden config option "Vi Input Mode Emulate Command Bar" to true in your katerc/kwriterc/kdeveloprc.
Missing Features
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.