-
題外話,國內的博客為什么都是抄來抄去呢,還是要自己實踐一下
-
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補全插件
-
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編輯器