1. 安装 vim
sudo apt install vim
按自己习惯配置
vim ~/.vimrc
set nocompatible
set nu
filetype on
set history=1000
set background=dark
syntax on
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions-=T
set ruler
set hls
set incsearch
set cursorline
set fencs=utf-8,ucs-bom,euc-jp,gb18030,gbk,gb2312,cp936
vim 一些快捷方法
[I 查找全局标识符定义。这个命令不依赖 ctags,而是在当前文件和 include 的文件中搜索。[<Tab> 查找全局标识符定义并直接跳转到第一个匹配的。3[<Tab> 跳转到第 3 个匹配的。[i 只列出第一个匹配的。]I 只列出当前光标之后的匹配项。]i 只列出当前光标之后的第一个匹配项。[D 只查找以 "#define" 定义的宏。[d 只列出第一个匹配。]D 只列出当前光标之后的匹配。]d 只列出当前光标之后的第一个匹配。gD 与 [I 类似,但只搜索当前文件,不搜索 include 的文件。gd 只在当前函数中查找。[# 跳转到 #if 或#ifdef。]# 跳转到 #else 或#endif。
vim 的折叠
可在 Vim 配置文件中设置 set fdm=XXX
可直接在文件中使用注释调用 vim 命令 /* vim: set fdm=XXX: */
有 6 种方法来选定折叠:1 manual 手工定义折叠
2 indent 更多的缩进表示更高级别的折叠
3 expr 用表达式来定义折叠
4 syntax 用语法高亮来定义折叠
5 diff 对没有更改的文本进行折叠
6 marker 对文中的标志折叠
我习惯用 indent
在可折叠处(大括号中间):zr 打开所有折叠
zR 打开所有折叠, 包含嵌套
zc 折叠
zC 对所在范围内所有嵌套的折叠点进行折叠
zo 展开折叠
zO 对所在范围内所有嵌套的折叠点展开
[z 到当前打开的折叠的开始处。]z 到当前打开的折叠的末尾处。zj 向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。zk 向上移动到前一折叠的结束处。关闭的折叠也被计入。
2.ctags
建立文件索引,实现函数或变量的跳转功能;
缺点:只能跳转到函数定义,不能查找那些地方调用了该函数;
(1) 安装
sudo apt-get install ctags
or
sudo apt-get install exuberant-ctags
(2) 生成 tags 文件
ctags -R
查看 linux 内核代码的话,可以直接
make tags ARCH=arm64
在当前目录生产索引文件
(3) 指定 tags 文件目录
vim ~/.vimrc
set tags=./tags,./TAGS,tags;~,TAGS;~
“./tags”:当前目录查找 tags 文件
如果要运用多个不同目录,可以用 "," 隔开,或则
set tags+=path1
set tags+=path2
如果需要在不同工程查阅代码,可以添加
set tags+=path1;
set autochdir
注:第一个分号不能少,如果当前目录没找到,就到父目录查找,一直递归;
(4) 跳转到指定函数或变量
tag func_name #可以 tab 键补全
tag /xxx #不完全匹配搜索 xxx
CTRL+] : 跳转一次
CTRO+o:返回一次跳转
CTRL+T:返回到最初跳转
]]: 向后跳到下一个函数头
[[:上一个函数头
ctags 不会生产局部变脸的索引
:tags 可以列出查找 / 跳转过程
3.cscope
可以查找函数的定义,调用栈等;
(1) 安装
sudo apt-get install cscope
(2) 使用
cscope -Rbqk
参数说明:
R : 递归所有子目录,建立索引;
b : 建立关联数据库,不导入使用者界面;
q : 建立 cscope.in.out 和 cscope.po.out,加快搜索速度
k : 不搜索预设的 include 目录不搜尋 (/usr/include)
内核代码可以用
make cscope ARCH=arm64
手动加载 cscope.out 文件
:cs add cscope.out
设置自动加入
注意:使用相对路径生产 cscope.out,可能出现查找结果无法跳转问题;
用 "cs add $PWD/cscope.out“指定绝对路径;
vim ~/.vimrc
if has("cscope")
set csprg=/usr/bin/cscope
" 指定:cstag 的搜索顺序。0 表示先搜索 cscope 数据库,若不匹配,再搜索 tag 文件,1
" 则相反
set csto=0
":tag/Ctrl-]/vim - t 将使用:cstag,而不是默认的:tag
set cst
"+(将结果追加到 quickfix 窗口)、-(清空上一次的结果)、0(不使用 quickfix。没有指定也相当于标志为 0)))
"set cscopequickfix=s-,c-,d-,i-,t-,e- " 使用 QuickFix 窗口来显示 cscope 查找结果
set nocsverb " 增加 cscope 数据库时,将不会打印成功或失败信息
set cspc=3 " 指定在查找结果中显示多少级文件路径, 默认值 0 表示显示全路径,1 表示只显示文件名 "
if filereadable("cscope.out")
cs add $PWD/cscope.out $PWD
"cs add cscope.out
else" 子目录打开,向上查找
let cscope_file=findfile("cscope.out", ".;")
let cscope_pre=matchstr(cscope_file, ".*/")
if !empty(cscope_file) && filereadable(cscope_file)
exe "cs add" cscope_file cscope_pre
endif
endif
set nocsverb
endif
补充一点,vim 可能走系统默认的 /etc/vimrc 配置,如果有权限可以直接注掉,如果没有(公用服务器),将
alias vim="vim -u ~/.vimrc"
写入.bashrc , 引用自己定义的配置
添加 cscope 符号索引数据库后,可以调用 "cscope find" 命令进行查找,vim 支持 8 种 cscope 的查询功能
:cs find x {name}
s: 查找 C 语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似 ctags 所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找 egrep 模式,相当于 egrep 功能,但查找速度快多了
f: 查找并打开文件,类似 vim 的 find 功能
i: 查找包含本文件的文件
快捷搜索方法:
ctrl-\ c:查找调用本函数的函数
ctrl-\ d:查找本函数调用的函数
.ctrl-\ s:查找 C 语言符号出现的地方。ctrl-\ g:查找 C 语言符号定义的地方。ctrl-\ t:查找指定的字符串。ctrl-\ e:egrep 模式,相当于 egrep 功能,但比 egrep 快多了。ctrl-\ f:查找并打开文件,类似于 vim 的 find 功能。ctrl-\ i:查找包含本文件的文件。
定义快捷键
vim .vimrc
nmap zs :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap zg :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap zc :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap zt :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap ze :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap zf :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap zi :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap zd :cs find d <C-R>=expand("<cword>")<CR><CR>
其他插件
vim 支持很多插件,为方便管理,这里先安装插件管家,通过这个插件管家自动安装、卸载、更新其他插件;
vim 常用的管家有 vundle 和 vim-plug,这里用 vundle
1. 安装 vundle 插件管家
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
在.vimrc 开启 vundle
vim ~/.vimrc
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
call vundle#end()
Vundle 支持的命令(vim 命令行模式下)
PluginList: 列出安装的插件
PluginInstall: 根据配置文件安装插件
PluginUpdate: 更新插件
PluginSearch [name]: 查找名为 [name] 的插件
2. 安装 NERD 插件
切出一块区域,用来显示从根目录开始的文件结构,可从该索引区直接打开文件;
在.vimrc 添加插件
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'The-NERD-Tree'
call vundle#end()
安装
:PluginInstall
在 vim 命令行模式下用
:NERDTree 目录名 "
启动,默认当前目录。通过 j k 上下移动光标,o 或回车打开文件。
配置:
nmap <F2> :NERDTreeFind<CR><CR> " 设置 F2(我电脑刚好 f2 闲置) 为开启 nerdtree 的快捷键
let NERDTreeWinPos=1 " 将 nerdtree 区域设置在右边
3.taglist 插件:
屏幕切出一块区域显示宏、变量名、函数名的索引;
安装 (要系统预先安装 vim,ctags)
Plugin 'taglist.vim'
:PluginInstall
安装后,在命令行启动
:TlistOpen/TlistClose
可以用 CTRL+ W 快捷键在 Taglist 窗口和编辑窗口切换;
在.vimrc 配置自动启动
" ----------------------------- plugin taglist start -----------------------------
"let Tlist_Use_Right_Window = 1
let Tlist_Show_One_File=1 " 仅显示一个文件的 tag
let Tlist_Exit_OnlyWindow=1 "taglist 为最后一个窗口时,退出 vim
let Tlist_Auto_Open = 1 " 设置打开 vim 时,自动启动 taglist
4.YouCompleteMe 插件
强大的代码自动补全
Plugin 'Valloric/YouCompleteMe'
手动安装:
git clone https://github.com/Valloric/YouCompleteMe.git ~/.vim/bundle/YouCompleteMe
cd ~/.vim/bundle/YouCompeteme
git submodule update --init --recursive
sudo apt install clang
sudo apt install build-essential cmake
sudo apt-get install python-dev python3-dev
#--clang-completer 支持 C 语言,其他语言选择 all
./install.py --clang-completer
在.vimrc 添加配置:
"YouCompletMe
" 自动补全配置
set completeopt=longest,menu " 让 Vim 的补全菜单行为与一般 IDE 一致 (参考 VimTip1228)
autocmd InsertLeave * if pumvisible() == 0|pclose|endif " 离开插入模式后自动关闭预览窗口
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>" " 回车即选中当前项
" 上下左右键的行为 会显示其他信息
inoremap <expr> <Down> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <Up> pumvisible() ? "\<C-p>" : "\<Up>"
inoremap <expr> <PageDown> pumvisible() ? "\<PageDown>\<C-p>\<C-n>" : "\<PageDown>"
inoremap <expr> <PageUp> pumvisible() ? "\<PageUp>\<C-p>\<C-n>" : "\<PageUp>"
"youcompleteme 默认 tab s-tab 和自动补全冲突
"let g:ycm_key_list_select_completion=['<c-n>']
"let g:ycm_key_list_select_completion = ['<Down>']
"let g:ycm_key_list_previous_completion=['<c-p>']
"let g:ycm_key_list_previous_completion = ['<Up>']
let g:ycm_confirm_extra_conf=0 " 关闭加载.ycm_extra_conf.py 提示
let g:ycm_collect_identifiers_from_tags_files=1 " 开启 YCM 基于标签引擎
let g:ycm_min_num_of_chars_for_completion=1 " 从第 2 个键入字符就开始罗列匹配项
let g:ycm_cache_omnifunc=0 " 禁止缓存匹配项, 每次都重新生成匹配项
let g:ycm_seed_identifiers_with_syntax=1 " 语法关键字补全
nnoremap <F5> :YcmForceCompileAndDiagnostics<CR> "force recomile with syntatic
"nnoremap <leader>lo :lopen<CR> "open locationlist
"nnoremap <leader>lc :lclose<CR> "close locationlist
inoremap <leader><leader> <C-x><C-o>
" 在注释输入中也能补全
let g:ycm_complete_in_comments = 1
" 在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
" 注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
let g:clang_library_path='/usr/lib/llvm-10/lib/libclang.so'
如果打开 vim 出现如下错误:
NoExtraConfDetected: No .ycm_extra_conf.py file detected
在 home 目录创建文件.ycm_extra_conf.py
import os
import ycm_core
flags = [
'-Wall',
'-Wextra',
'-Werror',
'-Wno-long-long',
'-Wno-variadic-macros',
'-fexceptions',
'-DNDEBUG',
'-std=c++11',
'-x',
'c++',
'-I',
'/usr/include',
'-isystem',
'/usr/lib/gcc/x86_64-linux-gnu/5/include',
'-isystem',
'/usr/include/x86_64-linux-gnu',
'-isystem'
'/usr/include/c++/5',
'-isystem',
'/usr/include/c++/5/bits'
]
SOURCE_EXTENSIONS = ['.cpp', '.cxx', '.cc', '.c',]
def FlagsForFile(filename, **kwargs):
return {
'flags': flags,
'do_cache': True
}
在.vimrc 添加
let g:ycm_global_ycm_extra_conf='~/.ycm_extra_conf.py'
let g:ycm_confirm_extra_conf = 0
5. 侧边栏显示 git 修改
Plugin 'airblade/vim-gitgutter
6. 目录树显示文件的 git 修改
Plugin 'Xuyuanp/nerdtree-git-plugin'