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

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

Вим поддерживает подсветку синтаксиса: различные конструкции могут быть выделены цветом символов, цветом фона и шрифтом (курсив и полужирный, скорее, всего, а в gvim и разные шрифты доступны). Но кто мешает заместить на экране кусок текста некоторым символом или скрыть вообще? Сам текст, в памяти и на диске, тот же самый, конечно, но его отображение может быть разным. Прежде всего, это удобно для ТеХ. Команды для символов, которые есть в Юникоде (греческие буквы, точка-умножение, интеграл, корень-радикал, верхние и нижние индексы, буква алеф и многое другое) можно заменить на экране на сами эти символы! И эту возможность можно использовать, в описании синтаксиса ТеХ она предусмотрена. Выглядит это как на скриншоте. Строка, на которой курсор, раскрашена по правилам, но показана как есть, без сокрытия, чтобы ее можно было редактировать. Называется это conceal. Если файл синтаксиса поддерживает его, то включить можно, выставив ненулевое значение в переменную conceallevel: :set conceallev

Вим поддерживает подсветку синтаксиса: различные конструкции могут быть выделены цветом символов, цветом фона и шрифтом (курсив и полужирный, скорее, всего, а в gvim и разные шрифты доступны). Но кто мешает заместить на экране кусок текста некоторым символом или скрыть вообще? Сам текст, в памяти и на диске, тот же самый, конечно, но его отображение может быть разным.

Прежде всего, это удобно для ТеХ. Команды для символов, которые есть в Юникоде (греческие буквы, точка-умножение, интеграл, корень-радикал, верхние и нижние индексы, буква алеф и многое другое) можно заменить на экране на сами эти символы! И эту возможность можно использовать, в описании синтаксиса ТеХ она предусмотрена. Выглядит это как на скриншоте. Строка, на которой курсор, раскрашена по правилам, но показана как есть, без сокрытия, чтобы ее можно было редактировать.

Называется это conceal. Если файл синтаксиса поддерживает его, то включить можно, выставив ненулевое значение в переменную conceallevel:

:set conceallevel=2

Нуль означает "не надо". Значение 3 означает "убрать скрытый текст вообще". Двойка значит "заменить на предписанный символ", и это то, что нужно для ТеХ. Если символ не предусмотрен, текст будет просто скрыт. Значение 1 примерно такое же, только текст не скрывается, если нет символа, а заменяется символом по умолчанию. Это пробел, но можно задать варианты в переменной listchars, в которую мы вдаваться не будем.

Это может пригодиться, например, для сокрытия тегов, если вы работаете с чем-то вроде HTML или XML; Можно убрать длинные комментарии, чтобы не мешали. Полезно бывает скрыть числа, если вы не хотите, чтобы кто-то видел через плечо суммы, даты, адреса. Можно прятать адреса e-mail с той же целью. И многое другое.

Краткое введение в написание синтакс-файлов я уже опубликовал. Суть в команде syntax match, которая описывает синтаксический элемент. Можно указывать ключевые слова, в том числе и относящиеся к сокрытию. А именно:

syntax match Number /\d\+\(\.\d\d\?\)\?/ conceal cchar=$

описывает элемент Number, который есть число, может быть сокрыт, и символ замещения указан: это знак доллара. Теперь, если вы примените этот синтаксис к файлу и выставите conceallevel в 1 или 2, все числа скроются, заменившись знаками $ с характерной подсветкой. Если укажете conceallevel=3, они просто исчезнут, появляясь магически при наведении курсора. Вот весь файл целиком:

syntax clear
syntax case ignore
syntax match Number /\d\+\(\.\d\d\?\)\?/ conceal cchar=$
highlight Number ctermfg=1

Последняя строка нужна, чтобы подкрасить числа красным. Можно ее убрать, тогда будет только сокрытие.

Примените этот скрипт к своему файлу: source имя_скрипта, и числа станут красными и спрячутся. Как на скриншоте.

Ну вот как-то так это выглядит. Курсор на 7-ой строке и там скрытый текст показан, а красный шрифт остался. Остальное скрыто. Это conceallevel 1 или 2. Если 0, то сокрытия не будет, а если 3, то после двоеточия ничего не будет, как будто и не написано число. Но поставь курсор на строку - и число появится.
Ну вот как-то так это выглядит. Курсор на 7-ой строке и там скрытый текст показан, а красный шрифт остался. Остальное скрыто. Это conceallevel 1 или 2. Если 0, то сокрытия не будет, а если 3, то после двоеточия ничего не будет, как будто и не написано число. Но поставь курсор на строку - и число появится.

Удачи, коллеги!

Оглавление рубрики

Путеводитель по каналу