Как использовать helm-semantic-or-imenu для навигации по коду с аннотированным Python-кодом типа
Я хотел бы использовать команду helm-semantic-or-imenu для навигации по компонентам аннотированного кода Python, но какой бы анализатор кода не использовался для идентификации компонентов, кажется, не распознает аннотированный Python-код типа. Функции с аннотацией возвращаемого типа не распознаются вообще, а функции с аннотированными аргументами показывают тип вместо имен аргументов в сигнатурах.
Основная проблема, с которой я столкнулся, заключается в том, что я неправильно понимаю компоненты, которые используются для выполнения этой работы (когда она работает). Очевидно, это может помочь как-то обновить анализатор кода, но в каком проекте я нахожу это? шлем? семантическая? imenu? или как кто-то упоминал где-то еще в отношении анализа кода python.el? Я мог бы действительно использовать некоторую помощь, чтобы начать решать эту проблему. Если анализатор кода находится в python.el, могу ли я тогда попытаться изменить и заставить emacs использовать локальную версию преимущественно над установленной?
РЕДАКТИРОВАТЬ: После того, как я сделал первый пост, я, наконец, прорвался, пытаясь выяснить, откуда берутся компоненты. Я искал python*.el во всей файловой системе и обнаружил:
./usr/share/emacs/26.2/lisp/cedet/semantic/wisent/python.elc./usr/share/emacs/26.2/lisp/cedet/semantic/wisent/python-wy.elc
Я нашел источник для emacs 26.2 и обнаружил, что действительно кажется, что python-el отвечает за синтаксический анализ файлов python для семантики. Он также внутренне использует python-wy для распознавания большой части языковых компонентов. Но, к сожалению, именно здесь я ударился о кирпичную стену. Я надеялся, что смогу исправить функцию, которая распознает определение функции через re или что-то еще, но семантика фактически решает проблему правильным способом. Таким образом, python-wy, кажется, автоматически генерируется из файла формального определения грамматики (в emacs git admin/grammars/python.wy) и выясняет, как изменить его, что, к сожалению, намного выше моих возможностей.
1 ответ
Бэкэнд семантического Python, по-видимому, неправильно анализирует аннотации типов (и, насколько я могу судить, в последнее время не было разработок для этих библиотек). поскольку helm-semantic-or-imenu
поддерживает семантику, когда она активна, вы можете вообще отключить семантику для буферов python, если не используете другие ее функции (лично я использую ее только для C/C++).
Когда загружаются зависящие от семантического режима библиотеки, они устанавливают imenu-create-default-create-index
а также imenu-default-goto-function
, заставляя imenu использовать семантическую функцию вместо imenu python.el.
Чтобы отключить семантическую поддержку файлов Python, вы можете настроить semantic-new-buffer-setup-functions
, только добавляя записи для режимов, для которых вы хотите семантическую поддержку, например. в вашем семантическом хуке (или в качестве альтернативы с настройкой пользовательского интерфейса),
(setq semantic-new-buffer-setup-functions
'((c-mode . semantic-default-c-setup)
(c++-mode . semantic-default-c-setup)
(srecode-template-mode . srecode-template-setup-parser)
(texinfo-mode . semantic-default-texi-setup)
;; etc.
;; (makefile-automake-mode . semantic-default-make-setup)
;; (makefile-mode . semantic-default-make-setup)
;; (makefile-gmake-mode . semantic-default-make-setup)
))