我想使用helm-semantic-or-imenu命令浏览带注释类型的Python代码的组件,但是使用任何代码分析器来识别组件,似乎都无法识别带注释类型的python代码。带有返回类型注释的函数根本无法识别,带有注解参数的函数将显示类型,而不是签名
中的参数名称。我遇到的主要问题是,我不正确地理解完成这项工作所涉及的组件(当它起作用时)。显然,这可能有助于以某种方式更新代码分析器,但是我在哪个项目中找到它?舵?语义? 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中)自动生成的,并且弄清楚如何修改那个,这很不幸超出了我的能力范围。
答案 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-imenu
和imenu-create-default-create-index
,从而导致imenu使用语义而不是python.el的imenu函数。
要禁用对python文件的语义支持,您可以自定义imenu-default-goto-function
,仅添加想要语义支持的模式的条目,例如。在您的语义钩子中(或使用自定义UI),
semantic-new-buffer-setup-functions