本文参考了VIM中文用户手册的附录三-“用VIM进行C/C++编程介绍”和第29、30章


一、ctags(有了ctags,可以实现很多强大的编程辅助功能,如下)

可以写入.vimrc文件中的命令有set autowrite


1、ctags,使用了ctags.sourceforge.net上的ctags软件,也是VIM推荐的ctags版本

2、这个ctags用起来很简单,直接ctags -R /usr/include/* 就能生成一个包含所有linux下.h文件的tags文件;使用ctags -R <my develop directory>就能生成自己应用的一个tags文件。一般来说,我们会先执行 ctags -R /usr/include/* 生成一个tags文件,然后用 ctags -a -R <our project root directory>来把我们项目文件中的变量、函数定义追加到上面生成的那个tags文件中,这样就生成了一个包含linux声明和我们代码声明 的一个tags文件,给我们做项目开发就perfect了!!

3、不过这个软件的实现不是很完美,有部分头文件里面的函数声明不能正确生成,这就导致了在.c文件中查找一个函数声明,会出现找不到的状况。但总体来说还是不错的。

4、安装ctags完成后,将光标移到要查找的类型变量、函数上(放到名称的任意一个字符上即可),按ctrl+],vi就查找tags文件,并 自动打开对应文件,将光标定位到变量一行。在此过程中,由于vi会隐藏我们原来编辑的文件,所以如果我们原来的文件编辑了但没保存,vi就会提示。这里建 议在$ HOME/.vimrc文件中,添加一行:set autowrite,这样vi就不会询问,自动保存。

5、在上述的查找过程中,我们经常会一层一层的往下查找,此时按ctrl+T可以回到上一层,一直按ctrl+T就可以回到我们编辑的源代码文件了。输入tags命令,就能看到所有的这些层次。

6、如果在查找一个变量或函数的定义的时候,不想让查找出来的东西隐藏我们原来编辑的文件,可以按ctrl+W+]来代替ctrl+],这样屏幕就会上下分割,光标在查找到的文件里面。使用ctrl+W W就可以在这两个窗口中切换光标。

7、vi在启动的时候会在当前目录下找tags文件,如果当前目录下没有该文件,可以在进入vi之后输入 set tags=<tags file path>,<tags file path>... 这样的命令来定位一个或多个tags文件

8、经常会碰到我们要查找的一个变量或函数有多处定义的情况,这是进行查找时,vi会给出tags文件中第一个匹配的tag,然后使用tnext命令可以来到下一个tag;使用命令tselect,vi会列出所有的这些tag,给我们选择。

9、有了tags,就可以让我们来查找一些方法和变量。比如我们现在只记得一个函数以“fge”开头,不知道后面的怎么写了,那可以输入命 令:tag fge 然后按下tab键,vi就会列出tags文件中所有以fge开头的变量或函数。找到答案后按ESC就可以继续编写代码

10、还有一个很常用的功能就是,想查看一个方法的参数定义。比如我们想查看printf这个函数的参数定义,那就可以输入命令: ptag printf ,vi会将窗口做上下分割,然后上面窗口中(vi称这个窗口为preview窗口)就列出了printf函数的定义,此时光标仍然在我们源代码的窗口(利 于我们继续编辑)。输入命令 pclose 就可以关闭这个preview窗口

11、如果想在preview窗口中直接编辑一个文件,可以输入pedit XXX命令,这个东东给我们直接编辑我们的头文件的时候比较有用

12、 psearch命令,这是一个非常非常有用的命令!该命令会根据我们代码中的头文件列表,依次搜索我们指定的变量或函数。比如我们要查找puts这个函 数,如果在代码的puts单词上按ctrl+](如前所说),vi会报告说puts这个tag没找到(这就是ctags不完美的地方,ctags在搜索并 分析/usr/include目录下的头文件的时候,居然不能发现puts是个tag),此时,就可以用psearch来弥补这个小缺陷,psearch 会根据我们代码中定义的头文件列表来进行搜索,一般都能找到  命令行格式就是psearch XXX


二、在代码中快速移动

1、将光标定位在欲查询的变量或函数上,使用gd命令,快速定位局部变量或函数

2、将光标定位在头文件的单词上,使用gf命令,vi自动打开该头文件

3、[ [ = 移动到前一个行首的'{'字符上, 等价于?^{

] ] = 移动到下一个行首的'{'字符上, 等价于/^{

[ ] = 移动到前一个行首的'}'字符上, 等价于?^}

] [ = 移动到下一个行首的'}'字符上, 等价于?^}

{ = 到前一个空行上

} = 到下一个空行上

gd = 到当前局部变量的定义处(当前的意思是光标停留其上的单词).

* = 到与当前单词相同的下一个单词上

# = 到与当前单词相同的上一个单词上

'' = 到上次光标停*的行

4、%命令是一个很有用的命令,该命令可以用来查找配对的代码。包括大括号、方括号、圆括号等其它一些可以配对的符号代码。


三、缩进

可以写入.vimrc文件的有

set cindent

set shiftwidth=4


四、编辑-编译-再编辑

1、在vi中直接输入:make ,vi就会去调用由makeprg设定的命令,默认下,makeprg这个vi的环境变量的值就是make。这样,我们就可以不用离开vi,直接make了

2、要改变makeprg的话,用命令 set makeprg=XXX

3、输入make或make XXX后,开始按照我们makefile里面的命令来编译代码,如果出错,vi会自动跳转到出错的代码行。不过前提条件是,vi中设定的 errorformat能正确匹配编译器的输出信息。vi默认的errorformat的格式能匹配gcc的输出,即errorformat为 %f:%l:%m ,分别是文件名:行号:错误信息。如果不是gcc编译器,输出和gcc不一样的话,就要根据该编译器的输出信息格式来手动调整errorformat了。 更具体内容请输入:h errorformat

4、编辑代码时,替换也是一个常用操作。这我们都知道用s命令,这里要说的是最后的一个选项,平常用的是g,表示globally,全局替换所有 匹配的字符串;我们还可以用c,表示对于每个替换都做询问;还可以用一个数字,表示只替换每行中最多N个匹配,这个N默认是1,这就是为什么如果我们不指 定最后这个option的话,vi只会替换每行的第一个匹配了