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

Режим 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Заменить символ
SЗаменить строку
ddУдалить строку
dУдалить
DУдалить до конца строки
xУдалить символ
XУдалить предыдущий символ
guПеревести в нижний регистр
guuПеревести строку в нижний регистр
gUПеревести в верхний регистр
gUUПеревести строку в верхний регистр
yКопировать
yyКопировать строку
YКопировать до конца строки
pВставить
PВставить перед курсором
r.Заменить символ
RПерейти в режим замены
:Переключиться в командную строку
/Поиск
uОтменить
<c-r>Повторить
UПовторить
m.Установить метку
>>Увеличить отступ строки
<<Уменьшить отступ строки
>Увеличить отступ строк
<Уменьшить отступ строк
<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><left>Перейти в окно слева
<c-w>jПерейти в окно снизу
<c-w><c-j>Перейти в окно снизу
<c-w><down>Перейти в окно снизу
<c-w>kПерейти в окно сверху
<c-w><c-k>Перейти в окно сверху
<c-w><up>Перейти в окно сверху
<c-w>lПерейти в окно справа
<c-w><c-l>Перейти в окно справа
<c-w><right>Перейти в окно справа
<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Влево
<left>Влево
<backspace>Влево
jВниз
<down>Вниз
<enter>Вниз, к первому непробельному символу
kВверх
<up>Вверх
-Вверх, к первому непробельному символу
lВправо
<right>Вправо
<space>Вправо
$В конец строки
<end>В конец строки
В столбец 0
<home>В столбец 0
^В начало строки
f.Найти символ
F.Найти символ в обратном направлении
t.До символа
T.До символа в обратном направлении
;Повторить последнюю команду t. или f.
,Повторить последнюю команду t. или f.
nНайти далее
NНайти предыдущее
ggК первой строке
GК последней строке
wНа слово вперёд
WНа СЛОВО вперёд
bНа слово назад
BНа СЛОВО назад
eВ конец слова
EВ конец СЛОВА
geВ конец предыдущего слова
gEВ конец предыдущего СЛОВА
%К парному элементу
`[a-zA-Z><]К метке
'[a-zA-Z><]К отмеченной строке
[[К началу предыдущего блока в фигурных скобках
]]К началу следующего блока в фигурных скобках
[]К концу предыдущего блока в фигурных скобках
][К концу следующего блока в фигурных скобках
*К следующему вхождению слова под курсором
#К предыдущему вхождению слова под курсором
HК первой строке окна
MК средней строке окна
LК последней строке окна
gjК следующей экранной строке
gkК предыдущей экранной строке

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

КлавишаОписание
iwВнутренняя часть слова
awСлово
iWВнутренняя часть СЛОВА
aWСЛОВО
i"Внутри двойных кавычек
a"Двойные кавычки
i’Внутри одинарных кавычек
a’Одинарные кавычки
i`Внутри обратных кавычек
a`Обратные кавычки
ibВнутри круглых скобок
i)Внутри круглых скобок
i(Внутри круглых скобок
abКруглые скобки
a)Круглые скобки
a(Круглые скобки
iBВнутри фигурных скобок
i}Внутри фигурных скобок
i{Внутри фигурных скобок
aBФигурные скобки
a}Фигурные скобки
a{Фигурные скобки
i<Внутри угловых скобок
i>Внутри угловых скобок
a<Угловые скобки
a>Угловые скобки
i[Внутри квадратных скобок
i]Внутри квадратных скобок
a[Квадратные скобки
a]Квадратные скобки
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 (интерактивная замена не работает; инкрементный поиск не позиционирует курсор правильно; не может использоваться в назначениях/макросах и т. д.).

Следующие комбинации клавиш предоставляются эмулируемой строкой команд; как и в Vim, их возможно переназначить с помощью cmap, cnoremap и т. п.:

КлавишаОписание
<c-r>.вставить содержимое регистра.
<c-r><c-w>Вставить слово под курсором (в документе).
<c-p>Вызвать контекстное автодополнение (см. ниже)
перейти назад или вверх по списку дополнений.
<c-p>Перейти вперёд или вниз по списку дополнений.
<c-space>Расширение Vim для Kate.
Автодополнение слова по документу.
<c-d>Расширение Vim для Kate.
В выражении замены в стиле sed (то есть s/найти/заменить/[g][c][i])
очистить часть «найти» и поместить туда курсор.
<c-f>Расширение Vim для Kate.
В выражении замены в стиле sed (то есть s/найти/заменить/[g][c][i])
очистить часть «заменить» и поместить туда курсор.
<c-g>.Расширение Vim для Kate.
Как и ., вставить содержимое именованного регистра,
но экранировать его так, чтобы при использовании в поиске
искалось буквальное содержимое регистра,
а не содержимое регистра, истолкованное как регулярное выражение.

«Контекстное автодополнение» определяется следующим образом:

  • В строке поиска (/ или ?) — автодополнение по журналу поиска (включая поиск, начатый с помощью * и #, поиск в выражениях замены в стиле sed и т. п.).
  • В пустой командной строке (:) выполняется автодополнение из журнала команд (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.

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

Как сказано выше, цель режима VI в Kate — не стопроцентная поддержка возможностей Vim, однако некоторых возможностей всё же очень не хватает

  • Визуальный блочный режим — особенно возможность добавлять текст в начало или конец блочного выделения.
  • Доступность команд ex не только в приложении Kate, но и в других программах.
  • Код поиска нуждается в доработке, а команды * и # должны выполнять обычный поиск.

Если вам не хватает других возможностей или вы хотите помочь с перечисленными выше, свяжитесь со мной или пришлите исправления! :-)

Журнал изменений

  • 16.05.2010:
    Первая версия. Сведения собраны из записей в блогах и файлов README, чтобы получить единый источник актуальной информации.
  • 17.05.2010:
    Добавлены Ctrl+A и Ctrl+X (увеличение и уменьшение числа под курсором).
  • 30.08.2010:
    Страница перенесена на kate-editor.org.
  • 10.09.2010:
    Исправлен текст о текстовом объекте «запятая» и внесены исправления в оформление.
  • 03.02.2021:
    Таблицы привязок клавиш преобразованы в markdown для Hugo.