如题所示, 没找到配置文档.
刚用pyls, 发现python的补全有时候挺难实现, 比如定义一个方法, 参数是没有类型的, 方法的实现代码里, 把参数当作一个类的对象来用, 而language server并不知道它是哪个类, 没法补全, 只有当该变量有值了之后才能补全, js难道都是这样吗?
如题所示, 没找到配置文档.
刚用pyls, 发现python的补全有时候挺难实现, 比如定义一个方法, 参数是没有类型的, 方法的实现代码里, 把参数当作一个类的对象来用, 而language server并不知道它是哪个类, 没法补全, 只有当该变量有值了之后才能补全, js难道都是这样吗?
@netjune .#test.py
并不是临时/备份文件,而是 LockFiles,并且它是一个链接符号(指向一个不存在的随机文件),用来锁定文件编辑状态。当另一个 Emacs 打开同一个文件时,会看到提示。
由于这个链接符号的名字只加了前缀 .#
,其后缀仍然是 lsp 可识别的,所以就当作正常文件处理了,然后就出错了。
简单的解决方案:
(setq create-lockfiles nil)
可能我安装的不对 pyls只找到2010年更新的版本
jedi 找到了2018年的
图片没什么用 只是想说明Jedi也能补全
给个链接呗(^_^)
喔 有链接啊
看来真的是我找的不对
这配色看得眼瞎, 看不清啊
这方法可以临时用一下, 更希望pyls可配置. 谢谢.
我hack了一下
File "/usr/lib/python3.6/site-packages/pyls/plugins/highlight.py", line 10, i\
n pyls_document_highlight
usages = document.jedi_script(position).usages()
File "/usr/lib/python3.6/site-packages/jedi/api/__init__.py", line 260, in us\
ages
names = usages.usages(cc_module, tree_name)
File "/usr/lib/python3.6/site-packages/jedi/evaluate/usages.py", line 45, in \
usages
for m in imports.get_modules_containing_name(module_context.evaluator, modu\
les, search_name):
File "/usr/lib/python3.6/site-packages/jedi/evaluate/imports.py", line 569, i\
n get_modules_containing_name
m = check_fs(p)
File "/usr/lib/python3.6/site-packages/jedi/evaluate/imports.py", line 536, i\
n check_fs
with open(path, 'rb') as f:
FileNotFoundError: [Errno 2] No such file or directory: '/home/chong/python/.\
#tt.py'
def check_fs(path):
path_str = str(path)
if path_str.find("#") > -1 :
return None
with open(path, 'rb') as f:
觉得他的eldoc的显示方式不够好
写了个小函数,好像更不好了,不仅会乱跳 popup-tip 还影响按键
只能在看代码的时候用,写代码千万不能用
(require 'lsp-python)
(defun python-popup (format-string &rest args)
(let ((str))
(setq str (format format-string args))
(popup-tip str)
))
(add-hook 'python-mode-hook
'(lambda ()
(lsp-python-enable)
(add-to-list (make-local-variable 'company-backends)
'company-lsp)
(make-local-variable 'eldoc-message-function)
(setq eldoc-message-function 'python-popup)
)
)
目前好像也没有别的解决方案:
lsp 协议没有规定如何忽略文件(我印象中是这样的),就看 pyls/jedi 能否忽略了,可以试试 tox.ini
。
lockfile 的前后缀如果可配置,问题也就有解了,但它偏偏是硬编码写在 c 函数里:
没有看我写的呦
在 check_directories
就把文件过滤掉,后面就可省略不必要的 check_fs 调用:
最好是可配置,除了 lockfile,还有其他需要忽略的文件。
钻研精神佩服:+1: 这个方法可以
这方法也不错. 没怎么用过这类语言, 不知道vscode里的js是怎么做的.
这个要看每种language server的工程的概念是什么, 越严格越好. 其实类似gitignore的语法格式也不错.
tox.ini不太熟悉, 我搜一下看看.
可能是为了保证不同配置的emacs都可以识别lock文件吧
改成了这样:
def check_directories(paths):
for p in paths:
if p is not None:
# We need abspath, because the seetings paths might not already
# have been converted to absolute paths.
d = os.path.dirname(os.path.abspath(p))
for file_name in os.listdir(d):
if file_name.startswith("."):
continue
path = os.path.join(d, file_name)
if file_name.endswith('.py'):
yield path
不报错了, 不过用起来卡顿挺明显, 不知道怎么回事, pyc也重新生成了.
假如用户配置文件里修改了这个变量,用emacs -Q的时候就不会识别lock文件了