以下是个人的 vimrc 配置,会不断更新
其内容大部分参考了 Vim as an IDE,效果见这里。
查看编辑文件历史
如果想重新打开之前编辑过的文件,可以使用如下命令:
:browse oldfiles
选择
命令 | 用途 |
---|---|
v | 激活面向字符的可视模式 |
V | 激活面向行的可视模式 |
<C-v> | 激活面向列块的可视模式 |
gv | 重选上次的高亮选区 |
复制黏贴系统剪切板
-
首先检查当前 vim 是否支持
vim --version | grep clipboard
如果出现
-clipboard
则说明系统的 vim 版本不支持与系统剪贴板的交互操作。 -
将 vim 中的代码或者文字复制到剪切板
"+yy
-
将系统剪切板中的代码或者文字复制到 vim 中
"+p
-
查看寄存器使用规则
:help registers
-
将寄存器中的值复制到命令行
<C-R><register>
-
使用 ssh 连接时的复制
-
Windows
别折腾,直接使用 Mobaterm,开启 X server
-
Linux
ssh 连接时添加
-Y
选项
-
重复命令
-
normal
.
-
Ex
@:
选择标签跳转
最建议使用:tjump <tag_name>
,因为他在标签唯一时直接跳转,否则等待用户选择。
可以使用:tags
显示当前跳转的标签堆栈。
创建标记跳转
m<a> —— 创建标记
’<a> —— 移动到标记的文本行首
`<a> —— 移动到标记的光标位置
:marks —— 列示所有标记
:delmarks —— 删除指定标记
:delmarks! —— 删除所有标记
高亮
取消搜索高亮
:noh
操作记录
q<register>
将操作记录到寄存器中
@<register>
执行记录中的操作
q:
显示命令行历史记录
代码折叠
设置折叠模式:
set foldmethod=syntax
关闭默认折叠:
set foldlevelstart=99
快捷键:
za
: 打开 / 关闭当前折叠
zr
: reduces fold level throughout the buffer
zR
: opens all folds
zm
: increases fold level throughout the buffer
zM
: folds everything all the way
C/C++ 语法跳转
目前使用的静态语法跳转系统存在跳转不准确的问题,有些时候效率不高,影响开发节奏。为了提高语法跳转的效率,可以采用 LSP 的方法实现特定语言的符号跳转。
LSP(Language Server Protocol)是一套通信协议,遵从 LSP 规范的客户端(各种编辑器 /IDE)可以通过众多 LSP 服务端按协议标准进行通信,由客户端完成用户界面相关的事情,由服务端提编程语言相关的:补全,定义引用查找,诊断,帮助文档,重构等服务。
目前 C/C++ 的 LSP Server 实现主要有三个:
可以看出,使用 ccls 似乎是一个不错的选择。
vim 要使能 LSP 能力需要安装相应的插件,这类插件也是有不少选择,这里我选择了比较轻量级,开发活跃度比较高的 vim-lsp。
以下就是我整个安装和配置的过程:
安装 ccls
sudo apt install clang cmake libclang-dev llvm-dev rapidjson-dev
git clone --depth=1 --recursive https://github.com/MaskRay/ccls
cd ccls
cmake -H. -BRelease
cmake --build Release --target install
安装 vim-lsp 插件
Plugin 'prabirshrestha/vim-lsp'
注册 ccls 并配置 vim-lsp
" Register ccls C++ lanuage server.
if executable('ccls')
au User lsp_setup call lsp#register_server({
\ 'name': 'ccls',
\ 'cmd': {server_info->['ccls']},
\ 'root_uri': {server_info->lsp#utils#path_to_uri(lsp#utils#find_nearest_parent_file_directory(lsp#utils#get_buffer_path(), 'compile_commands.json'))},
\ 'initialization_options': {'cache': {'directory': expand('~/.cache/ccls') }},
\ 'allowlist': ['c', 'cpp', 'objc', 'objcpp', 'cc'],
\ })
endif
" Key bindings for vim-lsp.
nn <silent> <localleader>gd :LspDefinition<cr>
nn <silent> <localleader>gr :LspReferences<cr>
nn <f2> :LspRename<cr>
nn <silent> <localleader>ga :LspWorkspaceSymbol<cr>
nn <silent> <localleader>gl :LspDocumentSymbol<cr>
highlight lspReference ctermfg=red guifg=red ctermbg=green guibg=green
生成工程构建数据库
由于 LSP 服务端需要目标工程的构建信息来执行相应的代码跳转和高亮操作,所以我们需要一个 json 文件来搜集工程在构建过程中的数据,目前已经有一个比较方便的工具 bear 可以生成这个 json 文件。
首先安装 bear:
sudo apt install bear
然后在构建命令前加上 bear 就能生成 compile_commands.json 这个文件了,把这个文件放到工程根目录下,ccls 会自动解析它。
bear [-a] [-l <path of libear.so>] make images CONF=slow
移动
<c-f>
: 向下一页
<c-b>
: 向上一页
<c-d>
: 向下半页
<c-u>
: 向上半页
<c-e>
: 向下一行,光标位置不变
<c-y>
: 向上一行,光标位置不变
zt
: 当前光标位置变成第一行
zz
: 当前光标位置变成中间一行
zb
: 当前光标位置变成最后一行
10z<enter>
: 第 10 行变成第一行
插件
hotoo/pangu.vim : Markdown 文档美化
vim-scripts/a.vim : 切换头文件和对应源文件
ludovicchabant/vim-gutentags & skywind3000/gutentags_plus : 语法跳转
打开 JS/TS 文件卡死
set re=0
// 或者
set regexpengine=0
文档信息
- 本文作者:Zhuojun Miao
- 本文链接:https://miaozhuojun.github.io/wiki/vim/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)