如果你的环境支持neovim7.0+,不妨试试现代neovim全新的LSP+Lua生态,见MyLunarVim
SpaceVim 是一个非常棒的配置集合。 相比于其他热门vim配置,SpaceVim开发最活跃,功能最完善,文档最齐全。 模块化的设计使得用户可以更方便、更精准地进行自定义,魔改原配置。 哪里不顺改那里,精准打击✺◟(∗❛ัᴗ❛ั∗)◞✺
注意注意!敲黑板!使用手册在此!
先look~look我改了哪些地方,然后再按一个个模块来讲解各种特性吧
- For VSCode User
- 写在前面
- 注意注意!敲黑板!使用手册在此!
- 目录
- 颜色主题
- 启动界面字符画
- 状态栏与标签栏
- 符号表、文件树、撤销树
- 高效编辑
- 模糊搜索
- 文本搜索
- 版本管理
- 在线翻译
- 代码补全
- 语法检测
- 代码运行
- 调试
- Markdown渲染预览
- 安装
SpaceVim的 colorscheme模块 提供了不少颜色主题。 我将语法高亮与颜色主题都针对C++源码进行了微调。
 只需要在启动nvim时设置环境变量DARKBG=1即可随机启用那些花里胡哨的主题中的一个,
或者类似设置DARKBG=gruvbox可指定使用gruvbox主题。
我一般设置命令别名alias vi='DARKBG=1 nvim'
演示使用NerdCodePro字体, 该字体集成了3种字体于一身,使得regular、bold、italic三种style使用三种不同的字体, 看起来赏心悦目超nice。
PS:要是所有终端都像alacritty一样支持不同style不同字体,我至于这么折腾自己吗(* ̄︿ ̄)
这个模块提供了许多SpaceVim启动界面的字符画,拉风的很。而且有惊喜哦>_<
这两个模块提供了状态栏与标签栏的配置,若禁用该模块则会启用备胎vim-airline
标签栏
左边的每块标签包括:
- 标签号
- 文件名
最右边的表示:
- Buffers:指明左边的标签为buffer
- Tabs:指明左边的标签为tab
状态栏
从左至右依次是:
- 当前vim模式以及窗口号
- 当前git分支
- 当前文件相对项目目录的路径(若文件只读还会显示特殊符号锁)
- 源码语法检错报错
- 文件类型
- 文件格式|编码格式
- 当前行号/总行数 :当前列号
- 屏幕显示的文本占比(接近文件内容边缘时会显示Bot或Top)
 符号表插件使用的是tagbar,按<F1>开启
 文件树插件使用的是defx,按<F2>开启
 撤销树插件使用的是undotree,按<F4>开启
提供了许多插件用于快速、舒服地写代码:
- 
提供许多额外的文本对象:如 e(entire)、i(indent)、l(line)、f(function)以及最好用的,(表示一个逗号分割的函数参数)
- 
提供了快速编辑结对符的插件vim-surround,看官方的演示更好理解用法,该插件可以与文本对象一同作用 
- 
虽然这个插件不属于edit模块,但还是放这儿一起show一波吧。多光标编辑,大杀器! 
这个模块即是围绕LeaderF搜索插件打造的
 SpaceVim集成该插件时做了一些定制,会与上述官方演示有些不一样,不过都是配置好了的,用就完事儿!
SpaceVim集成该插件时做了一些定制,会与上述官方演示有些不一样,不过都是配置好了的,用就完事儿!
| 按键 | 作用 | 
|---|---|
| <leader>fr | 重置上次搜索 | 
| <leader>f<space> | 搜索快捷键并执行 | 
| <leader>fp | 搜索插件信息 | 
| <leader>fh | 搜索vim帮助文档 | 
| <leader>fq | 搜索quickfix | 
| <leader>fl | 搜索locationlist | 
| <leader>fm | 搜索vim的输出信息并复制 | 
| <leader>fu | 搜索unicode并插入 | 
| <leader>fj | 搜索跳转表并跳转 | 
| <leader>fy | 搜索"寄存器历史并复制 | 
| <leader>fe | 搜索所有寄存器并复制 | 
| <leader>ff | 搜索当前buffer函数 | 
| <leader>fF | 搜索所有buffer函数 | 
| <leader>ft | 搜寻当前buffer符号 | 
| <leader>fT | 搜寻所有buffer符号 | 
| <leader>fg | 利用gtags搜寻标识符 | 
| <leader>sr | 搜索最近打开文件 | 
| <leader>sb | 搜索打开的缓冲区 | 
| <leader>sd | 搜索当前目录文件 | 
| <leader>sf | 搜索指定目录 | 
| Leaderf界面快捷键 | 功能 | 
|---|---|
| <c-e> | 切换模糊搜索模式或正则表达式模式 | 
| <c-c> | 关闭leaderf | 
flygrep是个集成在SpaceVim里的默认插件,但其功能也不亚于LeaderF, 后者用来搜索文件名、代码符号,flygrep用来搜索文件内容
| 按键 | 作用 | 
|---|---|
| <space>ss | 搜索当前缓冲区 | 
| <space>sb | 搜索所有缓冲区 | 
| <space>sd | 搜索当前目录 | 
| <space>sf | 搜索指定目录 | 
| <space>sp | 搜索工程目录 | 
| <space>sd | 搜索当前目录 | 
| <space>sf | 搜索指定目录 | 
| <space>sp | 搜索工程目录 | 
| flygrep界面快捷键 | 作用 | 
|---|---|
| <c-e> | 切换正则搜索模式或字符串锁搜模式 | 
| <m-r> | 进入替换模式 | 
| <c-p> | 浮窗预览 | 
| <c-d> | 向下翻页 | 
| <c-b> | 向上翻页 | 
| <c-c>或<esc> | 关闭flygrep | 
这俩模块我一半就只用来给statusline加个分支提示,我tmux开个zsh来管理项目不香吗( ◔ ڼ ◔ )
| 快捷键 | 功能 | 
|---|---|
| <space>gg | 侧栏显示diff(开启gitgutter) | 
| <space>ghv | 浮窗显示diff(需要开启上述gitgutter) | 
| <space>ghr | 撤销diff修改 (需要开启上述gitgutter) | 
 语义补全引擎默认使用YouCompleteMe。
可以帮你补全命名变量、函数、类、方法等等,任意输入两个字母就自动打开补全列表,
<tab>与<s-tab>上下选择,<cr>完成选择。
目前以集成:
- C/C++
- Go
- Python
- Vim
- Bash
- CMake
刚引入的头文件还需待后台服务进行解析, 故其中的符号可能不会立刻出现在补全列表中,稍等即可。
 除了语义补全,还有代码片段补全,插件为UltiSnips。
即按一定的语法编辑snippet配置文件后,再在代码中输入关键字,
然后按<M-/>(Alt+/)触发,就会将关键字替换为配置文件中的完整片段。
然后一路<M-/>修改锚点
 提供的默认片段位于UltiSnips文件夹下
 语法检测主要是利用YCM搭配ALE,
后者通过shell来调用使用静态分析器来进行语法检测。
在底部命令行的位置显示报错与警告,并在边栏显示错误或警告图标,
在错误代码的位置下显示波浪线(若终端不支持undercurl则回滚为underline下划线)

- g:ale_lint_on_*:这几个变量设置何时触发语法检测,用- :h查看详细信息, 默认只有文件有改动就会触发
在~/.SpaceVim.d/init.toml中的[option]下设置enable_terminal_runner = true
即可启用QuickRun替代原版中的Runner来运行程序,QuickRun与后者区别在于:
- 使用内建终端
- 程序运行计时器更加准确
- 设置参数比较方便
命令:
- 命令以Quickrun开头,如QuickrunCompileCmd gcc ${file}表示修改编译命令为gcc ${file},${file}会被替换为当前文件,其他替换见下
- 命令带!后缀表示修改参数
" 例:
:QuickrunCompileCmd         " 查看当前编译命令
:QuickrunRunCmd!            " 修改运行命令(交互)
:QuickrunRedir < file       " 重定向stdin到file选项:
let g:quickrun_default_flags = {
    \ 'cpp': {
        \ 'compileCmd': "g++ -g3 -ggdb3 -D_GLIBCXX_DEBUG -I${fileDirname} -I${workspaceFolder}include -o ${execPath} ${file}",
        \ 'extRegex': [
            \ '\v^#\s*include\s*[<"](pthread\.h|future|thread|.*asio\.hpp|.*gtest\.h)[>"]',
            \ '^#\s*include\s*[<"]dlfcn.h[>"]',
            \ '^#\s*include\s*[<"]pty.h[>"]',
            \ '^#\s*include\s*[<"]boost/locale\.hpp[>"]',
            \ '^#\s*include\s*[<"]*asio/ssl\.hpp[>"]',
            \ '^#\s*include\s*[<"](*asio/co_spawn\.hpp\|coroutine)[>"]',
            \ '^#\s*include\s*[<"]glog/.*[>"]',
            \ '^#\s*include\s*[<"]gtest/.*[>"]',
            \ '^#\s*include\s*[<"]gmock/.*[>"]',
            \ '^#\s*include\s*[<"]mysql++/.*[>"]',
            \ '^#\s*include\s*[<"]srchilite/.*[>"]',
            \ '^#\s*include\s*[<"]fmt/.*[>"]',
        \ ],
        \ 'extFlags': [
            \ '-lpthread',
            \ '-ldl',
            \ '-lutil',
            \ '-lboost_locale',
            \ '-lssl -lcrypto',
            \ '-fcoroutines',
            \ '-lglog',
            \ '-lgtest -lgtest_main',
            \ '-lgmock',
            \ '-I/usr/include/mysql -lmysqlpp',
            \ '-lsource-highlight',
            \ '-lfmt',
        \ ],
        \ 'runCmd': '${execPath}'
    \ },
    \ 'c': {
        \ 'compileCmd': 'gcc -std=c11 -I${fileDirname} -I${workspaceFolder}include -o ${execPath} ${file}',
        \ 'runCmd': '${execPath}'
    \ },
    \ 'python': {
        \ 'runCmd': 'python ${file}'
    \},
    \ 'go': {
        \ 'compileCmd': 'go build -o ${execPath} ${file}',
        \ 'runCmd': '${execPath}'
        \ }
\ }| 按键 | 作用 | 
|---|---|
| <space>lr | 运行程序(若时间戳较未变则不编译) | 
| <space>lR | 强制编译并运行程序 | 
| <space>li | 快速打开输入窗口 | 
| <F10> | 开启或关闭程序运行窗口(如果存在的话) | 
注意:<space>li快速打开窗口,会自动使用 QuickrunRedirect命令将当前buffer将要运行的程序重定向到该输入窗口。
离开输入窗口时会自动写回硬盘。
注意:对于C++,补全引擎YCM、语法检测引擎ALE、快速运行程序Runner所需要的默认C++标准都由
YCM读取的.ycm_extra_conf.py中设置的标准确定,该文件从源文件目录开始向上搜索,若无此文件则默认C++20
注意:对于C++,<space>ll手动启动所有linter进行静态语法解析,包括clang-tidy(这家伙启动所有checker后太慢了)
调试模块基于vimspector
| 按键 | 作用 | 
|---|---|
| <F5> | 继续 | 
| <S-F5> | 暂停 | 
| <F6> | 重启 | 
| <S-F6> | 停止 | 
| <F7> | Step Over | 
| <S-F7> | Step to Cursor | 
| <F8> | Step Into | 
| <S-F8> | Step Out | 
| <F9> | 设置断点 | 
| <S-F9> | 设置函数断点 | 
| <C-F9> | 设置条件断点 | 
| <F9> | 设置断点 | 
| <S-F9> | 设置函数断点 | 
| <C-F9> | 设置条件断点 | 
UltiSnips目录提供了一些markdown的代码补全片段。 此外,还对markdown的语法高亮进行了调整;
| 按键 | 作用 | 
|---|---|
| <space>lp | 开启markdown预览(需要浏览器) | 
| <space>lg | 添加或删除GFM目录 | 
| <space>lk | 利用系统剪切板的URL插入链接元素 | 
以上仅列出部分功能,其他功能需要好好阅读快捷键文档即可
Only for Linux
git clone --depth=1 https://github.com/mrbeardad/SpaceVim ~/.SpaceVim
ln -svf ~/.SpaceVim ~/.config/nvim
ln -svf ~/.SpaceVim/mode ~/.SpaceVim.d
g++ -O3 -std=c++11 -o ~/.local/bin/quickrun_time ~/.SpaceVim/custom/quickrun_time.cpp
# 启动neovim后执行 :SPInstall  安装插件
nvim
# 构建YCM代码补全引擎,如果需要其他语言的语义补全,见 ./install.py --help
cd ~/.cache/vimfiles/repos/github.com/ycm-core/YouCompleteMe/
./install.py --clangd-completer --go-completer
# 修改ALE语法检测引擎
cp -vf ~/.SpaceVim/custom/clangtidy.vim ~/.cache/vimfiles/repos/github.com/dense-analysis/ale/ale_linters/cpp/clangtidy.vim| -------------------------------- | ----------------------------- |
| 依赖包 | 作用 | 
|---|---|
| neovim | 本配置仅适用于neovim而非vim | 
| xsel | neovim与X系统剪切板交互 | 
| python-pynvim | neovim的python支持 | 
| ripgrep | 模糊搜索模块的后端工具 | 
| global、ctags | 符号索引 | 
| npm | 构建markdown-preview.nvim需要 | 
| cmake | 构建YCM时需要 | 
| cmake-language-server | CMake语法补全 | 
| gcc、cppcheck、clang-tidy | C模块 | 
| go、delve | Go模块 | 
| python、pylint、bandit | Python模块 | 
| shellcheck、bash-language-server | Sh模块 | 
| vint、vim-language-server | Vim模块 | 
此外,想要更好的体验,可以将neovim运行在tmux中,你可以设置你喜欢的终端,使它启动时自动连接tmux。 tmux的配置可以用这个, 此配置解决了tmux中的true-color、undercrul和vim映射冲突等问题,不然你在tmux例运行neovim体验可是不太好。

















