• VIM 打造 c/c++ IDE


    1. vim 的安装

    $sudo apt-get install vim vim-scripts vim-doc <br>
    

    其中vim-scripts包含了vim的一些基本插件,包括语法高亮,缩进等等。
    vim的中文文档tar包下载地址: http://sourceforge.net/projects/vimcdoc/files/vimcdoc/
    解压后其中有个doc文件夹, 将其中的内容全部复制到~/.vim/doc, 或者vim安装目录下的doc目录中, 此时vim中的help信息已经是中文的了.
    网页版中文帮助文档网址http://vimcdoc.sourceforge.net/doc/help.html
    首页就时vim帮助文档的目录,阅读起来更方便有效、更有针对性!

    2. vim的配置文件

    vim系统的配置文件在 /usr/share/vim, /etc/vim 两个文件夹下,但是,可以修改 ~/.vimrc 文件和 ~/.vim 目录来对用户单独配置vim。  
    

    3. vim的基本配置

    "---------------------------------- pathogen 设置-------------------------
    "pathogen插件用于管理其他vim插件,安装其他插件时候,可以直接解压覆盖到 .vim 目录下的 autoload, plugin, doc目录;
    "也可以安装完pathogen之后(会在autoload目录下有一个pathogen.vim,同时在.vim 下创建 bundles目录)进入 bundles目录,
    "执行 git clone xxxx 到bundles目录,利用 pathogen进行安装
    execute pathogen#infect()
    execute pathogen#helptags()

    "定义快捷键的前缀,前缀类似于命令空间,避免多个相同的快捷键冲突
    "如 c, <header> c, <header><header> c 是三个不同的快捷键
    let mapleader=";"

    "----------------------------------基本配置------------------------------
    "关闭兼容模式
    set nocompatible

    "文件类型检测,可以针对不同类型的文件加载不同的插件
    filetype on
    "根据侦测的文件类型,加载相应的插件
    filetype plugin on

    "vim 自身命令行 模式自动补全
    set wildmenu

    "设置语法高亮
    if has("syntax")
    syntax on
    endif


    "高亮光标所在的行
    set cul

    "用浅色高亮当前行
    autocmd InsertEnter * se cul

    "设置行间隔
    set linespace=0

    "设置退格键可用
    set backspace=2

    "设置匹配模式,显示匹配的括号
    set showmatch

    "整词换行
    set linebreak

    "设置光标可以从行首或行末换到另一行去
    set whichwrap=b,s,<,>,[,]

    "设置使用鼠标
    set mouse=a

    "显示行号
    set number

    "标志预览窗口
    set previewwindow

    "设置历史记录条数
    set history=50

    "设置自动写回文件
    "自动把内容写回文件: 如文件被修改过,在每个 :next、:rewind、:last、:first、:previous、:stop、:suspend、
    :tag、:!、:make、CTRL-]" 和 CTRL-^命令时进行;
    用 :buffer、CTRL-O、CTRL-I、'{A-Z0-9} 或 `{A-Z0-9} 命令转到别的文件时亦然。
    set autowrite



    "---------------------------------配色方案------------------------------
    syntax enable

    syntax on

    "设置背景色
    set background=dark

    "vim 配色方案
    "colorscheme solarized
    colorscheme desert

    set t_Co=256

    "设置字体
    set guifont=Consolas:h11


    "---------------------------------设置宽度(tab等)----
    "设置tab宽度
    set tabstop=4

    "设置软tab宽度,软tab,用空格代替tab
    set softtabstop=4

    "自动缩进的宽度
    set shiftwidth=4

    "----------------------------------设置对齐和缩进--------
    "设置自动对齐,(和上一行)
    set autoindent

    "智能对齐
    "set smartindent

    "使用c/c++语言的自动缩进方式
    set cindent

    "设置c/c++语言的具体缩进方式
    set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s

    "不要用空格代替制表符
    set expandtab

    "在行和段开始处使用制表符
    set smarttab

    4. 代码折叠

    1. 折叠方式foldmethod
      vim提供以下6种方法来选定折叠方式:
      manual 手工定义折叠
      indent 更多的缩进表示更高级别的折叠
      expr 用表达式来定义折叠
      syntax 用语法高亮来定义折叠
      diff 对没有更改的文本进行折叠
      marker 对文中的标志折叠
    2. 折叠级别foldlevel
      ‘foldlevel’ 是个数值选项:数字越大则打开的折叠更多。
      当 ‘foldlevel’ 为 0 时,所有的折叠关闭。
      当 ‘foldlevel’ 为正数时,一些折叠关闭。
      当 ‘foldlevel’ 很大时,所有的折叠打开。
    3. 折叠栏foldcolumn
      ‘foldcolumn’ 是个数字,它设定了在窗口的边上表示折叠的栏的宽度。当为0时,没有折叠栏。最大是12。
      一个打开的折叠由一栏来表示,顶端是 ‘-‘,其下方是 ‘|’。这栏在折叠结束的地方结束。当折叠嵌套时,嵌套的折叠出现在被包含的折叠右方一个字符位置。
      一个关闭的折叠由 ‘+’ 表示。
      当折叠栏太窄而不能显示所有叠时,显示一数字来表示嵌套的级别。
      在折叠栏点击鼠标,可以打开和关闭折叠:
      (1)点击 ‘+’ 打开在这行的关闭折叠
      (2) 在任何其他非空字符上点击,关闭这行上的打开折叠
      在vim配置文件/home/user/.vimrc中加入如下的配置:

      "--fold setting--
      set foldmethod=syntax " 用语法高亮来定义折叠
      set foldlevel=100 " 启动vim时不要自动折叠代码
      set foldcolumn=5 " 设置折叠栏宽度
    4. 常用命令
      za 打开/关闭在光标下的折叠
      zA 循环地打开/关闭光标下的折叠
      zo 打开 (open) 在光标下的折叠
      zO 循环打开 (Open) 光标下的折叠
      zc 关闭 (close) 在光标下的折叠
      zC 循环关闭 (Close) 在光标下的所有折叠
      zM 关闭所有折叠
      zR 打开所有的折叠

    5. quickfix 设置

    通过quickfix命令集,可以在vim内编译程序,并且直接跳转到出错位置进行修正,    
    

    然后接着进行编译和修正,直到不再出错为止。在 vim的配置文件~/.vimrc文件中加入如下配置:

    "-- QuickFix setting --
    " 按下F6,执行make clean
    map <F6> :make clean<CR><CR><CR>
    " 按下F7,执行make编译程序,并打开quickfix窗口,显示编译信息
    map <F7> :make<CR><CR><CR> :copen<CR><CR>
    " 按下F8,光标移到上一个错误所在的行
    map <F8> :cp<CR>
    " 按下F9,光标移到下一个错误所在的行
    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>
    下面的命令运行 "make" (包括你所给出的参数) 程序并捕捉其运行结果: >  
    

    :make {arguments}
    如果编译时出现错误,按 ,回到vim界面,看不到出错信息了!这时,可以运行以下命令
    :cw[indow] 打开quickfix窗口来查看出错信息,它会自动跳到第一处出错的地方。然后,你可以双击出错某一条出错信息,vim就会自动跳转到相应的出错位置
    :cn[ext] 光标移到下一个错误所在的行
    :cp[revious] 光标移到上一个错误所在的行
    :cfirst 到第一处错误
    :clast 到最后一处错误
    :cc 空间不够时,Vim 会缩短出错信息。如果你想查看详细信息,可以使用此命令
    :cl[ist] 列出所有出错信息的概览(只有那些含有文件名或行数的错误信息会被显示,需要查看那些并不含文件名或行数的信息可用“:cl[ist]!”命令)

    6. ctags配置

    ctags 可以建立源码树的标签索引,用于快速定位函数、变量等。  
    

    $sudo apt-get install ctags #安装ctags
    $ ctags -R * #建立索引文件

    ~/.vimrc中对ctgs的使用进行配置

    "-------------------------------------ctags设置----------------------------  
    "按下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

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

    5. 管理vim插件 pathogen

    通过pathogen,可以管理vim插件。  
    当自己下载安装vim插件的时候,也可以在自己的插件子目录~/.vim下。在~/.vim 子目录下,设置插件目录plugin 和文档目录doc.  
    使用手动方式进行拷贝添加:解压  xxx.zip,将 解压后的目录中的 autoload, plugin, doc 目录中的文件拷贝到 ~/.vim目录下  
    

    对应的autoload, plugin, doc 目录中去(直接解压覆盖安装即可)。
    或者使用pathogen 插件管理器来管理插件,pathogen在~/.vim/autoload目录下有 pathogen.vim, 然在.vim目录下建立
    bundle目录,在bumdle目录下执行 git clone xxxx.git 获得插件,即可完成自动安装。同时,在.vimrc 文件中添加
    execute pathogen#effect()
    execute pathogen#helptags()

    6. vim 自动补全 Onmicpp-Complete

        vim的自动补全功能可以通过 Omnicpp-Complete来实现。
    在~/.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
    OnmiCppComplete是基于ctags数据库即tag文件来自动补全的,所以在使用ctags -R 生成tag文件时需要加入其他选项,  
    

    才能与OnmiCppComplete配合。
    ctags -R —c++-kinds=+p —fields=+iaS —extra=+q .
    —c++-kinds=+p : 为C++文件增加函数原型的标签
    —fields=+iaS : 在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、以及函数的指纹(S)
    —extra=+q : 为标签增加类修饰符。注意,如果没有此选项,将不能对类成员补全
    例如,为了添加标准c++的代码补全。

    1. 下载c++的源代码
      $sudo apt-get install build-essential  (源码会放在/usr/include/c++ 目录下)  
      
    2. 然后生成和omnicppcomplete连接的tags文件
      在/usr/include/c++目录下执行,ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .  生成tags文件  
      
    3. 在.vimrc 文件中添加
      set tags+=/usr/include/c++/tags  
      

    注意:在自动补全的点,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

    7. 提示函数原型 echo_func

    echofunc可以在命令行中提示当前输入函数的原型。
    echofunc下载地址:<http://www.vim.org/scripts/script.php?script_id=1735> 下载完成后,把echofunc.vim文件放到 ~/.vim/plugin  
    

    文件夹中
    当你在vim插入(insert)模式下紧接着函数名后输入一个”(“的时候, 这个函数的声明就会自动显示在命令行中。如果这个函数有多个声明,
    则可以通过按键”Alt+-“和”Alt+=”向前和向后翻页,
    这个两个键可以通过设置g:EchoFuncKeyNext和g:EchoFuncKeyPrev参数来修改。这个插件需要tags文件的支持,
    并且在创建tags文件的时候要加选项”—fields=+lS”(OmniCppComplete创建的tag文件也能用),
    整个创建tags文件的命令如下:
    $ ctags -R —fields=+lS

    8. 标签浏览器 TagList

    Taglist了列出了当前文件中的所有标签,宏、变量、函数等。  
    

    安装taglist: 下载taglist 的压缩包, 解压缩到 ~/.vim 目录覆盖 doc和plugin目录即可。
    配置taglist:


    "-- 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

    9. cscope 设置

    Cscope是一个类似于ctags的工具,不过其功能比ctags强大很多。
    
    1. 安装Cscope
      $ sudo apt-get install cscope
    2. 在vim配置文件/home/user/.vimrc中加入如下的配置:
      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 :cs add ./cscope.out . :cs reset
    imap :cs add ./cscope.out . :cs reset
    “ 将:cs find c等Cscope查找命令映射为c等快捷键(按法是先按Ctrl+Shift+-, 然后很快再按下c)
    nmap s :cs find s =expand(““) :copen
    nmap g :cs find g =expand(““)
    nmap d :cs find d =expand(““) :copen
    nmap c :cs find c =expand(““) :copen
    nmap t :cs find t =expand(““) :copen
    nmap e :cs find e =expand(““) :copen
    nmap f :cs find f =expand(““)
    nmap i :cs find i =expand(““) :copen

    1. 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 查找包含这个文件的文件

    2. 用法:
      <1>、为源码建立一个cscope数据库
      $ cscope -Rbq
      $ 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等快捷键(按法是先按Ctrl+Shift+-, 然后很快按下c)

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

    10. vim 常用快捷键

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

    http://www.cnblogs.com/zhangsf/archive/2013/06/13/3134409.html

  • 相关阅读:
    指针
    day07
    day06
    oracle instr
    动态解析dll及使用类
    客户端调用接口
    Java中调用WebService
    Vs2015智能提示英文
    oracle中varchar(32)转nvarchar(32)
    C#创建XML节点
  • 原文地址:https://www.cnblogs.com/gtarcoder/p/4463335.html
Copyright © 2020-2023  润新知