我在 vim 中通过 YCM 使用 jedi,在我的项目中看到一些奇怪的行为,关于在 jediHttp 服务器上使用 usages
端点。基本上它只能找到我项目中类或函数的一小部分用法。它确实找到了当前文件中的所有用法,但没有找到其他文件中的绝大多数。 GoTo
命令工作正常,将按预期在项目中的任何位置打开一个新缓冲区。但是,当我从定义开始并尝试通过 GoToReferences
命令查看所有 usages
时,它只产生了大约 20% 的实际用法。
我尝试制作一个虚拟项目来重现行为,它似乎奏效了。这是简单的项目结构:
> tree -I __pycache__
.
├── setup.py
└── test_jedi
├── classes.py
├── __init__.py
├── mod1
│ ├── __init__.py
│ └── recessed.py
└── script.py
2 directories, 6 files
这些文件的内容如下:
类.py
class Foo:
def __init__(self, a):
self.a = a
def make_a(self):
print('hello')
mod1/recessed.py:
from test_jedi.classes import Foo
Foo(5).make_a()
print('Ran this')
脚本.py:
from classes import Foo
a = Foo(5)
a.make_a()
现在,在缓冲区中带有 recessed.py 的 vim 中,我可以在 Foo
上使用 GoTo
立即打开 classes.py
缓冲。然后,当我从 classes.py
缓冲区尝试 GoToReferences
时,我只在 script.py
和类.py
。我不知道为什么 jedi 没有向我显示 recessed.py
这是显示的 quickfix 缓冲区:
classes.py|2 col 7| class Foo
script.py|2 col 21| from classes import Foo
script.py|5 col 5| a = Foo(5)
但显然没有引用 mod1/recessed.py,它显然使用了 Foo
。
有什么想法吗?
请您参考如下方法:
我知道这个问题已有 1.5 年历史了,但为了像我一样遇到这个问题的人,它与 Jedi 中当前 Unresolved 问题有关。
Jedi script.usages
由 YouCompleteMe 在其 GoToReferences
函数中使用。然而,根据作者的说法,script.usages
在很多地方都有错误。他非常清楚这个问题,但目前它的优先级较低。