NB Это не дубликат Как работает команда "d3fg"? Пожалуйста, прочитайте это перед голосованием, чтобы закрыть!
Я попал в тупик в своем стремлении заставить маленькие удаления работать как большие . Проблема в том, что я не могу понять, как переназначить команды, как d3d. На самом деле, я даже не могу понять, как они работают в первую очередь, и не нахожу упоминания о них в помощи Vim. *
d3jэто просто: он применяет d
оператор к 3j
движению,
3ddтакже прост: он запускает dd
команду с «счетом» 3.
d3d Похоже, это должно быть просто, это относится к d
оператору ... но что это 3d
? Это не движение. Если вы печатаете 3dсамостоятельно, Vim обрабатывает его как счет, за которым следует оператор, и терпеливо ждет дальнейшего ввода.
И вы не можете применять операторы к другим операторам. ddне описывается в справке как последовательность двух операторов. Это отдельная команда, состоящая из двух клавиш. (ср. dc, который ничего не делает.)
Также не похоже, что положение счетчика является гибким для команд, требующих двух нажатий клавиш: 2gjперемещает курсор вниз на две строки экрана, но полностью g2jотбрасывает первые два нажатия клавиш и перемещает курсор вниз на одну строку.
Итак, как это работает? Это особый случай во внутреннем коде Vim? Есть ли способ, которым я могу создать d[count]d
отображение?
РЕДАКТИРОВАТЬ : это текстовый объект? :h text-objects
не включить его в список «текстовых команд выбора объектов», но тогда он действительно включает дд в списке удалений «сгруппированных от маленьких до больших объектов». И d2awдействительно удаляет слово под курсором и следующее. С другой стороны, c2dничего не делает.
* Я уверен, что некоторые упоминания о них должны существовать, но я не могу их найти. Я прочитал :help deleting
, :help motion.txt
и пытался :helpgrep dNd
при всех значениях N от 1-9 .
d
действует как подтверждение; Так что это так же, какd3<CR>
.y3y
иc3c
также работают так же ... Я не могу найти никаких документов по этому вопросу, хотя в Vim: help, vi (1), nvi (1), или в спецификации POSIX ... Он ведет себя одинаково вvi
иnvi
кстати ,dd
идентиченd_
._
переводит курсор к первому[count]
непустому в ( -1)-й строке вниз, но это также происходит, поэтому в паре с оператором он работает на целых строках. По этой причине, имеет смысл, что счет может появиться между двумяd
s.Ответы:
Режим ожидания оператора
Между набрав оператора (например
d
,c
илиgU
) и движение (напримерw
,i}
или/foo<CR>
), Вим находится в режиме оператора находящейся на рассмотрении. Вы можете создать сопоставления для этого с помощью:omap
и:onoremap
.В моих примерах я собираюсь отобразить ожидающий оператор
d
наw
. Это случайный выбор, потому что я не знаю, для чего вы на самом деле хотели его использовать.Создать omap
Давайте создадим отображение для
d
в режиме ожидания оператора. Я предполагаю, что мы пишем VimScript здесь (например, в вашем.vimrc
), поэтому я опущу ведущие:
s.Это заставляет
dd
действовать какdw
. Это также заставляетd[count]d
действовать какd[count]w
. Но держу пари, что вы не хотели влиять на поведениеdd
(то есть не[count]
поставлялись).Отображения выражений
Отображения выражений позволяют вам оценить выражение VimScript, чтобы получить правую часть сопоставления. Выражение должно вычисляться как строка. Отображения выражений обозначаются
<expr>
ключевым словом.В Vim также есть некоторые встроенные переменные, которые заполняются в разное время и часто полезны при отображениях. Одним из них является то
v:count
, что[count]
подается оператору или движению.Давайте сложим все это вместе. Если нет
[count]
,v:count
будет0
. Мы можем сказать, что наше отображение просто использоватьd
в этом случае.Теперь
dd
ведет себя как по умолчанию (удаляет строку), ноd[count]d
ведет себя какd[count]w
. Здорово!Ограничить его использование после
d
оператораВы можете заметить что-то, хотя. Теперь
cd
также ведет себя какcw
. Это может не быть проблемой, но для полноты давайте ограничим это, чтобы оно работало только послеd
оператора.В Vim есть еще одна переменная,
v:operator
которая содержит оператор, который использовался последним. Давайте проверим это тоже, прежде чем делать что-то особенное.ПРИМЕЧАНИЕ. Поскольку
:map
команды могут быть объединены в цепочку|
, мы должны экранировать их в нашем выражении здесь. Таким образом, логический оператор ИЛИ||
становится\|\|
.Круто, так
cd
иc[count]d
вернулись к тому, чтобы ничего не делать, как раньше. Это хорошо, так что другие плагины могут определитьcd
.Я не хочу просто удалить другое движение
Если вы хотите отобразить
d[count]d
что-то совершенно другое, не имеющее ничего общего с удалением текста, мы можем сделать это тоже.Когда вы вводите команды в обычном режиме и начинаете вводить команду по ошибке, вы можете нажать,
<Esc>
чтобы отменить эту команду. То же самое относится и к вашим сопоставлениям.Давайте
d[count]d
изменим текущую строку на что угодно[count]
.Последняя часть отображения является выражением VimScript:
<Esc>cc' . v:count . '<Esc>'
. Это<Esc>
для отмены ожидающейd
команды, затемcc
для изменения текущей строки,v:count
для ввода значения[count]
(в режиме вставки) и<Esc>
возврата в обычный режим. Обратите внимание, что здесь мы строим строку, используя оператор конкатенации VimScript.
.Ваш фактический вариант использования, вероятно, будет отличаться от того, что я изложил здесь, но, надеюсь, это поможет вам добиться успеха.
Счастливого Вимминга!
источник
:omap d d
(!), Но, к сожалению, режим ожидания оператора фактически никогда не достигается из-за моего отображения для d, которое устанавливает пользовательскую функцию оператора. Хотелось бы надеяться, что можно настроить вещи так, чтобы ониd3d
работали так, как должны. (Дайте мне знать, если у вас есть какие-либо идеи, или не стесняйтесь опубликовать полное решение другого вопроса, если вы предпочитаете.) Если я не смогу это выяснить в ближайшее время, я приму это и опубликую другой, более конкретный вопрос. Благодарность!