-
题外话,国内的博客为什么都是抄来抄去呢,还是要自己实践一下
-
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'), '
')
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补全插件
-
coc-phpactor 是php7以上才可以用
-
coc-phpls 一般都用这个
-
第一步 需要安装Intelephense
npm i intelephense -g
-
第二步打开vim, 安装coc-phpls
CocInstall coc-phpls
-
第三步 配置php language server
- 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
- 都是一个套路:
-
- 找到所需的插件,比如coc-python 安装他需要的依赖,一般插件后面会提到
-
- vim中安装coc扩展 CocInstall coc-python
-
- vim来打配置CocConfig,添加对应语言的server配置
-
- 所以LSP是一个cs结构的,有服务端也就是node进程, 客户端就是vim编辑器