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

    Всем хорош 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. Если вдруг кто-то найдет уже готовый файл синтаксиса, то милости прошу кидать его ссылку где-то сюда
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 14

      +1
      >Сам файл синтаксиса exim.Syntax можно забрать здесь
      можно было бы еще завести тикет на m-c.o и приаттачить его туда… может бы и появился бы в следующих версиях…
      0
      Адресок не дадите?
        0
        вроде нашел шас закину им
        0
        офтопик, но случайно никто не знает, как сделать командную строку в mc высотой не один, а по-больше?
          +1
          ctrl+O не спасет отца русской демократии?
            0
            Скажем так — я не очень знаком с хоткеями MC, поэтому некоторые вещи удобнее сделать через командную строку. Но в то же время, не хочется постоянно тыкать <C-o> Да и вообще иногда возникает желание набрать команду и сразу увидеть результат.
              0
              Лентяй
                0
                Вы слишком категоричны )). Отобьете у человека желание приобщиться к удобному.
                  –1
                  shell + vim = вот что удобно. А он предлагает не пойми что — mc на пол экрана :)
                    0
                    А я каюсь, vim'ом почти не пользуюсь, подсел на mcedit.
                      0
                      Если мне память не изменяет, в FARе это делалось то ли C-up, то ли Alt-up. Так что это не совсем не пойми что :)

                      Про удобство shell + vim я и так знаю, или вы про файловый менеджер внутри вима говорите?
                  0
                  Может тогда и не мучиться с MC? )) Сам совмещаю MC и «голую» консоль, удобно и то и другое.
                0
                это возможно только в терминале 'linux' (в голой консоли) в меню Настройки\Внешний вид круппа Консольный вывод… хочется кок нибудь на эту тему поковыряться, но пока не хватает идей как можно и в xterm-совместимых сделать…

              Only users with full accounts can post comments. Log in, please.