VIM 太牛了

===============================

话不多说,先来看看效果

===============================



================================
使用vim打造IDE, 针对C语言开发者
建议使用gvim
================================

# 安装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

# 安装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


# 创建 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

[plain] view plain copy
  1. "===================通用配置======================  
  2.   
  3. "文件搜索路径  
  4. set path=.,/usr/include,,  
  5.   
  6. " 控制  
  7. set nocompatible              "关闭vi兼容  
  8. filetype off                  "关闭文件类型侦测,vundle需要  
  9. set fileencodings=utf-8,gbk   "使用utf-8或gbk编码方式  
  10. syntax on                     "语法高亮  
  11. set backspace=2               "退格键正常模式  
  12. set whichwrap=<,>,[,]         "当光标到行首或行尾,允许左右方向键换行  
  13. set autoread                  "文件在vim外修改过,自动重载        
  14. set nobackup                  "不使用备份  
  15. set confirm                   "在处理未保存或只读文件时,弹出确认消息     
  16. set scrolloff=3               "光标移动到距离顶部或底部开始滚到距离  
  17. set history=1000              "历史记录数  
  18. set mouse=                    "关闭鼠标  
  19. set selection=inclusive       "选择包含最后一个字符  
  20. set selectmode=mouse,key      "启动选择模式的方式  
  21. set completeopt=longest,menu  "智能补全,弹出菜单,无歧义时才自动填充  
  22. set noswapfile                "关闭交换文件  
  23. set hidden                    "允许在有未保存的修改时切换缓冲区  
  24.   
  25. "显示  
  26. colorscheme mycolor           "选择配色方案  
  27. set t_Co=256                  "可以使用的颜色数目  
  28. set number                    "显示行号  
  29. set laststatus=2              "显示状态行  
  30. set ruler                     "显示标尺  
  31. set showcmd                   "显示输入的命令  
  32. set showmatch                 "高亮括号匹配  
  33. set matchtime=1               "匹配括号高亮的时间(十分之一秒)  
  34. set matchpairs={:},(:)        "匹配括号"{}""()"   
  35. set hlsearch                  "检索时高亮匹配项  
  36. set incsearch                 "边检索边显示匹配  
  37. set go-=T                     "去除gvim的toolbar  
  38.   
  39. "格式  
  40. set noexpandtab               "不要将tab转换为空格  
  41. set shiftwidth=4              "自动缩进的距离,也是平移字符的距离  
  42. set tabstop=4                 "tab键对应的空格数  
  43. set autoindent                "自动缩进  
  44. set smartindent               "智能缩进  
  45.   
  46.   
  47. "===================按键映射======================  
  48.   
  49. "按键映射的起始字符  
  50. let mapleader = '\'               
  51.   
  52. "使用Ctrl-l 和 Ctrl+h 切换标签页  
  53. nnoremap  gt              
  54. nnoremap  gT  
  55.   
  56. "在行末加上分号  
  57. nnoremap  ; :a;  
  58. "保存  
  59. nnoremap  :w  
  60. "替换  
  61. nnoremap  :%s/=expand("")/=expand("")  
  62. "===================插件管理======================  
  63.   
  64. " 下载vundle  
  65. " git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim  
  66.   
  67. " 下载pathogen  
  68. " curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim  
  69.   
  70. " 将vundle加入到runtime path  
  71. set rtp+=~/.vim/bundle/Vundle.vim  
  72.   
  73. " 下载到bundle目录的插件  
  74. call vundle#begin()  
  75.   
  76. " plugin on GitHub repo  
  77. Plugin 'VundleVim/Vundle.vim'  
  78. Plugin 'scrooloose/nerdtree'  
  79. Plugin 'Lokaltog/vim-powerline.git'  
  80. Plugin 'wincent/command-t'  
  81. Plugin 'Valloric/YouCompleteMe'  
  82. Plugin 'tomtom/tlib_vim'  
  83. Plugin 'tomtom/viki_vim'  
  84.   
  85. " plugin from http://vim-scripts.org/vim/scripts.html  
  86. Plugin 'taglist.vim'  
  87. Plugin 'EasyGrep'  
  88.   
  89. " Git plugin not hosted on GitHub  
  90. " Plugin 'git://...'  
  91.   
  92. " git repos on your local machine  
  93. " Plugin 'file://...'  
  94.   
  95. call vundle#end()  
  96.   
  97. filetype plugin indent on    " required  
  98.   
  99. "===================插件配置======================  
  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("")  
  155. nnoremap g :scs find g =expand("")  
  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

[plain] view plain copy
  1. " Vim color file  
  2. " Maintainer:   Hans Fugal   
  3. " Last Change:  $Date: 2004/06/13 19:30:30 $  
  4. " Last Change:  $Date: 2004/06/13 19:30:30 $  
  5. " URL:      http://hans.fugal.net/vim/colors/desert.vim  
  6. " Version:  $Id: desert.vim,v 1.1 2004/06/13 19:30:30 vimboss Exp $  
  7.   
  8. " cool help screens  
  9. " :he group-name  
  10. " :he highlight-groups  
  11. " :he cterm-colors  
  12.   
  13. set background=dark  
  14. if version > 580  
  15.     " no guarantees for version 5.8 and below, but this makes it stop  
  16.     " complaining  
  17.     hi clear  
  18.     if exists("syntax_on")  
  19.     syntax reset  
  20.     endif  
  21. endif  
  22. let g:colors_name="desert"  
  23.   
  24. hi Normal   guifg=White guibg=grey20  
  25.   
  26. " highlight groups  
  27. hi Cursor   guibg=khaki guifg=slategrey  
  28. "hi CursorIM  
  29. "hi Directory  
  30. "hi DiffAdd  
  31. "hi DiffChange  
  32. "hi DiffDelete  
  33. "hi DiffText  
  34. "hi ErrorMsg  
  35. hi VertSplit    guibg=#c2bfa5 guifg=grey50 gui=none  
  36. hi Folded   guibg=grey30 guifg=gold  
  37. hi FoldColumn   guibg=grey30 guifg=tan  
  38. hi IncSearch    guifg=slategrey guibg=khaki  
  39. "hi LineNr  
  40. hi ModeMsg  guifg=goldenrod  
  41. hi MoreMsg  guifg=SeaGreen  
  42. hi NonText  guifg=LightBlue guibg=grey30  
  43. hi Question guifg=springgreen  
  44. hi Search   guibg=peru guifg=wheat  
  45. hi SpecialKey   guifg=yellowgreen  
  46. hi StatusLine   guibg=#c2bfa5 guifg=black gui=none  
  47. hi StatusLineNC guibg=#c2bfa5 guifg=grey50 gui=none  
  48. hi Title    guifg=indianred  
  49. hi Visual   gui=none guifg=khaki guibg=olivedrab  
  50. "hi VisualNOS  
  51. hi WarningMsg   guifg=salmon  
  52. "hi WildMenu  
  53. "hi Menu  
  54. "hi Scrollbar  
  55. "hi Tooltip  
  56.   
  57. " syntax highlighting groups  
  58. hi Comment  guifg=SkyBlue  
  59. hi Constant guifg=#ffa0a0  
  60. hi Identifier   guifg=palegreen  
  61. hi Statement    guifg=khaki  
  62. hi PreProc  guifg=indianred  
  63. hi Type     guifg=darkkhaki  
  64. hi Special  guifg=navajowhite  
  65. "hi Underlined  
  66. hi Ignore   guifg=grey40  
  67. "hi Error  
  68. hi Todo     guifg=orangered guibg=yellow2  
  69.   
  70. " color terminal definitions  
  71. hi SpecialKey   ctermfg=darkgreen  
  72. hi NonText  cterm=bold ctermfg=darkblue  
  73. hi Directory    ctermfg=darkcyan  
  74. hi ErrorMsg cterm=bold ctermfg=7 ctermbg=1  
  75. hi IncSearch    cterm=NONE ctermfg=yellow ctermbg=green  
  76. hi Search   cterm=NONE ctermfg=grey ctermbg=blue  
  77. hi MoreMsg  ctermfg=darkgreen  
  78. hi ModeMsg  cterm=NONE ctermfg=brown  
  79. hi LineNr   ctermfg=3  
  80. hi Question ctermfg=green  
  81. hi StatusLine   cterm=bold,reverse  
  82. hi StatusLineNC cterm=reverse  
  83. hi VertSplit    cterm=reverse  
  84. hi Title    ctermfg=5  
  85. hi Visual   cterm=reverse  
  86. hi VisualNOS    cterm=bold,underline  
  87. hi WarningMsg   ctermfg=1  
  88. hi WildMenu ctermfg=0 ctermbg=3  
  89. hi Folded   ctermfg=darkgrey ctermbg=NONE  
  90. hi FoldColumn   ctermfg=darkgrey ctermbg=NONE  
  91. hi DiffAdd  ctermbg=4  
  92. hi DiffChange   ctermbg=5  
  93. hi DiffDelete   cterm=bold ctermfg=4 ctermbg=6  
  94. hi DiffText cterm=bold ctermbg=1  
  95. hi Comment  ctermfg=darkcyan  
  96. hi Constant ctermfg=brown  
  97. hi Special  ctermfg=5  
  98. hi Identifier   ctermfg=6  
  99. 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

[plain] view plain copy
  1. "not wrap  
  2. set nowrap  
  3.   
  4. if filereadable("tags.vim")  
  5.     so tags.vim  
  6. endif  
  7.   
  8. hi cFunction guifg=LightGreen  
  9. hi cMacro    guifg=LightRed  
  10. hi cGlobal   guifg=LightBlue  
  11. hi cMember   guifg=LightMagenta  
  12. hi def link cTypedef cType  

附录4  hitags.sh

[plain] view plain copy
  1. #!/bin/bash  
  2.   
  3. ctags -R --fields=+l ;  
  4. awk -F '"' '$2 ~ /^\tf/    {print $1 "\n"}' tags | awk '$1 ~ /^[a-zA-Z]/ {print "syn keyword cFunction " $1}' 1>  tags.vim ;  
  5. awk -F '"' '$2 ~ /^\t[de]/ {print $1 "\n"}' tags | awk '$1 ~ /^[a-zA-Z]/ {print "syn keyword cMacro " $1}'    1>> tags.vim ;  
  6. awk -F '"' '$2 ~ /^\tt/    {print $1 "\n"}' tags | awk '$1 ~ /^[a-zA-Z]/ {print "syn keyword cTypedef " $1}'  1>> tags.vim ;  
  7. 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

[plain] view plain copy
  1. import os  
  2.   
  3. flags = [  
  4.     '-x',  
  5.     'c',  
  6.     '-Wall',  
  7.     '-DOS=LINUX',  
  8.     '-I./mycode/igmpsnoop/h',  
  9.     '-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_DEVICE/osal/h',  
  23.     '-I./USP_HEADFILE/protocol/acl/h',  
  24.     '-I./USP_HEADFILE/protocol/hwroute/h',  
  25.     '-I./USP_HEADFILE/protocol/uspIf/inc',  
  26.     '-I/home/taopeng/Workspace/vmware/linux_share/osal_linux/inc',  
  27.     '-I/home/taopeng/Workspace/vmware/linux_share/usp_linux3.12.17/inc'  
  28. ]  
  29.   
  30. def MakeFinalFlag():  
  31.    
  32.   workDir = os.path.dirname(os.path.abspath(__file__))  
  33.   
  34.   finalFlags = []  
  35.   for flag in flags:  
  36.   
  37.     if flag.startswith('-I'):  
  38.       path = flag[len('-I'):]  
  39.       flag = '-I' + os.path.join(workDir, path)  
  40.       
  41.     finalFlags.append(flag)  
  42.   
  43.   return finalFlags   
  44.   
  45.   
  46. def FlagsForFile(fileName, **kwargs):  
  47.     
  48.   return {  
  49.     'flags': MakeFinalFlag(),  
  50.     'do_cache': True  
  51.   }  
  52.   
  53.   
  54. if __name__ == '__main__':  
  55.     print(FlagsForFile("test")) 

你可能感兴趣的:(Linux)