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


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

    一、前言

            目前工作环境基本以Linux为主,自然用到VIM也很多,很早就对如何提高VIM的使用效率有所研究,限于时间关系,也没做个系统记录和资料积累,时间久了又容易忘,好久没写文档了,算是对自己一个交代。本文所涉及的配置和插件在附件中有下载。

    二、环境

         开篇之前,有必要交代一下系统环境和常用软件版本。

        操作系统: centos 6.2,2.6.32-431.el6.i686

        git 版本: 3.2.29

        yum版本: 1.8

        vim版本 : 7.2.411

    三、vim配置

    3.1 基本配置

        包括一些基本的语法,缩进,代码折叠,高亮模式,窗口分割等,具体如下:

    syn on              " 打开语法高亮
    set expandtab    " 转义tab,当写python代码时很有用
    set tabstop=4       " 设置tab键的宽度
    set softtabstop=4
    set backspace=2     " 设置退格键可用
    set smartindent     " 智能对齐方式
    set shiftwidth=4    " 换行时行间交错使用4个空格
    set autoindent      " 自动对齐
    set cindent         "设置C/C++缩进方式
    "set ai!             " 设置自动缩进
    
    set nu!             " 显示行号
    set linebreak       " 整词换行
    set whichwrap=b,s,<,>,[,]       " 光标从行首和行末时可以跳到另一行去
    set autochdir                   " 自动设置目录为正在编辑的文件所在的目录
    set hidden          " 没有保存的缓冲区可以自动被隐藏
    
    set scrolloff=5
    
    "--------------------------------------------------------------------------------
    
    " 查找/替换相关的设置
    
    "--------------------------------------------------------------------------------
    
    set hlsearch        " 高亮显示搜索结果
    
    set incsearch       " 查询时非常方便,如要查找book单词,当输入到/b时,会自动找到
    
                        " 第一个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的
    
                        " 单词,依次类推,进行查找时,使用此设置会快速找到答案,当你
    
                        " 找要匹配的单词时,别忘记回车
    
    set gdefault        " 替换时所有的行内匹配都被替换,而不是只有第一个
    
    
    set showmatch       " 设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
    
    colorscheme desert  "设置颜色模式
    
    "--------------------------------------------------------------------------------
    
    " 代码折叠
    
    "--------------------------------------------------------------------------------
    
    set foldmethod=syntax
    
    set foldlevel=100       " Don't autofold anything (but I can still fold manually)
    
    "set foldopen-=search   " don't open folds when you search into them
    
    "set foldopen-=undo     " don't open folds when you undo stuff
    
    "set foldcolumn=4
    
    " 窗口操作的快捷键
    
    "--------------------------------------------------------------------------------
    "  垂直分割当前窗口
    nmap wv     <C-w>v    
     " 关闭当前窗口
    nmap wc     <C-w>c     
    " 水平分割当前窗口
    nmap ws     <C-w>s     
    View Code

    3.2 插件管理

             前期基本对VIM插件未进行管理,导致所有的插件都集中在.vim目录下,这对于删除一个插件来说还是比较麻烦的,目前管理vim插件的工具有几个,比较出名的如pathogen和vundle这两类,这两个插件各有优势,应用领域有所不同,关键区别如下:

            pathogen: 解决多插件文件分散问题, 集中管理插件目录,增加,删除插件都很方便,

            vundle: 解决自动搜索和下载插件问题, 方便插件的安装和更新,使插件能够时刻保持与线上版本一致

    3.2.1 pathogen的安装与配置

    1) 下载:git clone https://github.com/tpope/vim-pathogen

    2)  在.vim目录下新建 autoload和bundle目录

    3) 将下载的pathogen包中的pathogen.vim拷贝到~/.vim/autoload

    4)  配置pathogen: 在~/.vimrc中配置如下一句:

    call pathogen#infect()

    注意:此句一定要配置再filetype plugin on 之前

    5) 作用:配好后,pathogen会自动加载位于bundle目录下的所有插件

    3.2.2 vundle配置

     1) 下载:git clone https://github.com/gmarik/vundle.git

    2) 安装:将其复制到~/.vim/bundle目录

    3) 配置:

        set nocompatible               " be iMproved
         filetype off                   " required!       /**  从这行开始,vimrc配置 **/
    
         set rtp+=~/.vim/bundle/vundle/
         call vundle#rc()
    
         " let Vundle manage Vundle
         " required! 
         Bundle 'gmarik/vundle'
    
        
         "  Github上非vim-scripts仓库插件格式(github用户名/插件名)
         Bundle 'tpope/vim-fugitive'    
         Bundle 'tpope/vim-rails.git'
    
        " Github vim-scripts仓库插件格式
         Bundle 'python.vim'
       
         " 非上述两种模式
         Bundle 'git://git.wincent.com/command-t.git'
         " ... 
    
         filetype plugin indent on  " 必须有这句

    四 、其它插件安装

    4.1 Taglist

    作用:显示文件变量、宏、函数等tag,  以tags文件为基础,结合ctags软件使用

    下载:http://sourceforge.net/projects/vim-taglist/files/vim-taglist/

    安装:直接拷贝vim-taglist目录到~/.vim/bundle

    配置:

    "--------------------------------------------------------------------------------
    
    " TagList :Tlist
    
    "--------------------------------------------------------------------------------
    
    let Tlist_Show_One_File=1
    
    let Tlist_Exit_OnlyWindow = 1
    
    "let Tlist_Use_Right_Window=1

    效果截图:

    4.2 winmanager

    作用:规划布局各插件在vim中的显示,使其显示分明

    下载:http://www.vim.org/scripts/script.php?script_id=95

    安装:解压目录放到~/.vim/bundle下

    配置:

    "--------------------------------------------------------------------------------
    
    " WinManager :WMToggle
    
    "--------------------------------------------------------------------------------
    
    let g:winManagerWindowLayout='FileExplorer|TagList'
    
    
    "是nomal模式的命令,不是Ex模式的
    
    nmap wm :WMToggle<cr>  "快捷键

    使用: 直接在vim命令行模式输入WMToggle即可显示winmanager布局,再次输入WMToggle即可关闭布局

    效果图:

    4.3 MiniBufExplorer

    作用:显示打开的文件标签栏,即类似于tab效果,方便文件间切换

    下载: http://www.vim.org/scripts/script.php?script_id=159

    安装:直接将下载文件解压放至~/.vim/bundle

    配置:

    "--------------------------------------------------------------------------------
    
    " MiniBufExp
    
    "--------------------------------------------------------------------------------
    
    let g:miniBufExplMapWindowNavArrows = 1  “按左右箭头切换文件标签,再按enter键即可打开选择的文件标签
    
    let g:miniBufExplMapCTabSwitchBufs = 1   "按Tab键也可达到切换效果

    使用: 当打开winmanger布局时,用ctrl+w+w命令进入FileExplorer窗口, 按上下选择键选择文件回车打开,即可再miniBufExplorer窗口显示打开的文件标签.

    效果:如winmanager截图,最上面的小窗口所示,同时打开了3个文件

    4.4 grep.vim

    作用:类似于grep功能,查找关键字

    下载: http://www.vim.org/scripts/script.php?script_id=311

    安装: 解压目录至~/.vim/bundle

    配置:

    "直接按下<F3>键来查找光标所在的字符串
    
    nnoremap <silent> <F3> :Rgrep<CR>

    使用: 移动光标至关键字处,按F3,会在vim命令行处显示查找相关关键字的提示,按enter键进入查找,然后选择查找目录,默认是当前目录,按回车后会出现查找模式,默认为*,即只要包含此管键字的文件行都会被查找出来,要退出查找过程也很简单,按ESC键即可。

    效果如下:如要查找about_pages关键字,鼠标移动到该处,会作相应的提示,最后一张是查找结果图

    4.5 a.vim

    作用:头文件和源文件快速切换,这对于C/C++项目来说还是很方便的

    下载: http://www.vim.org/scripts/script.php?script_id=31

    安装: 解压目录至 ~/.vim/bundle

    配置:

    nnoremap <silent> <F12> :A<CR>

    使用: 按F12键则可在源文件和头文件之间切换

    4.6 omnicppcomplete

    作用: 智能C/C++库补全, 为了使用此控件,还要下载专门的C++源库文件,同时得先安装好ctags软件以便生成tags文件

    下载:

    #omnicomplete下载
    http://www.vim.org/scripts/script.php?script_id=1520

    #文件结构类似于
    |--omnicppcomplete

    |---after
    |    |---ftplugin |---autoload
    |    |---omni
    |    |   |---common
    |    |   |---cpp
    |---doc
    #C
    ++源库下载
    http://www.vim.org/scripts/script.php?script_id=2358

    安装:

    1) 对于omnicppcomplete, 解压文件到~/.vim,  有after、autoload、doc三个目录, autoload下有omni子目录,注意使用bundle来管理时,如果将包解压在~/.vim/bundle下时会识别不到,omni补全将失效;

    2) 对于源码,将其解压到指定目录,如/usr/local/cpp_src, 进入该目录,执行ctags命令生成tags文件,具体如下:

    cd /usr/local/cpp_src
    tar -jxvf cpp_src.tar.bz2
    ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . #不能简单的执行ctags -R, 需要带参数才能识别C++库
    move tags cpp  #重命名,非必须为区别起见

    配置:

    set completeopt=longest,menu    " 关掉智能补全时的预览窗口
    
    filetype plugin indent on       " 加了这句才可以用智能补全
    
    let OmniCpp_MayCompleteDot = 1 " autocomplete with
    let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
    let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
    let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)
    let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
    let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window
    let OmniCpp_GlobalScopeSearch=1 " enable the global scope search
    let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members
    let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
    let OmniCpp_ShowAccess=1
    "默认以std 命名空间为准, using namespace std
    let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]  
    "加载CPP库tags文件
    set tags+=/usr/local/cpp_src/cpp

    使用效果如下图:

    4.7 cscope

    作用: 此插件作用相信用过的人谁用谁知道,windows下有SourceInsights, Linux 下也有Cscope来撑腰,通过它可以方便的查看函数定义及其函数调用关系

    安装:http://cscope.sourceforge.net/,  下载源码包,编译安装,由于现在vim7.2已经集成有cscope,所以如果vim版本是7以上的话就不用安装了,同时为方便操作,cscope提供了大量的快捷键来操作以提高操作效率,快捷键映射需借助cscope_maps.vim插件,下载地址:在vim.org上有,可自行网上下载,下载后直接安装在~/.vim/bundle/cscope下

    配置:

    "--------------------------------------------------------------------------------
    
    " cscope
    
    "--------------------------------------------------------------------------------
    
    cs add /home/src/cscope.out /home/src
    
    :set cscopequickfix=s-,c-,d-,i-,t-,e-
    
    :set cscopetag
    
    " 按下面这种组合键有技巧,按了<C-_>后要马上按下一个键,否则屏幕一闪
    
    " 就回到nomal状态了
    
    " <C-_>s的按法是先按"Ctrl+Shift+-",然后很快再按"s"
    
    nmap <C-_>s :cs find s <C-R>=expand("<cword>")<cr><cr> :cw<cr>  "查找C代码符号
    
    nmap <C-_>g :cs find g <C-R>=expand("<cword>")<cr><cr> :cw<cr>  "查找本定义
    
    nmap <C-_>c :cs find c <C-R>=expand("<cword>")<cr><cr> :cw<cr>   "查找调用本函数的函数
    
    nmap <C-_>t :cs find t <C-R>=expand("<cword>")<cr><cr> :cw<cr>   "查找本字符串
    
    nmap <C-_>e :cs find e <C-R>=expand("<cword>")<cr><cr> :cw<cr>    "查找本egrep模式
    
    nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<cr><cr>    "查找本文件
    
    nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<cr><cr> :cw<cr>  "查找包含本文件的文件
    
    nmap <C-_>d :cs find d <C-R>=expand("<cword>")<cr><cr> :cw<cr>  " 查找本函数调用函数

    使用:

    1) 先生成cscope数据库文件,如在/home/src/下,执行 cscope -Rbq, 即可生成cscope.out文件

    2)配置:然后可像上述配置一样将cscope.out文件加载到vimrc中,也可手动加载,执行: cs add cscope.out /home/src

    3)快捷键: 将光标移至函数名称处,先按ctrl+下划线,再快速按相应字母即可实现相应的查找功能。

    4.8 其它插件

        还有一些其它插件,根据需求来安装,如markdown,python, emmet等,这些直接下载相应文件到bundle目录即可,markdown还需要一些配置,可参考附件vimrc文件

    五、总结

          终于总结完了,在用vim的过程中,遇到很多问题,虽然用了很久,但深知还有很多功能尚未用到,还有待挖掘,只能不断学习总结。

    六、附件

    6.1 vimrc

    call pathogen#infect()
    set expandtab
    set tabstop=4       " 设置tab键的宽度
    set softtabstop=4
    set shiftwidth=4
    set backspace=2     " 设置退格键可用
    
    set nu!             " 显示行号
    
    
    set linebreak       " 整词换行
    
    set whichwrap=b,s,<,>,[,]       " 光标从行首和行末时可以跳到另一行去
    
    
    
    set autochdir                   " 自动设置目录为正在编辑的文件所在的目录
    
    set hidden          " 没有保存的缓冲区可以自动被隐藏
    
    set scrolloff=5
    
    
    
    "--------------------------------------------------------------------------------
    
    " 查找/替换相关的设置
    
    "--------------------------------------------------------------------------------
    
    set hlsearch        " 高亮显示搜索结果
    
    set incsearch       " 查询时非常方便,如要查找book单词,当输入到/b时,会自动找到
    
                        " 第一个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的
    
                        " 单词,依次类推,进行查找时,使用此设置会快速找到答案,当你
    
                        " 找要匹配的单词时,别忘记回车
    
    set gdefault        " 替换时所有的行内匹配都被替换,而不是只有第一个
    
    
    
    "--------------------------------------------------------------------------------
    
    " 状态栏相关的设置
    
    "--------------------------------------------------------------------------------
    
    set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
    
    set laststatus=2    " always show the status line
    
    set ruler           " 在编辑过程中,在右下角显示光标位置的状态行
    
    
    
    "--------------------------------------------------------------------------------
    
    " 编程相关的设置
    
    "--------------------------------------------------------------------------------
    
    set completeopt=longest,menu    " 关掉智能补全时的预览窗口
    
    filetype plugin indent on       " 加了这句才可以用智能补全
    
    let OmniCpp_MayCompleteDot = 1 " autocomplete with
    let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
    let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
    let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)
    let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
    let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window
    let OmniCpp_GlobalScopeSearch=1 " enable the global scope search
    let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members
    let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
    let OmniCpp_ShowAccess=1
    let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
    
    "set tags=./tags
    "set tags+=/usr/include/c++/tags
    set tags+=/usr/local/cpp_src/cpp
    
    syn on              " 打开语法高亮
    
    set showmatch       " 设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
    
    set smartindent     " 智能对齐方式
    
    set shiftwidth=4    " 换行时行间交错使用4个空格
    
    set autoindent      " 自动对齐
    
    set cindent         "设置C/C++缩进方式
    "set ai!             " 设置自动缩进
    
    colorscheme desert
    
    
    
    "--------------------------------------------------------------------------------
    
    " 代码折叠
    
    "--------------------------------------------------------------------------------
    
    set foldmethod=syntax
    
    set foldlevel=100       " Don't autofold anything (but I can still fold manually)
    
    "set foldopen-=search   " don't open folds when you search into them
    
    "set foldopen-=undo     " don't open folds when you undo stuff
    
    "set foldcolumn=4
    
    " 窗口操作的快捷键
    
    "--------------------------------------------------------------------------------
    "  垂直分割当前窗口
    nmap wv     <C-w>v    
     " 关闭当前窗口
    nmap wc     <C-w>c     
    " 水平分割当前窗口
    nmap ws     <C-w>s     
    
    "###############################################################################
    
    " The following is the Plugins' setting
    
    "###############################################################################
    
    
    "--------------------------------------------------------------------------------
    
    " TagList :Tlist
    
    "--------------------------------------------------------------------------------
    
    let Tlist_Show_One_File=1
    
    let Tlist_Exit_OnlyWindow = 1
    
    "let Tlist_Use_Right_Window=1
    
    
    
    "--------------------------------------------------------------------------------
    
    " netrw 文件浏览器 :e <PATH>
    
    "--------------------------------------------------------------------------------
    
    "let g:netrw_winsize = 30       " 浏览器宽度
    
    "--------------------------------------------------------------------------------
    
    " QuickFix
    
    "--------------------------------------------------------------------------------
    " 切换到下一个结果
    nmap <F6> :cn<cr>  
     " 切换到上一个结果
    nmap <F7> :cp<cr>   
    
    
    
    "--------------------------------------------------------------------------------
    
    " WinManager :WMToggle
    
    "--------------------------------------------------------------------------------
    
    let g:winManagerWindowLayout='FileExplorer|TagList'
    
    
    "是nomal模式的命令,不是Ex模式的
    
    nmap wm :WMToggle<cr> 
    
    
    "--------------------------------------------------------------------------------
    
    " MiniBufExp
    
    "--------------------------------------------------------------------------------
    
    
    let g:miniBufExplMapWindowNavArrows = 1
    
    let g:miniBufExplMapCTabSwitchBufs = 1
    
    
    
    
    "--------------------------------------------------------------------------------
    
    " cscope
    
    "--------------------------------------------------------------------------------
    
    cs add /home/src/cscope.out /home/src
    
    :set cscopequickfix=s-,c-,d-,i-,t-,e-
    
    :set cscopetag
    
    " 按下面这种组合键有技巧,按了<C-_>后要马上按下一个键,否则屏幕一闪
    
    " 就回到nomal状态了
    
    " <C-_>s的按法是先按"Ctrl+Shift+-",然后很快再按"s"
    
    nmap <C-_>s :cs find s <C-R>=expand("<cword>")<cr><cr> :cw<cr>
    
    nmap <C-_>g :cs find g <C-R>=expand("<cword>")<cr><cr> :cw<cr>
    
    nmap <C-_>c :cs find c <C-R>=expand("<cword>")<cr><cr> :cw<cr>
    
    nmap <C-_>t :cs find t <C-R>=expand("<cword>")<cr><cr> :cw<cr>
    
    nmap <C-_>e :cs find e <C-R>=expand("<cword>")<cr><cr> :cw<cr>
    
    nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<cr><cr>
    
    nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<cr><cr> :cw<cr>
    
    nmap <C-_>d :cs find d <C-R>=expand("<cword>")<cr><cr> :cw<cr>
    
    
    
    "--------------------------------------------------------------------------------
    
    " Grep
    
    "--------------------------------------------------------------------------------
    
    "直接按下<F3>键来查找光标所在的字符串
    
    nnoremap <silent> <F3> :Rgrep<CR>
    
    
    
    "--------------------------------------------------------------------------------
    
    " A
    
    "--------------------------------------------------------------------------------
    
    nnoremap <silent> <F12> :A<CR>
    
    
    
    
    " NERD_commenter
    
    "--------------------------------------------------------------------------------
    
    let NERD_c_alt_style = 1    " 将C语言的注释符号改为//, 默认是/**/
    
    "nmap <F5> ,cc
    
    
    
    "--------------------------------------------------------------------------------
    
    " SuperTab :SuperTabHelp
    
    "--------------------------------------------------------------------------------
    
    let g:SuperTabRetainCompletionType = 2
    
    let g:SuperTabDefaultCompletionType = "<C-X><C-O>"
    
    
    "--------------------------------------------------------------------------------
    
    " CVim :help csupport
    
    "--------------------------------------------------------------------------------
    
    let g:C_Comments = "no"         " 用C++的注释风格
    
    let g:C_BraceOnNewLine = "no"   " '{'是否独自一行
    
    let g:C_AuthorName = "Wen Qiuliang"
    
    let g:C_Project="F9"
    
    let g:C_TypeOfH = "c"           " *.h文件的文件类型是C还是C++
    
    let g:user_emmet_settings = {
        'php' : {
          'extends' : 'html',
          'filters' : 'c',
        },
        'xml' : {
          'extends' : 'html',
        },
        'haml' : {
          'extends' : 'html',
        },
      }
    
    " vim markdown config
    au BufRead,BufNewFile *.{md,mdown,mkd,mkdn,markdown,mdwn} set filetype=mkd
    let g:vim_markdown_folding_disabled=1
    let g:vim_markdown_frontmatter=1
    View Code

    6.2  插件

        本文所涉及的所有插件都上传在github中,地址如下:

    https://git.oschina.net/ballwql/vim-plugin.git

  • 相关阅读:
    Java 虚拟机部分面试题
    Java 多线程部分面试题
    Java IO部分面试题
    Java 集合框架部分面试题
    Java 面向对象面试题
    Java 多线程同步的五种方法
    Python操作redis
    Python操作mysql
    Python操作mongodb
    数据处理的全过程---(获取数据-清洗数据-数据建模-数据可视化)
  • 原文地址:https://www.cnblogs.com/ballwql/p/4752933.html
Copyright © 2020-2023  润新知