SpaceVim
SpaceVim 同时支持 Vim 和 Neovim,但是 Neovim 在很多 Linux 发行版有更好的扩展,像 Debian 默认的 Vim 包是缺少 lua 的编译支持,很多插件就没法用上。所以这里以 Neovim 来使用作为 SpaceVim 的编辑器。
安装
curl -sLf https://spacevim.org/install.sh | bash
命令执行完后,首次打开会自动下载依赖。
配置
SpaceVim 的配置在 ~/.SpaceVim.d
目录里,大部分的设置都可以通过 init.toml 来配。
通用配置
主题
[options]
colorscheme = "SpaceVim"
colorscheme_bg = "light"
[[layers]]
name = "colorscheme"
文件搜索
[[layers]]
name = "fzf"
SpaceVim 常用配置
[options]
......
statusline_separator = "arrow"
statusline_unicode_symbols = true
filemanager = "defx"
filetree_direction = "left"
relativenumber = false
Vim 常用配置
假如是之前有些 vimscript 的配置,刚好没有对应的 SpaceVim 配置选项,那么可以在 ~/.SpaceVim.d/autoload/
目录里头创建脚本,封装为启动 SpaceVim 之前和之后两个时期的函数,如创建 myspacevim.vim 脚本:
function! myspacevim#before() abort
......
" set nu
" set si
set autoread
set termguicolors
" auto refresh file
au FocusGained,BufEnter * :checktime
" code style
au FileType * setlocal et sta sw=2 sts=2
au FileType python setlocal et sta sw=4 sts=4
au FileType java setlocal et sta sw=4 sts=4
au FileType php setlocal et sta sw=4 sts=4
au FileType javascript setlocal et sta sw=4 sts=4
au FileType perl setlocal et sta sw=4 sts=4 equalprg=perltidy\ -st
endfunction
function! myspacevim#after() abort
......
endfunction
然后在 init.toml 里头加上:
[options]
......
bootstrap_before = "myspacevim#before"
bootstrap_after = "myspacevim#after"
常用插件
历时变化,一直在做优胜劣汰,插件最后沒剩下多少,可能是 Vim 开箱即用就已经有不错体验了(打勾的为 SpaceVim 已有的):
- auto-pairs:括号补全
- rainbow:让嵌套括号有不同的颜色
- ctrlp.vim:文件快速搜索,支持模糊查询
- BufClose.vim:彻底删除关闭文件的 buffer,SpaceVim 通过
Space b
触发 buffer 相关的 - nerdtree:文件目录树,SpaceVim 带上更好的 defx
- vim-easymotion:以键盘字符快速定位到代码的某个位置,SpaceVim 通过
Space j
触发
以 rainbow 为例安装配置:
[[custom_plugins]]
name = 'luochen1990/rainbow'
merged = false
在 myspacevim.vim 里头进行配置:
function! myspacevim#before() abort
......
let lightcolors = ['lightblue', 'lightyellow', 'red', 'darkgreen', 'darkyellow', 'lightred', 'yellow', 'cyan', 'magenta', 'white']
let darkcolors = ['DarkBlue', 'Magenta', 'Black', 'Red', 'DarkGray', 'DarkGreen', 'DarkYellow']
let g:rainbow_conf = {
\'ctermfgs': (&background=="dark"? darkcolors : lightcolors)
\}
let g:rainbow_active=1
endfunction
Lsp
Vim/Neovim 有很多 Lsp 插件,coc 是相对成熟的,SpaceVim 默认并不是 coc,所以需要:
[options]
......
autocomplete_method = "coc"
在 myspacevim.vim 文件加上 coc 的快捷键设定:
function! myspacevim#after() abort
......
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)
nnoremap <silent> K :call <SID>show_documentation()<CR>
endfunction
function! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
else
call CocAction('doHover')
endif
endfunction
因为 lsp 主要还是对语言服务器的调用,所以对于每种语言都需要安装对应的服务器,在 Vim/Neovim 里头命令模式下执行诸如 CocInstall coc-java
来安装,更详细可以参考:
同样,每加上一种,就在 init.toml 加上对应语言的 layer:
[[layers]]
name = "lang#php"
[[layers]]
name = "lang#java"
coc.nvim 是作为一个独立于 SpaceVim 的项目存在,配置在 ~/.config/coc/
文件夹内。但是 SpaceVim 对于 coc 单独的配置是落在 ~/.SpaceVim/coc-settings.json
中。
问题
Java 项目缓存报错
因为 SpaceVim 默认是使用 neomake 做代码的 linter,但是假如项目是 java 的话,因为生成在主项目目录下的 class,导致各种 classpath 不对,所以我们要把 neomake 换掉:
[options]
......
enable_neomake = false
enable_ale = true
[[layers]]
name = "checkers"
enable = false
刷新缓存,在命令行模式执行 CocCommand java.clean.workspace
。
Java 项目 Getter 和 Setter 报错
下载 lombok.jar, coc-settings.json 加上:
{
"java.jdt.ls.vmargs": "-javaagent:${lombok.jar_path} -Xbootclasspath/a:${lombok.jar_path}"
}
FreeBSD 下无法安装 coc 插件
使用 CocInstall 安装插件在 FreeBSD 却会出现各种权限错误,官方说是 rimraf 的问题,只能手动安装语言服务:
npm i -g yarn
cd ~/.config/coc/extensions
yarn add coc-java