打造VIM IDE(针对C语言开发者)

 

================================
使用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. 需要安装 curl
  3. 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. 使用快捷键 \bt 创建 ctags的标签
  3. 使用快捷键 \bc 创建 cscope的标签
  4. 使用快捷见 \ht 对重新高亮标签
     *每次启动vim时会自动导入一次, 如果没有
      重新生成标签就不要重新导入

# 使用YouCompleteMe的自动补全功能
  1. 在工程的根目录或创建 .ycm_extra_conf.py
  2. 将附录5中 .ycm_extra_conf.py 内容拷贝到其中
  3. 根据工程修改其中的头文件路径

附录1 .vimrc

"===================通用配置======================

"文件搜索路径
set path=.,/usr/include,, " 控制
set nocompatible "关闭vi兼容
filetype off "关闭文件类型侦测,vundle需要
set fileencodings=utf-8,gbk "使用utf-8或gbk编码方式
syntax on "语法高亮
set backspace=2 "退格键正常模式
set whichwrap=<,>,[,] "当光标到行首或行尾,允许左右方向键换行
set autoread "文件在vim外修改过,自动重载
set nobackup "不使用备份
set confirm "在处理未保存或只读文件时,弹出确认消息
set scrolloff=3 "光标移动到距离顶部或底部开始滚到距离
set history=1000 "历史记录数
set mouse= "关闭鼠标
set selection=inclusive "选择包含最后一个字符
set selectmode=mouse,key "启动选择模式的方式
set completeopt=longest,menu "智能补全,弹出菜单,无歧义时才自动填充
set noswapfile "关闭交换文件
set hidden "允许在有未保存的修改时切换缓冲区 "显示
colorscheme mycolor "选择配色方案
set t_Co=256 "可以使用的颜色数目
set number "显示行号
set laststatus=2 "显示状态行
set ruler "显示标尺
set showcmd "显示输入的命令
set showmatch "高亮括号匹配
set matchtime=1 "匹配括号高亮的时间(十分之一秒)
set matchpairs={:},(:) "匹配括号"{}""()"
set hlsearch "检索时高亮匹配项
set incsearch "边检索边显示匹配
set go-=T "去除gvim的toolbar "格式
set noexpandtab "不要将tab转换为空格
set shiftwidth=4 "自动缩进的距离,也是平移字符的距离
set tabstop=4 "tab键对应的空格数
set autoindent "自动缩进
set smartindent "智能缩进 "===================按键映射====================== "按键映射的起始字符
let mapleader = '\' "使用Ctrl-l 和 Ctrl+h 切换标签页
nnoremap <C-l> gt
nnoremap <c-h> gT "在行末加上分号
nnoremap <silent> <Leader>; :<Esc><End>a<Space>;<Esc><Down>
"保存
nnoremap <C-s> :w<CR>
"替换
nnoremap <C-h> :%s/<C-R>=expand("<cword>")<CR>/<C-R>=expand("<cword>")<CR>
"===================插件管理====================== " 下载vundle
" git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim " 下载pathogen
" curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim " 将vundle加入到runtime path
set rtp+=~/.vim/bundle/Vundle.vim " 下载到bundle目录的插件
call vundle#begin() " plugin on GitHub repo
Plugin 'VundleVim/Vundle.vim'
Plugin 'scrooloose/nerdtree'
Plugin 'Lokaltog/vim-powerline.git'
Plugin 'wincent/command-t'
Plugin 'Valloric/YouCompleteMe'
Plugin 'tomtom/tlib_vim'
Plugin 'tomtom/viki_vim' " plugin from http://vim-scripts.org/vim/scripts.html
Plugin 'taglist.vim'
Plugin 'EasyGrep' " Git plugin not hosted on GitHub
" Plugin 'git://...' " git repos on your local machine
" Plugin 'file://...' call vundle#end() filetype plugin indent on " required "===================插件配置====================== "-----pathogen-----
execute pathogen#infect() "-----NERDTree-----
let g:NERDTreeCaseSensitiveSort = 1
let g:NERDTreeWinSize = 25
let g:NERDTreeWinPos = "right"
nnoremap <silent> <Leader>t :NERDTreeToggle<CR>
nnoremap <silent> <Leader>o :NERDTreeFind<CR> "-----Powerline-----
set fillchars+=stl:\ ,stlnc:\
let g:Powerline_symbols = 'compatible'
let g:Powerline_stl_path_style = 'filename' "只显示文件名 "-----Command-T-----
let g:CommandTFileScanner = 'ruby' "使用ruby作为文件浏览器
let g:CommandTTraverseSCM = 'dir' "根目录为执行vim时所在的目录
"打开文件跳转
nnoremap <silent> <Leader>f :CommandT<CR> "-----taglist-----
let Tlist_Show_One_File = 1 "只显示当前文件的taglist
let Tlist_Exit_OnlyWindow = 1 "taglist是最后一个窗口时退出vim
let Tlist_Use_Left_Window = 1 "在左侧窗口显示taglist
let Tlist_GainFocus_On_ToggleOpen = 1 "打开taglist时,光标停在taglist窗口
let Tlist_Auto_Update = 1 "自动更新
" 打开标签浏览器
nnoremap <silent><Leader>dt :Tlist<CR>
" 重新生成标签
nnoremap <silent><Leader>bt :!~/Myfiles/Tool/sh/ctags/hitags.sh<CR>
" 高亮标签
nnoremap <silent><Leader>ht :so tags.vim<CR> "-----cscope-----
"加载cscope库
if filereadable("cscope.out")
cs add cscope.out
endif
set cscopequickfix=s-,c-,d-,i-,t-,e- "使用quickfix窗口显示结果
set cst "跳转时也使用cscope库
"打开引用窗口
nnoremap <silent><Leader>cw :cw<CR>
"重新生成索引文件
nnoremap <silent><Leader>bc :!cscope -Rbq<CR>
"s: 查找本C符号
"g: 查找本定义
"d: 查找本函数调用的函数
"c: 查找调用本函数的函数
"t: 查找本字符串
"e: 查找本egrep模式
"f: 查找本文件
"i: 查找包含本文件的文件
nnoremap <C-\>s :scs find s <C-R>=expand("<cword>")<CR><CR>
nnoremap <C-\>g :scs find g <C-R>=expand("<cword>")<CR><CR>
nnoremap <C-\>c :scs find c <C-R>=expand("<cword>")<CR><CR>
nnoremap <C-\>t :scs find t <C-R>=expand("<cword>")<CR><CR>
nnoremap <C-\>e :scs find e <C-R>=expand("<cword>")<CR><CR>
nnoremap <C-\>f :scs find f <C-R>=expand("<cfile>")<CR><CR>
nnoremap <C-\>i :scs find i <C-R>=expand("<cfile>")<CR><CR>
nnoremap <C-\>d :scs find d <C-R>=expand("<cword>")<CR><CR> "-----YouCompleteMe-----
let g:ycm_server_python_interpreter= '/usr/bin/python2'
let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py' "默认配置文件
let g:ycm_key_invoke_completion = '<C-Tab>' "跨文件补全
let g:ycm_confirm_extra_conf = 0 "关闭加载配置文件提示
let g:ycm_cache_omnifunc = 0 "关闭补全缓存
let g:ycm_enable_diagnostic_signs = 0 "关闭诊断提示符
let g:ycm_enable_diagnostic_highlighting = 1 "关闭诊断高亮
"let g:ycm_show_diagnostics_ui = 0 "关闭诊断ui
let g:ycm_min_num_of_chars_for_completion = 3 "n字符开始自动补全
"获取变量类型
nnoremap <silent><Leader>yt :YcmCompleter GetType<CR>
"跳转定义或声明
nnoremap <silent><Leader>yg :YcmCompleter GoTo<CR>
"跳转包含文件
nnoremap <silent><Leader>yi :YcmCompleter GoToInclude<CR>
"打开诊断信息
nnoremap <silent><Leader>yd :YcmDiags<CR> "-----EasyGrep-----
let EasyGrepMode = 2 "根据文件类型搜索相应文件
let EasyGrepRecursive = 1 "递归搜索
let EasyGrepCommand = 1 "使用grep
let EasyGrepJumpToMatch = 0 "不要跳转

附录2 mycolor.vim

" Vim color file
" Maintainer: Hans Fugal <hans@fugal.net>
" Last Change: $Date: 2004/06/13 19:30:30 $
" Last Change: $Date: 2004/06/13 19:30:30 $
" URL: http://hans.fugal.net/vim/colors/desert.vim
" Version: $Id: desert.vim,v 1.1 2004/06/13 19:30:30 vimboss Exp $ " cool help screens
" :he group-name
" :he highlight-groups
" :he cterm-colors set background=dark
if version > 580
" no guarantees for version 5.8 and below, but this makes it stop
" complaining
hi clear
if exists("syntax_on")
syntax reset
endif
endif
let g:colors_name="desert" hi Normal guifg=White guibg=grey20 " highlight groups
hi Cursor guibg=khaki guifg=slategrey
"hi CursorIM
"hi Directory
"hi DiffAdd
"hi DiffChange
"hi DiffDelete
"hi DiffText
"hi ErrorMsg
hi VertSplit guibg=#c2bfa5 guifg=grey50 gui=none
hi Folded guibg=grey30 guifg=gold
hi FoldColumn guibg=grey30 guifg=tan
hi IncSearch guifg=slategrey guibg=khaki
"hi LineNr
hi ModeMsg guifg=goldenrod
hi MoreMsg guifg=SeaGreen
hi NonText guifg=LightBlue guibg=grey30
hi Question guifg=springgreen
hi Search guibg=peru guifg=wheat
hi SpecialKey guifg=yellowgreen
hi StatusLine guibg=#c2bfa5 guifg=black gui=none
hi StatusLineNC guibg=#c2bfa5 guifg=grey50 gui=none
hi Title guifg=indianred
hi Visual gui=none guifg=khaki guibg=olivedrab
"hi VisualNOS
hi WarningMsg guifg=salmon
"hi WildMenu
"hi Menu
"hi Scrollbar
"hi Tooltip " syntax highlighting groups
hi Comment guifg=SkyBlue
hi Constant guifg=#ffa0a0
hi Identifier guifg=palegreen
hi Statement guifg=khaki
hi PreProc guifg=indianred
hi Type guifg=darkkhaki
hi Special guifg=navajowhite
"hi Underlined
hi Ignore guifg=grey40
"hi Error
hi Todo guifg=orangered guibg=yellow2 " color terminal definitions
hi SpecialKey ctermfg=darkgreen
hi NonText cterm=bold ctermfg=darkblue
hi Directory ctermfg=darkcyan
hi ErrorMsg cterm=bold ctermfg=7 ctermbg=1
hi IncSearch cterm=NONE ctermfg=yellow ctermbg=green
hi Search cterm=NONE ctermfg=grey ctermbg=blue
hi MoreMsg ctermfg=darkgreen
hi ModeMsg cterm=NONE ctermfg=brown
hi LineNr ctermfg=3
hi Question ctermfg=green
hi StatusLine cterm=bold,reverse
hi StatusLineNC cterm=reverse
hi VertSplit cterm=reverse
hi Title ctermfg=5
hi Visual cterm=reverse
hi VisualNOS cterm=bold,underline
hi WarningMsg ctermfg=1
hi WildMenu ctermfg=0 ctermbg=3
hi Folded ctermfg=darkgrey ctermbg=NONE
hi FoldColumn ctermfg=darkgrey ctermbg=NONE
hi DiffAdd ctermbg=4
hi DiffChange ctermbg=5
hi DiffDelete cterm=bold ctermfg=4 ctermbg=6
hi DiffText cterm=bold ctermbg=1
hi Comment ctermfg=darkcyan
hi Constant ctermfg=brown
hi Special ctermfg=5
hi Identifier ctermfg=6
hi Statement ctermfg=3
hi PreProc ctermfg=5
hi Type ctermfg=2
hi Underlined cterm=underline ctermfg=5
hi Ignore cterm=bold ctermfg=7
hi Ignore ctermfg=darkgrey
hi Error cterm=bold ctermfg=7 ctermbg=1 "vim: sw=4

附录3 c.vim

"not wrap
set nowrap if filereadable("tags.vim")
so tags.vim
endif hi cFunction guifg=LightGreen
hi cMacro guifg=LightRed
hi cGlobal guifg=LightBlue
hi cMember guifg=LightMagenta
hi def link cTypedef cType

附录4 htags.sh

#!/bin/bash

ctags -R --fields=+l ;
awk -F '"' '$2 ~ /^\tf/ {print $1 "\n"}' tags | awk '$1 ~ /^[a-zA-Z]/ {print "syn keyword cFunction " $1}' 1> tags.vim ;
awk -F '"' '$2 ~ /^\t[de]/ {print $1 "\n"}' tags | awk '$1 ~ /^[a-zA-Z]/ {print "syn keyword cMacro " $1}' 1>> tags.vim ;
awk -F '"' '$2 ~ /^\tt/ {print $1 "\n"}' tags | awk '$1 ~ /^[a-zA-Z]/ {print "syn keyword cTypedef " $1}' 1>> tags.vim ;
awk -F '"' '$2 ~ /^\tv/ {print $1 "\n"}' tags | awk '$1 ~ /^[a-zA-Z]/ {print "syn keyword cGlobal " $1}' 1>> tags.vim ;

附录5 .ycm_extra_conf.py

import os

flags = [
'-x',
'c',
'-Wall',
'-DOS=LINUX',
'-I./mycode/igmpsnoop/h',
'-I./mycode/mldsnoop/h',
'-I./mycode/head_files',
'-I./mycode/g8132/inc',
'-I./mycode/nqa/inc',
'-I./mycode/mplste/inc',
'-I./mycode/mplsoam/inc',
'-I./mycode/cli',
'-I./mycode/trill/inc',
'-I./mycode/igmpsnoop_onu/inc',
'-I./mycode/hqos/inc',
'-I./mycode/qos/inc',
'-I./mycode/mplsqos/inc',
'-I./mycode/pim/inc',
'-I./USP_HEADFILE/protocol/acl/h',
'-I./USP_HEADFILE/protocol/hwroute/h',
'-I./USP_HEADFILE/protocol/uspIf/inc',
'-I/home/taopeng/Workspace/vmware/linux_share/osal_linux/inc',
'-I/home/taopeng/Workspace/vmware/linux_share/usp_linux3.12.17/inc'
] def MakeFinalFlag(): workDir = os.path.dirname(os.path.abspath(__file__)) finalFlags = []
for flag in flags: if flag.startswith('-I'):
path = flag[len('-I'):]
flag = '-I' + os.path.join(workDir, path) finalFlags.append(flag) return finalFlags def FlagsForFile(fileName, **kwargs): return {
'flags': MakeFinalFlag(),
'do_cache': True
} if __name__ == '__main__':
print(FlagsForFile("test"))

VIM IDE的更多相关文章

  1. vim IDE平台-打造属于自己的配置

    vim IDE平台-打造属于自己的配置 一.前言 目前工作环境基本以Linux为主,自然用到VIM也很多,很早就对如何提高VIM的使用效率有所研究,限于时间关系,也没做个系统记录和资料积累,时间久了又 ...

  2. dotfiles for linux/unix users automatically! (python Vim IDE)

    Here is a brief introduction and package of dotfiles for linux/unix user. I think there are enough i ...

  3. 初涉Linux ----------> 打造自己的 Vim IDE

    一.  开篇前言 (图片显示越界的话,请刷新) 装好Ubuntu15.04系统之后呢,玩了玩 Ubuntu,感觉还是很不错的.比windows快,一开机就可以打开你想要的程序,但是在windows下你 ...

  4. 一键打造vim ide 支持python golang shell等高级特性

    1.vim-for-devops github: https://github.com/yxxhero/vim_for_devops 利用vim插件打造支持python.shell.golang的id ...

  5. Vim ide for shell development

    Source : This article is part of the ongoing Vi / Vim Tips and Tricks Series. As a Linux sysadmin or ...

  6. emacs vim IDE

    原本想花点时间来学习下Vim或者emacs,结果在网上搜索到这篇文章 骂战挺多的,但是也长见识 http://bbs.csdn.net/topics/390306165 下面是windows下的ema ...

  7. 打造vim IDE

    pathogen.vim:vim插件目录自动识别.加载(注意:能用pathogen.vim安装插件,就不要用Vundle.因为Vundle下载插件速度非常慢.) https://github.com/ ...

  8. vim IDE配置

    参考: http://www.cnblogs.com/witcxc/archive/2011/12/28/2304704.html http://www.cnblogs.com/ma6174/arch ...

  9. 学以致用十四-----打造一个简单的vim IDE

    一.安装dircolors git clone https://github.com/seebi/dircolors-solarized.git cd dircolors-solarized/ mv ...

随机推荐

  1. QT学习 之 文本文件读写

    上一章我们介绍了有关二进制文件的读写.二进制文件比较小巧,却不是人可读的格式.而文本文件是一种人可读的文件.为了操作这种文件,我们需要使用QTextStream类.QTextStream和QDataS ...

  2. The Priest Mathematician

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=31329#problem/F f[0] = 1 , f[ i ] = f[ i - 1 ] ...

  3. php返回的json格式

    public function search_ip(){ $where['ip'] = $_GET['ip']; $Machine = M('Machine_info'); $arr = $Machi ...

  4. Sicily-1009 梅森素数

    一.梅森素数 素数有无穷多个,却只有极少量的素数能表示成2p-1(p为素数)的形式.在不大于257的素数中,当p=2.3.5.7.13.17.19.31.67.127.257时,2p-1是素数,其它都 ...

  5. poj 1256 Anagram(dfs)

    题目链接:http://poj.org/problem?id=1256 思路分析:该题为含有重复元素的全排列问题:由于题目中字符长度较小,采用暴力法解决. 代码如下: #include <ios ...

  6. WebLogic(12C)——Server

    上篇博客介绍了Weblogic的安装.Domain的创建,以及怎样进入管理控制台. WebLogic Server安装教程 1.Server(server)概念 2,创建Server(server) ...

  7. [置顶] C++ Pirate: Lambda vs Bind

    Lambda 与 Bind的性能比较 转载请说明出处:http://blog.csdn.net/cywosp/article/details/9379403 先让我们看看下面函数: template ...

  8. iOS弹出底部视图简单实现

    - 项目基本目录 其中xib文件用来自定义需要弹出的视图. 在主控制器里设置popview的frame等信息代码如下: 底部视图(popview)初始化放在父类视图的最顶部或者说是整个屏幕的最底部,宽 ...

  9. c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]

    说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...

  10. VMware Workstation9安装Mac OS X10.9系统

    链接地址:http://jingyan.baidu.com/article/aa6a2c142cef740d4c19c426.html VMware Workstation9.0安装Mac OS X1 ...