VIM 基本工作流配置

前言

最近结束了近 3 个月的秋招,终于可以闲下来一段时间了。最近想了解别人基于 VIM 的编程工作流,于是参照网上的信息自己配置了一个最基本的工作流。本篇博客记录基本的插件和配置信息,便于后续自己查看。

VIM 配置及基本插件安装

  1. 使用 vim-plug 来管理插件:

下载plug.vim并将其放到~/.vim/autoload路径下(需要自己创建相应目录)。

  1. 配置 VIM 以及相关插件

然后对 VIM 配置基本按键映射以及插件安装,编辑~/.vimrc

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
""""插件""""
call plug#begin('~/.vim/plugged')
Plug 'preservim/nerdtree'
Plug 'Valloric/YouCompleteMe'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'Yggdroot/LeaderF', {'do': ':LeaderfInstallCExtension'}
call plug#end()

set tags=tags;

"F2打开和关闭NERDTree"
map <F2> :NERDTreeToggle<CR>
let NERDTreeWinSize=30

"YCM配置"
let g:ycm_global_ycm_extra_conf='~/.vim/plugged/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py'
let g:ycm_add_preview_to_completeopt = 0
let g:ycm_show_diagnostics_ui = 0
let g:ycm_server_log_level = 'info'
let g:ycm_min_num_identifier_candidate_chars = 2
let g:ycm_collect_identifiers_from_comments_and_strings = 1
let g:ycm_complete_in_strings=1
let g:ycm_key_invoke_completion = '<c-z>'
set completeopt=menu,menuone
noremap <c-z> <NOP>
let g:ycm_semantic_triggers = {
\ 'c,cpp,python,java,go,erlang,perl': ['re!\w{2}'],
\ 'cs,lua,javascript': ['re!\w{2}'],
\ }

"""""""""""""""
"" 通用设置
"""""""""""""""
set nocompatible
filetype on
set t_Co=256
set autoread
set autowrite
set number
syntax on
set showcmd
set encoding=utf-8
filetype indent on
set autoindent
set tabstop=4
set shiftwidth=4
set expandtab
set softtabstop=4
set hlsearch

"不同模式光标样式"
let &t_SI.="\e[5 q" "SI = INSERT mode
let &t_SR.="\e[4 q" "SR = REPLACE mode
let &t_EI.="\e[1 q" "EI = NORMAL mode (ELSE)

"括号补全"
inoremap ( ()<ESC>i
inoremap ) <c-r>=ClosePair(')')<CR>
inoremap [ []<ESC>i
inoremap ] <c-r>=ClosePair(']')<CR>
inoremap " ""<ESC>i
inoremap ' ''<ESC>i
inoremap { {}<ESC>i
" { 后快速回车 ==> 带缩进的花括号"
inoremap {<CR> {<CR>}<ESC>O
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endfunction
inoremap jk <ESC>
  1. 安装插件

使用 VIM 命令模式的 :PlugInstall 即可安装插件:

等待插件安装结束即可。
其中 YouCompleteMe 插件需要安装以下依赖:

1
sudo apt install build-essential cmake python3-dev

并在~/.vim/plugged/YouCompleteMe下进行编译:

1
python3 install.py --clang-completer

为了使 YCM 能够补全 C++ 标准库中的符号,需要修改~/.vim/plugged/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py文件中相关的配置(第43行和44行为添加的内容,不同机器上路径不一样,一般都是...../c++/*的路径):

tmux 安装和配置

tmux 是终端复用器,能够用于启动一系列的终端会话。我们平时使用的终端窗口也会对应一个会话,当我们在这个会话中运行程序时,关闭终端会导致会话被关闭,这时候程序也会被关闭。

而 tmux 将终端和会话进行的解绑,当终端关闭时会话并不会被终止,可以重新连接到会话。此外,tmux 有灵活的分屏和切换等功能,能够有效的提高工作效率。

安装 tmux:

1
sudo apt-get install tmux

这里并不会介绍 tmux 的使用,只是记录其相关的配置,编辑~/.tmux.conf:

1
2
3
4
5
6
7
unbind C-b 
set -g prefix C-a
set-option -g mouse on
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

这里将默认的Ctrl + b控制前缀变为了Ctrl + a,便于操作,并开启了鼠标控制分屏的大小,改变了光标在不同分屏之间切换的控制方法,是其和 VIM 中分屏控制统一。VIM 中通过Ctrl + wh, j, k, l来控制光标在分屏之间移动,而 tmux 通过 Ctrl + ah, j, k, l 来做到这一点。

通过 VIM 和 tmux 配合可以实现一个较为舒适的界面进行开发和编译调试:

总结

配置的过程其实还是比较花时间,主要是新手需要花较长时间来适应和记住相关的快捷键,最终是达到了一个可用的地步。在平时只具备终端开发环境的情况下,这样配置和使用还算顺手。对于不想折腾的朋友,使用 vscode 的 remote-ssh 或者 CLion 这类 IDE 也许是更好的选择。