Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Подробнее о сокращениях

Привет, коллеги. Обсудим поподробнее сокращения. О них уже был материал, но довольно краткий. Имеет смысл собрать все тонкости в одной заметке. Итак, сокращения. Они аналогичны привязкам, но относятся только к последовательностям символов. Если введено слово-сокращение, Вим заменяет его на "правую часть". Например, классическое :abbr teh the или abbr пв почти всюду Когда вы напишете, например, "In teh " на втором пробеле сокращение раскроется, и вы получите "In the ". Сокращения удобнее привязок, потому что нет необходимости вводить серию быстро. Если у вас привязка или сокращение afaik, то для привязки надо ввести все пять букв без пауз, а для сокращения это не обязательно. Работают сокращения в режимах вставки/замены и командном. И можно задавать их раздельно: abbr создает привязку для обоих режимов, cabbr — для командного режима, iabbr — для режима вставки/замены. Левая часть, то есть то "слово", которое будет преобразовано, может быть одного из трех типов: Эти три возможности охв

Привет, коллеги. Обсудим поподробнее сокращения. О них уже был материал, но довольно краткий. Имеет смысл собрать все тонкости в одной заметке.

Можно и эти использовать, почему нет. https://i.ytimg.com/vi/HFTJ90YwPfo/maxresdefault.jpg
Можно и эти использовать, почему нет. https://i.ytimg.com/vi/HFTJ90YwPfo/maxresdefault.jpg

Итак, сокращения. Они аналогичны привязкам, но относятся только к последовательностям символов. Если введено слово-сокращение, Вим заменяет его на "правую часть". Например, классическое

:abbr teh the

или

abbr пв почти всюду

Когда вы напишете, например, "In teh " на втором пробеле сокращение раскроется, и вы получите "In the ".

Сокращения удобнее привязок, потому что нет необходимости вводить серию быстро. Если у вас привязка или сокращение afaik, то для привязки надо ввести все пять букв без пауз, а для сокращения это не обязательно.

Работают сокращения в режимах вставки/замены и командном. И можно задавать их раздельно: abbr создает привязку для обоих режимов, cabbr — для командного режима, iabbr — для режима вставки/замены.

Левая часть, то есть то "слово", которое будет преобразовано, может быть одного из трех типов:

  1. full-id, то есть именно слово из символов класса keyword (в дальнейшем "словный символ"). Это латинские и кириллические буквы, цифры, дефис, подчерк _. Например, qq, -2, w2, йй.
  2. end-id, то есть последний символ словный, а все остальные несловные. Например, &^q
  3. 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>

и всё.

Короче: удачи, коллеги!

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022

Наука
7 млн интересуются