【发布时间】:2019-06-14 19:44:20
【问题描述】:
我想使用 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 中)自动生成的,并且弄清楚如何修改 that 不幸的是,这远远超出了我的能力。
【问题讨论】:
-
您是在尝试使用语义还是 imenu?语义的代码分析器在语义库中,python.el 提供了一个 imenu 函数来查找所有函数名称,但不会提供参数/类型。如果
(semantic-active-p)在您的python 缓冲区中不是零,那么helm-semantic-or-imenu将更喜欢语义而不是imenu -
@jenesaisquoi 感谢您的回复。所以现在理解,使用其中一个是一种选择,我会说哪个函数为搜索提供组件并不重要,只要该组件识别类型注释的函数定义即可。显然,参数名称会很好,但不是必需的。在上面的 python 缓冲区中评估
(semantic-active-p)会返回t。我试图用(setq semantic-active-p nil)将它设置为nil,但没有成功。我该如何修改它?为我糟糕的 elisp foo 道歉,但我一直是 emacs 用户而不是 modder。 -
不用担心,cedet/semantic 包可能是您在基本 emacs 中可以找到的最复杂的代码。就我个人而言,我只为 C/C++ 启用它,但开箱即用,它将在包括 python 在内的其他一些模式下处于活动状态。正如您在编辑中提到的那样,Imenu 通常使用简单的正则表达式来查找跳转位置
-
@jenesaisquoi 我还应该提到,虽然我无法修改
semantic-active-p变量,但我确实尝试直接调用imenu,它给出了相同的搜索结果。 -
是的,因为一旦您为 python 激活语义(加载 wisent 文件),它就会烦人地设置
imenu-create-index-function的值——恕我直言,这是一个错误
标签: python-3.x emacs emacs-helm emacs-semantic imenu