如何使用 helm-semantic-or-imenu 进行带有类型注释 python 代码的代码导航

How to use helm-semantic-or-imenu for code navigation with type annotated python code

我想使用 helm-semantic-or-imenu 命令来导航带注释类型 Python 代码的组件,但是无论使用什么代码分析器来识别组件似乎都无法识别带注释类型 python代码。带有 return 类型注释的函数根本无法识别,带有注释参数的函数在签名中显示类型而不是参数名称

我的主要问题是我没有正确理解使这项工作(当它工作时)所涉及的组件。显然,以某种方式更新代码分析器可能会有所帮助,但我在哪个项目中找到了它?舵?语义?菜单?或者正如有人在其他地方提到的关于代码分析 python.el?我真的可以使用一些帮助开始解决这个问题。如果在 python.el 中找到了代码分析器,我可以尝试修改并使 emacs 优先使用本地版本而不是已安装的版本吗?

编辑: 在制作了最初的 post 之后,我终于在试图找出组件的来源方面取得了突破。我在所有文件系统系统中搜索 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 似乎是 auto-generated 来自正式的语法定义文件(在 emacs git admin/grammars/python.wy 中)并弄清楚如何修改 that 不幸的是,这远远超出了我的能力范围。

语义 python 后端似乎无法正确解析类型注释(据我所知,这些库最近没有太多开发)。由于 helm-semantic-or-imenu 在激活时支持语义,你可以为 python 缓冲区完全禁用语义,除非你使用它的其他功能(我个人只将它用于 C/C++)。

加载语义 mode-specific 库时,它们会设置 imenu-create-default-create-indeximenu-default-goto-function,导致 imenu 使用语义而不是 python.el 的 imenu 函数。

要禁用对 python 文件的语义支持,您可以自定义 semantic-new-buffer-setup-functions,只为您想要语义支持的模式添加条目,例如。在你的语义挂钩中(或者使用自定义 UI),

(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)
        ))