Подсветка синтаксиса - это инструмент. Она помогает быстрее читать код. Быстрее находить нужную информацию. Ориентироваться в большом файле.

Как и любой инструмент, её можно использовать правильно или неправильно. Давайте посмотрим, как использовать подсветку синтаксиса для облегчения работы.

Безумие новогодней елки

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

Иногда всё настолько плохо, что не видно основного цвета текста: всё подсвечено. Какой здесь основной цвет текста?

Подсветка в стиле новогодней елки
Подсветка в стиле новогодней елки

Проблема в том, что если всё выделено, то ничто не выделяется. Ваш глаз адаптируется и воспринимает это как новую норму: всё яркое и блестящее, и вместо того, чтобы разделяться, всё сливается воедино.

Вот быстрый тест. Попробуйте найти определение функции здесь:

Плохая подсветка синтаксиса
Плохая подсветка синтаксиса

и здесь:

Хорошая подсветка синтаксиса
Хорошая подсветка синтаксиса

Понимаете, о чём я?

Так что да, к сожалению, невозможно просто выделить всё. Приходится принимать решения: что важнее, что менее важно. Что должно выделяться, а что нет.

Выделение всего - это как назначение «высшего приоритета» каждой задаче в линейном календаре. Это работает только в том случае, если у большинства задач приоритет ниже.

Если выделено всё, то ничего не выделено.

Достаточно цветов для запоминания

Есть два основных варианта использования, которые должна решать ваша цветовая тема:

  • Взглянуть на что-то и определить, что это за объект, по его цвету (да, это можно определить, прочитав текст, но зачем тогда нужна подсветка синтаксиса?)

  • Поиск чего-либо. Вы хотите знать, что искать (какой цвет).

Первая задача - это прямой поиск по индексу: цвет → тип объекта. Вторая - это обратный поиск: тип объекта → цвет. По правде говоря, большинство людей вообще не делают таких поисков. Они могут думать, что делают, но на самом деле это не так.

Позвольте мне проиллюстрировать. До:

После:

Видите? Я неправильно написал return вместо retunr, и цвет сменился с красного на фиолетовый.

А я - нет, не вижу.

Вот ещё один тест. Закройте глаза (ещё нет! сначала дочитай��е это предложение!) и попытайтесь вспомнить, какой цвет ваша цветовая тема использует для имён классов.

Вспомнили?

Если ответ на оба вопроса «нет», то ваша цветовая тема нефункциональна. Она может вас успокоить (например, «я чувствую себя в безопасности. Если что-то выделено, это, вероятно, код»), но вы не можете использовать её как инструмент. Она вам не помогает.

Какое решение? Используйте абсолютный минимум цветов. Настолько мало, чтобы все они сразу умещались в голове. Например, моя цветовая тема, Alabaster, использует всего четыре:

  • Зелёный - для строк;

  • Фиолетовый - для констант;

  • Жёлтый - для комментариев;

  • Светло-голубой - для определений верхнего уровня.

Вот и всё! И я смог напечатать всё это по памяти. Этот минимализм позволяет мне выполнять поиск: если я ищу строку, я знаю, что она будет зелёной. Если я ищу что-то жёлтое, я знаю, что это комментарий. В общем, ограничьте количество различных цветов тем, что можете запомнить. Если вы поменяете местами зелёный и фиолетовый в моём редакторе, это будет катастрофа. Если кто-то поменяет цвета в вашем, вы вообще заметите?

Ограничьте количество различных цветов тем, что можете запомнить.

Если вы поменяете местами зелёный и фиолетовый в моём редакторе, это будет катастрофа. Если кто-то поменяет цвета в вашем, вы вообще заметите?

Что нужно выделять?

Что-то, чего не так много. Помните - мы хотим, чтобы подсветка была заметна. Именно поэтому я не выделяю переменные или вызовы функций - они повсюду, ваш код, вероятно, на 75% состоит из имён переменных и вызовов функций.

Я выделяю константы (числа, строки). Они обычно используются реже и часто служат опорными точками - многие логические цепочки начинаются с констант.

Определения верхнего уровня - ещё одна хорошая идея. Они быстро дают представление о структуре.

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

Пожалуйста, пожалуйста, не выделяйте ключевые слова языка: класс, функция, if, else и тому подобное. Вы редко их ищете: «где этот if» - вопрос вполне обоснованный, но вы будете смотреть не на ключевое слово if, а на условие после него. Условие - важная, отличительная часть. Ключевое слово - нет.

Выделяйте имена и константы. Пунктуацию оставляйте серым. Не выделяйте ключевые слова языка.

Комментарии важны

Традиция использовать серый цвет для комментариев восходит к временам, когда людям платили построчно. Если у вас есть что-то вроде

то, конечно, вы бы хотели оставить его серым! Это бессмысленный текст, который ничего не добавляет и был написан для того, чтобы его просто проигнорировали.

Но с хорошими комментариями ситуация обратная. Хорошие комментарии дополняют код. Они объясняют то, что нельзя выразить напрямую. Они важны.

Поэтому вот вам еще одна идея для размышления:

Комментарии следует выделять, а не прятать.

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

Два типа комментариев

Ещё один секрет, о котором никто не говорит, заключается в том, что существует два типа комментариев:

  • Пояснения

  • Закомментированный код

Большинство языков не различают эти типы, поэтому с синтаксисом мало что можно сделать. Иногда есть соглашение (например, -- вместо /* */ в SQL), так что используйте его!

Вот реальный пример из кодовой базы Clojure, который идеально использует два типа комментариев:

Закомментированный код - серый, пояснения - ярко желтый.
Закомментированный код - серый, пояснения - ярко желтый.

Светлая или тёмная тема?

По статистике, 70% разработчиков предпочитают тёмные темы. Будучи в числе оставшихся 30%, этот вопрос всегда озадачивал меня. Почему?

И, кажется, у меня есть ответ. Вот типичная тёмная тема:

А вот светлая:

На последнем варианте цвета гораздо менее яркие. Вот, я их для вас выбрал:

Обратите внимание, сколько цветов. Никто не может запомнить столько.
Обратите внимание, сколько цветов. Никто не может запомнить столько.

Это связано с тем, что тёмные цвета, как правило, менее различимы и более размыты. Посмотрите на шкалу оттенков при уменьшении яркости:

По сути, в тёмной части спектра просто меньше цветов для игры. Нет «тёмно-жёлтого» или красивого «тёмно-бирюзового».

Здесь ничего не поделаешь. Нет никаких волшебных цветов, которые бы одновременно хорошо контрастировали на белом фоне и хорошо смотрелись. Выбирая светлую тему, вы обрекаете себя на очень ограниченный, некрасивый, едва различимый набор тёмных цветов.

Так что это логично. Тёмные темы выглядят лучше. Вернее: светлые не могут выглядеть хорошо. Наука ¯_(ツ)_/¯

Но!

Но.

Есть один трюк, который я нечасто вижу. Используйте фоновые цвета! Сравните:

В первом примере приятные цвета, но слишком низкий контраст: буквы становится трудночитаемыми.

Во втором - хороший контраст, но цвета едва различимы.

В последнем есть и то, и другое: высокая контрастность и чистые, яркие цвета. Более светлые цвета читаются даже на белом фоне, поскольку занимают гораздо большую площадь. Текст имеет ту же яркость, что и во втором примере, но создаёт впечатление более чёткого цвета. В этом есть и плюс.

UI-дизайнеры давно знают об этом приёме, но я редко вижу его применение в редакторах кода:

Если ваш редактор поддерживает выбор цвета фона, попробуйте. Возможно, он откроет для вас светлые темы.

Жирный шрифт и курсив

Не используйте. Это относится к той же категории, что и слишком много цветов. Это просто ещё один способ выделить что-то, и вам не нужно слишком много цветов, потому что вы не можете выделить всё.

Теоретически, можно попробовать заменить цвета типографикой. Сработает ли это? Не знаю. Я не видел примеров.

Использование курсива и жирного шрифта вместо цветов
Использование курсива и жирного шрифта вместо цветов

Миф о совершенстве, основанном на числах

Некоторые темы слишком усердствуют в научном единообразии. Например, все цвета имеют одинаковую яркость, а оттенки равномерно распределены по окружности.

Это могло бы быть интересно, но на практике это работает не так хорошо, как кажется:

OkLab l=0.7473 c=0.1253 h=0, 45, 90, 135, 180, 225, 270, 315
OkLab l=0.7473 c=0.1253 h=0, 45, 90, 135, 180, 225, 270, 315

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

Наши глаза гораздо более чувствительны к различиям в яркости, чем в цвете, и нам следует использовать это, а не пытаться игнорировать.

Давайте вместе создадим цветовую тему

Давайте применять эти принципы шаг за шагом и посмотрим, к чему это нас приведёт. Начнём с темы, из которой мы начали этот пост:

Во-первых, давайте уберем подсветку ключевых слов языка и заново введем базовый цвет текста:

Далее мы убираем цвет из использования переменной:

и из вызова функции/метода:

Идея заключается в том, что ваш код в основном состоит из ссылок на переменные и вызовов методов. Если мы их выделим, нам придётся выделить более 75% кода.

Обратите внимание, что мы сохранили объявления переменных. Они не так распространены и помогают быстро ответить на распространённый вопрос: откуда берётся то-то и то-то?

Далее давайте смягчим пунктуацию:

Я предпочитаю немного приглушить его, потому что это помогает им лучше выделяться. Одни только имена могут дать общее представление о том, что происходит, и точное расположение скобок редко бывает столь же важно.

Но можно использовать и пунктуацию основного цвета:

Ладно, уже близко. Давайте выделим комментарии:

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

Всё равно на один цвет больше, чем нужно, поэтому я объединяю числа и строки, используя зелёный:

Наконец, давайте немного поменяем цвета. Мы хотим сохранить логику вложенности, поэтому объявления функций должны быть ярче (жёлтыми), чем объявления переменных (синими).

Сравните с тем, что мы начали:

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

Заключение

Я применяю эти принципы уже около 8 лет, и они мне отлично подошли. Я никогда не хотел возвращаться к прежней подсветке, и один взгляд на любую «традиционную» цветовую схему теперь пугает меня.

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

Время бесстыдного пиара

Я называю эту тему Alabaster и пару раз создавал её для редакторов, которые использовал:

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

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