Python 3.x 如何使用helm semantic或imenu对带类型注释的python代码进行代码导航

Python 3.x 如何使用helm semantic或imenu对带类型注释的python代码进行代码导航,python-3.x,emacs,emacs-helm,emacs-semantic,imenu,Python 3.x,Emacs,Emacs Helm,Emacs Semantic,Imenu,我想使用helm semantic或imenu命令来导航带类型注释的Python代码的组件,但是无论使用什么代码分析器来标识组件,似乎都无法识别带类型注释的Python代码。带有返回类型注释的函数根本无法识别,带有注释参数的函数在签名中显示类型而不是参数名称 我遇到的主要问题是,我没有正确理解使这项工作(当它工作时)所涉及的组件。显然,以某种方式更新代码分析器可能会有所帮助,但我在哪个项目中发现了这一点?掌舵?语义的?伊梅努?或者像其他人提到的关于python.el的代码分析?我真的需要一些帮助

我想使用helm semantic或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


我找到了Emacs26.2的源代码,并发现PythonEL似乎确实负责解析python文件的语义。它还在内部使用pythonwy来识别大部分语言组件。但不幸的是,这正是我遇到困难的地方。我希望能够通过re或其他东西来修补识别函数定义的函数,但语义实际上以正确的方式解决了问题。因此,python wy似乎是从一个正式的语法定义文件(在emacs git admin/grammars/python.wy中)自动生成的,并找出如何修改,不幸的是,这远远超出了我的能力。

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

加载特定于语义模式的库时,它们会设置
imenu创建默认创建索引
imenu默认转到函数
,从而使imenu使用语义而不是python.el的imenu函数

要禁用python文件的语义支持,您可以自定义
语义新缓冲区设置函数
,只为需要语义支持的模式添加条目,例如在语义挂钩中(或者使用自定义UI)


您正在尝试使用semantic还是imenu?semantic的代码分析器位于语义库中,python.el提供了一个imenu函数,用于查找所有函数名,但不会提供参数/类型。如果
(semantic-active-p)
在python缓冲区中为非nil,则
helm semantic或imenu
将优先使用语义而不是imenu@jenesaisquoi感谢您的回复。现在我明白了,使用其中一个是一种选择,我想说的是,哪一个函数为搜索提供组件并不重要,只要该组件能够识别pe注释的函数定义。显然,参数名称最好是有,但不是必需的。在上面的python缓冲区中计算
(semantic-active-p)
将返回
t
。我尝试使用
(setq semantic-active-p nil)将其设置为
nil
但没有成功。我如何修改它?为我糟糕的elisp foo道歉,但我始终是emacs用户而不是modder。不用担心,cedet/semantic包可能是在基本emacs中可以找到的最复杂的代码。我个人只在C/C++中启用它,但它在其他一些模式(包括pytho)中会立即激活n、 Imenu通常使用一个简单的正则表达式,正如您在编辑中提到的,以查找跳转locations@jenesaisquoi我还应该提到,虽然我无法修改
semantic-active-p
变量,但我尝试直接调用
imenu
,它给出了相同的sarch结果。是的,因为一旦激活了python的semantic(加载wisent文件)它将设置
imenu create index函数的值,这是一个错误
(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)
        ))