Перейти к содержимому

Режим Vi

Введение

Логотип Vim

Режим VI в Kate — это проект по внедрению модального редактирования в стиле Vim в текстовый редактор Kate и, как следствие, в другие приложения KDE, использующие тот же компонент редактора. Проект стартовал в рамках Google Summer of Code в 2008 году, когда была написана вся базовая функциональность. С тех пор я продолжаю поддерживать и развивать этот код, и количество функций Vim, которые ещё не реализованы, постепенно сокращается. Большинство пользователей Vim уже смогут продуктивно работать в режиме VI Kate. Список отсутствующих возможностей приведён внизу страницы.

На этой странице представлен обновлённый обзор этой работы.

\ Для включения режима ввода VI перейдите в
Параметры → Настроить Kate… → Редактирование → Режим ввода VI.
Его также можно переключить с помощью параметра «Режим ввода VI» в меню «Правка». (Комбинация клавиш по умолчанию — Meta+Ctrl+V, где Meta обычно является клавишей Windows).

Цели

Цель режима VI — не полная замена Vim и поддержка всех его возможностей. Его задача — сделать «вимовский» способ редактирования текста и привычки, усвоенные в Vim, доступными для приложений, использующих текстовый редактор Kate в качестве встроенного. К таким приложениям относятся

  1. Текстовый редактор Kate
  2. KWrite — простой текстовый редактор KDE
  3. KDevelop — расширенная среда разработки для многих языков программирования
  4. Kile — редактор LaTeX

Режим VI предназначен для удобной интеграции с приложениями и в разумных пределах отклоняется от поведения Vim. Например, команда :w в режиме VI Kate откроет диалог сохранения.

Несовместимость с Vim

В режиме VI редактора Kate есть лишь несколько функций, несовместимых с Vim (не считая отсутствующих). Они перечислены ниже вместе с соответствующими причинами.

  1. Kate: U и Ctrl+R — повтор
    Vim: Ctrl+R — обычный повтор, U используется для отмены всех последних изменений в строке
    В режиме VI Kate U действует как повтор, поскольку комбинация Ctrl+R по умолчанию занята функцией замены Kate (поиск и замена). По умолчанию режим VI не переопределяет комбинации клавиш Kate (это можно настроить в «Настройки → Настроить Kate… → Редактирование → Режим ввода VI»), поэтому действие повтора должно быть доступно и как «обычное» нажатие клавиши. Кроме того, поведение команды U в Vim плохо соотносится с внутренней системой отмены Kate, так что её поддержка была бы нетривиальной.
  2. Kate: :print открывает диалог «Печать»
    Vim: :print выводит строки заданного диапазона, как в его предке ed. Команды вроде :print доступны не только в режиме VI, но и для пользователей «обычной» Kate. Поэтому было решено, что команда :print будет открывать диалог печати — следуя принципу наименьшего удивления, а не копируя поведение Vim.
  3. Kate: Y копирует до конца строки.
    Vim: Y копирует всю строку, как и yy. Поведение VI для команды Y фактически является ошибкой; для команд изменения и удаления cc/dd выполняют действие над текущей строкой, а C/D работают от позиции курсора до конца строки. Однако и yy, и Y копируют текущую строку. В режиме VI Kate команда Y копирует до конца строки. Это описано как «более логичное» в документации Vim.
  4. 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В конец слова
ЕВ конец СЛОВА
geTo end of prev word
gETo 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
HTo first line of window
MTo middle line of window
LTo last line of window
gjTo next visual line
gkTo prev visual line

Supported text objects

КлавишаОписание
iwInner word
awA word
iWInner WORD
aWA 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
ibInner paren
i)Inner paren
i(Inner paren
abA 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 to

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+A and Ctrl+X added (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.