Pull to refresh

Sublime Text 3 — пользовательская подсветка синтаксиса

Abnormal programming *Website development *
Sandbox
Tutorial
Расширяемость 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 для редактирования. В самом низу перед закрывающимся добавляем блоки стилей. Стиль может содержать три параметра: 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) и наслаждаемся результатом:

Tags:
Hubs:
Total votes 41: ↑38 and ↓3 +35
Views 67K
Comments Comments 20