SublimeLinter ignore_match не работает, когда указано расширение

Я пытаюсь заставить SublimeLinter и HTMLTidy игнорировать определенные предупреждения php. В частности, missing <!DOCTYPE> declaration, inserting implicit <body> и inserting missing 'title' element. Прямо в документации написано, как это сделать:

{
"ignore_match": [
    "missing <!DOCTYPE> declaration",
    "inserting (?:implicit <body>|missing 'title' element)"
    ]
}

Источник: Настройки ЛИНТЕРа

Добавление этого в мой файл пользовательских настроек SublimeLinter сработало нормально. Проблема в том, что я хочу, чтобы он применялся только к файлам PHP, потому что использование только вышеперечисленного также будет игнорировать его в файлах HTML.

В документах есть пример применения ignore_match только к определенным расширениям:

{
"ignore_match": {
    "inc": [
        "missing <!DOCTYPE> declaration",
        "inserting (?:implicit <body>|missing 'title' element)"
        ]
}

Поэтому я скопировал это и изменил inc на php, и я все еще получаю эти предупреждения в файлах php.

Вот как выглядит раздел htmltidy моего файла настроек SublimeLinter:

"htmltidy": {
            "@disable": false,
            "args": [],
            "excludes": [],
            "ignore_match": {
                "php": [
                    "missing <!DOCTYPE> declaration",
                    "inserting (?:implicit <body>|missing 'title' element)"
                ]
            }
        }

Любая идея, почему ignore_match работает так, как предполагается, пока я не укажу расширение, к которому должно применяться правило ignore_match?


person Colin Marshall    schedule 03.12.2015    source источник


Ответы (1)


Это ошибка SublimeLinter. Токенизатор настроек позволяет заменять токены типа ${project} или ${home} в настройках. Он пытается сделать это рекурсивно, но сбивается, когда вы используете вложенный список внутри словаря ignore_match.

Я протестировал его, и он меняет все строки, оборачивает их в список и назначает имя списка в качестве ключа для словаря, поэтому:

{"ignore_match": { "php": ["Error1", "Error2"]}}

преобразуется в: {"ignore_match": None, "php": ["Error1","Error2"]}}

Отлаживать происходящее довольно сложно, поэтому я рекомендую сохранять настройки ignore_match перед токенизацией и сбрасывать их после токенизации. Что-то подобное в lint/linter.py get_merged_settings:

ims = None
if 'ignore_match' in settings.keys():
    ims = settings['ignore_match']
    del settings['ignore_match']
self.replace_settings_tokens(settings)
if ims:
    settings['ignore_match'] = ims
person Dawid Gosławski    schedule 28.12.2015
comment
Спасибо за этот ответ. Я пытаюсь проверить это, но не уверен, где в функции get_merged_settings я должен разместить предоставленный вами код. Хочу ли я разместить это первым, прямо перед window = self.view.window()? - person Colin Marshall; 28.12.2015
comment
self.replace_settings_tokens(settings) - это исходный код, курси замените его кодом выше, который защищает запись ignore_match - person Dawid Gosławski; 28.12.2015
comment
Спасибо еще раз! Я даю вам награду, прежде чем я смогу проверить ее, так как время истекает. Очень признателен. - person Colin Marshall; 29.12.2015
comment
Кажется, это заставляет ignore_match работать так, как должно. Большое спасибо за ваше время и усилия! - person Colin Marshall; 29.12.2015
comment
@alkuzad, вам следует подумать о том, чтобы сделать запрос на вытягивание с вашими изменениями. :) - person groteworld; 09.01.2016
comment
@grotewold это хак, вы должны исправить рекурсию, чтобы можно было использовать вложенные словари вместо их слияния :) - person Dawid Gosławski; 11.01.2016
comment
Добавлен запрос @grotewold на вытягивание github.com/SublimeLinter/SublimeLinter3/pull/393 - person Dawid Gosławski; 18.01.2016