Как отключить семантику для определенного типа файлов

Для файлов со смешанными типами языков программирования, таких как.html, у семантики есть проблемы с анализом кода. Есть ли способ специально отключить автоанализ по семантике для этих типов файлов?

Я использую встроенный cedet, поставляемый с Emacs 24:

CEDET Version:  1.0
            Requested   File        Loaded
  Package       Version     Version     Version
  ----------------------------------------------------------
  cedet:        1.0     nil     ok
  eieio:        1.3     nil     ok
  semantic:     2.0     nil     ok
  srecode:      1.0     nil     ok
  ede:          1.0     nil     ok
  speedbar:     1.0     nil     ok

3 ответа

Решение

Использование semantic-inhibit-functions, Например, это:

(setq semantic-inhibit-functions
      (list (lambda () (not (and (featurep 'cc-defs)
                                 c-buffer-is-cc-mode)))))

следует отключить семантику во всехcc-mode буферы.

Другой пример, чтобы отключить его для определенного режима:

(add-to-list 'semantic-inhibit-functions
             (lambda () (member major-mode '(html-mode))))

Из семантических документов:

2.3.1 Не разбирать определенные буферы

Вы можете запретить синтаксический анализ, используя переменную semantic-ингибировать-функции.

- Переменная: функции семантического запрета Список функций, которые необходимо вызвать без аргументов, прежде чем семантическая установка буфера. Если какая-либо из этих функций возвращает не ноль, текущий буфер не настроен для использования Semantic.

Вы можете запретить этот анализ в очень больших файлах или файлах, которые вызывают определенные проблемы в семантике.

Пример правильного использования:

  ;; Disable Semantic's source referencing in lisp buffers.
  (add-hook 'semantic-inhibit-functions
            (lambda () (member major-mode '(emacs-lisp-mode))))

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

Вы должны использовать with-eval-after-load, поскольку семантический пакет может не загружаться при инициализации вашей пользовательской конфигурации. И в этом случае вы получите сообщение об ошибке, говорящее о том, что переменная семантической блокировки функций не существует, и ваше переопределение не будет применено.

Это решает эти проблемы и лучше, чем ответы @Tom's и @Dmitry.

Да, и я настоятельно рекомендую заблокировать emacs-lisp-mode, потому что в противном случае Semantic будет пытаться проанализировать все дерево исходного кода запущенного экземпляра Emacs при каждом запуске автозаполнения, что остановит Emacs, если у вас много пакетов.

Другие вопросы по тегам