Vim

以下是个人的 vimrc 配置,会不断更新

myvimrc

其内容大部分参考了 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选项

重复命令

选择标签跳转

最建议使用: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 实现主要有三个:

  • clangd: 貌似比较健壮,但不支持符号的引用搜索
  • cquery: 支持符号引用的搜索,但目前已经停止开发
  • ccls: 完善了 cquery 的不足,支持符号引用的搜索

可以看出,使用 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

文档信息

Search

    Table of Contents