2

我想使用 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 中)自动生成的,不幸的是,弄清楚如何修改远远超出了我的能力。

4

1 回答 1

1

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

当加载特定于语义模式的库时,它们设置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)
        ))
于 2019-06-16T10:56:13.943 回答