| ч16. группы автокоманд {autocmd} | Содержание | ч18.Сопоставление зависящие от оператора |
В этой главе исследуем очередную тему "Сопоставление в операторе ожидания". Давайте разберемся с терминами.
Оператор - это команда, которая ожидает, когда вы введете команду перемещения, а затем делает что то с текстом, между тем местом где вы сейчас находитесь и тем куда переведет вас перемещение.
Пример некоторых операторов: d, y, c. Например:
Ключ | Оператор | Перемещение
---- -------- -------------
dw | Удалить | "до следующего слова"
ci( | изменить | "внутри скобок"
yt, | Копировать | "до запятой"
Сопоставления перемещений
Vim позволяет создавать новые перемещения, которые работают со всеми существующими командами. Выполните следующую команду:
:onoremap p i(
Теперь введите следующий текст в буфере Vim
return person.get_pets(type="cat", fluffy_only=True)
Поставьте курсор на слово "cat" и введите dp. Что произошло? Vim удалил весь текст внутри круглых скобок. Вы можете думать об этом новом движении как о "параметрах".
onoremap эта команда сообщает Vim, что, когда он ожидает передачи оператора перемещения и видит p, он должен относиться к нему как i(. Когда мы запустили dp, это было все равно, что сказать "удалить параметры", что Vim переводит как "удалить все внутри круглых скобок".
Мы можем использовать это новое сопоставление сразу со всеми операторами. Введите тот же текст, что и раньше, в буфер (или просто отмените изменение):
return person.get_pets(type="cat", fluffy_only=True)
Поставьте курсор на слово "cat" и введите cp. Что произошло? Vim удалил весь текст внутри круглых скобок, но на этот раз он оставил вас в режиме вставки , потому что вы использовали "изменить" вместо "удалить".
Давайте попробуем другой пример. Выполните следующую команду:
:onoremap b /return<cr>
Теперь введите следующий текст в буфер:
def count(i):
i += 1
print i
return foo
Наведите курсор на i во второй строке и нажмите db. Что произошло? Vim удалил все тело функции, вплоть до return, для поиска которого, наше сопоставление использовало обычный поиск Vim.
Когда вы пытаетесь представить, как определить новый оператор ожидания передвижения, вы можете это представить так:
- Начните с текущей позиции курсора.
- Перейди в визуальный режим (charwise).
- ... Тут идут ключи сопоставления ...
- Теперь должен быть выделен весь текст, который вы хотите включить в перемещение.
Ваша задача - заполнить третий шаг соответствующими ключами.
Изменения начальной позиции
Возможно, вы уже увидели проблему и она в том что наши движения всегда должны начинаться с текущей позиции курсора, и это очень ограничивает наши возможности
У Vim есть способ обойти эту проблему. Выполните следующую команду:
:onoremap in( :<c-u>normal! f(vi(<cr>
Это может показаться пугающим, но давайте попробуем. Введите следующий текст в буфер:
print foo(bar)
Поместите курсор где-нибудь в слове print и введите [ cin( ]. Vim удалит содержимое круглых скобок и переведет вас в режим вставки между ними.
Думайте об этом сопоставлении как о значении "внутри следующих круглых скобок", и оно выполнит оператор над текстом внутри следующего набора круглых скобок в текущей строке.
Давайте создадим дополнение "внутри последних круглых скобок" Выполните следующую команду:
:onoremap il( :<c-u>normal! F)vi(<cr>
Убедитесь, что это работает.
Итак, как работают эти сопоставления? Во-первых, <c-u> это нечто особенное, что вы можете пока игнорировать - просто поверьте мне, что оно должно там быть, чтобы сопоставления работали во всех случаях. Если мы удалим это, у нас останется:
:normal! F)vi(<cr>
[ :normal! ] об этом мы поговорим в следующей главе, но пока достаточно знать, что это команда, используемая для имитации нажатия клавиш в обычном режиме. Например, запуск :normal! dddd приведет к удалению двух строк, как и нажатие dddd. [ <cr> ] В конце сопоставления выполняется :normal! команда.
Итак, теперь мы знаем, что сопоставление - это, по сути, просто запуск блока ключей:
F)vi(
Это довольно просто:
- F) Переместиться назад к ближайшему ) символу.
- vi( Визуальное выделение внутри круглых скобок.
В итоге мы получаем визуально выделенный текст, с которым будем работать, и Vim начинает выполнять операции с ним как обычно.
Общие правила
Хороший идея это сохранить несколько способов создания сопоставлений, оператора ожидания, - запомните следующие два правила:
- Если ваше сопоставление в ожидании оператора заканчивается визуально выделенным текстом, Vim будет работать с этим текстом.
- В противном случае Vim будет работать с текстом между исходной позицией курсора и новой позицией.
Упражнения
Создайте сопоставления в операторе ожидания, для "вокруг следующих круглых скобок" и "вокруг последних круглых скобок".
Создайте аналогичные сопоставления для фигурных скобок.
Прочитайте :help omap-info и посмотрите, сможете ли вы понять, для чего же в наших примерах нам был нужен [ <c-u> ].
| ч16. группы автокоманд {autocmd} | Содержание | ч18.Сопоставление зависящие от оператора |