更新与安装

在安装 SpaceVim 之前,需要确保电脑上已经安装了 Git 和 cURL。这两个工具用来下载插件和字体。 其次,需要安装 Vim 或者 Neovim,同时启用 +python3 的支持后使用体验会更好。

neovim

1
2
3
4
5
6
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:neovim-ppa/stable
sudo apt-get update
sudo apt-get install neovim
cd ~/.SpaceVim/bundle/vimproc.vim/
make

字体乱码

1
2
3
git clone https://github.com/powerline/fonts
cd fonts
./install.sh

windows

1
https://spacevim.org/cn/install.cmd

linux

1
curl -sLf https://spacevim.org/install.sh | bash -s -- --install vim

使用 neovim 打开需要安装字体库

1
2
sudo apt-get install ttf-mscorefonts-installer
sudo apt-get install fontconfig

自身更新

可通过很多种方式来更新 SpaceVim 的核心文件。 建议在更新 SpaceVim 之前,更新一下所有的插件。具体内容如下:
注意:默认,这一特性是禁用的,因为自动更新将会增加 SpaceVim 的启动时间, 影响用户体验。如果你需要这一特性,可以将如下加入到用户配置文件中:

1
2
3
[options]
automatic_update = true
启用这一特性后,SpaceVim 将会在每次启动时候检测是否有新版本。 更新后需重启 SpaceVim。

通过插件管理器更新

使用 :SPUpdate SpaceVim 这一命令,将会打开 SpaceVim 的插件管理器,更新 SpaceVim,具体进度会在插件管理器 buffer 中展示。通过 git 进行更新。可通过在 SpaceVim 目录中手动执行 git pull, SpaceVim 默认安装的位置为 ~/.SpaceVim, 因此可以再命令行使用如下命令进行手动更新:

1
git -C ~/.SpaceVim pull

更新插件

这一命令将会更新所有插件,包括 SpaceVim 自身。 当然这一命令也支持参数,参数为插件名称,可同时添加多个插件名称作为参数, 同时可以使用 Tab 键来补全插件名称。

1
:SPUpdate

重新安装插件

在插件安装、更新过程中,如果发现某个插件损坏了, 可以使用 :SPReinstall 命令进行重新安装插件。 类似于 :SPUpdate,需要添加一个插件名称参数, 可以使用 Tab 键来补全插件名称。比如:

1
:SPReinstall echodoc.vim

用户配置

初次启动时,SpaceVim 弹出一个选择目录(basic 模式、 dark_powerd 模式),用户需要选择合适自己的配置模板。 此时,SpaceVim 将自动在 $HOME 目录生成 ~/.SpaceVim.d/init.toml。 所有用户配置文件都可以存储在 ~/.SpaceVim.d/。

这一文件夹将被加入 Vim 的运行时路径 &runtimepath。

也可以通过 SPACEVIMDIR 这一环境变量, 指定用户配置目录的具体位置。也可以通过软链接来改变目录位置, 以便配置备份。

同时,还支持项目本地配置,配置初始文件为,项目根目录下的 .SpaceVim.d/init.toml 文件。同时根目录下的 .SpaceVim.d/ 也将被加入到 Vim 运行时路径。

所有的 SpaceVim 选项可以使用 :h SpaceVim-options 来查看。 选项名称为原先 Vim 脚本中使用的变量名称去除 g:spacevim_ 前缀。

完整的内置文档可以通过 :h SpaceVim 进行查阅。 也可以通过按键 SPC h SPC 模糊搜索, 该快捷键需要载入一个模糊搜索模块。

添加自定义插件

如果你需要添加 github 上的插件,只需要在 SpaceVim 配置文件中添加 [[custom_plugins]] 片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[[custom_plugins]]
repo = 'lilydjwg/colorizer'
# `on_cmd` option means this plugin will be loaded
# only when the specific commands are called.
# for example, when `:ColorHighlight` or `:ColorToggle`
# commands are called.
on_cmd = ['ColorHighlight', 'ColorToggle']
# `on_func` option means this plugin will be loaded
# only when the specific functions are called.
# for example, when `colorizer#ColorToggle()` function is called.
on_func = 'colorizer#ColorToggle'
# `merged` option is used for merging plugins directory.
# When `merged` is `true`, all files in this custom plugin
# will be merged into `~/.cache/vimfiles/.cache/init.vim/`
# for neovim or `~/.cache/vimfiles/.cache/vimrc/` for vim.
merged = false
# For more options see `:h dein-options`.

也可以使用仓库克隆的地址,比如:

1
2
3
[[custom_plugins]]
repo = "https://gitlab.com/code-stats/code-stats-vim.git"
merged = false

on_cmd 选项使得这个插件延迟加载。 该插件会在第一次执行 ColorHighlight 或者 ColorToggle 命令时被加载。

merged 选项用于设定是否合并该插件的文件夹,如果 merged 是 true,那么,这一插件内的文件将被合并到: ~/.cache/vimfiles/.cache/init.vim/ 或者 ~/.cache/vimfiles/.cache/vimrc/, 这依据当前使用的是 Neovim 还是 Vim。

除了 on_cmd 以外,还有一些其它的选项,可以通过 :h dein-options 查阅。

如果需要添加多个自定义插件,可以参考如下设置:

1
2
3
4
5
6
7
[[custom_plugins]]
repo = 'lilydjwg/colorizer'
merged = false

[[custom_plugins]]
repo = 'joshdick/onedark.vim'
merged = false

禁用插件

SpaceVim 默认安装了一些插件,如果需要禁用某个插件,可以通过 ~/.SpaceVim.d/init.toml 的 [options] 片段中的 disabled_plugins 这一选项来操作:

1
2
3
[options]
# 请注意,该值为一个 List,每一个选项为插件的名称,而非 github 仓库地址。
disabled_plugins = ["clighter", "clighter8"]

启动函数

由于 toml 配置的局限性,SpaceVim 提供了两种启动函数 bootstrap_before 和 bootstrap_after,在该函数内可以使用 Vim script。 可通过 ~/.SpaceVim.d/init.toml 的 [options] 片段中的这两个选项 bootstrap_before 和 bootstrap_after 来指定函数名称,例如:

1
2
3
[options]
bootstrap_before = "myspacevim#before"
bootstrap_after = "myspacevim#after"

这两种启动函数的区别在于,bootstrap_before函数是在载入用户配置时候执行的, 而bootstrap_after函数是在触发VimEnter事件时执行的。

启动函数文件应放置在 Vim &runtimepath 的 autoload 文件夹内。例如:

文件名:~/.SpaceVim.d/autoload/myspacevim.vim

1
2
3
4
5
6
7
8
function! myspacevim#before() abort
let g:neomake_c_enabled_makers = ['clang']
nnoremap jk <esc>
endfunction

function! myspacevim#after() abort
iunmap jk
endfunction

在启动函数中,可以使用:lua 命令对 SpaceVim 进行配置,比如:

1
2
3
4
5
6
7
function! myspacevim#before() abort
lua << EOF
local opt = requires('spacevim.opt')
opt.enable_projects_cache = false
opt.enable_statusline_mode = true
EOF
endfunction

函数 bootstrap_before 将在读取用户配置后执行,而函数 bootstrap_after 将在 VimEnter autocmd 之后执行。

如果你需要添加自定义以 SPC 为前缀的快捷键,你需要使用 bootstrap function, 在其中加入以下代码(注意你定义的按键必须是 SpaceVim 没有使用的):

1
2
3
4
function! myspacevim#before() abort
call SpaceVim#custom#SPCGroupName(['G'], '+TestGroup')
call SpaceVim#custom#SPC('nore', ['G', 't'], 'echom 1', 'echomessage 1', 1)
endfunction

同样地,如果你需要定义语言相关的功能,可以使用以下函数定义:

1
2
3
4
function! myspacevim#before() abort
call SpaceVim#custom#LangSPCGroupName('python', ['G'], '+TestGroup')
call SpaceVim#custom#LangSPC('python', 'nore', ['G', 't'], 'echom 1', 'echomessage 1', 1)
endfunction

这些按键绑定以语言相关的前缀键开头,默认的前缀键是 , 。 同样,你为特定语言定义的按键必须是 SpaceVim 没有使用的。

Vim 兼容模式

以下为 SpaceVim 中与 Vim 默认情况下的一些差异。

按键 s 是删除光标下的字符,但是在 SpaceVim 中, 它是Normal模式窗口快捷键的前缀,这一功能可以使用选项 windows_leader 来修改,默认是 s。 如果需要使用按键 s 的原生功能,可以将该选项设置为空。

1
2
[options]
windows_leader = ''

按键 , 是重复上一次的搜索 f、F、t 和 T ,但在 SpaceVim 中默认被用作为语言专用的前缀键。如果需要禁用此选项, 可设置 enable_language_specific_leader = false。

1
2
[options]
enable_language_specific_leader = false

按键 q 是录制宏,但是在 SpaceVim 中被设置为了智能关闭窗口,设置该功能的选项是 windows_smartclose,默认值是 q, 可以通过将该选项设置成空字符串来禁用该功能,同时也可以设置成其他按键。

1
2
[options]
windows_smartclose = ''

命令行模式下 Ctrl-a 按键在 SpaceVim 中被修改为了移动光标至命令行行首。
命令行模式下 Ctrl-b 按键被映射为方向键 , 用以向左移动光标。
命令行模式下 Ctrl-f 按键被映射为方向键 , 用以向右移动光标。
可以通过设置 vimcompatible = true 来启用 Vim 兼容模式,而在兼容模式下,以上所有差异将不存在。 当然,也可通过对应的选项禁用某一个差异。例如,恢复逗号 , 的原始功能,可以通过禁用语言专用的前缀键:

1
2
[options]
enable_language_specific_leader = false

如果发现有其它区别,可以提交 PR。

私有模块

这一部分简单介绍了模块的组成,更多关于新建模块的内容可以阅读 SpaceVim 的模块首页。

目的

使用模块的方式来组织和管理插件,将相关功能的插件组织成一个模块,启用/禁用效率更加高。同时也节省了很多寻找插件和配置插件的时间。

结构

在 SpaceVim 中,一个模块是一个单个的 Vim 文件,例如,autocomplete 模块存储在 autoload/SpaceVim/layers/autocomplete.vim,在这个文件内有以下几个公共函数:

1
2
3
4
SpaceVim#layers#autocomplete#plugins(): 返回该模块插件列表
SpaceVim#layers#autocomplete#config(): 模块相关设置
SpaceVim#layers#autocomplete#set_variable(): 模块选项设置函数
SpaceVim#layers#autocomplete#get_options(): 返回模块选项列表

调试上游插件
当发现某个内置上游插件存在问题,需要修改并调试上游插件时,可以依照以下步骤操作:

禁用内置上游插件 比如,调试内置语法检查插件 neomake.vim

1
2
[options]
disabled_plugins = ["neomake.vim"]

添加自己 fork 的插件 修改配置文件 init.toml,加入以下部分,来添加自己 fork 的版本:

1
2
3
4
[[custom_plugins]]
repo = 'wsdjeg/neomake.vim'
# note: you need to disable merged feature
merged = false

或者添加本地克隆版本 使用 bootstrap_before 函数来添加本地路径:

1
2
3
function! myspacevim#before() abort
set rtp+=~/path/to/your/localplugin
endfunction

界面元素

SpaceVim 集成了多种实用的 UI 插件,如常用的文件树、语法树等插件,配色主题默认采用的是 gruvbox。

颜色主题

默认的颜色主题采用的是 gruvbox。这一主题有深色和浅色两种。关于这一主题一些详细的配置可以阅读 :h gruvbox。

如果需要修改 SpaceVim 的主题,可以在 ~/.SpaceVim.d/init.toml 的 [options] 片段中修改 colorscheme 选项。例如,使用 Vim 自带的内置主题 desert:

1
2
3
[options]
colorscheme = "desert"
colorscheme_bg = "dark"

快捷键 功能描述
SPC T n 切换至下一个随机主题,需要载入主题模块
SPC T s 通过模糊搜索模块选择主题
可以在主题模块中查看 SpaceVim 支持的所有主题。

注意:

SpaceVim 在终端下默认使用了真色,因此使用之前需要确认下你的终端是否支持真色。 可以阅读 Colours in terminal 了解根多关于真色的信息。

如果你的终端不支持真色,可以在 ~/.SpaceVim.d/init.toml 的 [options] 片段中禁用真色支持:

1
2
[options]
enable_guicolors = false

字体

在 SpaceVim 中默认的字体是 SourceCodePro Nerd Font Mono。 如果你也喜欢这一字体,建议将这一字体安装到系统中。 如果需要修改 SpaceVim 的字体,可以在 ~/.SpaceVim.d/init.toml 的 [options]片段中修改选项 guifont,默认值为:

1
2
[options]
guifont = "SourceCodePro Nerd Font Mono:h11"

如果指定的字体不存在,将会使用系统默认的字体,此外,这一选项在终端下是无效的,终端下修改字体,需要修改终端自身配置。

标签栏

如果只有一个 Tab, Buffers 将被罗列在标签栏上,每一个包含:序号、文件类型图标、文件名。如果有不止一个 Tab, 那么所有 Tab 将被罗列在标签栏上。标签栏上每一个 Tab 或者 Buffer 可通过快捷键 number 进行快速访问,默认的 是 \。

1
2
3
4
5
6
7
8
9
10
11
快捷键	功能描述
<Leader> 1 跳至标签栏序号 1
<Leader> 2 跳至标签栏序号 2
<Leader> 3 跳至标签栏序号 3
<Leader> 4 跳至标签栏序号 4
<Leader> 5 跳至标签栏序号 5
<Leader> 6 跳至标签栏序号 6
<Leader> 7 跳至标签栏序号 7
<Leader> 8 跳至标签栏序号 8
<Leader> 9 跳至标签栏序号 9
g r 跳至前一个 Tab,常用于两个 Tab 来回切换

注意: 两个缓冲区来回切换的快捷键是 SPC Tab, 可阅读缓冲区管理部分内容,了解更多缓冲区相关的快捷键。

标签栏上也支持鼠标操作,左键可以快速切换至该标签,中键删除该标签。该特性只支持 Neovim,并且需要 has(‘tablineat’) 特性。

注意: 这一特性仅限于 Neovim 并且 has(‘tablineat’) 返回 true。

1
2
3
快捷键	功能描述
<Mouse-left> 切换至该标签
<Mouse-middle> 删除该标签

标签管理器

可使用 SPC t t 打开内置的标签管理器,标签管理器内的快捷键如下:

1
2
3
4
5
6
7
8
9
快捷键	功能描述
o 展开或关闭标签目录
r 重命名光标下的标签页
n 在光标位置下新建命名标签页
N 在光标位置下新建匿名标签页
x 删除光标下的标签页
Ctrl-S-<Up> 向上移动光标下的标签页
Ctrl-S-<Down> 向下移动光标下的标签页
<Enter> 跳至光标所对应的标签窗口

文件树

SpaceVim 使用 nerdtree 作为默认的文件树插件,默认的快捷键是 F3, SpaceVim 也提供了另外一组快捷键 SPC f t 和 SPC f T 来打开文件树。 如果需要修改默认文件树插件,需要在 ~/.SpaceVim.d/init.toml 的 [options] 片段中修改选项 filemanager:

1
2
3
4
5
6
[options]
# 文件树插件可选值包括:
# - nerdtree (默认)
# - vimfiler: 需要编译 vimproc.vim, 在目录 bundle/vimproc.vim 下
# - defx: 需要 +py3 支持
filemanager = "nerdtree"

开启

默认情况下文件树是打开的,如果需要设置文件树默认关闭,需要修改 enable_vimfiler_welcome 选项。

1
2
[options]
enable_vimfiler_welcome = false

位置

默认情况下文件树是在窗口的右边打开,如果需要设置文件树默认在左边,需要修改 filetree_direction 选项。 需要注意的是,当设置文件树在左边时,函数列表 tagbar 将会在右边。

1
2
[options]
filetree_direction = "left"

文件树中的常用操作

文件树中主要以 hjkl 为核心,这类似于 vifm 中常用的快捷键:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
快捷键	功能描述
<F3> / SPC f t 切换文件树
文件树内的快捷键
<Left> / h 移至父目录,并关闭文件夹
<Down> / j 向下移动光标
<Up> / k 向上移动光标
<Right> / l 展开目录,或打开文件
<Enter> 切换目录,或打开文件
N 在光标位置新建文件
y y 复制光标下文件路径至系统剪切板
y Y 复制光标下文件至系统剪切板
P 在光标位置黏贴文件
. 切换显示隐藏文件
s v 分屏编辑该文件
s g 垂直分屏编辑该文件
p 预览文件
i 切换至文件夹历史
v 快速查看
> 放大文件树窗口宽度
< 缩小文件树窗口宽度
g x 使用相关程序执行该文件
' 标记光标下的文件(夹)
V 清除所有标记
Ctrl+r 刷新页面

文件树中打开文件

如果只有一个可编辑窗口,则在该窗口中打开选择的文件,否则则需要指定窗口来打开文件:

1
2
3
4
快捷键	功能描述
l / <Enter> 打开文件
sg 分屏打开文件
sv 垂直分屏打开文件

代码缩进

默认的代码缩进值是 2,缩进的大小由选项 default_indent 设置, 如果希望使用 4 个空格作为缩进,只需要在 SpaceVim 配置文件中加入如下内容:

1
2
[options]
default_indent = 4

default_indent 这一选项的值,将被赋值到 Vim 的选项:&tabstop、&softtabstop 和 &shiftwidth。默认情况下,输入的 会被自动展开成对应缩进数量的空格, 可通过设置选项 expand_tab 的值为 false 来禁用这一特性:

1
2
3
[options]
default_indent = 4
expand_tab = true

复制粘贴

如果 has(‘unnamedplus’) 返回 1,那么快捷键 y 使用的寄存器是 +, 否则,这个快捷键使用的寄存器是 *, 可以阅读 :h registers 获取更多关于寄存器相关的内容。

1
2
3
4
5
快捷键	功能描述
<Leader> y 复制已选中的文本至系统剪切板
<Leader> p 粘贴系统剪切板文字至当前位置之后
<Leader> P 粘贴系统剪切板文字至当前位置之前
<Leader> Y 复制已选中的文本至 pastebin

快捷键 Y 将把选中的文本复制到 pastebin 服务器,并且将返回的链接复制到系统剪切板。 使用该功能,需要系统里有 curl 可执行程序(Windows 系统下,Neovim 自带 curl)。

按下快捷键 Y 后,实际执行的命令为:

1
curl -s -F "content=<-" http://dpaste.com/api/v2/

该命令将读取标准输入(stdin),并且把输入的内容复制到 dpaste 服务器,等同于:

1
echo "selected text" | curl -s -F "content=<-" http://dpaste.com/api/v2/

增删注释

注释的增删是通过插件 nerdcommenter 来实现的, 以下为注释相关的常用快捷键:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
快捷键	功能描述
SPC ; 进入注释操作模式
SPC c h 隐藏/显示注释
SPC c l 注释/反注释当前行
SPC c L 注释行
SPC c u 反注释行
SPC c p 注释/反注释段落
SPC c P 注释段落
SPC c s 使用完美格式注释
SPC c t 注释/反注释到行
SPC c T 注释到行
SPC c y 注释/反注释同时复制
SPC c Y 复制到未命名寄存器后注释
SPC c $ 从光标位置开始注释当前行

文本编码格式

SpaceVim 默认使用 utf-8 码进行编码。下面是 utf-8 编码的四个设置:

1
2
3
4
fileencodings (fencs) : ucs-bom, utf-8, default, latin1
fileencoding (fenc) : utf-8
encoding (enc) : utf-8
termencoding (tenc) : utf-8 (only supported in Vim)

修复混乱的显示:SPC e a 是自动选择文件编码的按键映射。在选择好文件编码方式后,你可以运行下面的代码来修复编码:

1
2
set enc=utf-8
write

窗口管理

常用的窗口管理快捷键有一个统一的前缀,默认的前缀 [Window] 是按键 s,可以在配置文件中通过修改 SpaceVim 选项 window_leader 的值来设为其它按键:

1
2
[options]
windows_leader = "s"
1
2
3
4
5
6
7
8
9
10
11
12
快捷键	功能描述
q 智能关闭当前窗口
[Window] v 水平分屏
[Window] V 水平分屏,并编辑上一个文件
[Window] g 垂直分屏
[Window] G 垂直分屏,并编辑上一个文件
[Window] t 新建新的标签页
[Window] o 关闭其他窗口
[Window] x 关闭当前缓冲区,并保留新的空白缓冲区
[Window] q 关闭当前缓冲区
[Window] Q 关闭当前窗口
Shift-<Tab> 切换至前一窗口

常规模式下的按键 q 被用来快速关闭窗口,其原生的功能可以使用 q r 来代替。

常用编辑器窗口

1
2
3
4
5
6
7
按键	功能描述
<F2> 打开、关闭语法树
<F3> 打开、关闭文件树
Ctrl-<Down> 切换至下方窗口
Ctrl-<Up> 切换至上方窗口
Ctrl-<Left> 切换至左边窗口
Ctrl-<Right> 切换至右边窗口

窗口操作常用快捷键

每一个窗口都有一个编号,该编号显示在状态栏的最前端,可通过 SPC 编号 进行快速窗口跳转。

1
2
3
4
5
6
7
8
9
10
快捷键	功能描述
SPC 1 跳至窗口 1
SPC 2 跳至窗口 2
SPC 3 跳至窗口 3
SPC 4 跳至窗口 4
SPC 5 跳至窗口 5
SPC 6 跳至窗口 6
SPC 7 跳至窗口 7
SPC 8 跳至窗口 8
SPC 9 跳至窗口 9

窗口操作相关快捷键(以 SPC w 为前缀):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
快捷键	功能描述
SPC w . 启用窗口临时快捷键
SPC w <Tab> 在同一标签内进行窗口切换
SPC w = 对齐分离的窗口
SPC w c 进入阅读模式,浏览当前窗口 (需要 tools 模块)
SPC w C 选择某一个窗口,并且进入阅读模式 (需要 tools 模块)
SPC w d 删除一个窗口
SPC w D 选择一个窗口并关闭
SPC w f 切换同步滚屏
SPC w F 新建一个新的标签页
SPC w h 移至左边窗口
SPC w H 将窗口向左移动
SPC w j 移至下方窗口
SPC w J 将窗口向下移动
SPC w k 移至上方窗口
SPC w K 将窗口向上移动
SPC w l 移至右方窗口
SPC w L 将窗口向右移动
SPC w m 最大化/最小化窗口(最大化相当于关闭其它窗口)
SPC w M 选择窗口进行替换
SPC w o 按序切换标签页
SPC w p m 使用弹窗打开消息
SPC w p p 关闭当前弹窗窗口
SPC w r 顺序切换窗口
SPC w R 逆序切换窗口
SPC w s/- 水平分割窗口
SPC w S 水平分割窗口,并切换至新窗口
SPC w u 恢复窗口布局
SPC w U 撤销恢复窗口布局
SPC w v// 垂直分离窗口
SPC w V 垂直分离窗口,并切换至新窗口
SPC w w 切换至前一窗口
SPC w W 选择一个窗口
SPC w x 切换窗口文件

文件操作相关快捷键

文件操作相关的快捷键都是以 SPC f 为前缀的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
快捷键	功能描述
SPC f / 使用 find 或者 fd 命令查找文件,支持参数提示
SPC f b 跳至文件书签
SPC f c copy current file to a different location(TODO)
SPC f C d 修改文件编码 unix -> dos
SPC f C u 修改文件编码 dos -> unix
SPC f D 删除文件以及 buffer,需要手动确认
SPC f E open a file with elevated privileges (sudo edit)(TODO)
SPC f f 在当前文件所在文件夹搜索文件
SPC f F 在当前文件所在的文件夹搜索光标下的文件
SPC f o 打开文件树,并定位到当前文件
SPC f R 重命名当前文件
SPC f s / Ctrl-s 保存文件 (:w)
SPC f a 另存为新的文件
SPC f W 使用管理员模式保存
SPC f S 保存所有文件
SPC f r 打开文件历史
SPC f t 切换侧栏文件树
SPC f T 打开文件树侧栏
SPC f d Windows 下显示/隐藏磁盘管理器
SPC f y 复制并显示当前文件的绝对路径
SPC f Y 复制并显示当前文件的远程路径

搜索

模糊搜索

目前一共有五种模糊搜索的模块,分别对应不同的工具:

1
2
3
4
5
denite
unite
leaderf
ctrlp
fzf

这些模块都提供了非常类似的快捷键,包括文件搜索、跳转历史搜索等功能, 具体快捷键列表如下:

快捷键

1
2
3
4
5
6
7
8
9
10
快捷键	功能描述
<Leader> f <Space> 模糊查找快捷键,并执行该快捷键
<Leader> f e 模糊搜索寄存器
<Leader> f h 模糊搜索 history/yank
<Leader> f j 模糊搜索 jump, change
<Leader> f l 模糊搜索 location list
<Leader> f m 模糊搜索 output messages
<Leader> f o 模糊搜索函数列表
<Leader> f q 模糊搜索 quickfix list
<Leader> f r 重置上次搜索窗口

模糊搜索窗口内的快捷键:

1
2
3
4
5
6
7
8
9
10
快捷键	功能描述
<Tab> / Ctrl-j 下一个选项
Shift-<Tab> / Ctrl-k 上一个选项
jk 离开输入模式(仅支持 denite 和 unite 模块)
Ctrl-w 删除光标前词语
<Enter> 执行默认动作
Ctrl-s 在分割窗口内打开
Ctrl-v 在垂直分割窗口内打开
Ctrl-t 在新的标签页里打开
Ctrl-g 推出模糊搜索插件

Denite 或 Unite 模块可视模式下快捷键:

1
2
3
4
5
6
7
快捷键	功能描述
Ctrl+h/k/l/r 未定义
Ctrl+l 刷新窗口
<Tab> 选择即将执行的动作
Space 切换标记当前选项
r 替换或者重命名
Ctrl+z 切换窗口分割方式

在当前文件中进行搜索

1
2
3
4
5
6
7
8
9
快捷键	功能描述
SPC s s 使用默认的搜索工具进行搜索
SPC s S 使用默认的搜索工具进行搜索光标下的词
SPC s a a 使用 ag 进行搜索
SPC s a A 使用 ag 进行搜索光标下的词
SPC s g g 使用 grep 进行搜索
SPC s g G 使用 grep 进行搜索光标下的词
SPC s r r 使用 rg 进行搜索
SPC s r R 使用 rg 进行搜索光标下的词

搜索当前文件所在的文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
快捷键	功能描述
SPC s d 使用默认的搜索工具进行搜索
SPC s D 使用默认的搜索工具搜索光标下的词
SPC s a d 使用ag进行搜索
SPC s a D 使用ag搜索光标下的词
SPC s g d 使用grep进行搜索
SPC s g D 使用grep搜索光标下的词
SPC s k d 使用ack进行搜索
SPC s k D 使用ack搜索光标下的词
SPC s r d 使用rg进行搜索
SPC s r D 使用rg搜索光标下的词
SPC s t d 使用pt进行搜索
SPC s t D 使用pt搜索光标下的词

在所有打开的缓冲区中进行搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
快捷键	功能描述
SPC s b 使用默认的搜索工具进行搜索
SPC s B 使用默认的搜索工具搜索光标下的词
SPC s a b 使用ag进行搜索
SPC s a B 使用ag搜索光标下的词
SPC s g b 使用grep进行搜索
SPC s g B 使用grep搜索光标下的词
SPC s k b 使用ack进行搜索
SPC s k B 使用ack搜索光标下的词
SPC s r b 使用rg进行搜索
SPC s r B 使用rg搜索光标下的词
SPC s t b 使用pt进行搜索
SPC s t B 使用pt搜索光标下的词

在任意目录中进行搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
快捷键	功能描述
SPC s f 使用默认的搜索工具进行搜索
SPC s F 使用默认的搜索工具搜索光标下的词
SPC s a f 使用ag进行搜索
SPC s a F 使用ag搜索光标下的词
SPC s g f 使用grep进行搜索
SPC s g F 使用grep搜索光标下的词
SPC s k f 使用ack进行搜索
SPC s k F 使用ack搜索光标下的词
SPC s r f 使用rg进行搜索
SPC s r F 使用rg搜索光标下的词
SPC s t f 使用pt进行搜索
SPC s t F 使用pt搜索光标下的词

在工程中进行搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
快捷键	功能描述
SPC s p 使用默认的搜索工具进行搜索
SPC s P 使用默认的搜索工具搜索光标下的词
SPC s a p 使用ag进行搜索
SPC s a P 使用ag搜索光标下的词
SPC s g p 使用grep进行搜索
SPC s g P 使用grep搜索光标下的词
SPC s k p 使用ack进行搜索
SPC s k P 使用ack搜索光标下的词
SPC s r p 使用rg进行搜索
SPC s r P 使用rg搜索光标下的词
SPC s t p 使用pt进行搜索
SPC s t P 使用pt搜索光标下的词

后台进行工程搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
快捷键	功能描述
SPC s j 使用默认搜索工具,后台检索输入的正则表达式
SPC s J 使用默认搜索工具,后台检索光标下的词语
SPC s l 使用 quickfix 窗口列出搜索结果
SPC s a j 使用 ag 后台检索输入的正则表达式
SPC s a J 使用 ag 后台检索光标下的词语
SPC s g j 使用 grep 后台检索输入的正则表达式
SPC s g J 使用 grep 后台检索光标下的词语
SPC s k j 使用 ack 后台检索输入的正则表达式
SPC s k J 使用 ack 后台检索光标下的词语
SPC s t j 使用 pt 后台检索输入的正则表达式
SPC s t J 使用 pt 后台检索光标下的词语
SPC s r j 使用 rg 后台检索输入的正则表达式
SPC s r J 使用 rg 后台检索光标下的词语

在工程中搜索文件

1
2
3
4
5
SPC p f	在当前工程中查找文件
SPC p F 在当前工程中查找光标下的文件
SPC p / 在当前工程中搜索文本内容
SPC p k 关闭当前工程的所有缓冲区
SPC p p 显示所有工程

在网上进行搜索

1
2
3
快捷键	功能描述
SPC s w g Get Google suggestions in Vim. Opens Google results in Browser.
SPC s w w Get Wikipedia suggestions in Vim. Opens Wikipedia page in Browser.(TODO)

注意: 为了在 Vim 中使用谷歌 suggestions,需要在 ~/.SpaceVim.d/init.toml 的 [options] 片段中加入如下配置:

1
2
[options]
enable_googlesuggest = true

实时代码检索

1
2
快捷键	功能描述
SPC s / 在工程中使用默认工具实时检索代码

保持高亮

SpaceVim 使用 search_highlight_persist 保持当前搜索结果的高亮状态到下一次搜索。 同样可以通过 SPC s c 或者运行 命令 :nohlsearch 来取消搜索结果的高亮表示。

跳转,合并,拆分

跳转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SPC j $	跳至行尾,并且在原始位置留下标签,以便跳回
SPC j 0 跳至行首,并且在原始位置留下标签,以便跳回
SPC j b 向后回跳
SPC j c 跳至前一个修改位置
SPC j D 跳至当前目录某个文件夹(在另外窗口展示文件列表)
SPC j d 跳至当前目录某个文件夹
SPC j f 向前跳
SPC j i 跳至当前文件的某个函数,使用 Denite 打开语法树
SPC j I 跳至所有 Buffer 的语法树(TODO)
SPC j J 跳至当前窗口的某两个字符的组合 (easymotion)
SPC j j 跳至当前窗口的某个字符 (easymotion)
SPC j k 跳至下一行,并且对齐下一行
SPC j l 跳至某一行 (easymotion)
SPC j q show the dumb-jump quick look tooltip (TODO)
SPC j u 跳至窗口某个 URL (TODO)
SPC j v 跳至某个 Vim 函数的定义处 (TODO)
SPC j w 跳至 Buffer 中某个单词 (easymotion)

合并,拆分

1
2
3
4
5
6
J	合并当前行和下一行
SPC j k 跳至下一行,并且对齐该行
SPC j n 从光标处断开当前行,并且插入空行以及进行对齐
SPC j o 从光标处拆分该行,光标停留在当前行行尾
SPC j s 从光标处拆分 String
SPC j S 从光标处使用换行符拆分 String,并自动缩进新行

标签管理

在浏览代码时,通常需要给指定位置添加标签,方便快速跳转,在 SpaceVim 中可以使用如下快捷键来管理标签。 这一功能需要载入 tools 模块:

1
2
[layers]
name = "tools"
1
2
3
4
5
6
m a	显示书签列表
m c 清除所有书签
m m 切换当前行标签状态
m n 跳至下一个书签
m p 跳至前一个书签
m i 给当前行标签添加说明

正因为占用了以上几个快捷键,以下几个寄存器无法用来记忆当前位置了:a, c, m, n, p, i。 当然,也可以在启动函数里将 m 映射为 m 键,如此便可使用 m a 来代替 m a。

1
2
3
function! myspacevim#before() abort
nnoremap <silent><Leader>m m
endfunction

任务管理

通过内置的任务管理系统,可以快速集成外部命令工具,类似于 vscode 的任务管理系统, 在 SpaceVim 中,目前支持的任务配置文件包括两种:

1
2
~/.SpaceVim.d/tasks.toml:全局配置文件
.SpaceVim.d/tasks.toml:项目局部配置文件
1
2
3
SPC p t e	编辑任务配置文件
SPC p t r 选定任务并执行
SPC p t l 列出所有任务

自定义任务

以下为一个简单的任务配置示例,异步运行 echo hello world,并将结果打印至输出窗口。

1
2
3
[my-task]
command = 'echo'
args = ['hello world']

对于不需要打印输出结果,后台运行的任务,可以设置 isBackground 为 true:

1
2
3
4
[my-task]
command = 'echo'
args = ['hello world']
isBackground = true

gtag 标签模块

模块简介

tags 模块提供了项目 tags 管理工具,依赖 SpaceVim 自身的项目管理特性。

功能特性

自动/手动新建 tag 数据库
自动/手动更新 tag 数据库
查找所有引用处
查找所有定义处
列出当前项目所有 tag
重置上次查询窗口
根据文本内容跳至定义/引用处

安装及启用模块

首先需要安装 GNU Global,可根据当前使用的操作系统, 使用自带的软件包管理工具安装。

1
sudo apt-get install global

OSX 下使用 homebrew 安装

1
brew install global --with-pygments --with-ctags

如果需要启用 global 的所有特性,你需要安装 2 个额外的软件包:pygments 和 ctags。 这两个可以使用系统自带的包管理器安装:
Ubuntu

1
sudo apt-get install exuberant-ctags python-pygments

ArchLinux

1
sudo pacman -S ctags global python-pygments

编译安装
下载最新的 tar.gz 文件,执行如下命令:

1
2
3
4
5
6
wget http://tamacom.com/global/global-6.6.5.tar.gz
tar xvf global-6.5.5.tar.gz
cd global-6.5.5
./configure --with-exuberant-ctags=/usr/bin/ctags
make
sudo make install

如果需要启用 pygments 和 ctags,需要复制示例 gtags.conf.in 至 /etc/gtags.conf 或者 $HOME/.globalrc。例如:

1
cp gtags.conf.in ~/.globalrc

此外,启动 shell 时需要设置环境变量 GTAGSLABEL,通常需要修改 .profile 文件。

1
echo export GTAGSLABEL=pygments >> .profile

启用模块

可在配置文件添加如下内容来启用该模块。

1
2
[[layers]]
name = "tags"

模块设置
gtags 模块提供了以下模块选项:
gtagslabel: 设置 gtags 命令所使用的后台工具,可以选择 ctags 或者 pygments,默认是空。
例如,使用 pygments 作为后台:

1
2
3
[[layers]]
name = "gtags"
gtagslabel = "pygments"

快捷键

1
2
3
4
5
SPC m g c	新建 tag 数据库
SPC m g u 手动更新 tag 数据库
SPC m g f 列出数据库中所涉及到的文件
SPC m g d 查找 definitions
SPC m g r 查找 references

shell

在启用该模块时,可以通过 default_position 这一模块选项来指定终端打开的位置, 目前可以选的值为:top, bottom, left, right, float or full,默认的值为 top。

同时,可以通过 default_height 这一模块选项指定终端打开的高度,默认值为 30。

1
2
3
4
[[layers]]
name = "shell"
default_position = "top"
default_height = 30
1
2
3
4
5
6
7
8
9
SPC '	打开或跳至已打开的终端窗口
Ctrl-d 输入模式下关闭终端窗口
q Normal 模式下隐藏终端窗口
Ctrl-` Terminal 模式下隐藏终端窗口
Ctrl-\-Ctrl-n 从 Terminal 模式切换到 Normal 模式
Ctrl-Left 切换到左侧窗口
Ctrl-Up 切换到上方窗口
Ctrl-Down 切换到下方窗口
Ctrl-Right 切换到右侧窗口

搭建 C/C++ 开发环境

安装模块

SpaceVim 初次安装时默认并未启用相关语言模块。首先需要启用 lang#c 模块,通过快捷键 SPC f v d 打开配置文件,添加如下片断:

1
2
[[layers]]
name = "lang#c"

启用 lang#c 模块后,在打开 C/C++ 文件时,就可以使用语言专属快捷键,这些快捷键都是以 SPC l 为前缀的。

语法高亮

基础的语法高亮是基于正则表达式的,如果需要基于 clang 解析的语法高亮, 可以启用 enable_clang_syntax_highlight 这一模块选项:

1
2
3
[[layers]]
name = 'lang#c'
enable_clang_syntax_highlight = true

这一功能需要 Vim/Neovim 支持 +python 或者 +python3,并且安装了 libclang。

代码自动补全

autocomplete 模块为 SpaceVim 提供了自动补全功能,目前针对 C/C++ 而言,比较好的补全方案是配合使用 lsp 模块:

1
2
[[layers]]
name = "lsp"

lsp 模块默认使用 clangd 作为 C/C++ 的语言服务器后台命令。

在配置文件中添加如下内容即可为 C/C++ 启用语言服务器:

1
2
3
4
5
6
7
8
[[layers]]
name = "lsp"
filetypes = [
"c",
"cpp"
]
[layers.override_cmd]
c = ["clangd"]

如果使用的是 nvim(>=0.5.0),则需要指定 enabled_clients 选项:

1
2
3
[[layers]]
name = 'lsp'
enabled_clients = ['clangd']

语法检查

checkers 模块为 SpaceVim 提供了语法检查的功能,该模块默认已经载入。该模块默认使用 neomake 这一异步语法检查工具。对于 C/C++ 的支持,是通过异步调用 gcc 命令来完成的。

工程文件跳转

SpaceVim 自带工程管理插件,可以识别项目根目录,自动跳转 alternate 文件。需要在项目根目录添加工程文件 .project_alt.json:

1
2
3
4
{
"*.c": {"alternate": "{}.h"},
"*.h": {"alternate": "{}.c"}
}

通过以上的配置,就可以使用命令 :A 在源文件和测试文件之间进行跳转。

代码格式化

C/C++ 代码格式化,主要依赖 format 模块,快捷键为 SPC b f,异步执行 clang-format 命令:

1
2
[[layers]]
name = "format"

快速运行

在编辑 C/C++ 文件时,可以快速运行当前文件,默认的快捷键是 SPC l r 。按下后, 会在屏幕下方打开一个插件窗口,运行的结果会被展示在窗口内。于此同时,光标并不会跳到该插件窗口,避免影响编辑。在这里需要说明下,
默认的代码快速运行命令会读取模块选项 clang_std 和 clang_flag。 例如,如果需要使用 c11,可以设置 clang_std 选项如下:

1
2
3
4
[[layers]]
name = "lang#c"
[layers.clang_std]
cpp = "c11"

与此同时,你也可以在项目根目录新建一个 .clang 文件,在其内逐行写入 C/C++ 编译的参数, 比如:

1
2
-I/home/test
-I/user/std/include

交互式编程

在编辑 C/C++ 文件时,可通过快捷键 SPC l s i 启动 igcc 交互窗口, 之后使用快捷键将代码发送至解释器。默认快捷键都以 SPC l s 为前缀。