linuxsir首页 LinuxSir.Org | Linux、BSD、Solaris、Unix | 开源传万世,因有我参与欢迎您!
网站首页 | 设为首页 | 加入收藏
您所在的位置:主页 > Linux及计算机学科基础理论版 >

基于Ubuntu 16.04 配置 Vim IDE

时间:2018-01-01  来源:未知  作者:admin666

1.序言        

本文是本人在Ubuntu 16.04上Vim IDE搭建过程的总结。在Windows环境开发的小伙伴也许都知道sourceinsight这款编辑器,为了提高Linux下开发效率,本人搭建了类sourceinsight的IDE开发环境(勉强称作VIM IDE吧:))。

废话不多,先上图展示本人的VIM IDE。 一个窗口同时显示了4个子终端窗口(当然也可以有更多),每一个子终端窗口类似sourceinsight又切分成了3栏(左下Taglist栏-显示函数,宏等标签;左上filelist栏-显式代码文件目录文件结构; 右侧栏-代码编辑区)。 如果我们看着窗口字太小,没关系, 当编辑程序时候你可以选择4个子终端窗口中要编辑的那个终端单独放大全屏显示(terminator安装后Ctrl+shit+X),编辑完成之后仍然可以切换回来(terminator安装后Ctrl+shift+Z)。

2. 配置过程

    如果要完成以上显示效果,我们需要安装一些必要的工具和插件,下面将逐步展开。

2.1 Terminator 安装

      工具Terminator可以在一个窗口中显示多个终端窗口,并且可以按照用户的要求对窗口进行任意分割。

      Ubuntu环境安装terminator工具命令为:sudo apt-get install terminator

      Terminator常用快捷按键有:

    1)Ctrl+Shift+E垂直分割窗口

      2)Ctrl+Shift+O 水平分割窗口

      3)Ctrl+Tab  在分割的窗口间切换

      4)Ctrl+Shift+C/V 复制/粘贴

      5)Ctrl+Shift+X 放大窗口到全屏

      6)Ctrl+Shift+Z 从放大窗口回到多窗口

      注意:如果您对窗口风格不满意,可以右键->preferences进行必要设置和修改。比如修改快捷按键等等。

2.2 vim 编辑器安装

      Ubuntu环境安装terminator工具命令为: sudo apt-get install vim vim-scripts vim-doc

     其中vim-scripts是vim的一些基本插件 ,vim安装之后紧接着应该个性化配置。Vim本身的系统配置文件夹是在/usr/share/vim/和/etc/vim/两个文件夹下。但是通常我们不会去改变这两个文件夹下的配置文件,而是在用户文件夹/home/user下建立自己的配置文件.vimrc然后对其配置,这里不再解释,后面我将附上我的vim配置。

 

2.3 vim插件安装

    vim常用插件有:1)vim-addons 2)ctags 3)cscope 4)winmanager 5)minibufexplorer 6)omnicppcomplete 7)AutoComplPop  8)echofunc 9)taglist

2.3.1 vim-addons

  通过vim-addons,我们可以管理vim插件。可通过命令sudo apt-get install vim-addon-manager手动安装。

  查看插件状态 命令: vim-addons status

# Name                    User Status  System Status
align                      removed      removed       
alternate                  removed      removed       
bufexplorer                removed      removed       
calendar                    removed      removed       
closetag                    removed      removed       
colors-sampler-pack        removed      removed       
cvsmenu                    removed      removed       
debPlugin                  removed      removed       
detectindent                removed      removed       
doxygen-toolkit            removed      removed       
editexisting                removed      removed       
enhanced-commentify        removed      removed       
gnupg                      removed      removed       
info                        removed      removed       
justify                    removed      removed       
lbdbq                      removed      removed       
matchit                    removed      removed       
minibufexplorer            installed    removed       
nerd-commenter              removed      removed       
omnicppcomplete            installed    removed       
po                          removed      removed       
project                    installed    removed       
python-indent              removed      removed       
secure-modelines            removed      removed       
snippetsEmu                removed      removed       
sokoban                    removed      removed       
supertab                    removed      removed       
surround                    removed      removed       
taglist                    installed    removed       
tetris                      removed      removed       
utl                        removed      removed       
vcscommand                  removed      removed       
vimplate                    removed      removed       
whatdomain                  removed      removed       
winmanager                  installed    removed       
xmledit                    removed      removed

    安装某个插件X命令(前提是在目录/home/user/.vim/下建立好了plugin和doc两个文件夹):vim-addons install X

2.3.2 ctags

    ctags用来建立源码树的标签索引(标签就是一个标识符被定义的地方,如函数定义),在编程时能迅速定位函数、变量、宏定义等位置去查看原形。
    1)ctags安装命令

          sudo apt-get install ctags

    2)ctags配置

        要正确使用ctags功能,我们也需要配置vimrc文件,我将在附件列举。

    3)建立项目project的源码索引命令(通常在项目project文件夹根目录执行)

          ctags -R *

          执行以上命令之后,你会发现多了一个tags文件,这个就是ctags索引文件。

    4)ctags常用方法

          Ctrl+]  跳到当前光标下单词的标签
          Ctrl+O  返回上一个标签
          Ctrl+T  返回上一个标签
        Ctrl+W + ]  新窗口显示当前光标下单词的标签,光标跳到标签处

2.3.3 cscope

      cscope是类似于ctags一样的工具,但是比ctags更强大。

     1)cscope安装命令

          sudo apt-get install cscope

    2)cscope配置

        要正确使用cscope功能,我们也需要配置vimrc文件,我将在附件列举。

    3)建立项目project的源码cscope数据库命令(通常在项目project文件夹根目录执行)

          cscope -Rbq cscope.out

          执行以上命令之后,你会发现多了3个文件,cscope.in.out,cscope.po.out, cscope.out, 它们就是cscope索引数据库。

        注意:以上命令收集的是project目录下cscope缺省类型文件索引,有时候我们自定义文件不能索引,所以我们可以用如下命令替换以上命令:

        find  .  -name "*.h" -o -name "*.cpp" -o -name "*.c" > cscope.file

        cscope -bqk -i cscope.file

    4)添加cscope库到vim

        对于简单1个文件,用vim打开某个源码文件,末行模式下,输入“:cs add cscope.out"。对于整个project工程文件,我们需要借助vim自己读取配置文件。

        我是在用户目录~/.vim/plugin/下放置了cscope_map.vim配置文件,后面会附上。

    5)cscope常用方法

      Ctrl-\ s 查找所有当前光标所在符号出现过位置。
      Ctrl-\ c 查找所有调用当前光标所在函数的函数。

      当然还有其它按键,请阅读配置文件或者在vim命令行执行:help cscope

    注意:通过快捷键查找某个符号后,会立即跳转到第一个找到的该符号出现的位置。如果你对这次默认跳转的位置不满意,在Vim命令行下运行cw命令,就能在编辑区下面quickfix窗口看到所有查找结果的列表,点击相应列表项就能跳转到相应位置。

2.3.4  winmanager

    WinManager用于管理文件浏览器和缓冲区(buffer)。

    安装命令为:vim-addons install winmanager

    配置见附录vimrc,进入vim之后打开或者关闭命令是输入:WMToggle

2.3.5 minibufexplorer

    安装命令为:vim-addons install minibufexplorer

    配置见附录vimrc

2.3.6 omnicppcomplete(自动补齐)

  安装命令为:vim-addons install omnicppcomplete

  配置文件见附录vimrc

2.3.7 AutoComplPop(普通变量和函数自动弹出补齐)

      下载链接:http://www.vim.org/scripts/script.php?script_id=1879 

        安装方法:

               先解压:unzip vim-autocomplpop.zip,将解压后的文件拷贝到~/.vim/ 下的相应目录里:

                     autoload/*    ->    ~/.vim/autoload/

                     doc/*    ->    ~/.vim/doc/

                     plugin/*    ->    ~/.vim/plugin/

      帮助使用:

              重新打开vim即可使用。添加help文件:helptags ~/.vim/doc/即可(打开帮助文件:help autocomplpop)

2.3.8 echofunc(函数原型提示)

    echofunc下载地址:http://www.vim.org/scripts/script.php?script_id=1735
    下载完成后,把echofunc.vim文件放到 ~/.vim/plugin文件夹中
    当在vim插入(insert)模式下紧接着函数名后输入一个"("的时候, 这个函数的声明就会自动显示在信息提示栏。

    注意:这个插件需要tags文件的支持, 并且在创建tags文件的时候要加选项"--fields=+lS"。  ctags -R --field=+IS

2.3.9 taglist

      taglist用于列出了当前文件中的所有标签(宏, 全局变量, 函数名等)。
    安装Taglist命令: vim-addons install taglist

      配置见附录vimrc,进入vim之后关闭或者打开taglist方法是末行命令模式输入:Taglist。

2.3.10 quickfix

      在程序的开发过程中,很重要的一个循环是:编辑-编译-编辑,vim中的quickfix功能就是为了提高这一循环的效率。

    推荐使用Makefile的方式进行项目的编译、管理,可以实现项目的自动化管理、有利于提高效率。通过make命令完成程序的编译工作后,会得到编译结果,一般会有一些编译错误,quickfix功能使我们可以直接跳到文件中的错误位置,直接进行修改,并通过使用quickfix的命令完成错误列表的跳转。

    如果仅有1个文件也懒得写Makefile文件,可以采用如下2条命令处理:

    :set makeprg=gcc\ test.c\ -o\ test
    :make     变量的值为字符串,当在其中有空格时需要用\进行转义,同样如果想输入\也要进行转义。
    注意:在vim运行时通过命令行设置的变量值均是临时的,即当退出vim环境时,该变量值会恢复为配置文件中的值或者默认值。
   
        常用的quickfix命令为:     :cc     显示详细错误信息     :cp     跳到上一个错误     :cn     跳到下一个错误     :cl      列出所有错误     :cw     如果有错误列表,则打开quickfix窗口,没有则什么也不错

3. 附录

3.1 vimrc设置

    下面是我的vimrc配置,这个文件放在目录/home/user/下。

runtime! debian.vim

" Uncomment the next line to make Vim more Vi-compatible
" NOTE: debian.vim sets 'nocompatible'. Setting 'compatible' changes numerous
" options, so any other options should be set AFTER setting 'compatible'.
set nocompatible

" Vim5 and later versions support syntax highlighting. Uncommenting the
" following enables syntax highlighting by default.
if has("syntax")
   syntax on
endif
colorscheme ron  

" detect file type
filetype on
filetype plugin on

" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
set background=dark

" Uncomment the following to have Vim jump to the last position when
" reopening a file
if has("autocmd")
   au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
   "have Vim load indentation rules and plugins according to the detected filetype
   filetype plugin indent on
endif

" The following are commented out as they cause vim to behave a lot
" differently from regular Vi. They are highly recommended though.

"set ignorecase
"set smartcase       
set autowrite       
set autoindent       
"set smartindent     
set tabstop=4       
set softtabstop=4  
set shiftwidth=4  
set cindent     
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s     
"set backspace=2   
set showmatch     
set linebreak     
set whichwrap=b,s,<,>,[,]
"set hidden " Hide buffers when they are abandoned
set mouse=a           
set number           
"set previewwindow   
set history=50     


set laststatus=2
set ruler           

set showcmd   
set showmode

"--find setting--
set incsearch       
set hlsearch   


"--ctags setting--
map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
set tags=tags
set tags+=./tags "add current directory's generated tags file
"set tags+=~/test/tags


"-- omnicppcomplete setting --
imap <F3> <C-X><C-O>
imap <F2> <C-X><C-I>
set completeopt=menu,menuone
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_DefaultNamespaces=["std"]
let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
let OmniCpp_ShowAccess=1


"-- Taglist setting --
let Tlist_Ctags_Cmd='ctags'
let Tlist_Use_Right_Window=1
let Tlist_Show_One_File=0
let Tlist_File_Fold_Auto_Close=1
let Tlist_Exit_OnlyWindow=1
let Tlist_Process_File_Always=1
let Tlist_Inc_Winwidth=0



"-- WinManager setting --
let g:winManagerWindowLayout='FileExplorer|TagList'
"let g:persistentBehaviour=0
nmap wm :WMToggle<cr>


" -- MiniBufferExplorer --
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1
let g:miniBufExplModSelTarget = 1   


"--fold setting--
set foldmethod=syntax
set foldlevel=100
set foldcolumn=5


"-- QuickFix setting --
map <F6> :make clean<CR><CR><CR>
map <F7> :make<CR><CR><CR> :copen<CR><CR>
map <F8> :cp<CR>
map <F9> :cn<CR>
imap <F6> <ESC>:make clean<CR><CR><CR>
imap <F7> <ESC>:make<CR><CR><CR> :copen<CR><CR>
imap <F8> <ESC>:cp<CR>
imap <F9> <ESC>:cn<CR>

3.2 cscope配置文件

  cscope配置文件位于目录(/home/user/.vim/plugin)名叫cscope_map.vim,内容为

 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" CSCOPE settings for vim           
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"
" This file contains some boilerplate settings for vim's cscope interface,
" plus some keyboard mappings that I've found useful.
"
" USAGE:
" -- vim 6:    Stick this file in your ~/.vim/plugin directory (or in a
"              'plugin' directory in some other directory that is in your
"              'runtimepath'.
"
" -- vim 5:    Stick this file somewhere and 'source cscope.vim' it from
"              your ~/.vimrc file (or cut and paste it into your .vimrc).
"
" NOTE:
" These key maps use multiple keystrokes (2 or 3 keys).  If you find that vim
" keeps timing you out before you can complete them, try changing your timeout
" settings, as explained below.
"
" Happy cscoping,
"
" Jason Duell      jduell@alumni.princeton.edu    2002/3/7
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


" This tests to see if vim was configured with the '--enable-cscope' option
" when it was compiled.  If it wasn't, time to recompile vim...
if has("cscope")

   set csprg=/usr/bin/cscope "指定用来执行cscope的命令


    """"""""""""" Standard cscope/vim boilerplate

    " use both cscope and ctag for 'ctrl-]', ':ta', and 'vim -t'
    set cscopetag
   set csto=0  "设置cstag命令查找次序:0先找cscope数据库再找标签文件;1先找标签文件再找cscope数据库"
   set cst                            "同时搜索cscope数据库和标签文件
   set cscopequickfix=s-,c-,d-,i-,t-,e-    " 使用QuickFix窗口来显示cscope查找结果
   
   set nocsverb

    " add any cscope database in current directory
    if filereadable("cscope.out")
        cs add cscope.out  
    " else add the database pointed to by environment variable
    elseif $CSCOPE_DB != ""
        cs add $CSCOPE_DB
    endif

    " show msg when any other cscope db added
   set csverb
  " set cscopeverbose  


    """"""""""""" My cscope/vim key mappings
    "
    " The following maps all invoke one of the following cscope search types:
    "
    "  's'  symbol: find all references to the token under cursor
    "  'g'  global: find global definition(s) of the token under cursor
    "  'c'  calls:  find all calls to the function name under cursor
    "  't'  text:  find all instances of the text under cursor
    "  'e'  egrep:  egrep search for the word under cursor
    "  'f'  file:  open the filename under cursor
    "  'i'  includes: find files that include the filename under cursor
    "  'd'  called: find functions that function under cursor calls
    "
    " Below are three sets of the maps: one set that just jumps to your
    " search result, one that splits the existing vim window horizontally and
    " diplays your search result in the new window, and one that does the same
    " thing, but does a vertical split instead (vim 6 only).
    "
    " I've used CTRL-\ and CTRL-@ as the starting keys for these maps, as it's
    " unlikely that you need their default mappings (CTRL-\'s default use is
    " as part of CTRL-\ CTRL-N typemap, which basically just does the same
    " thing as hitting 'escape': CTRL-@ doesn't seem to have any default use).
    " If you don't like using 'CTRL-@' or CTRL-\, , you can change some or all
    " of these maps to use other keys.  One likely candidate is 'CTRL-_'
    " (which also maps to CTRL-/, which is easier to type).  By default it is
    " used to switch between Hebrew and English keyboard mode.
    "
    " All of the maps involving the <cfile> macro use '^<cfile>$': this is so
    " that searches over '#include <time.h>" return only references to
    " 'time.h', and not 'sys/time.h', etc. (by default cscope will return all
    " files that contain 'time.h' as part of their name).


    " To do the first type of search, hit 'CTRL-\', followed by one of the
    " cscope search types above (s,g,c,t,e,f,i,d).  The result of your cscope
    " search will be displayed in the current window.  You can use CTRL-T to
    " go back to where you were before the search.  
    "

    nmap <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-\>g :cs find g <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-\>c :cs find c <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-\>t :cs find t <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-\>e :cs find e <C-R>=expand("<cword>")<CR><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>
    nmap <C-\>d :cs find d <C-R>=expand("<cword>")<CR><CR>   


    " Using 'CTRL-spacebar' (intepreted as CTRL-@ by vim) then a search type
    " makes the vim window split horizontally, with search result displayed in
    " the new window.
    "
    " (Note: earlier versions of vim may not have the :scs command, but it
    " can be simulated roughly via:
    "    nmap <C-@>s <C-W><C-S> :cs find s <C-R>=expand("<cword>")<CR><CR>   

    nmap <C-@>s :scs find s <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-@>g :scs find g <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-@>c :scs find c <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-@>t :scs find t <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-@>e :scs find e <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-@>f :scs find f <C-R>=expand("<cfile>")<CR><CR>   
    nmap <C-@>i :scs find i ^<C-R>=expand("<cfile>")<CR>$<CR>   
    nmap <C-@>d :scs find d <C-R>=expand("<cword>")<CR><CR>   


    " Hitting CTRL-space *twice* before the search type does a vertical
    " split instead of a horizontal one (vim 6 and up only)
    "
    " (Note: you may wish to put a 'set splitright' in your .vimrc
    " if you prefer the new window on the right instead of the left

    nmap <C-@><C-@>s :vert scs find s <C-R>=expand("<cword>")<CR><CR>
    nmap <C-@><C-@>g :vert scs find g <C-R>=expand("<cword>")<CR><CR>
    nmap <C-@><C-@>c :vert scs find c <C-R>=expand("<cword>")<CR><CR>
    nmap <C-@><C-@>t :vert scs find t <C-R>=expand("<cword>")<CR><CR>
    nmap <C-@><C-@>e :vert scs find e <C-R>=expand("<cword>")<CR><CR>
    nmap <C-@><C-@>f :vert scs find f <C-R>=expand("<cfile>")<CR><CR>   
    nmap <C-@><C-@>i :vert scs find i ^<C-R>=expand("<cfile>")<CR>$<CR>   
    nmap <C-@><C-@>d :vert scs find d <C-R>=expand("<cword>")<CR><CR>


    """"""""""""" key map timeouts
    "
    " By default Vim will only wait 1 second for each keystroke in a mapping.
    " You may find that too short with the above typemaps.  If so, you should
    " either turn off mapping timeouts via 'notimeout'.
    "
    "set notimeout
    "
    " Or, you can keep timeouts, by uncommenting the timeoutlen line below,
    " with your own personal favorite value (in milliseconds):
    "
    "set timeoutlen=4000
    "
    " Either way, since mapping timeout settings by default also set the
    " timeouts for multicharacter 'keys codes' (like <F1>), you should also
    " set ttimeout and ttimeoutlen: otherwise, you will experience strange
    " delays as vim waits for a keystroke after you hit ESC (it will be
    " waiting to see if the ESC is actually part of a key code like <F1>).
    "
    "set ttimeout
    "
    " personally, I find a tenth of a second to work well for key code
    " timeouts. If you experience problems and have a slow terminal or network
    " connection, set it higher.  If you don't set ttimeoutlen, the value for
    " timeoutlent (default: 1000 = 1 second, which is sluggish) is used.
    "
    "set ttimeoutlen=100

endif

3.3 ctags和cscope脚本

    为方便使用,如下写到一个脚本中,在创建工程project之后调用一下即可创建tags索引和cscope数据库。

#!/bin/sh

ctags -R --fields=+lS

find . -name "*.h" -o -name "*.c" -o -name "*.cpp" > cscope.files
cscope -bkq -i cscope.files

Vim入门基础知识集锦  http://www.linuxidc.com/Linux/2017-02/140903.htm

Vim入门基础教程 http://www.linuxidc.com/Linux/2017-02/140279.htm

把Vim打造成优秀的C++ IDE  http://www.linuxidc.com/Linux/2016-06/132262.htm

Ubuntu 14.04升级Vim7.4到8.0  http://www.linuxidc.com/Linux/2016-11/136816.htm

Vim安装youcompleteme自动补全插件  http://www.linuxidc.com/Linux/2016-11/137665.htm

Linux Vim编辑器使用简单讲解  http://www.linuxidc.com/Linux/2016-12/138930.htm

Vim文本编辑器  http://www.linuxidc.com/Linux/2017-03/142275.htm

Vim安装与配置进阶版 http://www.linuxidc.com/Linux/2017-03/141724.htm

Vim编辑器使用教程  http://www.linuxidc.com/Linux/2017-07/145885.htm

Ubuntu 16.04 Vim YouCompleteMe自动补全的安装配置与使用  http://www.linuxidc.com/Linux/2017-02/141088.htm

Linux文本编辑器Vim基础教程  http://www.linuxidc.com/Linux/2017-09/146930.htm

友情链接