注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

guoyoooping的博客

audio,picture, text and video

 
 
 

日志

 
 

Vim学习笔记6: Vim之于程序  

2010-01-31 19:24:15|  分类: Vim: 学习Vim的心 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
#Author: ypguo<guoyoooping@163.com>
#Data: 2010.2.8
#Version: 1.0

[关键字] Vim, 程序, ctags, taglist, cscope, make, gdb

[摘要] 本文总结了Vim用于编程的一些技巧, 主要包括格式化程序, 利用ctags和cscope生
成标签, 利用quickfix在程序里调用make, gdb等.

vim由一个程序员开发, 而且为更多的程序员所使用, 所以在vim中加强了对软件开发的支
持.

1. 格式化程序

程序一般都有固定的语法, 书写符合一定的规则的程序可读性强. 选项主要有:

    1)set (no)expandtab 将TAB键转换成格

    2)set softtabstop=num 一个tab键转换成几个空格.

    3)set tabstop=num 一个tab键看起来占几个空格的位置

    4)set shiftwidth=num"自动缩进的时候缩进几个空格

    5)set cindent"按C语言的语法自动缩进

    6)set formatoptions=tcroqmB "格式化选项(参考:help formatoptions), 查看
    各个选项分别代表什么意思, 这里简单介绍几个, t: 输入时自动断行; c: 对于
    程序的注释也应用自动折行; r: 注释自动折行时自动加入注释前缀; o: 在用 o
    或O命令新开一行时, 自动插入注释前缀, q: 允许gq命令作用于注释; m: 可以
    在任一中文字符后断行; M: 合并两行时两行中间不插入多余的空格

    8)set cindent"设置C格式的缩进.

    9)set cinoptions=:0,g0,t0,(0" " do c-style indenting, cinoptions changes:
    ":N    Place case labels N characters from the indent of the switch().
    (default 'shiftwidth').
    "gN    Place C++ scope declarations N characters from the indent of the
    block they are in. (default 'shiftwidth').
    "tN    Indent a function return type declaration N characters from the
    margin. (default 'shiftwidth').
    "(N    When in unclosed parentheses, indent N characters from the line
    with the unclosed parentheses. (default 'shiftwidth' * 2).

    10)set formatoptions=tcroqmB

    11)autocmd FileType c,cpp :match ErrorMsg /\%>80v.\+/ "编程时提示超过
    80字符的行

用于排版程序的命令主要有:

    1)= 将所选范围的代码按C语言的格式进行重排, 也可以带参数


2. 用ctags和cscope打造IDE编程环境

Tag文件(标签文件)无疑是开发人员的利器之一, 有了tag文件的协助, 你可以在VIM查看
函数调用关系, 类, 结构, 宏等的定义, 可以在任意标签 中跳转, 返回……相信使用过
Source Insight的人对这些功能并不陌生, 而在VIM中, 此功能的实现依赖于下面四个工
具:

1)taglist插件

taglist插件能够把当前文件中的宏, 全局变量, 函数等tag显示在Symbol窗口, 用鼠标点
上述tag, 就跳到该tag定义的位置; 可以按字母序, 该tag所属的类或scope, 以及该tag
在文件中出现的位置进行排序; 如果切换到另外一个文件, Symbol窗口更新显示这个文件
中的tag, 作为一个编程人员, 这是必须的, 有关taglist插件请参考 <#9.1 taglist: 源
代码结构浏览>.

2)Exuberant Ctags

使用上一节所提的taglist插件可以在独立的窗口显示函数定义列表, Exuberant ctags还
提供了另外的功能, 那就是光标放在函数上, 按Ctrl-]就可以直接跳到该函数的定义处.
首先在工程目录里执行Exuberant Ctags, 为工程生成一个tags文件, 里面储存了函数,
变量, 宏定义的信息, 这样再打开程序时就可以实现跳转功能了.

进入自己的代码目录, 运行"ctags.exe -R ."就可以生成代码标签. 打开代码后,
taglist与ctags就自动关联起来了, 下面可以在代码使用 taglist插件的命令:

        :tag XXXX, 查询XXX.
        :tags: 显示标签栈
        Ctrl-]: 跳到光标所在标签的定义处.
        Ctrl-o, Ctrl-t: 跳回原来的地方.
        Ctrl-i: 向前跳.

3)cscope

Cscope是一个交互式的屏幕下使用的工具, 用Cscope自己的话说-"你可以把它当做是超过
频的ctags", 其功能和强大程度可见一斑吧, cscope除了可以像ctags那样直接跳转到标签的定义处以
外, 还可以回答以下问题:

        *什么地方用到了这个符号?
        *这是在什么地方定义的?
        *这个变量在哪里被赋值?
        *这个全局符号的定义在哪里?
        *这个函数在源文件中的哪个地方?
        *哪些函数调用了这个函数?
        *这个函数调用了哪些函数?
        *信息"outofspace"从哪来?
        *这个源文件在整个目录结构中处于什么位置?
        *哪些文件包含这个头文件?

了解了ctags和cscope的强大功能, 下面就进入正题吧. 进入自己的代码目录, 运行
"cscope -Rq .",  这个命令会生成三个文件: cscope.out, cscope.in.out,
cscope.po.out. 其中 cscope.out是基本的符号索引, 后两个文件是使用"-q"选项生成的
, 可以加快cscope的索引速度.

ctags里的关于代码定义的跳, 在cscope里也一样能用, 由于cscope的功能更强大, 它又
定义了其它的跳命令:

    <C-\>s -> cs find s XXX: 查找C语言符号(即函数名,宏或枚举值)被引用的地方
    <C-\>g -> cs find g XXX: 查找C语言符号(即函数名,宏或枚举值)被定义的地方
        <C-\>d -> cs find d XXX: 查找本函数调用的函数
        <C-\>c -> cs find c XXX: 查找调用本函数的函数
        <C-\>t -> cs find t XXX: 查找指定的字符串被引用的地方
    <C-\>e -> cs find e XXX: 查找egrep模式, 相当于快速egrep功能
        <C-\>f -> cs find f XXX: 查找并打开文件, 类似vim的find功能
        <C-\>i -> cs find i XXX: 查找包含本文件的文件

和ctags相比, cscope的缺点是支持语言相对较少.

4)NERD_tree

关于于NERD_tree的详情请参考<#6.7 NERD_tree: 目录树浏览器>, 这个插件的作用主要
是方便以IDE的方式从vim里直接打开文件, 不是必须.

3. 编译和quickfix

vim由一个程序员开发, 而且为更多的程序员所使用, 所以在vim中加强了对软件开发的支
持, quickfix模式的引入就是一个例子. 所谓quickfix模式, 它和Normal模式,  Insert
模式没什么关系, 它只是一种加快你开发速度的工作方式.  Quickfix模式的主要思想是
保存一个位置列表, 然后提供一系列命令, 实现在这个位置列表中跳转.

利用vim的quickfix模式, 在vim的命令模式下直接输入make就可以编译代码, 然后vim会
根据编译器输出的错误信息, 自动跳到第一个出错的地方, 让你进行修改; 修改完后, 使
用一个快捷键, 跳到下一个错误处, 再进行修改, 方便的很, 这一点使你即使在编译阶段
也可以不离开vim, 非常受程序员们欢迎.

为了做到这一点, 你有两种选择, 一种是你的工作目录下有Makefile文件, 只需输入
":make"命令就可以进行编译了; 如果你工作目录下没有Makefile文件, 你也可以定义
'makeprg‘ 项, make的时候会调用 'makeprg'里参数进行编译. 比如":set
makeprg=gcc\ -Wall\ -ohello\ hello.c", make的时候相当于在vim执行了"!gcc -Wall
-ohello hello.c"

在使用":make", vim会把编译输出重定向到一个临时文件中, 当编译出现错误时, vim
会从上述临时文件中读出错误信息, 根据这些信息形成quickfix列表, 并跳转到第一个错
误出现的地方.

如果你没看清出错信息, 可以输入":cc"命令, vim会更次显示此信息, 或者干脆使用"
:cw"命令, 打开一个quickfix窗口, 把所有的出错信息都显示出来. 现在我们知道错在
哪儿了, 修正一下, 然后使用":cn"命令(或者在Quickfix List对应行上输入回车)跳
到下一个出错的地方, 以此类推, 直到修正全部错误.

vim可以同时记住最新的10个错误列表, 也就是说你最近10次使用":make"命令编译所遇
到的错误都保存着, 可以使用":colder"和":cnewer"命令, 回到旧的错误列表进到更
新的错误列表.

在quickfix模式里经常用到的命令有:

    :cc 显示详细错误信息 ( :help :cc )
    :cp 跳到上一个错误 ( :help :cp )
    :cn 跳到下一个错误 ( :help :cn )
    :cl 列出所有错误 ( :help :cl )
    :cw 如果有错误列表, 则打开quickfix窗口 ( :help :cw )
    :col 到前一个旧的错误列表 ( :help :col )
    :cnew 到后一个较新的错误列表 ( :help :cnew )

更多的命令, 以及这些命令更详细的解释, 请参见手册.

如果你希望跳转到出错的文件时, 使用一个分隔的窗口打开, 请参阅’switchbuf‘选项
的值.

在vim7中, 每个窗口都可以拥有自己的位置列表, 这样, 你就能够同时打开多个位置列表
了, 而quickfix列表在整个vim中只有一个. 你可以使用位置列表来显示编译错误信息,
具体命令参阅手册: ":help location-list"以及":help :lmake".
  评论这张
 
阅读(1788)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017