Как использовать 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)
        ))
Другие вопросы по тегам