Расширяемость Sublime Text не знает границ. Для тех, кому мало стандартных функций, на Хабре уже рассказывали о том, как создать сниппет, как написать простой плагин, как написать сложный плагин и еще много много чего. Про ручную настройку подсветки синтаксиса толком ничего не смог найти: для кого-то слишком очевидно, кому-то просто не нужна, а кому-то и наверняка же пригодится.

Итак, задача: имея какие-нибудь абстрактные логи доступа в wonder-net:

!->14/02 16:44:22 [134.249.51.251:39951>80] (t1 19) >HTTP  in:504 out:34  Time:156
GET /516874233**21893/ HTTP/1.1 SCOD=00
!->14/02 16:44:24 [134.249.51.251:49507>80] (t1 20) 
GET /44058858**409377/ HTTP/1.1 SCOD=00
!->14/02 16:54:11 [195.18.13.107:1721>80] (t2 22) 
GET /41494377**562173/ HTTP/1.1 SCOD=00
!->14/02 16:54:11 [195.18.13.107:1721>80] (t2 23) >HTTP  in:385 out:10138  Time:156
GET /5211537**1172048/ HTTP/1.1 SCOD=00
!->14/02 16:54:24 [195.18.13.107:1727>80] (t1 30) >HTTP  in:423 out:1220  Time:187
GET /5211537**6447554/ HTTP/1.1 SCOD=23
!->14/02 18:07:24 [82.145.208.159:43634>80] (t2 52) 
GET /4149437**8265377/ HTTP/1.1 SCOD=00
!->14/02 18:09:41 [82.145.208.174:41708>80] (t2 61) 
GET /4149497**5750155 / HTTP/1.1 SCOD=00
!->14/02 18:51:39 [82.145.210.33:55210>80] (t1 66) >HTTP  in:543 out:34  Time:0
GET /5168757**9478487/ HTTP/1.1 SCOD=00
!->14/02 18:51:40 [82.145.210.33:55332>80] (t1 68) >HTTP  in:544 out:1243  Time:141
GET /4149497**0456701 / HTTP/1.1 SCOD=00
!->14/02 18:51:46 [82.145.210.33:57345>80] (t1 73) >HTTP  in:544 out:1243  Time:125
GET /5168742**0521893/ HTTP/1.1 SCOD=00

выделить:
Дату-время — фиолетовым курсивом;
Номер карты — желтым курсивом, если не в черном списке или красным, если иначе;
ip-адрес — темно-зеленым, если не в черном списке или красным, если иначе;
scod=хх — темно-зеленым если 00 или красным, если иначе.

В нашу цветовую схему нужно добавить стили, которыми мы собираемся подсвечивать текст. Насколько я понял, все цветовые схемы аккуратно собраны в файле c:\Program Files\Sublime Text 3\Packages\Color Scheme — Default.sublime-package.

Файл представляет собой zip архив без сжатия. Распаковываем, выбираем любимую схему (по умолчанию Monokai.tmTheme) и копируем ее в…(запускаем Sublime Text: меню Preferences — Browse Packages) папку User.

Открываем свежескопированный Monokai.tmTheme для редактирования. В самом низу перед закрывающимся </array> добавляем блоки стилей. Стиль может содержать три параметра: background, foreground и fontStyle. fontStyle в свою очередь bold, italic и underline.

фиолетовый курсив будет выглядеть так:
<dict>
	<key>scope</key>
	<string>violet</string> <!-- По этому имени будем обращаться к стилю --> 
	<key>settings</key>
	<dict>
		<key>foreground</key>
		<string>#EE82EE</string>
		<key>fontStyle</key>
		<string>italic</string>
	</dict>
</dict>

жирный желтый(ЖЖ):
<dict>
	<key>scope</key>
	<string>yellow</string>
	<key>settings</key>
	<dict>
		<key>foreground</key>
		<string>#FFD700</string>
		<key>fontStyle</key>
		<string>bold</string>
	</dict>
</dict>


темно-зеленый:
<dict>
	<key>scope</key>
	<string>green</string>
	<key>settings</key>
	<dict>
		<key>foreground</key>
		<string>#006400</string>
	</dict>
</dict>


красный:
<dict>
	<key>scope</key>
	<string>red</string>
	<key>settings</key>
	<dict>
		<key>foreground</key>
		<string>#FF0000</string>
	</dict>
</dict>

2. В той же папке User создаем файл синтаксиса: wonderLog.tmLanguage с содержимым:
<?xml version="1.0" encoding="UTF-8" ?>
<plist version="1.0">
    <dict>
        <key>patterns</key>
        <array>
            <dict>
                <key>name</key>
                <string>red</string> <!-- Имя стиля --> 
                <key>match</key>
                <string>\b(?i)(?:5168742**0521893|414943**01562173|4149497**5750155)\b</string> <!-- Регулярное выражение к-рое надо выделить (номера из черного списка) --> 
            </dict>

            <dict>
                <key>name</key>
                <string>red</string> 
                <key>match</key>
                <string>\b(?i)(?:134\.249\.51\.251|82\.145\.208\.174)\b</string> <!-- ip из черного списка (точки экранируем) --> 
            </dict>

            <dict>
                <key>name</key>
                <string>green</string> 
                <key>match</key>
                <string>\b(?i)scod=00\b</string> <!-- scod=00 --> 
            </dict>

            <dict>
                <key>name</key>
                <string>red</string> 
                <key>match</key>
                <string>\b(?i)scod=\d+\b</string> <!-- scod!=00 --> 
            </dict>

            <dict>
                <key>name</key>
                <string>green</string> 
                <key>match</key>
                <string>\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b</string> <!-- остальные ip (конечно, надо не так, но...) --> 
            </dict>

            <dict>
                <key>name</key>
                <string>yellow</string> 
                <key>match</key>
                <string>\b\d{16}\b</string> <!-- остальные номера --> 
            </dict>

            <dict>
                <key>name</key>
                <string>violet</string> 
                <key>match</key>
                <string>\d{1,2}/\d{1,2}\s\d{2}:\d{2}:\d{2}</string> <!-- дата, время --> 
            </dict>

        </array>
        <key>name</key>
        <string>wonderLog</string> 
        <key>scopeName</key>
        <string>wonderLog</string>
        <key>fileTypes</key>
        <array>
            <string>log</string> <!-- К этому расширению файла будет автоматически применяться данный синтаксис -->
        </array>
    </dict>
</plist>

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

Сохраняем все.

Выбираем пользовательскую цветовую схему: Preferences — Color Scheme — User — Monokai.

Открываем наш чудо-лог (если расширение файла не совпадает с шаблонным, делаем View — Syntax — wonderLog) и наслаждаемся результатом:

Комментарии (19)


  1. XlebNick
    15.05.2015 19:58
    +5

    Спасибо, нужная фича. Sublime text просто палочка-выручалочка!


    1. Apathetic
      16.05.2015 01:40
      -4

      Это вы еще Brackets не пробовали, например. Или Atom. Или еще какой-нибудь другой редактор.


      1. norlin
        16.05.2015 08:43
        +3

        Пробовал Атом, вернулся на Саблайм. Атом более кастомизируемый, но менее удобный по-дефолту, ИМХО.


        1. Apathetic
          16.05.2015 22:12

          Интересно, что почти все прокомментировавшие именно про Атом говорили. Но первым я назвал Brackets, между прочим.

          Я с саблаймом три года душа в душу прожил, просто в какой-то момент захотелось новенького. Атом мне и самом не очень-то подошел, а вот Brackets — в самый раз. А кому-то Emacs больше нравится. А кому-то — WebStorm.

          Короче говоря, я комментарий свой оставил не холивара ради, а токмо во исполнение воли пославшей мя жены чтобы показать, что редакторов много, и вот лично меня от таких вот "%имя_редактора% просто палочка-выручалочка" слегка коробит.


      1. resetnow
        16.05.2015 11:43
        +13

        atom

        Текстовый редактор весом под сотню мегабайт, который работает на JS, жрет память, не открывает большие файлы и в котором каждая строка — это отдельный <div> в эмулируемом поле редактирования? Нет, спасибо.


      1. Bagobor
        16.05.2015 12:30
        +1

        У меня ощущение что только меня одного бесят лаги (особенно на выделение, копирование\вставка кусков) не-нативных редакторов кода. :(
        Надо было меньше в Quake 1 играть…


        1. norlin
          16.05.2015 12:59

          В саблайме, например, нет таких лагов. Разве что, при вставке ОЧЕНЬ больших кусков кода. Но бывают лаги на проверку вставленного кода (lint-плагины)…

          p.s. пропустил уточнение «нативных», сорри.


        1. khim
          16.05.2015 16:37

          Тут как бы некоторый вопрос что такое «не-нативный редактор». Emacs — он как бы на lisp'е написан и когда-то считался тормозом изрядным. Когда процессоры были в 100 медленнее, чем сейчас. Может и Atom лет через 20 будет «летать»… хотя сегодня я им пользоваться не могу именно из-за лагов.


          1. Bagobor
            16.05.2015 20:33

            «не нативный» — значит используется толстая прослойка для отобраения данных на экране. по сути в нашем слушем случае это «движок» браузера.
            видимо это и дает минимальное отставание на один кадр обновление монитора. что в случае стандарного LCD = 1/60 ~ 16ms
            Это конечно гипотеза и ее легко проверить, поставив частоту обновления в 30hz — если лаг будет сильнней — значит я прав.
            И тогда получается что просто увеличением скорости проессора не обойтись.


        1. Apathetic
          16.05.2015 22:12

          Нет, такие вещи бесят всех. Не понимаю, с чего вы вдруг обратное подумали.


          1. Bagobor
            17.05.2015 02:25

            Потому несколько человек мне активно рекламировали Атом. И всячески пищали от восторга, говоря что никаких лагов нет воообще.


            1. Apathetic
              17.05.2015 20:04

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


      1. XlebNick
        16.05.2015 20:56

        Атом пробовал, Dreamweaver пробовал, но сублайм более удобен как по мне


  1. KaneUA
    16.05.2015 00:19
    +4

    Не знаю, кому как, а мне не нравится курсив в текстовых редакторах. Никогда не видел, чтобы он отлично смотрелся. Первым делом, как устанавливаю, выставляю опцию «no_italic».


    1. MTonly
      16.05.2015 18:32
      -1

      мне не нравится курсив в текстовых редакторах. Никогда не видел, чтобы он отлично смотрелся.
      На 4K-мониторе (например, Dell P2415Q) курсив смотрится отлично. ;-)


  1. mihmig
    16.05.2015 11:17
    +1

    Как-то печально задавать подсветку чёрно/белых списков регулярками…
    Архитектура модуля подсветки не позволяет задавать списки в тегах XML?


    1. CJay
      16.05.2015 14:19

      Насколько я разобрался с данным вопросом, саблайм разбивает свой текст на блоки регулярками, давая блоку некоторый стиль. Ч/Б список не является частью языка, поэтому закидывать его в регулярку в конфиге языка — неверный подход. Решить данную задачу можно не расширением языка(.tmLanguage), а написанием своего расширения (plugin), которое по событиям (нажатие комбинации клавиш, изменение текста), пробежится по тексту (или по нужным блокам), сверит введённую информацию с какими-то внешними списками, и потом уже задаст необходимым кускам текста (блокам) дополнительную маркировку (метод add_regions объекта view). Хорошим примером служит расширение, подсвечивающее введённые hex цвета в css цветом (ColorHighlighter).
      Так что, повторюсь, архитектура это позволяет, но не так, как указано в статье.


  1. zhovner
    16.05.2015 12:22

    Как в саблайме 2 отобразить переносы строк? Показ непечатных символов включен, но переносы строк он не показывает. Невозможно понять виндовые или юниксовые переносы в конкретном файле, приходится открывать в mcedit.


  1. Lord_D
    16.05.2015 12:57
    +3

    Всем интересующимся советую обратить внимание на официальную документацию и пакет разработчика, позволяющий создавать файлы синтаксиса в формате YAML с подсветкой операторов.