Привет, коллеги. Обсудим поподробнее сокращения. О них уже был материал, но довольно краткий. Имеет смысл собрать все тонкости в одной заметке.
Итак, сокращения. Они аналогичны привязкам, но относятся только к последовательностям символов. Если введено слово-сокращение, Вим заменяет его на "правую часть". Например, классическое
:abbr teh the
или
abbr пв почти всюду
Когда вы напишете, например, "In teh " на втором пробеле сокращение раскроется, и вы получите "In the ".
Сокращения удобнее привязок, потому что нет необходимости вводить серию быстро. Если у вас привязка или сокращение afaik, то для привязки надо ввести все пять букв без пауз, а для сокращения это не обязательно.
Работают сокращения в режимах вставки/замены и командном. И можно задавать их раздельно: abbr создает привязку для обоих режимов, cabbr — для командного режима, iabbr — для режима вставки/замены.
Левая часть, то есть то "слово", которое будет преобразовано, может быть одного из трех типов:
- full-id, то есть именно слово из символов класса keyword (в дальнейшем "словный символ"). Это латинские и кириллические буквы, цифры, дефис, подчерк _. Например, qq, -2, w2, йй.
- end-id, то есть последний символ словный, а все остальные несловные. Например, &^q
- non-id, то есть последний символ несловный, остальные вообще любые, кроме пробела и табуляции. Например, q!
Эти три возможности охватывают не всё; так, a.b, %ab, a b, _$w не годятся. Слово a.b в первый класс не пускает точка, во второй - a, в третий - b. И так далее.
Сокращение срабатывает только тогда, когда введен несловный символ, то есть, упрощенно говоря, не буква. Обычно это пробел, знак препинания, символ конца строки (клавиша ввода), в программировании может быть скобка, знак операции (плюс, например) или ещё что-то.
Так что, если у вас сокращение "со", то "со " раскроется и "со." тоже, а вот "сокращение" не раскроется, к вящему вашему удовлетворению.
Таким символом-триггером может быть <ESC>, выходящий из режима вставки, или ввод, выполняющий команду. А также символ <C-]>, который служит именно для того, чтобы раскрыть сокращение.
Текст перед сокращением тоже не любой: для full-id перед сокращением должен быть несловный символ или вообще начало строки. К тому же, если сокращение из одного символа, то и несловный символ перед ним не разрешен: либо начало строки, либо пробел или табуляция.
Например, если сокращение "со", то "колесо " не раскроется. Зачем ставить на сокращение один словный символ - я не знаю. Разве что, например, нуль сам по себе у вас никогда не используется, и вы его задействовали так:
abbr 0 нуль
01 и 10 не раскроются, как и 0.0 , тогда как 0. раскроется. Правда, в режиме кириллицы (когда клавиши переназначены) этого не происходит.
Для end-id перед сокращением должен быть словный символ, или пробельный, или ничего.
То есть, если вы создали сокращение ;1 (а это хорошая идея, так как чаще всего после точки с запятой идет пробел, что в текстах, что в программном коде), то ok;1 раскроется, а вот ;;1 нет.
Для non-id перед сокращением должен быть либо пробельный символ, либо ничего вообще.
Это для сокращений типа ;; или $$$.
Чтобы предотвратить раскрытие сокращения, можно либо сдвинуть курсор влево и потом обратно, или выйти из режима вставки и опять войти, или нажать <C-V> перед последним символом.
В командном режиме <C-V> надо нажать дважды.
С использованием <C-R> (вставка из регистра) и регистра-выражения можно любые функции вызывать и вычисленные ими значения вставлять в текст. Банальный пример:
abbr c45 <C-R>=cos(45*acos(-1.0)/180)<CR>
С сокращениями применимы ключи <buffer> (сокращение локально для буфера) и <expr>: в этом случае правая часть вычисляется как выражение и там можно вообще всё, что хотите, делать.
Это ещё один способ вставить результат вычисления выражения:
abbr <expr> c45 string(cos(45*acos(-1.0)/180))
Если выставлена опция verbose, то команда abbr не только покажет привязки, но и где они были определены.
Сокращения рекурсивными не бывают, но в правой части могут срабатывать привязки. Это можно запретить через команды типа noreabbr. То есть, сокращение
abbr со колесо
к сюрпризам не ведет.
Удаляют привязки команды типа unabbr, или можно удалить все сразу командой abclear (сокращается до abc) или ее аналогами для режимов: iunabbr, cunabbr.
Можно вставить и спецсимволы в правую часть: с помощью <C-V>, только вот саму эту комбинацию надо нажимать несколько раз. Иногда до пяти раз, как в примере в Справке: чтобы ввести код клавиши Escape литерально. Первые два позволят ввести символ <C-V> (как символ), вторая пара — еще один, третье вставит код клавиши <Esc>. В итоге сохранится два раза <C-V> (как символ) и символ <ESC>. При срабатывании пара <C-V> вставит этот символ один раз, а этот один символ вставит литерально символ <ESC> после него.
Но можно проще:
abbr qq <ESC>
и всё.
Короче: удачи, коллеги!