vlambda博客
学习文章列表

阿chai的Neovim配置:LSP还是“LSP”

今天我们继续neonvim相关的配置教程,介绍鼎鼎大名的“LSP”。第一次看的小伙伴请移步如下推文链接。



LSP还是“LSP”

LSP并不是小伙伴中的“LSP”,全称是Language Server Protocol,支持各种编程语言,可通过lua语言在nvim中完成配置。nvim-lsp的官方链接如下:

https://github.com/neovim/nvim-lspconfig.git

可能这样还是不明白,那我们说成大白话,比如在IDE中存在各种查找等等功能,都需要依托LSP。

LSP的配置非常简单,因为nvim中已经包含了语言服务器协议的客户端,因此我们安装nvim-lspconfig即可。

在plug.vim中添加:

Plug 'neovim/nvim-lspconfig'

然后我们重新启动nvim后输入:PlugInstall即可完成安装。

阿chai的Neovim配置:LSP还是“LSP”

pluginstall

安装之后的效果如下:

阿chai的Neovim配置:LSP还是“LSP”

install_resault

然后我们进行进一步的LSP配置。

“佛系”入口

对于了解和听过vim的小伙伴其实可以想到,配置vim的插件虽说很省心还是也是需要折腾一会的,如果您想开箱即用阿chai的配置,那看这里。

阿chai的配置放到自己的配置文件夹后,输入如下命令进行配置。

我们首先在plug.vim中确认的是否有:

Plug 'hrsh7th/cmp-nvim-lsp'
Plug 'hrsh7th/cmp-buffer'

然后输入:PlugInstall进行安装。其他配置阿chai已经帮小伙伴们写好。

在安装完成后在你所在的环境中安装npm。如果不安装,在python的补全没什么影响,但是别的语言可能会无法使用。npm的安装可参考阿chai之前的推文。

然后我们可以看一下LSP的docs中的python插件:

阿chai的Neovim配置:LSP还是“LSP”

python_lsp

阿chai一般使用第一种。

Mac

$ pip install 'python-lsp-server[all]' #使用pip

也可以使用npm安装,详细内容可以去如官方链接查看:

https://github.com/python-lsp/python-lsp-server

Kali Linux

$ pip install 'python-lsp-server[all]' #使用pip

注意,如果是通过conda或者pip创建的虚拟环境,在环境中如果想使用一定要重新安装一下pylsp,要不会无法使用。

我们创建一个123.py发现已经可以进行补全:

阿chai的Neovim配置:LSP还是“LSP”
图片

其他的跳转,查找等可自行根据官方文件去阿chai的配置文件中查看。

自己动手

如果想自己动手配置一下请看这里的介绍。

我们看一下配置中lsp-tree:

lsp-config
├── lsp-colors.rc.vim
├── lspconfig.rc.vim
├── lspkind.rc.lua
├── lspsaga.rc.vim

1. definition跳转

按下gd可进行跳转:

-- Mappings.
  local opts = { noremap=true, silent=true }
  buf_set_keymap('n', 'gD', '<Cmd>lua vim.lsp.buf.declaration()<CR>', opts)
  buf_set_keymap('n', 'gd', '<Cmd>lua vim.lsp.buf.definition()<CR>', opts)
  --...
end

2. LSP-UI 设置

首先在plug上添加:

Plug 'glepnir/lspsaga.nvim'

输入:PlugInstall安装,然后输入如下设置:

local saga = require 'lspsaga'
saga.init_lsp_saga {
  error_sign = '',
  warn_sign = '',
  hint_sign = '',
  infor_sign = '',
  border_style = "round",
}

3. 其他快捷键设置

a. Doc悬停

设置后输入Shift+K可实现操作:

nnoremap <silent>K :Lspsaga hover_doc<CR>
b. Signature

设置后按下Ctrl+K可实现操作:

inoremap <silent> <C-k> <Cmd>Lspsaga signature_help<CR>
c. Finder
nnoremap <silent> gh <Cmd>Lspsaga lsp_finder<CR>
d. Diagnostics

我们首先安装语言诊断插件(npm用上了):

$ npm install -g diagnostic-languageserver

我们看一下设置文件:

nvim_lsp.diagnosticls.setup {
  on_attach = on_attach,
  filetypes = { 'javascript', 'javascriptreact', 'json', 'typescript', 'typescriptreact', 'css', 'less', 'scss', 'pandoc' , 'python'},
  init_options = {
    linters = {
      eslint = {
        command = 'eslint_d',
        rootPatterns = { '.git' },
        debounce = 100,
        args = { '--stdin', '--stdin-filename', '%filepath', '--format', 'json' },
        sourceName = 'eslint_d',
        parseJson = {
          errorsRoot = '[0].messages',
          line = 'line',
          column = 'column',
          endLine = 'endLine',
          endColumn = 'endColumn',
          message = '[eslint] ${message} [${ruleId}]',
          security = 'severity'
        },
        securities = {
          [2] = 'error',
          [1] = 'warning'
        }
      },
    },
    filetypes = {
      javascript = 'eslint',
      javascriptreact = 'eslint',
      typescript = 'eslint',
      typescriptreact = 'eslint',
    },
    formatters = {
      eslint_d = {
        command = 'eslint_d',
        rootPatterns = { '.git' },
        args = { '--stdin', '--stdin-filename', '%filename', '--fix-to-stdout' },
        rootPatterns = { '.git' },
      },
      prettier = {
        command = 'prettier_d_slim',
        rootPatterns = { '.git' },
        -- requiredFiles: { 'prettier.config.js' },
        args = { '--stdin', '--stdin-filepath', '%filename' }
      }
    },
    formatFiletypes = {
      css = 'prettier',
      javascript = 'prettier',
      javascriptreact = 'prettier',
      json = 'prettier',
      scss = 'prettier',
      less = 'prettier',
      typescript = 'prettier',
      typescriptreact = 'prettier',
      json = 'prettier',
    }
  }
}

e.诊断标志设置

在lsp-config中:

-- icon
vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(
  vim.lsp.diagnostic.on_publish_diagnostics, {
    underline = true,
    -- This sets the spacing and the prefix, obviously.
    virtual_text = {
      spacing = 4,
      prefix = ''
    }
  }
)

额外的C/C++

阿chai push倒github的配置中并没有写C/C++怎样配置,那么在这里给大家简单的说一下操作的方法。

C/C++的配置方式与python类似,也在lsp的docs中有说明,我们这里用ccls。

如果是Mac 上的用户也可以用这个,最新的版本支持clang。

a. llvm

我们首先安装llvm:

$ brew install llvm  # MacOS
$ sudo apt-get install llvm # Kali Linux
b. npm

然后我们安装npm,如果是Mac M1的虚拟机或者是直接装Linux,安装npm不建议源码编译,因为太久了。不过这里阿chai也附上过程。

源码编译指令(默认路径:/usr/local/bin):

cd your_path
$ ./configure
$ make -j4 # 根据自己的设备调整
$ sudo make install

测试:

$ npm --version
$ node --version
c. coc-ccls

在plug.vim中添加:

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

使用:PlugInstall安装。

然后我们

然后我们在nvim中输入CocConfig进入配置文件,复制如下脚本:

"languageserver": {
    "ccls": {
      "command""ccls",
      "filetypes": ["c""cpp""objc""objcpp"],
      "rootPatterns": [".ccls""compile_commands.json"".vim/"".git/"".hg/"],
      "initializationOptions": {
         "cache": {
           "directory""/tmp/ccls"
         }
      }
   }
}

输入:CocInstall coc-json等待一会完成

我们创建一个123.cpp的文件,就可以看到补全效果:

阿chai的Neovim配置:LSP还是“LSP”

C++

其他的配置小伙伴们可以参考上述的介绍。



LSP的介绍我们到这里结束,喜欢的小伙伴可以继续关注官方的插件配置。