美文网首页
vim c开发环境搭建

vim c开发环境搭建

作者: lmem | 来源:发表于2017-05-08 19:30 被阅读991次

    http://blog.csdn.net/yinjiabin/article/details/8254609

    1.安装vim 环境

    首先安装好Vim和Vim的基本插件。这些使用apt-get安装即可:

    lingd@ubuntu:~/arm$sudo apt-get install vim vim-scripts vim-doc
    

    其中vim-scripts是vim的一些基本插件,包括语法高亮的支持、缩进等等

    2.配置文件

    /etc/vim下,也可以拷贝到自己的home目录,修改为.vimrc

    " This line should not be removed as it ensures that various options are
        " properly set to work with the Vim-related packages available in Debian.
        " 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        " elflord ron peachpuff default 设置配色方案,vim自带的配色方案保存在/usr/share/vim/vim72/colors目录下
    
        " 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        " 如果搜索模式包含大写字符,不使用 'ignorecase' 选项。只有在输入搜索模式并且打开 'ignorecase' 选项时才会使用。
        set autowrite        " 自动把内容写回文件: 如果文件被修改过,在每个 :next、:rewind、:last、:first、:previous、:stop、:suspend、:tag、:!、:make、CTRL-] 和 CTRL-^命令时进行;用 :buffer、CTRL-O、CTRL-I、'{A-Z0-9} 或 `{A-Z0-9} 命令转到别的文件时亦然。
        set autoindent        " 设置自动对齐(缩进):即每行的缩进值与上一行相等;使用 noautoindent 取消设置
        "set smartindent        " 智能对齐方式
        set tabstop=4        " 设置制表符(tab键)的宽度
        set softtabstop=4     " 设置软制表符的宽度    
        set shiftwidth=4    " (自动) 缩进使用的4个空格
        set cindent            " 使用 C/C++ 语言的自动缩进方式
        set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s     "设置C/C++语言的具体缩进方式
        "set backspace=2    " 设置退格键可用
        set showmatch        " 设置匹配模式,显示匹配的括号
        set linebreak        " 整词换行
        set whichwrap=b,s,<,>,[,] " 光标从行首和行末时可以跳到另一行去
        "set hidden " Hide buffers when they are abandoned
        set mouse=a            " Enable mouse usage (all modes)    "使用鼠标
        set number            " Enable line number    "显示行号
        "set previewwindow    " 标识预览窗口
        set history=50        " set command history to 50    "历史记录50条
    
    
        "--状态行设置--
        set laststatus=2 " 总显示最后一个窗口的状态行;设为1则窗口数多于一个的时候显示最后一个窗口的状态行;0不显示最后一个窗口的状态行
        set ruler            " 标尺,用于显示光标位置的行号和列号,逗号分隔。每个窗口都有自己的标尺。如果窗口有状态行,标尺在那里显示。否则,它显示在屏幕的最后一行上。
    
        "--命令行设置--
        set showcmd            " 命令行显示输入的命令
        set showmode        " 命令行显示vim当前模式
    
        "--find setting--
        set incsearch        " 输入字符串就显示匹配点
        set hlsearch        
    

    3.ctags可以建立源码树的标签索引(标签就是一个标识符被定义的地方,如函数定义),使程序员在编程时能迅速定位函数、变量、宏定义等位置去查看原形

    lingd@ubuntu:~/arm$ sudo apt-get install ctags
    
    输入命令ctags -R *,你会发现多了一个tags文件,这个就是索引文件
    

    向vim注册索引文件tags的路径,
    lingd@ubuntu:~/arm/linux-2.6.24.7$ vi ~/.vimrc
    在打开文件的最后添加如下内容(当然,具体路径根据你自己的情况)

        "--ctags setting--
        " 按下F5重新生成tag文件,并更新taglist
        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+=~/arm/Linux-2.6.24.7/tags "add new tags file(刚刚生成tags的路径,在ctags -R 生成tags文件后,不要将tags移动到别的目录,否则ctrl+]时,会提示找不到源码文件)
    
    set tags+=./tags表示在当前工作目录下搜索tags文件
    set tags+=~/arm/linux-2.6.24.7/tags表示在搜寻tags文件的时候,也要搜寻~/arm/linux-2.6.24.7/文件夹下的tags文件。
    

    然后保存并退出vi。这样,你就可以用vim在任意地方查看有关Linux的函数原形

    tag命令用法:
    Ctrl+]  跳到当前光标下单词的标签
    Ctrl+O  返回上一个标签
    Ctrl+T  返回上一个标签
    :tag TagName 跳到TagName标签
    以上命令是在当前窗口显示标签,当前窗口的文件替代为包标签的文件,当前窗口光标跳到标签位置。如果不希望在当前窗口显示标签,可以使用以下命令:
    :stag TagName 新窗口显示TagName标签,光标跳到标签处
    Ctrl+W + ]  新窗口显示当前光标下单词的标签,光标跳到标签处
    当一个标签有多个匹配项时(函数 (或类中的方法) 被多次定义),":tags" 命令会跳转到第一处。如果在当前文件中存在匹配,那它将会被首先使用。
    可以用这些命令在各匹配的标签间移动:
    :tfirst    到第一个匹配
    :[count]tprevious 向前 [count] 个匹配
    :[count]tnext  向后 [count] 个匹配
    :tlast    到最后一个匹配
    或者使用以下命令选择要跳转到哪一个
    :tselect TagName
    输入以上命令后,vim会为你展示一个选择列表。然后你可以输入要跳转到的匹配代号 (在第一列)。其它列的信息可以让你知道标签在何处被定义过。
    以下命令将在预览窗口显示标签
    :ptag TagName 预览窗口显示TagName标签,光标跳到标签处
    Ctrl+W + }  预览窗口显示当前光标下单词的标签,光标跳到标签处
    :pclose   关闭预览窗口
    :pedit file.h 在预览窗口中编辑文件file.h(在编辑头文件时很有用)
    :psearch atoi 查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配,在使用没有标签文件的库函数时十分有用。 
    

    4.自动补全

    vim的自动补全功能可通过其插件OmniCppComplete实现。
    安装OmniCppComplete
    lingd@ubuntu:~$ vim-addons install omnicppcomplete
    配置OmniCppComplete
    在vim配置文件/home/user/.vimrc中加入如下的配置:

        "-- omnicppcomplete setting --
        " 按下F3自动补全代码,注意该映射语句后不能有其他字符,包括tab;否则按下F3会自动补全一些乱码
        imap <F3> <C-X><C-O>
        " 按下F2根据头文件内关键字补全
        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 
    

    (前几行就是提供了C++中的./->/::等操作符的提示和自动完成)。
    OmniCppComplete是基于ctags数据库即tags文件实现的(基于ctags生成的索引信息来实现自动补全的),所以在ctags -R生成tags时还需要一些额外的选项,这样生成的tags文件才能与OmniCppComplete配合运作。使用下列命令生成tags文件,就可以与OmniCppComplete配合运作:
    ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
    --c++-kinds=+p : 为C++文件增加函数原型的标签
    --fields=+iaS : 在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、以及函数的指纹(S)
    --extra=+q : 为标签增加类修饰符。注意,如果没有此选项,将不能对类成员补全
    vim自动补全功能的测试
    为了测试自动补全功能,我们先下载C++一份C++标准库的源代码。

    lingd@ubuntu:~$ sudo apt-get install build-essential
    

    # 然后在/usr/include/c++下就可以找到标准库的头文件了。

    lingd@ubuntu:~$ cd /usr/include/c++
    lingd@ubuntu:/usr/include/c++$ ls
    

    4.4 4.4.3
    在此文件夹下生成能与OmniCppComplete配合运作的tags文件

    lingd@ubuntu:/usr/include/c++$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
    lingd@ubuntu:/usr/include/c++$ ls
    

    4.4 4.4.3 tags
    在vim的配置文件中如下内容,然后在编程的时候就可以使用自动补全功能了。

    lingd@ubuntu:/usr/include/c++$ vi ~/.vimrc
    set tags+=/usr/include/c++/tags
    

    用vi打开前面的Test.c文件,在printf("Hello World!\n")下一行中,输入pri,然后按下Ctrl+X Ctrl+O,此时vi会弹出一个窗口,所有以pri开头的tag都会出现在这个窗口中,printf就出现在第6行中

    lingd@ubuntu:~$ cd ~
    lingd@ubuntu:~$ vim Test.c
    

    注意:在自动补全的点,Vim必须知道可能补全的定义。比如说,在namespace std命名空间下的变量和函数,必须要用using namespace std;暴露出来,否则是不能补全的。在.cpp文件中还可以,在.h文件中这样就不是好的做法了。暂时不知道这个问题是由于我自己配置错误还是程序没有实现。
    当自动补全下拉窗口弹出后,一些可用的快捷键:

    Ctrl+P  向前切换成员
    Ctrl+N  向后切换成员
    Ctrl+E  表示退出下拉窗口, 并退回到原来录入的文字
    Ctrl+Y  表示退出下拉窗口, 并接受当前选项
    其他补全方式:
    Ctrl+X Ctrl+L 整行补全
    Ctrl+X Ctrl+N  根据当前文件里关键字补全
    Ctrl+X Ctrl+K  根据字典补全
    Ctrl+X Ctrl+T  根据同义词字典补全
    Ctrl+X Ctrl+I  根据头文件内关键字补全
    Ctrl+X Ctrl+]  根据标签补全
    Ctrl+X Ctrl+F  补全文件名
    Ctrl+X Ctrl+D  补全宏定义
    Ctrl+X Ctrl+V  补全vim命令
    Ctrl+X Ctrl+U  用户自定义补全方式
    Ctrl+X Ctrl+S  拼写建议
    

    帮助文档
    :help omnicppcomplete

    5.标签浏览器Taglist

    Taglist用于列出了当前文件中的所有标签(宏, 全局变量, 函数名等)
    安装Taglist
    lingd@ubuntu:~$ vim-addons install taglist
    配置Taglist
    在vim配置文件/home/user/.vimrc中加入如下的配置:

        "-- Taglist setting --
        let Tlist_Ctags_Cmd='ctags' "因为我们放在环境变量里,所以可以直接执行
        let Tlist_Use_Right_Window=1 "让窗口显示在右边,0的话就是显示在左边
        let Tlist_Show_One_File=0 "让taglist可以同时展示多个文件的函数列表
        let Tlist_File_Fold_Auto_Close=1 "非当前文件,函数列表折叠隐藏
        let Tlist_Exit_OnlyWindow=1 "当taglist是最后一个分割窗口时,自动推出vim
        "是否一直处理tags.1:处理;0:不处理
        let Tlist_Process_File_Always=1 "实时更新tags
        let Tlist_Inc_Winwidth=0
    

    进入vim后用命令":Tlist"打开/关闭taglist窗口
    帮助文档
    :help taglist.txt

    Paste_Image.png

    6.文件浏览器和缓冲区管理器WinManager

    WinManager用于管理文件浏览器和缓冲区(buffer)。2.0以上版本的WinManager还可以管理其他IDE类型插件,不过要用户在插件中增加一些辅助变量和hook来支持WinManager(帮助文档有相关说明)。
    Taglist插件本身就提供了对WinManager的支持,不需要我们去修改它。这里,我们就用WinManager来管理文件浏览器netrw和标签浏览器Taglist。netrw是标准的vim插件, 已经随vim一起安装进系统里了, 不需要我们自行下载安装。
    安装WinManager

    lingd@ubuntu:~$ vim-addons install winmanager
    

    配置WinManager
    在vim配置文件/home/user/.vimrc中加入如下的配置:

    
        "-- WinManager setting --
        let g:winManagerWindowLayout='FileExplorer|TagList' " 设置我们要管理的插件
        "let g:persistentBehaviour=0 " 如果所有编辑文件都关闭了,退出vim
        nmap wm :WMToggle<cr> 
    

    常用命令

    :WMToggle 打开/关闭WinManage,不过我们在配置文件.vimrc中做了快捷键映射,所以直接按wm就可以打开/关闭WinManage
    文件浏览器命令(在文件浏览器窗口中使用)
    <enter>或双击  如果光标下是目录, 则进入该目录; 如果光标下文件, 则打开该文件
    <tab>   如果光标下是目录, 则进入该目录; 如果光标下文件, 则在新窗口打开该文件
    <F5> 刷新列表
    -  返回上一层目录
    c  使浏览目录成为vim当前工作目录
    d  创建目录
    D  删除当前光标下的目录或文件
    i  切换显示方式
    R  文件或目录重命名
    s  选择排序方式
    r  反向排序列表
    x  定制浏览方式, 使用你指定的程序打开该文件
    winmanager帮助文档
    :help winmanager
    netrw帮助文档
    :help netrw
    
    7.Cscope

    Cscope是一个类似于ctags的工具,不过其功能比ctags强大很多。
    安装Cscope
    lingd@ubuntu:~$ sudo apt-get install cscope
    在vim配置文件/home/user/.vimrc中加入如下的配置:

        "-- Cscope setting --
        if has("cscope")
            set csprg=/usr/bin/cscope        " 指定用来执行cscope的命令
            set csto=0                        " 设置cstag命令查找次序:0先找cscope数据库再找标签文件;1先找标签文件再找cscope数据库
            set cst                            " 同时搜索cscope数据库和标签文件
            set cscopequickfix=s-,c-,d-,i-,t-,e-    " 使用QuickFix窗口来显示cscope查找结果
            set nocsverb
            if filereadable("cscope.out")    " 若当前目录下存在cscope数据库,添加该数据库到vim
                cs add cscope.out
            elseif $CSCOPE_DB != ""            " 否则只要环境变量CSCOPE_DB不为空,则添加其指定的数据库到vim
                cs add $CSCOPE_DB
            endif
            set csverb
        endif
        map <F4> :cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
        imap <F4> <ESC>:cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
        " 将:cs find c等Cscope查找命令映射为<C-_>c等快捷键(按法是先按Ctrl+Shift+-, 然后很快再按下c)
        nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
        nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
        nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
        nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
        nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
        nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<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> :copen<CR><CR>
    

    cscope的主要功能是通过其"find"子命令来实现的
    "cscope find"的用法:

    cs find c|d|e|f|g|i|s|t name
    0 或 s  查找这个 C 符号(可以跳过注释)
    1 或 g  查找这个定义
    2 或 d  查找这个函数调用的函数
    3 或 c  查找调用过这个函数的函数
    4 或 t  查找这个字符串
    6 或 e  查找这个 egrep 模式
    7 或 f  查找这个文件
    8 或 i  查找包含这个文件的文件
    

    用法:
    <1>、为源码建立一个cscope数据库

    lingd@ubuntu:~/arm/linux-2.6.28.7$ cscope -Rbq
    lingd@ubuntu:~/arm/linux-2.6.28.7$ ls cscope.*
    cscope.in.out  cscope.out  cscope.po.out
    

    <2>、用vim打开某个源码文件,末行模式下,输入“:cs add cscope.out"(该命令已被我们映射为快捷键F4),添加cscope数据库到vim。因为我们已将vim配置为启动时,自动添加当前目录下的cscope数据库,所以你再添加该cscope数据库时,vim会提示“重复cscope数据库 未被加入“
    <3>、完成前两步后,现在就可以用“cs find c”等Cscope查找命令查找关键字了。我们已在.vimrc中将“cs find c”等Cscope查找命令映射为<C-_>c等快捷键(按法是先按Ctrl+Shift+-, 然后很快按下c)

    帮助文档

    :help if_cscop
    

    注意:帮助文档if_cscop中,快捷键映射nmap <C->i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>是有误的!
    比如光标“header.h”上按下<C-
    >i,也就是查找包含“header.h“的文件。但是按照这个映射规则,则是将<C->i映射为cs find i header.h$,也就是查找包含“header.h$“的文件,这显然不是我们想要的结果。该映射规则应该改成nmap <C->i :cs find i <C-R>=expand("<cfile>")<CR><CR>

    8.vim常用快捷键

    % 跳转到配对的括号去
    [[ 跳转到当前或者上一代码块(函数定义、类定义等)的开头去(但要求代码块中'{'必须单独占一行)
    ][ 跳转到当前代码块(函数定义、类定义等)的结尾去(但要求代码块中'{'必须单独占一行)
    ]] 跳转到下一代码块(函数定义、类定义等)的开头去(但要求代码块中'{'必须单独占一行)
    [/ 跳到注释开头(只对/* /注释有效)
    ]/ 跳到注释结尾(只对/
    */注释有效)
    gD 跳转到当前文件内标识符首次出现的位置,可用于跳转到全部变量的定义处;查找局部变量时,要是多个函数中定义了该局部变量,使用gD进行查找,找到的变量定义可能不是你需要的
    gd 跳转到当前函数内标识符首次出现的位置,可用于跳转到局部变量的定义处
    '' 跳转到光标上次停靠的地方, 是两个', 而不是一个"
    mx 设置书签,x只能是a-z的26个字母
    x 跳转到书签处("`"是1左边的键)
    > 增加缩进,"x>"表示增加以下x行的缩进
    < 减少缩进,"x<"表示减少以下x行的缩进

    相关文章

      网友评论

          本文标题:vim c开发环境搭建

          本文链接:https://www.haomeiwen.com/subject/jnhvtxtx.html