Pull to refresh

Подсветка синтаксиса Midnight Commander: добавляем свой синтаксис

Reading time 3 min
Views 25K
Всем хорош exim но его конфигурация не похожа ни на что соответственно и подсветка в нем скучно-серая (см.ниже)и чтобы исправить эту досадную ошибку решено было покопаться в недрах гугла на предмет Midnight commander syntax highlight.
Краткий конспект поисков представлен ниже

ДО:


Теория MC syntax Highlight


Согласно ману редактор МС (man mcedit) ищет подсветки в файле ~/.mc/cedit/Syntax
или если там нет файлов тогда в $PREFIX/share/mc/syntax/Syntax.
Внимание. Эти файлы просматриваются именно в такой последовательности и ищутся до первого совпадения. Поэтому если вы напишите файл Syntax в домашней директории то будут определяться ТОЛЬКО синтаксисы описанные в нем (это касается версии МС 4.7.5, возможно все изменилось в более поздних версиях).

Быстрый способ


Быстрый (но ОЧЕНЬ не точный) способ был найден здесь. В нем просто заменяется синтаксис неизвестного типа (файл /usr/local/share/mc/syntax/unknown.syntax) на sh.syntax)
Но этот способ не качественный и неспортивный. Поэтому мы пойдем другим путём.

Синтаксис Syntax-а


Для начала мы зайдем в $PREFIX/share/mc/syntax/Syntax и в самом начале поставим ссылку на разрабатываемый нами файл:
file configure exim\sconfiguration
include exim.syntax

Которая означает: все файлы которые начинаются с configuration и находятся в папке exim подсвечиваются синтаксисом из файла exim.syntax. Таким образом любые резервные копии (configure_28_11_2010, configure.orig, configure.default и т.д. — тоже будут подсвечены).
Контексты

В синтаксисе может быть один или несколько контекстов. Контекст — все что заключено между определенными служебными символами\словами (delimiters) пример:
context " " green
spellcheck

— все что между лапками отображается зеленым (в нашем случае строка)
context exclusive # \n brown


— все что между # и концом строки — коричневый (комментарий)

Обязательный контекст дефолтный (context default) используется для подсветки того что не находится ни в одном контексте.
Keywords

В любом контексте служебные слова задаются в таком виде:
keyword [whole|wholeright|wholeleft] [linestart] string foreground [background]

коротко о параметрах:
  • whole — только целые слова (иначе даже части большего слова будут выделятся
  • wholeright — от строки string и вправо до конца слова
  • wholeleft — от строки string и влево до конца слова
  • linestart — string должна идти в начале строки

Еще бы хорошо определить какие символы НЕ обозначают конец слова. Это делается при помощи команды
wholechars:
wholechars abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_01234567890.-
exim.Syntax

Собственно начнем мы с дефолтного контекста:
context default
keyword = white
keyword : yellow
keyword ! red
keyword # brown
keyword \/\/ brown
keyword ${ green
keyword } green
keyword whole domainlist brightcyan
keyword whole begin brightcyan
keyword whole acl brightcyan

keyword whole warn cyan
keyword whole accept cyan
keyword whole reject cyan
keyword whole drop cyan
keyword whole deny cyan

.............

— здесь мы определяем целые слова и их цвет
Далее:
keyword wholeright smtp_* brightcyan
keyword wholeright rfc1413_* brightcyan
keyword wholeright recipients_max* brightcyan
keyword wholeright system_filter* brightcyan
keyword wholeright maildir_* brightcyan
keyword wholeright message_* brightcyan
keyword wholeright quota_warn_* brightcyan
keyword wholeright server_* brightcyan
.............

— определяем целые семьи служебных слов (все что начинается с <keyword_> и до конца слова
И переходим к другим контекстам:
context " " green
spellcheck

context exclusive # \n brown


— строка и однострочный комментарий

context exclusive = \n magenta
keyword \\\n red
keyword \\ red
keyword \/\/ brown
keyword "*" green
keyword '*' green


— Контекст присвоения параметров
domainlist relay_to_domains = local_domains
Также отвечает за то чтобы строки в этом контексте отображались зеленым:
keyword "*" green, keyword '*' green, а служебные символы переноса строки — красным.

Выводы

ПОСЛЕ этих манипуляций (без перегрузки МС) наш конфиг стал выглядеть более привлекательно:


P.S.
Основные источники: man mcedit
А также /usr/local/share/mc/syntax/Syntax
Сам файл синтаксиса exim.Syntax можно забрать здесь
P.P.S. Если вдруг кто-то найдет уже готовый файл синтаксиса, то милости прошу кидать его ссылку где-то сюда
Tags:
Hubs:
+34
Comments 15
Comments Comments 15

Articles