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

时间:2019-06-14 19:44:20

标签: python-3.x emacs emacs-helm emacs-semantic imenu

我想使用helm-semantic-or-imenu命令浏览带注释类型的Python代码的组件,但是使用任何代码分析器来识别组件,似乎都无法识别带注释类型的python代码。带有返回类型注释的函数根本无法识别,带有注解参数的函数将显示类型,而不是签名see screenshot

中的参数名称。

我遇到的主要问题是,我不正确地理解完成这项工作所涉及的组件(当它起作用时)。显然,这可能有助于以某种方式更新代码分析器,但是我在哪个项目中找到它?舵?语义? imenu?还是正如其他人提到的有关代码分析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中)自动生成的,并且弄清楚如何修改那个,这很不幸超出了我的能力范围。

1 个答案:

答案 0 :(得分:1)

语义python后端似乎无法正确解析类型注释(据我所知,这些库没有什么新近发展)。由于import { Component, OnInit, Input } from '@angular/core'; import { IdashService } from '../services/idash.service'; @Component({ selector: 'app-idash-widget', template: ` <div class="card-body"> <h5 *ngIf="widgetConfig.title" class="card-title">{{widgetConfig.title}}</h5> <!-- I want the component here with the [data] attribute set to this.data --> </div> ` }) export class IdashWidgetComponent implements OnInit { @Input() widgetConfig; widget; data; constructor(private idashService: IdashService) { this.data = { someKey: 'someValue' } } ngOnInit() { this.widget = this.idashService.moduleConfig.widgets[this.widgetConfig.type]; console.warn(this.widget, this.data) } } 处于活动状态时会优先使用语义,因此可以完全禁用python缓冲区的语义,除非您使用其其他功能(我个人仅将其用于C / C ++)。

在加载特定于语义模式的库时,它们会设置helm-semantic-or-imenuimenu-create-default-create-index,从而导致imenu使用语义而不是python.el的imenu函数。

要禁用对python文件的语义支持,您可以自定义imenu-default-goto-function,仅添加想要语义支持的模式的条目,例如。在您的语义钩子中(或使用自定义UI),

semantic-new-buffer-setup-functions