Режим 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. Його метою є використання способу редагування текстів Vim, — та вивчених прийомів користування Vim, — у програмах, які використовують текстовий редактор для вбудованих режимів редагування. Серед цих програм
- Текстовий редактор Kate
- KWrite – простий текстовий редактор KDE
- KDevelop – досконале комплексне середовище для розробки багатьма мовами програмування
- Kile – редактор LaTeX
Режим VI чудово інтегрується у сторонні програми і відхиляється від поведінки Vim там, де це має сенс. Наприклад, команда :w у режимі VI Kate відкриває діалогове вікно збереження файла.
Несумісності з Vim
З Vim несумісні лише декілька можливостей режиму VI Kate, якщо не брати до уваги багатьох речей, які просто не реалізовано. Нижче наведено список цих можливостей з поясненнями причин несумісності.
- Kate:
UіCtrl+rпризначено для повторного виконання дії
Vim:Ctrl+r— звичайне повторне виконання дії,Uвикористано для скасування усіх останніх змін окремому рядку
Причиною того, щоUпрацює яка повторне виконання дії у режимі VI Kate, є те, що типово клавіатурне скорочення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 KateYкопіює до кінця рядка. Це описано як «логічніший» варіант у документації до 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 | Замінити символ |
| 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.