首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Neovim中使用Python的语言服务器协议

如何在Neovim中使用Python的语言服务器协议
EN

Stack Overflow用户
提问于 2019-12-21 20:18:55
回答 4查看 7K关注 0票数 7

我花了相当多的时间研究如何在neovim中使用Python (3)的语言服务器协议(LSP)。主要是我在寻找Python3的自动补全功能,以及像PySide2这样的模块。

遗憾的是,我的配置文件(.config/vim/init.vim)无法正常工作。我知道在github上有很多这样的东西。但它们包含了如此多的附加功能,以至于我还不能根据自己的需求调整其中的一个。还有一些也是过时的。

因此,到目前为止,我尝试了以下内容:

www.langserver.org有一个相当长的语言客户端和服务器列表。

我安装了Palantirs Language Server Protocol for Python (https://github.com/palantir/python-language-server):

代码语言:javascript
复制
pip3 install 'python-language-server[all]'

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

代码语言:javascript
复制
call plug#begin('~/.local/share/nvim/plugged')
" Plugins:
Plug 'dense-analysis/ale'

" Initialize plugin system
call plug#end()

并通过:PlugInstall安装

然后,必须在加载Ale之前进行设置,以使自动完成生效:

代码语言:javascript
复制
" initialize before ale is loaded
let g:ale_completion_enabled = 1

对于Omnicompletion的使用,还需要一个设置:

代码语言:javascript
复制
set omnifunc=ale#completion#OmniFunc

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

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

这给了我最终的init.vim:

代码语言:javascript
复制
" 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.后按Ctrl +N完成,我在nvim中只会看到以下屏幕:

代码语言:javascript
复制
#!/usr/bin/env python

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

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

我只是在寻找一个最低限度的配置,以启用通过LSP的自动完成。

EN

回答 4

Stack Overflow用户

发布于 2020-01-05 21:01:22

对于lsp,coc.nvim比ale更容易设置

vimrc:

代码语言:javascript
复制
Plug 'neoclide/coc.nvim', {'branch': 'release'}

然后在vim8/nvim中:

代码语言:javascript
复制
:PlugInstall
:CocInstall coc-python
票数 6
EN

Stack Overflow用户

发布于 2019-12-25 00:25:46

自助回复1:

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

实际上,并不是所有的东西都能与链接中显示的设置完美配合,但它已经向我展示了我犯下的一些错误。

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

代码语言:javascript
复制
Plug 'w0rp/ale'

到这一行:

代码语言:javascript
复制
Plug 'dense-analysis/ale'

我想是吧。

票数 2
EN

Stack Overflow用户

发布于 2019-12-25 00:56:37

自助回复2:

好吧,目前还没有针对Python的LSP。但是我得到了对我来说最重要的功能,自动补全。实际上,这需要三个插件: jedi-vim,deoplete.nvim和deoplete jedi。现在,nvim在您输入时显示了潜在的语法。配置文件仍然非常简单:

代码语言:javascript
复制
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>-N<Ctrl>-P在列表之间切换,最后<Enter>将传递选定的表达式。

当然,nvim需要Python才能使用:

代码语言:javascript
复制
pip3 install --user neovim
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59436119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档