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