从0开始搭建属于自己的VIM IDE开发工具


前言

  vim在开发内核的时候会用的比较多,还记得以前初入职场的时候看到旁边大牛使用vim来看代码,那档次就不一样了,不明觉厉。
  现在自己用上vim发现确实香,不过在搭建vim的IDE的环境的时候会比较耗时间,这里记录下我搭建vim开发环境过程,以便将来走到哪里不走弯路,不会忘记。


一、vim是什么?

  Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
  简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。
在没有修改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插件管理器,

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上获取到的插件

  1. omnicappcomplete 该插件主要用于C/C++代码(类或结构体的 . ,-> ,:: 操作符)的自动补全功能;
    下载地址:https://www.vim.org/scripts/script.php?script_id=1520
cd omnicppcomplete-0.41
cp -r * ~/.vim/
  1. acp 该插件是自动补全功能的一个重要插件,与omnicappcomplete的不同在于普通变量函数的自动补全功能;
    下载地址:http://www.vim.org/scripts/script.php?script_id=1879
cd vim-autocomplpop
cp -r * ~/.vim/
  1. 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的所有内容了,防止忘记记录在这篇博文里。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坚持不秃0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值