================================
使用vim打造IDE, 针对C语言开发者
建议使用gvim
================================
先上两个截图
# 安装ctags
1. 下载地址: http://ctags.sourceforge.net/
# 安装cscope
1. 下载地址: http://cscope.sourceforge.net/
2. 修改源码,使其支持递归搜索文件夹的软链接
修改文件: dir.c
修改方式: 替换函数调用 lstat 全部替换为 stat
3. 编译源码可能出现的错误
错误: fatal error: curses.h: No such file or directory
解决: sudo apt install libncurses5-dev libncursesw5-dev
# 安装ruby, command-t插件会用到
sudo apt install ruby ruby-dev
# 安装vim, vim-gtk
sudo apt install vim vim-gtk
# 在home目录下创建 .vimrc 并编辑
1. 将附录1中 vimrc 的内容拷贝进去
# 在home目录下创建 .vim 目录
1. 进入 .vim 目录
2. 创建目录 autoload bundle colors syntax
# 在 ~/.vim/colors 目录中创建 mycolor.vim 并编辑
1. 将附录2中 mycolor.vim 的内容拷贝进去
# 在 ~/.vim/syntax 目录中创建 c.vim 并编辑
1. 将附录3中 c.vim 的内容拷贝进去
# 下载插件 vundle 到 ~/.vim/bundle
1. git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
2. 需要安装 git
3. vundle 可以自动安装和更新其他vim插件
# 下载插件 pathogen 到 ~/.vim/autoload
1. curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
2. 需要安装 curl3. pathogen 可以自动加载插件
# 安装其余 vim 插件
1. 打开 vim 或 gvim
2. 执行 :PluginInstall
# 编译 command-t插件
1. 进入 ~/.vim/bundle/command-t/ruby/command-t目录
2. 执行 ruby extconf.rb
3. 执行 make
# 编译 YouCompleteMe 插件
1. 进入 ~/.vim/bundle/YouCompleteMe
2. 执行 ./install.py --clang-completer
3. 需要安装 cmake
# 创建 tag 生成和高亮脚本
1. 找一个地方创建 htags.sh 文件,注意同时修改 .vimrc 中该脚本的路径
2. 将附录4中 htags.sh 的内容拷贝进去
3. 给htags.sh增加执行权限 chmod u+x htags.sh
# 生成 ctags 和 cscope 的标签并高亮
1. 在工程的根目录打开 gvim 或 vim
2. 使用快捷键 t 创建 ctags的标签
3. 使用快捷键 c 创建 cscope的标签
4. 使用快捷见 ht 对重新高亮标签
*每次启动vim时会自动导入一次, 如果没有
重新生成标签就不要重新导入
# 使用YouCompleteMe的自动补全功能
1. 在工程的根目录或创建 .ycm_extra_conf.py
2. 将附录5中 .ycm_extra_conf.py 内容拷贝到其中
3. 根据工程修改其中的头文件路径
附录1 .vimrc
view sourceprint?001.'===================通用配置======================
002.
003.'文件搜索路径
004.set path=.,/usr/include,,
005.
006.' 控制
007.set nocompatible '关闭vi兼容
008.filetype off '关闭文件类型侦测,vundle需要
009.set fileencodings=utf-8,gbk '使用utf-8或gbk编码方式
010.syntax on '语法高亮
011.set backspace=2 '退格键正常模式
012.set whichwrap=<,>,[,] '当光标到行首或行尾,允许左右方向键换行
013.set autoread '文件在vim外修改过,自动重载
014.set nobackup '不使用备份
015.set confirm '在处理未保存或只读文件时,弹出确认消息
016.set scrolloff=3 '光标移动到距离顶部或底部开始滚到距离
017.set history=1000 '历史记录数
018.set mouse= '关闭鼠标
019.set selection=inclusive '选择包含最后一个字符
020.set selectmode=mouse,key '启动选择模式的方式
021.set completeopt=longest,menu '智能补全,弹出菜单,无歧义时才自动填充
022.set noswapfile '关闭交换文件
023.set hidden '允许在有未保存的修改时切换缓冲区
024.
025.'显示
026.colorscheme mycolor '选择配色方案
027.set t_Co=256 '可以使用的颜色数目
028.set number '显示行号
029.set laststatus=2 '显示状态行
030.set ruler '显示标尺
031.set showcmd '显示输入的命令
032.set showmatch '高亮括号匹配
033.set matchtime=1 '匹配括号高亮的时间(十分之一秒)
034.set matchpairs={:},(:) '匹配括号'{}''()'
035.set hlsearch '检索时高亮匹配项
036.set incsearch '边检索边显示匹配
037.set go-=T '去除gvim的toolbar
038.
039.'格式
040.set noexpandtab '不要将tab转换为空格
041.set shiftwidth=4 '自动缩进的距离,也是平移字符的距离
042.set tabstop=4 'tab键对应的空格数
043.set autoindent '自动缩进
044.set smartindent '智能缩进
045.
046.
047.'===================按键映射======================
048.
049.'按键映射的起始字符
050.let mapleader = ''
051.
052.'使用Ctrl-l 和 Ctrl+h 切换标签页
053.nnoremap gt
054.nnoremap gT
055.
056.'在行末加上分号
057.nnoremap ; :a;
058.'保存
059.nnoremap :w
060.'替换
061.nnoremap :%s/=expand('')/=expand('')
062.'===================插件管理======================
063.
064.' 下载vundle
065.' git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
066.
067.' 下载pathogen
068.' curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
069.
070.' 将vundle加入到runtime path
071.set rtp+=~/.vim/bundle/Vundle.vim
072.
073.' 下载到bundle目录的插件
074.call vundle#begin()
075.
076.' plugin on GitHub repo
077.Plugin 'VundleVim/Vundle.vim'
078.Plugin 'scrooloose/nerdtree'
079.Plugin 'Lokaltog/vim-powerline.git'
080.Plugin 'wincent/command-t'
081.Plugin 'Valloric/YouCompleteMe'
082.Plugin 'tomtom/tlib_vim'
083.Plugin 'tomtom/viki_vim'
084.
085.' plugin from http://vim-scripts.org/vim/scripts.html
086.Plugin 'taglist.vim'
087.Plugin 'EasyGrep'
088.
089.' Git plugin not hosted on GitHub
090.' Plugin 'git://...'
091.
092.' git repos on your local machine
093.' Plugin 'file://...'
094.
095.call vundle#end()
096.
097.filetype plugin indent on ' required
098.
099.'===================插件配置======================
100.
101.'-----pathogen-----
102.execute pathogen#infect()
103.
104.'-----NERDTree-----
105.let g:NERDTreeCaseSensitiveSort = 1
106.let g:NERDTreeWinSize = 25
107.let g:NERDTreeWinPos = 'right'
108.nnoremap t :NERDTreeToggle
109.nnoremap o :NERDTreeFind
110.
111.'-----Powerline-----
112.set fillchars+=stl: ,stlnc:
113.let g:Powerline_symbols = 'compatible'
114.let g:Powerline_stl_path_style = 'filename' '只显示文件名
115.
116.'-----Command-T-----
117.let g:CommandTFileScanner = 'ruby' '使用ruby作为文件浏览器
118.let g:CommandTTraverseSCM = 'dir' '根目录为执行vim时所在的目录
119.'打开文件跳转
120.nnoremap f :CommandT
121.
122.'-----taglist-----
123.let Tlist_Show_One_File = 1 '只显示当前文件的taglist
124.let Tlist_Exit_OnlyWindow = 1 'taglist是最后一个窗口时退出vim
125.let Tlist_Use_Left_Window = 1 '在左侧窗口显示taglist
126.let Tlist_GainFocus_On_ToggleOpen = 1 '打开taglist时,光标停在taglist窗口
127.let Tlist_Auto_Update = 1 '自动更新
128.' 打开标签浏览器
129.nnoremap dt :Tlist
130.' 重新生成标签
131.nnoremap bt :!~/Myfiles/Tool/sh/ctags/hitags.sh
132.' 高亮标签
133.nnoremap ht :so tags.vim
134.
135.'-----cscope-----
136.'加载cscope库
137.if filereadable('cscope.out')
138.cs add cscope.out
139.endif
140.set cscopequickfix=s-,c-,d-,i-,t-,e- '使用quickfix窗口显示结果
141.set cst '跳转时也使用cscope库
142.'打开引用窗口
143.nnoremap cw :cw
144.'重新生成索引文件
145.nnoremap bc :!cscope -Rbq
146.'s: 查找本C符号
147.'g: 查找本定义
148.'d: 查找本函数调用的函数
149.'c: 查找调用本函数的函数
150.'t: 查找本字符串
151.'e: 查找本egrep模式
152.'f: 查找本文件
153.'i: 查找包含本文件的文件
154.nnoremap s :scs find s =expand('word>')
155.nnoremap g :scs find g =expand('word>')
156.nnoremap c :scs find c =expand('')
157.nnoremap t :scs find t =expand('')
158.nnoremap e :scs find e =expand('')
159.nnoremap f :scs find f =expand('')
160.nnoremap i :scs find i =expand('')
161.nnoremap d :scs find d =expand('')
162.
163.'-----YouCompleteMe-----
164.let g:ycm_server_python_interpreter= '/usr/bin/python2'
165.let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py' '默认配置文件
166.let g:ycm_key_invoke_completion = '' '跨文件补全
167.let g:ycm_confirm_extra_conf = 0 '关闭加载配置文件提示
168.let g:ycm_cache_omnifunc = 0 '关闭补全缓存
169.let g:ycm_enable_diagnostic_signs = 0 '关闭诊断提示符
170.let g:ycm_enable_diagnostic_highlighting = 1 '关闭诊断高亮
171.'let g:ycm_show_diagnostics_ui = 0 '关闭诊断ui
172.let g:ycm_min_num_of_chars_for_completion = 3 'n字符开始自动补全
173.'获取变量类型
174.nnoremap yt :YcmCompleter GetType
175.'跳转定义或声明
176.nnoremap yg :YcmCompleter GoTo
177.'跳转包含文件
178.nnoremap yi :YcmCompleter GoToInclude
179.'打开诊断信息
180.nnoremap yd :YcmDiags
181.
182.'-----EasyGrep-----
183.let EasyGrepMode = 2 '根据文件类型搜索相应文件
184.let EasyGrepRecursive = 1 '递归搜索
185.let EasyGrepCommand = 1 '使用grep
186.let EasyGrepJumpToMatch = 0 '不要跳转
附录2 mycolor.vim
view sourceprint?001.' Vim color file
002.' Maintainer: Hans Fugal
003.' Last Change: $Date: 2004/06/13 19:30:30 $
004.' Last Change: $Date: 2004/06/13 19:30:30 $
005.' URL: http://hans.fugal.net/vim/colors/desert.vim
006.' Version: $Id: desert.vim,v 1.1 2004/06/13 19:30:30 vimboss Exp $
007.
008.' cool help screens
009.' :he group-name
010.' :he highlight-groups
011.' :he cterm-colors
012.
013.set background=dark
014.if version > 580
015.' no guarantees for version 5.8 and below, but this makes it stop
016.' complaining
017.hi clear
018.if exists('syntax_on')
019.syntax reset
020.endif
021.endif
022.let g:colors_name='desert'
023.
024.hi Normal guifg=White guibg=grey20
025.
026.' highlight groups
027.hi Cursor guibg=khaki guifg=slategrey
028.'hi CursorIM
029.'hi Directory
030.'hi DiffAdd
031.'hi DiffChange
032.'hi DiffDelete
033.'hi DiffText
034.'hi ErrorMsg
035.hi VertSplit guibg=#c2bfa5 guifg=grey50 gui=none
036.hi Folded guibg=grey30 guifg=gold
037.hi FoldColumn guibg=grey30 guifg=tan
038.hi IncSearch guifg=slategrey guibg=khaki
039.'hi LineNr
040.hi ModeMsg guifg=goldenrod
041.hi MoreMsg guifg=SeaGreen
042.hi NonText guifg=LightBlue guibg=grey30
043.hi Question guifg=springgreen
044.hi Search guibg=peru guifg=wheat
045.hi SpecialKey guifg=yellowgreen
046.hi StatusLine guibg=#c2bfa5 guifg=black gui=none
047.hi StatusLineNC guibg=#c2bfa5 guifg=grey50 gui=none
048.hi Title guifg=indianred
049.hi Visual gui=none guifg=khaki guibg=olivedrab
050.'hi VisualNOS
051.hi WarningMsg guifg=salmon
052.'hi WildMenu
053.'hi Menu
054.'hi Scrollbar
055.'hi Tooltip
056.
057.' syntax highlighting groups
058.hi Comment guifg=SkyBlue
059.hi Constant guifg=#ffa0a0
060.hi Identifier guifg=palegreen
061.hi Statement guifg=khaki
062.hi PreProc guifg=indianred
063.hi Type guifg=darkkhaki
064.hi Special guifg=navajowhite
065.'hi Underlined
066.hi Ignore guifg=grey40
067.'hi Error
068.hi Todo guifg=orangered guibg=yellow2
069.
070.' color terminal definitions
071.hi SpecialKey ctermfg=darkgreen
072.hi NonText cterm=bold ctermfg=darkblue
073.hi Directory ctermfg=darkcyan
074.hi ErrorMsg cterm=bold ctermfg=7 ctermbg=1
075.hi IncSearch cterm=NONE ctermfg=yellow ctermbg=green
076.hi Search cterm=NONE ctermfg=grey ctermbg=blue
077.hi MoreMsg ctermfg=darkgreen
078.hi ModeMsg cterm=NONE ctermfg=brown
079.hi LineNr ctermfg=3
080.hi Question ctermfg=green
081.hi StatusLine cterm=bold,reverse
082.hi StatusLineNC cterm=reverse
083.hi VertSplit cterm=reverse
084.hi Title ctermfg=5
085.hi Visual cterm=reverse
086.hi VisualNOS cterm=bold,underline
087.hi WarningMsg ctermfg=1
088.hi WildMenu ctermfg=0 ctermbg=3
089.hi Folded ctermfg=darkgrey ctermbg=NONE
090.hi FoldColumn ctermfg=darkgrey ctermbg=NONE
091.hi DiffAdd ctermbg=4
092.hi DiffChange ctermbg=5
093.hi DiffDelete cterm=bold ctermfg=4 ctermbg=6
094.hi DiffText cterm=bold ctermbg=1
095.hi Comment ctermfg=darkcyan
096.hi Constant ctermfg=brown
097.hi Special ctermfg=5
098.hi Identifier ctermfg=6
099.hi Statement ctermfg=3
100.hi PreProc ctermfg=5
101.hi Type ctermfg=2
102.hi Underlined cterm=underline ctermfg=5
103.hi Ignore cterm=bold ctermfg=7
104.hi Ignore ctermfg=darkgrey
105.hi Error cterm=bold ctermfg=7 ctermbg=1
106.
107.'vim: sw=4
附录3 c.vim
view sourceprint?01.'not wrap
02.set nowrap
03.
04.if filereadable('tags.vim')
05.so tags.vim
06.endif
07.
08.hi cFunction guifg=LightGreen
09.hi cMacro guifg=LightRed
10.hi cGlobal guifg=LightBlue
11.hi cMember guifg=LightMagenta
12.hi def link cTypedef cType
附录4 htags.sh
view sourceprint?01.#!/bin/bash
02.
03.ctags -R --fields=+l ;
04.awk -F ''' '$2 ~ /^ f/ {print $1 '
05.'}' tags | awk '$1 ~ /^[a-zA-Z]/ {print 'syn keyword cFunction ' $1}' 1> tags.vim ;
06.awk -F ''' '$2 ~ /^ [de]/ {print $1 '
07.'}' tags | awk '$1 ~ /^[a-zA-Z]/ {print 'syn keyword cMacro ' $1}' 1>> tags.vim ;
08.awk -F ''' '$2 ~ /^ t/ {print $1 '
09.'}' tags | awk '$1 ~ /^[a-zA-Z]/ {print 'syn keyword cTypedef ' $1}' 1>> tags.vim ;
10.awk -F ''' '$2 ~ /^ v/ {print $1 '
11.'}' tags | awk '$1 ~ /^[a-zA-Z]/ {print 'syn keyword cGlobal ' $1}' 1>> tags.vim ;
附录5 .ycm_extra_conf.py
view sourceprint?01.import os
02.
03.flags = [
04.'-x',
05.'c',
06.'-Wall',
08.'-I./mycode/igmpsnoop/h',
09.'-I./mycode/mldsnoop/h',
10.'-I./mycode/head_files',
11.'-I./mycode/g8132/inc',
12.'-I./mycode/nqa/inc',
13.'-I./mycode/mplste/inc',
14.'-I./mycode/mplsoam/inc',
15.'-I./mycode/cli',
16.'-I./mycode/trill/inc',
17.'-I./mycode/igmpsnoop_onu/inc',
18.'-I./mycode/hqos/inc',
19.'-I./mycode/qos/inc',
20.'-I./mycode/mplsqos/inc',
21.'-I./mycode/pim/inc',
22.'-I./USP_HEADFILE/protocol/acl/h',
23.'-I./USP_HEADFILE/protocol/hwroute/h',
24.'-I./USP_HEADFILE/protocol/uspIf/inc',
25.'-I/home/taopeng/Workspace/vmware/linux_share/osal_linux/inc',
26.'-I/home/taopeng/Workspace/vmware/linux_share/usp_linux3.12.17/inc'
27.]
28.
29.def MakeFinalFlag():
30.
31.workDir = os.path.dirname(os.path.abspath(__file__))
32.
33.finalFlags = []
34.for flag in flags:
35.
36.if flag.startswith('-I'):
37.path = flag[len('-I'):]
38.flag = '-I' + os.path.join(workDir, path)
39.
40.finalFlags.append(flag)
41.
42.return finalFlags
43.
44.
45.def FlagsForFile(fileName, **kwargs):
46.
47.return {
48.'flags': MakeFinalFlag(),
49.'do_cache': True
50.}
51.
52.
53.if __name__ == '__main__':
54.print(FlagsForFile('test'))
标签:C语言开发人员