【问题标题】:How to use helm-semantic-or-imenu for code navigation with type annotated python code如何使用 helm-semantic-or-imenu 进行带有类型注释的 python 代码的代码导航
【发布时间】: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


【解决方案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)
        ))

【讨论】:

    猜你喜欢
    • 2020-06-06
    • 2014-07-29
    • 2013-08-03
    • 1970-01-01
    • 2017-02-28
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多