配置 Vim

构建 Vim 和 YCM

Vim 不知不觉已经到迭代到了 9.0 版本了,回顾昨天我还在用 vim 6.0

构建vim

$ git clone https://github.com/vim/vim --depth 1
$ sudo apt install python3-dev universal-ctags  \
        exuberant-ctags libperl-dev \
        liblua5.3-dev libpcre3-dev libncurses-dev
$ cd vim; 
$ ./configure --prefix=/home/ihexon/vim_bin \
    --enable-cscope    --enable-terminal    \
    --enable-multibyte  --enable-autoservername \
    --enable-python3interp=yes  --enable-perlinterp=yes \
    --enable-luainterp=yes

有关构建 Vim 的更多细节可以在 src/INSTALL* 中找到。

Vim 的源码组织和文档结构给我的感觉就是,它真的是 Unix生态中的活化石…. 当你进到 READMEdir,发现这里有一堆平套相关的 README:

Contents         README_ami.txt       README_amibin.txt.info  README_bindos.txt  README_haiku.txt  README_os2.txt    README_srcdos.txt  README_w32s.txt  runtime.info
Contents.info    README_ami.txt.info  README_amisrc.txt       README_dos.txt     README_mac.txt    README_os390.txt  README_unix.txt    Vim.info         src.info
README.txt.info  README_amibin.txt    README_amisrc.txt.info  README_extra.txt   README_ole.txt    README_src.txt    README_vms.txt     Xxd.info         vimdir.info

随便打开某个平台相关的 README 比如 README_ami.txt 看看:

README_ami.txt for version 9.0 of Vim: Vi IMproved.

This file explains the installation of Vim on Amiga systems.
See README.txt for general information about Vim.

嗯,Amiga systems 是什么系统,怎么之前没听说?搜索一下看看:

这是我爷…

Vim 配置

$ rm -rf ~/.vim

$ curl -fLo ~/.vim/autoload/plug.vim \
    --create-dirs  \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

~/.vim/vimrc 下的插件配置:

execute 'source' fnamemodify(expand('<sfile>'), ':h').'/init.vim'
let g:ycm_use_clangd = 1


call plug#begin()
  Plug 'dracula/vim'
  Plug 'ycm-core/YouCompleteMe', { 'dir': '~/YouCompleteMe', 'do': 'git submodule update --init --recursive' }
  Plug 'andymass/vim-matchup'
  Plug 'preservim/tagbar'
        Plug 'preservim/nerdtree'
        Plug 'mhinz/vim-grepper', { 'on': ['Grepper', '<plug>(GrepperOperator)'] }
call plug#end()

colorscheme dracula

" let g:ycm_clangd_binary_path = '/data/local/tmp/gentoo/usr/lib/llvm/17/bin/clangd'

let g:ycm_clangd_uses_ycmd_caching = 1
let ycm_min_num_identifier_candidate_chars = 4
let g:ycm_auto_trigger = 1

let g:ycm_enable_semantic_highlighting=1
let g:ycm_server_log_level = 'debug'
" let g:ycm_global_ycm_extra_conf = '/data/local/tmp/gentoo/home/.vim/ycm_extra_conf.py'
let g:ycm_add_preview_to_completeopt = 1
let g:ycm_autoclose_preview_window_after_insertion = 1
let g:ycm_autoclose_preview_window_after_completion = 1
let g:ycm_goto_buffer_command = 'split'

exe 'hi MatchParen ctermbg=blue guibg=lightblue cterm=italic gui=italic'

Vim 加载 .vim/vimrc 后使用 :PlugInstall 安装插件,注意 YCM 的源码被拉取到了 ~/YouCompleteMe 下。接下来构建 YCM。

构建 YCM

$ cd /home/ihexon/YouCompleteMe
$ ./install.py --clangd-completer

clangd 会被自动下载到 ./third_party/ycmd/third_party/clangd/output/bin/clangd 下。实际上 YCM 是 Clangd 的前端,clangd 会根据 compile_commands.json 对整个代码生成 indexs,clangd 将诊断和补全结果返回给 YCMD,呈现给 Vim。

开始使用 Vim

Vim 内 Debug

VIM 9.0 版本集成了 Termdebug 这个插件(起初 Termdebug 是独立存在的),关于 Debug 的所有细节可以参考:help Termdebug 文档。

Termdebug 需要通过 :packadd termdebug 来加载到 Vim &rtp 中,通过:echo &rtp 显示:

就可以开始 Debug 了,使用 :Termdebug 后 Vim 会分出一个 Terminal 窗口运行 GDB 调试器:

GDB Console 可以键入调试命令,vim 的文本编辑区域则会响应 GDB,另外如果启用了鼠标模式,可以右键变量名,Vim 会 popup 一个菜单,可以在当前行标记 breakpoint 或者 Eval 某个变量,方便太多了。

实际上 Vim debug 也没有那么复杂对不对?

补全

ctrl+space

快速跳转

在if,elseif,else,endfi 之前快速跳转按 %,vim 会自动判断与此光标匹配的上级的判断语句。 Note:matchit 已经是 Vim 7.4.1649 以及之后的内置插件,patch 可以在这里看到

更新:我的配置使用了增强版的 Matchup 插件 andymass/vim-matchup

在 clangd 正常工作的情况下,YCM 帮助我们在函数结构体之间跳转:

:YcmCompleter GoTo 跳转到目标函数,类似的还有 GoToDeclaration,GoToInclude,GoToReferences 等。 :YcmCompleter GoToSymbol 在 indexs 中搜索 symbol。

Tagbar

一个Outline 插件: preservim/tagbar,使用 TagbarToggle 启动: ,tagbar 现需要系统安装 universal-ctags:

内置终端

Vim内支持:term 开启一个新的终端会话,这功能非常好用,我在想是不是直接可其实可以用 Vim 来实现 tmux 一样的终端复用效果。 vim 内的 terminal 实际上是一个 buffer,使用CTRL-W N 来回到 Normal 模式,让使用 :resize +10 命令调整窗口高度