• 题外话,国内的博客为什么都是抄来抄去呢,还是要自己实践一下
  • coc插件原理 vscode 补全利用的是LSP (language server protocol), 简单理解就是编辑时启动一个进程,补全过程就类似app请求服务器得到补全数据。这就是为什么要装node,服务进程都是node启动。

第一步 安装nvim

  • 首先你需要 安装vim8 或者nvim 我测试的是macos
  • 如果是nvim, 需要把nvim 的配置文件做一次软链接指向 ~/.vimrc 这是延续以前的vim配置方式, 不做的话,只能修改./config/nvim/init.vim , 因为nvim的配置默认读取这个文件。
  • 以下提到的vim都是指的nvim,我在/etc/profile alias vim=“nvim” 了
ln -s ~/.config/nvim/init.vim ~/.vimrc

第二步 安装nvim插件管理器 Vim-plug

curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

第三步 安装coc插件

  • 以上两步完成之后,可以添加coc插件,我的配置如下
set nu  " 显示行号  
" 插件列表    
" 插件加载目录 .config/nvim/plugged ,也可以是.vim/plugged 随便都可以, 以后太会下载到这个目录,启动vim也会加载这里的插件

call plug#begin('~/.config/nvim/plugged')  " 开始语句    
Plug 'neoclide/coc.nvim', {'branch': 'release'}   " 这是coc.nvim 插件
Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }    " 这是go语言补全需要的插件
    
call plug#end() " 结束语句
    
let s:script_cwd = expand('<sfile>:p:h')    
let s:source_list = [    
      \ 'viml',    
      \ 'config',    
      \]    
    
for s:item in s:source_list    
  let s:path = split(globpath(s:script_cwd . '/' . s:item, '*.vim'), '\n')    
  for s:cfg in s:path    
    if filereadable(s:cfg)    
      execute 'source ' . s:cfg    
    endif    
  endfor    
endfor    
    
unlet s:script_cwd    
unlet s:source_list    
    
" 这两句是针对go插件的配置设定
let g:go_def_mode='gopls'    
let g:go_info_mode='gopls'
  • 其余的配置我也不太清楚,暂且不管,最终要的是结果是利用coc补全各种语言…

第四步 如何安装php补全插件

npm i intelephense -g
  • 第二步打开vim, 安装coc-phpls
CocInstall coc-phpls
  • vim : CocConfig
  • 会默认打开一个配置文件
```
  {    
    "languageserver": {    
  	 "intelephense": {    
  		"command": "intelephense",    
  		"args": ["--stdio"],    
  		"filetypes": ["php"],    
  		"initializationOptions": {    
  			"storagePath": "/Users/kunming/php/"    
  		}    
  	}
  }
```
  • 这里外面的intelephense表示配置的名称
  • command里面的intelephense是一个文件
  • args 表示可执行文件后面的参数
  • 比如你打开一个php文件,ps命令可以看到系统会启动一个进程 node /usr/local/bin/intelephense --stdio
  • 有一个索引js的进程/usr/local/bin/node --no-warnings /Users/kunming/.SpaceVim/plugged/coc.nvim/build/index.js
  • node还会启动一个进程类似这样/usr/local/Cellar/node/14.1.0/bin/node /Users/kunming/.config/coc/extensions/node_modules/coc-phpls/node_modules/intelephense/lib/intelephense.js --node-ipc --clientProcessId=72264
  • filetypes 指定了对php文件有效
  • storagePath 表示初始化信息存储的位置,据我观察应该是打开一个文件,进程为php建立补全信息建立的索引日志文件,安装intelephense,会附带好多php文件,常见的php库,也是为了建立索引用的,初次编辑一个php文件,这个目录会有28872930这样的文件夹生成。
  • 最重要的:只有你在storagePath目录下建立的php文件或者项目,vim编辑才会出现补全提示,在别的目录是没有提示的,这一点研究了好久才感觉出来,文档也没说这些。

其余插件,我只安装了go的coc扩展和python的coc扩展,go扩展需要提前安装fatih/vim-go来支持

  • 同样每次编辑他们的文件都会启动一个类似node进程/usr/local/bin/node --no-warnings /Users/kunming/.SpaceVim/plugged/coc.nvim/build/index.js
  • 都是一个套路:
  1. 找到所需的插件,比如coc-python 安装他需要的依赖,一般插件后面会提到
  2. vim中安装coc扩展 CocInstall coc-python
  3. vim来打配置CocConfig,添加对应语言的server配置
  4. 所以LSP是一个cs结构的,有服务端也就是node进程, 客户端就是vim编辑器