Как использовать helm-semantic-or-imenu для навигации по коду с аннотированным типом кода Python

Я хотел бы использовать команду helm-semantic-or-imenu для навигации по компонентам кода Python с аннотациями типа, но какой бы анализатор кода ни использовался для идентификации компонентов, похоже, он не распознает код Python с аннотациями типа. Функции с аннотацией возвращаемого типа вообще не распознаются, а функции с аннотированными аргументами показывают тип вместо имен аргументов в подписях см.  скриншот

Основная проблема, с которой я столкнулся, заключается в том, что я неправильно понимаю компоненты, задействованные в этой работе (когда она действительно работает). Очевидно, может помочь как-то обновить анализатор кода, но в каком проекте я это найду? шлем? семантический? имя? или как кто-то упоминал где-то еще в отношении анализа кода 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), и выяснить, как изменить это, к сожалению, намного выше моих возможностей.


person TLE    schedule 14.06.2019    source источник
comment
вы пытаетесь использовать семантику или imenu? Анализатор кода для семантики находится в семантической библиотеке, python.el предоставляет функцию imenu, которая находит все имена функций, но не предоставляет аргументы/типы. Если (semantic-active-p) не равен нулю в вашем буфере python, то helm-semantic-or-imenu предпочтет семантику, а не imenu   -  person Rorschach    schedule 16.06.2019
comment
@jenesaisquoi спасибо за ответ. Итак, теперь, понимая, что можно использовать один из других вариантов, я бы сказал, что не имеет значения, какая функция предоставляет компоненты для поиска, если этот компонент распознает определения функций с аннотациями типа. Очевидно, было бы неплохо иметь имена аргументов, но не обязательно. Вычисление (semantic-active-p) в буфере Python выше возвращает t. Я пытался установить nil с помощью (setq semantic-active-p nil), но безуспешно. Как мне изменить его? Извиняюсь за мой плохой elisp foo, но я всегда был больше пользователем emacs, чем моддером.   -  person TLE    schedule 16.06.2019
comment
не беспокойтесь, пакет cedet/semantic, вероятно, самый сложный код, который вы можете найти в базовом emacs. Лично я включаю его только для C/C++, но из коробки он будет активен и в некоторых других режимах, включая python. Imenu обычно использует простое регулярное выражение, как вы упомянули в своем редактировании, чтобы найти места перехода.   -  person Rorschach    schedule 16.06.2019
comment
@jenesaisquoi Я также должен упомянуть, что, хотя мне не удалось изменить переменную semantic-active-p, я попытался вызвать imenu напрямую, и это дало те же результаты поиска.   -  person TLE    schedule 16.06.2019
comment
да, потому что, как только вы активируете семантику для python (загружая файл Wisent), он раздражающе установит значение для imenu-create-index-function - это ошибка ИМХО   -  person Rorschach    schedule 16.06.2019
comment
Спасибо, спасибо, спасибо. Итак, я попытался запустить emacs без моего .emacs и использовать imenu, и это показало все функции. Затем я зашел в свой .emacs и просто закомментировал строку, которая активировала семантический режим для файлов python, и вот, helm-semantic-or-imenu теперь отображает все результаты. Достаточно простое решение, но я бы не смог найти его без вашего участия в том, как эта штука устроена. Я немного не уверен в этикете stackoverflow здесь, но если вы вставите это в ответ, я, конечно, отмечу его как решающий ответ.   -  person TLE    schedule 16.06.2019
comment
рад, что это сработало для вас. Причина, по которой я думаю, что это ошибка, заключается в том, что даже если вы не активируете семантику в своем хуке python, но используете его для C/C++ или что-то в этом роде, когда вы открываете буфер C/C++, переменные imenu все равно будут установлены в python буферы, если специально не указать семантике не настраивать эти буферы режима   -  person Rorschach    schedule 16.06.2019


Ответы (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)
        ))
person Rorschach    schedule 16.06.2019