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

Рубрика "Секреты" Вим. Свойства текста

Привет, коллеги. В Вим версии 8.2 появились свойства текста: нечто, что можно присвоить отрезку текста, и эти свойства будут двигаться вместе с текстом. Например, если число в тексте имеет свойство "это число", то при вставке текста перед числом оно будет смещаться - вместе со своим свойством. Равно как и при редактировании числа его свойство будет растягиваться на большее число символов или сокращаться: исчезнет только вместе с числом. Называется text properties, Справка по слову textprop. Предназначение этого - раскраска текста. Вместо обычной раскраски по синтаксису, когда элементы вычленялись регулярными выражениями, теперь свойства расставляет скрипт (но он все равно будет парсить текст, хотя может делать это внешней утилитой). Может быть выигрыш в производительности, так как нет необходимости разбирать текст при каждой перерисовке окна. С другой стороны, новый текст не будет автоматически раскрашен, пока кто-то не навесит на него соответствующее свойство. Можно использовать свойс

Привет, коллеги. В Вим версии 8.2 появились свойства текста: нечто, что можно присвоить отрезку текста, и эти свойства будут двигаться вместе с текстом. Например, если число в тексте имеет свойство "это число", то при вставке текста перед числом оно будет смещаться - вместе со своим свойством. Равно как и при редактировании числа его свойство будет растягиваться на большее число символов или сокращаться: исчезнет только вместе с числом.

Называется text properties, Справка по слову textprop.

Предназначение этого - раскраска текста. Вместо обычной раскраски по синтаксису, когда элементы вычленялись регулярными выражениями, теперь свойства расставляет скрипт (но он все равно будет парсить текст, хотя может делать это внешней утилитой). Может быть выигрыш в производительности, так как нет необходимости разбирать текст при каждой перерисовке окна. С другой стороны, новый текст не будет автоматически раскрашен, пока кто-то не навесит на него соответствующее свойство.

Можно использовать свойства и для других целей, например, для поиска. Придать заголовкам процедур свойство "заголовок" или формулам в ТеХ свойство "формула", и будет проще искать: по свойству, а не по регулярному выражению. Формула, например, может быть оформлена по-разному: распознать ее и навесить свойство может сколь угодно сложный скрипт, а поиск будет легким и комфортным.

Вот я выделил цветом число, причем таких чисел полно - а выделено только это. И при редактировании текста число это сохранит свой цвет.
Вот я выделил цветом число, причем таких чисел полно - а выделено только это. И при редактировании текста число это сохранит свой цвет.

Свойство имеет длину (в символах) и присваивается данному символу в данной строке (а потом оно может двигаться вместе с текстом), а также некий числовой идентификатор и тип.

Тип (как раз "формула", "заголовок", "число") является словарем и содержит поля, описывающие группу цветового выделения, взаимодействие с раскраской по синтаксису (заменить или работать совместно), приоритет (как разобраться, если тексту присущи два свойства) и что делать, если новый текст вводится впритык к тексту со свойством до или после: добавлять или не добавлять.

Вот пример из Справки. Пусть на строке 11 имеется текст:

The number 123 is smaller than 4567.

Мы хотим выделить числа:

call prop_type_add('number', {'highlight': 'Constant'})
call prop_add(11, 12, {'length': 3, 'type': 'number'})
call prop_add(11, 32, {'length': 4, 'type': 'number'})

Сначала создали тип number, потом присвоили свойства длиной 3 и 4, начиная с символов 12 и 32 на строке 11. Потом свойства будут двигаться вместе с текстом, и проявляется это в выделении чисел.

Имейте в виду, что русские символы занимают два байта и это надо учитывать и при указании длины, и при задании начальной позиции.

Предусмотрено большое число функций для управления свойствами. Можно создавать типы, менять и удалять их, запрашивать свойства. Можно назначать свойства тексту, в указанной позиции или сразу во многих позициях. Можно искать текст по свойству. Можно запрашивать свойства в данной позиции.

Вот как можно найти помеченный текст на скриншоте и перейти на него:

:let f=prop_find({'type':'attention'})
:let b:ln=f['lnum']
:let b:cn=f['col']
:call cursor(b:ln,b:cn)

Можно всё это в одну строку через |

Свойство было создано и назначено так:

:call prop_type_add('attention', {'highlight': 'Boolean'})
:call prop_add(23, 30, {'length': 7, 'type': 'attention'})

Функция propfind возвращает словарь с массой полезной информации. Мы берем оттуда только координаты первого символа.

Помимо типа и идентификатора, свойство может содержать еще очень много всего. Функции prop_add передается словарь, в котором должен быть тип, но могут быть и другие поля, перечисленные в Справке.

Ну и нет способа свойства сохранить при закрытии файла. Разве что специальным скриптом все собрать и записать в файл. При открытии снова придется заново свойства присваивать.

Возможность любопытная, но прямо необходимой я бы ее не назвал. Если сделать скрипт, который по уже готовому тексту расставит свойства - то это может быть удобно. И для дополнительной раскраски, и для поиска, и для какой-то структуризации текста. Опять-таки для автоматики.

Либо вы можете вручную (ну, через привязки) помечать какие-то куски текста как, например, "в работе" или "не трогать". Это ваше личное, и неформализуемое. Никаким регулярным выражением не описываемое.

У меня есть файлик todo, в котором стоят важные и менее важные дела, и он раскрашен через простенький синтаксис. Важное помечено восклицательным знаком, несрочное вопросительным, и всё такое.

Теперь я могу выделить красным, скажем, вообще любое слово или предложение, которое захочу. И оно останется красным, что бы я не писал до и после, и как бы не менял само это слово или предложение (за исключением случая полного удаления). Либо я могу присвоить невидимое свойство любому тексту, которое будет с ним, пока открыт файл, и поможет мне найти его. Например. "незнакомое слово". Но это давайте обсудим в другой раз.

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