8

我花了很多时间弄清楚如何在 neovim 中使用 Python (3) 的语言服务器协议 (LSP)。主要是我正在寻找 Python 3 的自动完成功能,它是 PySide2 之类的模块。

可悲的是,我无法让我的配置文件 (.config/vim/init.vim) 工作。我知道github上有很多。但是它们包含了很多额外的功能,以至于我还不能根据我的需要来调整其中的一个。还有一些也已经过时了。

所以这是我迄今为止尝试过的:

www.langserver.org 有很长的语言客户端和服务器列表。

我为 Python 安装了 Palantir 语言服务器协议(https://github.com/palantir/python-language-server):

pip3 install 'python-language-server[all]'

在下一步中,我通过 vim-plug 为 neovim 安装了一个语言客户端。实际上我尝试了几个,但让我们坚持以 ale 为例(https://github.com/dense-analysis/ale):

call plug#begin('~/.local/share/nvim/plugged')
" Plugins:
Plug 'dense-analysis/ale'

" Initialize plugin system
call plug#end()

并通过安装它:PlugInstall

然后必须在加载 Ale 之前进行自动完成设置:

" initialize before ale is loaded
let g:ale_completion_enabled = 1

要与 Omnicompletion 一起使用,还需要另外一项设置:

set omnifunc=ale#completion#OmniFunc

经过一番谷歌搜索后,我读到我必须注册语言服务器(https://vi.stackexchange.com/questions/20958/use-the-pyls-python-lsp-with-ale-on-neovim):

if executable('pyls')
    au User lsp_setup call lsp#register_server({
        \ 'name': 'pyls',
        \ 'cmd': {server_info->['pyls']},
        \ 'whitelist': ['python'],
        \ })
endif

这给了我最终的 init.vim:

" Specify a directory for plugins
" - For Neovim: ~/.local/share/nvim/plugged
" - Avoid using standard Vim directory names like 'plugin'
call plug#begin('~/.local/share/nvim/plugged')
" Plugins go here:

" Language Server Client
Plug 'dense-analysis/ale'

" initialize before ale is loaded
" is that the right spot?
let g:ale_completion_enabled = 1

" Initialize plugin system
call plug#end()

set omnifunc=ale#completion#OmniFunc

" register the language server
if executable('pyls')
    au User lsp_setup call lsp#register_server({
        \ 'name': 'pyls',
        \ 'cmd': {server_info->['pyls']},
        \ 'whitelist': ['python'],
        \ })
endif

如果我现在打开如下所示的文件并PySide2.在 nvim 中仅获得以下屏幕后按 Ctrl + N 完成:

#!/usr/bin/env python

>>from PySide2.usr 
--             usr            
~              bin            
~              env            
~              python         
~              from           
~              PySide2        
~

它只是一个已经出现在文件中的单词的列表——就像普通的 Omnicompletion 一样,但不是 PySide2 库中的模块。

我只是在寻找一种简约的配置来通过 LSP 启用自动完成功能。

4

4 回答 4

6

coc.nvim 比 lsp 的 ale 更容易设置

vimrc:

Plug 'neoclide/coc.nvim', {'branch': 'release'}

然后从 vim8/nvim 中:

:PlugInstall
:CocInstall coc-python
于 2020-01-05T13:01:22.427 回答
2

自我回复1:

我还没有放弃这个。我找到了以下有用的链接并想分享这个: https ://yufanlu.net/2018/09/03/neovim-python/

实际上,并非一切都与链接中显示的设置完美配合,但它已经向我展示了我犯的一些错误。

但链接中的 ALE 插件已过时,因此您必须更改以下行:

Plug 'w0rp/ale'

到这一行:

Plug 'dense-analysis/ale'

我假设。

于 2019-12-24T16:25:46.080 回答
0

请注意,最新版本的 neovim 内置了语言服务器 (LSP) 支持。我的 ~/.vimrc 的相关部分如下所示:

call plug#begin('~/.vim/plugged')
:Plug 'neovim/nvim-lsp'
call plug#end()

lua<<
    local status, nvim_lsp = pcall(require, "nvim_lsp")
    if(status) then
        nvim_lsp.pyls.setup{}
    end
.

在此期间,我完全建议添加nnoremap <silent> <F5> <cmd>lua vim.lsp.buf.formatting()<CR>. 拥有 F5 绑定重新格式化功能让我立即进入了 LSP 生态系统。

于 2021-12-07T16:45:30.567 回答
0

自我回复2:

好的,Python 还没有 LSP。但我得到了对我来说最重要的功能,自动完成。实际上这需要三个插件:jedi-vim、deoplete.nvim 和 deoplete-jedi。现在 nvim 在您键入时显示潜在的语法。配置文件仍然很简单:

call plug#begin('~/.local/share/nvim/plugged')
" Plugins:

" autocompletion for Python
Plug 'davidhalter/jedi-vim'

" show autocompletion
if has('nvim')
  Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
else
  Plug 'Shougo/deoplete.nvim'
  Plug 'roxma/nvim-yarp'
  Plug 'roxma/vim-hug-neovim-rpc'
endif
" further plugin for autocompletion
Plug 'deoplete-plugins/deoplete-jedi'

" Initialize plugin system
call plug#end()

" enable deoplete
let g:deoplete#enable_at_startup = 1

第一次使用自动完成时,会有一点延迟,因为它需要一些时间来加载。但之后建议很快就会显示出来。您可以通过箭头键或<Ctrl>-Nand来切换列表<Ctrl>-P,最后<Enter>通过选定的表达式。

当然,nvim 需要 Python 可用:

pip3 install --user neovim
于 2019-12-24T16:56:37.217 回答