如何让pyls忽略临时文件? 比如emacs的.#test.py?

如题所示, 没找到配置文档.

刚用pyls, 发现python的补全有时候挺难实现, 比如定义一个方法, 参数是没有类型的, 方法的实现代码里, 把参数当作一个类的对象来用, 而language server并不知道它是哪个类, 没法补全, 只有当该变量有值了之后才能补全, js难道都是这样吗?

还是用 jedi 吧 pyls 在 python3.6 不能用

@netjune .#test.py 并不是临时/备份文件,而是 LockFiles,并且它是一个链接符号(指向一个不存在的随机文件),用来锁定文件编辑状态。当另一个 Emacs 打开同一个文件时,会看到提示。

由于这个链接符号的名字只加了前缀 .#,其后缀仍然是 lsp 可识别的,所以就当作正常文件处理了,然后就出错了。

简单的解决方案:

(setq create-lockfiles nil)

@zhouchongzxc

  1. pyls 可在 python3.6 下使用
  2. 贴图什么意思?

可能我安装的不对 pyls只找到2010年更新的版本

jedi 找到了2018年的

图片没什么用 只是想说明Jedi也能补全

  • 2010 年还没有 lsp,也就不会有 pyls
  • pyls 的补全就是基于 jedi

给个链接呗(^_^)

喔 有链接啊

看来真的是我找的不对

这配色看得眼瞎, 看不清啊

这方法可以临时用一下, 更希望pyls可配置. 谢谢.

我hack了一下

  1. 找出Exception — C-x b *lsp-python stderr* 会有如下的信息
  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'
  1. 然后修改 check_fs 函数。"/usr/lib/python3.6/site-packages/jedi/evaluate/imports.py", line 536 变成如下

    def check_fs(path):
        path_str = str(path)
        if path_str.find("#") > -1 :
            return None
        with open(path, 'rb') as f:
  1. 重新生成 pycache
    这个我真的不知道怎么回事,反正我就是找了个jedi的例子 然后sudo 运行了一下

关于第二个问题:定义一个方法, 参数是没有类型

好像已经用docstr解决了

下面的图展示如何给参数设类型

下面的图展示函数的返回值

觉得他的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 函数里:

没有看我写的呦

1 个赞

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文件了