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

Для файлов со смешанными типами языков программирования, таких как .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

person RNA    schedule 30.12.2012    source источник


Ответы (3)


Используйте 1_. Например, это:

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

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

person Dmitry    schedule 30.12.2012

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

(add-to-list 'semantic-inhibit-functions
             (lambda () (member major-mode '(html-mode))))
person Tom    schedule 03.12.2013
comment
Несколько дней назад работало, а сейчас все равно не работает, странно. Я уже изменил его на (add-hook 'org-mode-hook'(lambda() (set (make-local-variable 'semantic-mode) nil))), это работает. - person CodyChan; 11.01.2014

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

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

Вы можете запретить синтаксический анализ, используя переменную semantic-inhibit-functions.

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

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

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

  ;; 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 и @Dmitry.

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

person gw0    schedule 11.12.2016
comment
Вы можете сделать лучше и использовать add-hook вместо add-to-list. Это также сделало бы with-eval-after-load ненужным. - person Dmitry; 12.12.2016
comment
@Dmitry Это список функций, которые семантика будет вызывать, чтобы проверить, должна ли она включаться для каждого буфера. Использование add-hook (функция записи списка) создаст список, если он еще не существует, что может сломаться в будущем, если семантика перезапишет список при инициализации. Поэтому правильный способ — заключить with-eval-after-load add-to-list, как я сделал выше. Вы можете погуглить. ;-) - person gw0; 12.12.2016
comment
semantic-inhibit-functions — это defcustom с типом hook. Так что сама Semantic должна побеспокоиться о том, чтобы не перезаписать его в будущем. Кроме того, он обрабатывается с помощью run-hook-with-args-until-success. - person Dmitry; 12.12.2016
comment
@Dmitry Спасибо, это отличное открытие. Я обновил пример кода, чтобы удалить with-eval-after-load :) - person gw0; 13.12.2016