文章目录
前言
vim在开发内核的时候会用的比较多,还记得以前初入职场的时候看到旁边大牛使用vim来看代码,那档次就不一样了,不明觉厉。
现在自己用上vim发现确实香,不过在搭建vim的IDE的环境的时候会比较耗时间,这里记录下我搭建vim开发环境过程,以便将来走到哪里不走弯路,不会忘记。
一、vim是什么?
Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。
在没有修改vim之前的键盘图
二、从0开始搭建VIM IDE开发环境
搭建IDE开发环境,无非需要两个必要的点:
- 索引能力
- 编辑能力
满足以上两个点就能就能得到一个初步的开发环境,其余的细枝末节就是锦上添花,不过有时这些锦上添花的功能也会很方便。
优秀的编辑能力vim本身已经具备,所以我们主要解决vim的索引能力,话不多说开始我们今天的正题:
vim常用的索引的插件:ctags和cscope
ctags:能搭建起代码里面函数、变量和宏的定义跳转功能,方便代码阅读的工具,但是缺陷是当有多个函数定义点时,会直接跳转到记录的第一个,不会给用户选择的余地。
cscope:能通过这个插件快速的找到函数或变量的定义位置、被调用位置或快速查找某个字符串,缺陷在于目前只支持C和C++,且该插件还提供一个界面,用于选择跳转到那个文件,这个插件一定程度上补齐了ctags的短板。
如下是我个人的.vimrc,整体会比较整洁,不喜欢很多东西堆在一起没有美感。
"""""""""""""""""""""""""load plug module""""""""""""""""""""""""""""
call plug#begin()
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
Plug 'preservim/nerdtree'
Plug 'godlygeek/tabular'
Plug 'mileszs/ack.vim'
Plug 'w0rp/ale'
Plug 'brookhong/cscope.vim'
Plug 'Yggdroot/indentLine'
Plug 'easymotion/vim-easymotion'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
call plug#end()
""""""""""""""""""common、map和gitgutter settings"""""""""""""""""""""
source /home/xxx/.vim/self/common.vim
"配置新创文件初始化内容
source /home/xxx/.vim/self/files.vim
"""""""""""""""""""""""--Nerdtree setting--"""""""""""""""""""""""""
source /home/xxx/.vim/self/nerdtree.vim
"""""""""""""""""""""""""--cscope setting--"""""""""""""""""""""""""
source /home/xxx/.vim/self/cscope.vim
"""""""""""""--ctags、taglist和omnicppcomplete setting--"""""""""""""
source /home/xxx/.vim/self/tags.vim
"""""""""""""""""""""""""--airline setting--"""""""""""""""""""""""""
source /home/xxx/.vim/self/airline.vim
""""""""""""""""""--indentline easymotion setting--""""""""""""""""""
source /home/xxx/.vim/self/indentline.vim
下面进行细分:
前面2~13行内容:是用来加装插件的本身plug这个字段也是要安装一个插件才能使用。
1、目录创建
mkdir ~/.vim
cd ~/.vim
mkdir after autoload doc plugged plugin self syntax
#目录介绍
~/.vim/after #会在vim启动时加载,不过需等~/.vim/plugin/加载完成之后才加载after里的内容。
~/.vim/autoload #它是一个非常重要的目录,在用到时会自动加载里面的文件,而不是在vim启动时就加载。
~/.vim/doc #为插件放置文档的地方。例如:help的时候可以用到。
~/.vim/pluged #放置通过plug插件下载其他插件的位置。
~/.vim/plugin #存放的是每次启动vim都会被运行一次的插件。
~/.vim/self #自定义的一个目录,用于存放自己编写的vim文件,需source添加到主vim配置里面
~/.vim/syntax #语法描述脚本。比如c语言语法相关的插件。
2、 安装插件管理器Vim-plug
Vim-plug 是一个Vim插件管理器,
- 离线下载:
Vim-plug的获取链接:https://github.com/junegunn/vim-plug
cp plug.vim ~/.vim/autoload
cp plug.txt ~/.vim/doc
- 在线下载:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
curl -fLo ~/.vim/doc/plug.txt --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/doc/plug.txt
3、 安装其他插件
在~/.vimrc内输入开头我的.vimrc的几个插件内容,后面会一一介绍齐作用。
call plug#begin()
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
Plug 'preservim/nerdtree'
Plug 'w0rp/ale'
Plug 'brookhong/cscope.vim'
Plug 'Yggdroot/indentLine'
Plug 'easymotion/vim-easymotion'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'airblade/vim-gitgutter'
call plug#end()
fzf: 通用命令行模糊查找器,用作搜索文件和命令行历史,非常实用的一个插件
nerdtree: 树形方式展示文件系统,用于从目录结构中手动找到文件
ale: 代码异步检测插件,可以实时/并发显示错误语法,在标识栏、状态栏以及命令行查看信息
cscope: ctags的增强版,前面有介绍
indentline: 一个用细垂直线显示缩进级别的vim插件
easymotion: 使用键盘移动光标的插件,超强的光标移动插件,能快速移动到你想要移动到的位置
airline: 美化状态栏插件,使得整个界面好看很多
gitgutter: 在sign列中显示git diff的Vim插件,它显示已添加、修改或删除的行,还可以预览、暂存和撤消单个hunk
上面的插件中有两个比较特殊,这里做特别的说明:
其中,fzf的安装也会改变.bashrc这个文件,在之后的启动中,你的系统也会有fzf的功能,该功能很方便用于找文件和查看命令行历史,非常使用且方便。
另外,cscope插件的使用还需要在系统上安装有cscope,这里的插件会需要使用系统cscope
sudo apt-get install cscope
有没有发现,在安装的插件中还少了一个ctags,这里要做单独说明:
跟cscope相似,需要系统安装ctags,然后在进行vim的设置,即可在Vim里使用
sudo apt-get install ctags
其他,无法从github上获取到的插件
- omnicappcomplete 该插件主要用于C/C++代码(类或结构体的 . ,-> ,:: 操作符)的自动补全功能;
下载地址:https://www.vim.org/scripts/script.php?script_id=1520
cd omnicppcomplete-0.41
cp -r * ~/.vim/
- acp 该插件是自动补全功能的一个重要插件,与omnicappcomplete的不同在于普通变量函数的自动补全功能;
下载地址:http://www.vim.org/scripts/script.php?script_id=1879
cd vim-autocomplpop
cp -r * ~/.vim/
- taglist 该插件提供一个可视化界面,使得用户在vim编辑器中便捷的查看/显示源代码的函数、类、结构体等信息,用户可以从taglist中选择并进入
下载地址:http://www.vim.org/scripts/script.php?script_id=273
cd taglist_46
cp -r * ~/.vim/
4、 配置插件
4.1 vim 环境通用配置
""如上面所提到我的.vimrc里面会加如下这句话
""""""""""""""""""common、map和gitgutter settings"""""""""""""""""""""
source /home/xxx/.vim/self/common.vim
common.vim里面包含3块:
- vim所有通用配置;
- 组合按键的映射方式;
- gitgutter插件的设置;
"""""""""""""""""""""""""""""common settings"""""""""""""""""""""""""
set nu " 设置行号
syntax on
syntax enable
set nocompatible
"缩进宽度设置
set noexpandtab
set smartindent
set tabstop=4 " tab宽度
set shiftwidth=4
set autoindent " 自动缩进
set smarttab
set showmatch
set fileformat=unix " 保存文件格式
set textwidth=79 " 行最大宽度
set confirm " 未保存退出时提示
"set list
"搜索逐字符高亮
set hlsearch
set incsearch
set cmdheight=2 " 设定命令行的行数为 2
set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏)
set cino=g0,:0 " 对齐风格
set spell " 打开拼写检查
set mouse=c " 设置鼠标可用
set cursorline " 高亮当前行
set ignorecase " 忽略大小写
colorscheme desert
set autoread
set foldenable " 允许折叠
set foldmethod=manual " 手动折叠
set magic " 设置魔术
set ruler " 打开状态栏标尺
set showcmd " 显示输入的命令
set guifont=Courier_New:h10:cANSI " 设置字体
" 保存光标的位置
autocmd BufReadPost *
\ if line("'\"")>0 && line("'\"") <= line("$") |
\ exe "normal g'\"" |
\ endif
"""""""""""""""""""""""""--map setting--""""""""""""""""""""""""""""
" 转移串口聚焦
nnoremap <C-w> <C-W>w
nnoremap <C-l> <C-W>l
nnoremap <C-h> <C-W>h
" 跳转到.c或.h文件
nnoremap A :A<CR>
" 回退撤回
nnoremap U <C-r>
"保存和退出vim
nnoremap ,w :w<CR>
nnoremap ,q :q<CR>
" 取消vim自带的高亮功能
nnoremap ,b :noh<CR>
" 屏幕分割
nnoremap ,s :sp<CR> " 竖屏分割
nnoremap ,v :vsp<CR> " 横屏分割
" 打开FZF搜索(ctrl + p),查看上一次搜索情况(ctrl + e)
nnoremap ,f :Files<CR>
nnoremap ,e :Buffers<CR>
" 下一个buffer,上一个buffer,删除buffer
nnoremap bn :bn<CR>
nnoremap bp :bp<CR>
nnoremap bd :bd<CR>
"""""""""""""""""""""""""--gitgutter setting--""""""""""""""""""""""""""""
set updatetime=1000
highlight GitGutterAdd ctermfg=blue
highlight GitGutterChange ctermfg=green
highlight GitGutterDelete ctermfg=red
"配置新创文件初始化内容
source /home/xxx/.vim/self/files.vim
" 自动补充括号
inoremap ( ()<ESC>i
inoremap { {<CR>}<ESC>O
inoremap [ []<ESC>i
inoremap " ""<ESC>i
inoremap ' ''<ESC>i
inoremap ) <c-r>=ClosePair(')')<CR>
inoremap } <c-r>=ClosePair('}')<CR>
inoremap ] <c-r>=ClosePair(']')<CR>
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endfunction
"新建.c,.h,.sh,.java文件,自动插入文件头
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()"
""定义函数SetTitle,自动插入文件头
func SetTitle()
"如果文件类型为.sh文件
if &filetype == 'sh'
call setline(1,"\#########################################################################")
call append(line("."), "\# File Name: ".expand("%"))
call append(line(".")+1, "\# Author: xxx")
call append(line(".")+2, "\# mail: xxx@xxx")
call append(line(".")+3, "\# Created Time: ".strftime("%c"))
call append(line(".")+4, "\#########################################################################")
call append(line(".")+5, "\#!/bin/bash")
call append(line(".")+6, "")
else
call setline(1, "/*************************************************************************")
call append(line("."), " * File Name: ".expand("%"))
call append(line(".")+1, " * Author: xxx")
call append(line(".")+2, " * Mail: xxx@xxx")
call append(line(".")+3, " * Created Time: ".strftime("%c"))
call append(line(".")+4, " ************************************************************************/")
call append(line(".")+5, "")
endif
if &filetype == 'cpp'
call append(line(".")+6, "#include <iostream>")
call append(line(".")+7, "using namespace std;")
call append(line(".")+8, "")
endif
if &filetype == 'c'
call append(line(".")+6, "#include <stdio.h>")
call append(line(".")+7, "")
endif
"新建文件后,自动定位到文件末尾
autocmd BufNewFile * normal G
endfunc
4.2 Nerdtree 配置
"""""""""""""""""""""""--Nerdtree setting--"""""""""""""""""""""""""
source /home/xxx/.vim/self/nerdtree.vim
" F2打开/关闭NERDTree
map <F2> :NERDTreeMirror<CR>
map <F2> :NERDTreeToggle<CR>
" 打开vim时,自动打开NERDTree
autocmd vimenter * NERDTree
wincmd w
autocmd vimEnter * wincmd w
" 修改树的显示图标
let g:NERDTreeDirArrowExpandable = '+'
let g:NERDTreeDirArrowCollapsible = '-'
let g:NERDTreeWinPos = 'left' "窗口位置
let g:NERDTreeSize = 30 "窗口尺寸
let g:NERDTreeShowLineNumbers = 1 "窗口是否显示行号
let g:NERDTreeHidden = 0 "不显示隐藏文件
" 当界面只留有Nerdtree时,会自动退出vim
function! AutoExitTree()
if winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree()
quit
endif
endfunction
autocmd BufEnter * call AutoExitTree()
" 判断Nerdtree是否是处于打开状态
function! IsNERDTreeOpen()
return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1)
endfunction
" Nerdtree打开时,实时同步当前文件对应文件目录树的位置
function! SyncTree()
if &modifiable && IsNERDTreeOpen() && strlen(expand('%')) > 0 && !&diff
NERDTreeFind
wincmd p
endif
endfunction
" 高亮当前文件所在行
autocmd BufEnter * call SyncTree()
4.3 cscope 配置
"""""""""""""""""""""""""--cscope setting--"""""""""""""""""""""""""
source /home/xxx/.vim/self/cscope.vim
注意:下文中vim默认<leader>键是" \ "
if has("cscope")
set csprg=/usr/bin/cscope
set csto=0 " cscope数据将会被优先查找
set nocsverb
" 添加当前目录下的数据库
if filereadable("cscope.out")
cs add cscope.out
" 添加环境变量中指定的数据库
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set cscopequickfix=s-,g-,c-,f-,t-,d-,i-,e-,a-
" 快捷键映射
" 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
nnoremap <leader>fs :cs find s <c-r>=expand("<cword>")<cr><cr>:copen<cr>
" 查找函数、宏、枚举等定义的位置
nnoremap <leader>fg :cs find g <c-r>=expand("<cword>")<cr><cr>:copen<cr>
" 查找本函数调用的函数
nnoremap <leader>fd :cs find d <c-r>=expand("<cword>")<cr><cr>:copen<cr>
" 查找调用本函数的函数
nnoremap <leader>fc :cs find c <c-r>=expand("<cword>")<cr><cr>:copen<cr>
" 查找指定的字符串
nnoremap <leader>ft :cs find t <c-r>=expand("<cword>")<cr><cr>:copen<cr>
" 查找egrep模式,相当于egrep功能,但查找速度快多了
nnoremap <leader>fe :cs find e <c-r>=expand("<cword>")<cr><cr>:copen<cr>
" 查找并打开文件,类似vim的find功能
nnoremap <leader>ff :cs find f <c-r>=expand("<cfile>")<cr><cr>:copen<cr>
" 查找包含本文件的文件
nnoremap <leader>fi :cs find i <c-r>=expand("<cfile>")<cr><cr>:copen<cr>
nnoremap <c-j> :cnext<cr> " 切换至下一个cscopequickfix的搜索结果 映射为 ctrl+j
nnoremap <c-k> :cprev<cr> " 切换至上一个cscopequickfix的搜索结果 映射为 ctrl+k
nnoremap <leader>t :copen<cr> " 打开cscopequickfix窗口
autocmd FileType qf nnoremap <buffer> <CR> <CR>:cclose<CR>
endif
4.4 Ctags、taglist和omnicppcomplete 配置
"""""""""""""--ctags、taglist和omnicppcomplete setting--"""""""""""""
source /home/xxx/.vim/self/tags.vim
" F3打开/关闭taglist
" F4重新生成tags文件,并更新taglist
map <F3> :TlistToggle<CR>
map <F4> :!ctags -R --c-kinds=+p --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
\ :!cscope -Rbqk <CR>
\ :TlistUpdate<CR>
imap <F4> <ESC>:!ctags -R --c-kinds=+p --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
"""""""""""""""""""""""""--ctags setting--""""""""""""""""""""""""""""""
set tags=~/.ctags/tags,tags
"""""""""""""""""""""""""--taglist setting--"""""""""""""""""""""""""""""
let Tlist_Show_One_File=1 "只显示当前文件的tags
let Tlist_Ctags_Cmd='ctags'
let Tlist_WinWidth=40 "设置taglist宽度
let Tlist_Exit_OnlyWindow=1 "tagList窗口是最后一个窗口,则退出Vim
let Tlist_Use_Right_Window=1 "在Vim窗口右侧显示taglist窗口
let Tlist_Process_File_Always=1
let Tlist_Compart_Format=1 "压缩方式
let Tlist_Close_On_Select=1 "在选择了tag后自动关闭taglist窗口
let Tlist_Auto_Update=1 "随文件自动更新
"""""""""""""""""""""""""--omnicppcomplete setting--"""""""""""""""""""
"该插件是基于Ctags来进行补全的
filetype plugin indent on
set completeopt=menu,longest
let OmniCpp_MayCompleteDot=1 "打开.提示
let OmniCpp_MayCompleteArrow=1 "打开->提示
let OmniCpp_MayCompleteScope=1 "打开::提示
let OmniCpp_NamespaceSearch=1 "打开namespace
let OmniCpp_GlobalScopeSearch=1 "打开全局搜索
let OmniCpp_DefaultNamespace=["std"] "默认命名空间为std
let OmniCpp_ShowPrototypeInAbbr=1 "打开函数提示function
let OmniCpp_SelectFirstItem=2 "自动定位到第二个
4.5 airline 配置
"""""""""""""""""""""""""--airline setting--"""""""""""""""""""""""""
source /home/xxx/.vim/self/airline.vim
"""""""""""""""""""""""""--airline setting--""""""""""""""""""""""""""""
let g:airline_theme="molokai"
let g:airline_powerline_fonts = 1
let laststatus = 2
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
let g:airline_left_sep = '▶'
let g:airline_left_alt_sep = '❯'
let g:airline_right_sep = '◀'
let g:airline_right_alt_sep = '❮'
let g:airline_symbols.linenr = '¶'
let g:airline_symbols.branch = '⎇'
" 开启tabline
let g:airline#extensions#tabline#enabled=1 "tabline中当前buffer两端的分隔字符
"let g:airline#extensions#tabline#left_sep=' ' "tabline中未激活buffer两端的分隔字符
"let g:airline#extensions#tabline#left_alt_sep='|' "tabline中buffer显示编号
let g:airline#extensions#tabline#buffer_nr_show=1
" 关闭状态显示空白符号计数
"let g:airline#extensions#whitespace#enabled = 0
"let g:airline#extensions#whitespace#symbol = '!'
4.6 indentline、easymotion和ale 配置
""""""""""""""""""--indentline easymotion setting--""""""""""""""""""
source /home/xxx/.vim/self/indentline.vim
"""""""""""""""""""""""""--indentline setting--""""""""""""""""""""""""""""
let g:indentLine_enabled = 1
let g:autopep8_disable_show_diff = 1
"""""""""""""""""""""""""--easymotion setting--""""""""""""""""""""""""""""
nmap ss <Plug>(easymotion-s2)
""""""""""""""""""""""""""""--ale setting--""""""""""""""""""""""""""""""""
" 自定义跳转错误行快捷键
nmap <leader>k <Plug>(ale_previous_wrap)
nmap <leader>j <Plug>(ale_next_wrap)
let g:ale_sign_column_always = 1 " 保持侧边栏可见
let g:ale_sign_error = '>>' " 改变错误标识
let g:ale_sign_warning = '--' " 改变警告标识
" 改变命令行消息
let g:ale_echo_msg_error_str = 'E'
let g:ale_echo_msg_warning_str = 'W'
" 添加检测完成后回调
augroup YourGroup
autocmd!
autocmd User ALELint call YourFunction()
augroup END
4.7 C语言源文件语法颜色配置
复制下面内容,重命名为c.vim放置在~/.vim/syntax目录下
syn match cFunctions "\<[a-zA-Z_][a-zA-Z0-9_]*\>\s*("me=e-1
syn match cStruct "\(struct\|union\|enum\|typedef\)\{1}\s\+\<[a-zA-Z_][a-zA-Z0-9_]*\>\(\s*\**\s*\)*[);]\?\s*\n*"me=e-1 contains=cVar
syn match cVar "\(\s*\**\s*\)*&\?\s*\<[a-zA-Z_][a-zA-Z0-9_]*\>\s*[,\);:=\>\<\-+\|\&\.\[\]]"me=e-1 contains=cStruct,cStatement,cMacro,cType
syn match cStrMbrP "\->\<[a-zA-Z_][a-z_A-Z0-9]*\>" contains=cStruct
syn match cStrMbrM "\.\<[a-zA-Z_][a-z_A-Z0-9]*\>" contains=cStruct
syn match cMacro "\s*\<[A-Z][a-zA-Z0-9_]*\>\s*[a-zA-Z0-9_,\);:\"\'=><\-+\|\&\.\[\]]\|(\->)\?\s*\n*"me=e-1 contains=cStruct
hi cFunctions gui=none cterm=bold ctermfg=214
hi cStruct gui=none cterm=bold ctermfg=45
hi cVar gui=none cterm=none ctermfg=150
hi cStrMbrP gui=none cterm=none ctermfg=196
hi cStrMbrM gui=none cterm=none ctermfg=201
hi cMacro gui=none cterm=bold ctermfg=159
hi cType gui=none cterm=bold ctermfg=45
总结
以上就是自己使用的vim的所有内容了,防止忘记记录在这篇博文里。