Режим 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+X
d (збільшити або зменшити число під курсором). - 30 серпня 2010 року:
сторінку перенесено на kate-editor.org. - 10 вересня 2010 року:
виправлено текст щодо об'єкта, обмеженого комами, і виправлено форматування - 3 лютого 2021 року:
перетворено у формат markdown таблиці клавіатурних скорочень для hugo.