Перейти до вмісту

Режим 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. Його метою є використання способу редагування текстів Vim, — та вивчених прийомів користування Vim, — у програмах, які використовують текстовий редактор для вбудованих режимів редагування. Серед цих програм

  1. Текстовий редактор Kate
  2. KWrite – простий текстовий редактор KDE
  3. KDevelop – досконале комплексне середовище для розробки багатьма мовами програмування
  4. Kile – редактор LaTeX

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

Несумісності з Vim

З Vim несумісні лише декілька можливостей режиму VI Kate, якщо не брати до уваги багатьох речей, які просто не реалізовано. Нижче наведено список цих можливостей з поясненнями причин несумісності.

  1. Kate: U і Ctrl+r призначено для повторного виконання дії
    Vim: Ctrl+r — звичайне повторне виконання дії, U використано для скасування усіх останніх змін окремому рядку
    Причиною того, що U працює яка повторне виконання дії у режимі VI Kate, є те, що типово клавіатурне скорочення 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Центрувати перегляд за курсором
гаВивести код символу
.Повторити останню зміну
==Вирівняти рядок
=Вирівняти рядки
~Змінити регістр
<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Вниз
<вниз>Вниз
<enter>Вниз до першого непорожнього
kВгору
<вгору>Вгору
Вгору до першого непорожнього
lПраворуч
<праворуч>Праворуч
<пробіл>Праворуч
$До кінця рядка
<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Внутрішнє СЛОВО
аВтСЛОВО
i"Внутрішні подвійні лапки
a"Подвійні лапки
i’Внутрішні одинарні лапки
a’Одинарні лапки
i`Внутрішні зворотні лапки
a`Зворотні лапки
ibВнутрішня дужка
i)Внутрішня дужка
i(Внутрішня дужка
abДужка
a)Дужка
a(Дужка
iBВнутрішня фігурна дужка
o}Внутрішня фігурна дужка
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», натискання клавіш ci, («змінити між комами») вилучить «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-пробіл>Розширення 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-заміни; тощо)
  • На порожній панелі команд (:) автодоповнення з журналу команд (Зауваження: автодоповнення назв команд викликається автоматично, коли користувач починає вводити дані).
  • На панелі команд, що містить вираз sed-заміни (наприклад :s/знайти/замінити/gc), якщо курсор розташовано на слові «знайти», автоматично доповнювати з журналу пошуку; якщо на слові «замінити», автоматично доповнювати з журналу замінників.

При виконання виразу sed-заміни на панелі команд з прапорцем «c» (наприклад s/find/replace/gc), започатковувати інтерактивний вираз пошуку/заміни у стилі Vim.

Деякі приклади використання емуляції панелі команд із анімаціями у форматі GIF наведено у цьому блозі. У версії 4.11 емульовану панель команд можна увімкнути встановленням для прихованого параметра налаштувань «Емуляція панелі команд режиму введення Vi» значення «true» у вашому katerc/kwriterc/kdeveloprc.

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

Як уже зазначалося, метою реалізації режиму VI Kate не є 100% підтримка можливостей Vim, втім, є можливості, яких, на жаль, поки не вистачає

  • Візуальний блоковий режим — особливо, можливість дописувати текст спереду або позаду до позначеного візуального блоку.
  • Надання доступу до команд ex у відмінних від Kate програмах.
  • Програмний код для пошуку потребує удосконалення, а команди * і # мають бути просто звичайними пошуками.

Якщо вам не вистачає якихось інших можливостей або ви хочете допомогти з реалізацією якоїсь можливості, яку згадано вище, не вагайтеся — зв'яжіться зі мною і надсилайте латки! :-)

Журнал змін

  • 16 травня 2010 року:
    Початкова версія. Зібрано відомості з дописів у блогах та файлах README для утворення єдиного джерела поточних відомостей.
  • 17 травня 2010 року:
    додано Ctrl+A і Ctrl+Xd (збільшити або зменшити число під курсором).
  • 30 серпня 2010 року:
    сторінку перенесено на kate-editor.org.
  • 10 вересня 2010 року:
    виправлено текст щодо об'єкта, обмеженого комами, і виправлено форматування
  • 3 лютого 2021 року:
    перетворено у формат markdown таблиці клавіатурних скорочень для hugo.