这里的内容是针对编程序或者阅读源代码时候使用的,本来它的有些内容可以属于其它类的,但是这里单独用"编程相关"将这类命令集中起来了。
编译并自动定位第一个错误
输入 :make filename
。
注意:在vi中编译test.c,直接用 :make test
就可以了,注意是不带后缀的哟。如果有makefile的话可以再vi直接敲 :make
,然后就能够定位到第一个错误上面了。
关于ctags跳转
通常我们需要使用名为ctags的程序来生成这样的tag文件。vim能直接使用ctags程序所生成的tag文件。
安装ctags
$sudo apt-get install ctags
注意这里是在ubuntu下。
为当前目录文件生成tags文件
$ctags -R ./
或
$ctags -R
这里,如果 ctags -R ../
将会也生成父目录文件的tags,ctags利用tags进行跳转。
载入当前标签
输入 :set tags=tags
.
这将载入(当前目录的)所需标签文件,如果不载入则没有ctags所需要的tags文件,为了实现自动载入启动可以在~/.vimrc加入如下内容:
if has("ctags")
if filereadable("tags")
set tags=tags
endif
endif
直接打开文件并跳转到函数
$vim -t func
这样,将打开vim并且直接跳转到func函数的位置。
跳转到当前光标函数实现内部
输入 [Ctrl]]
.
实现这个功能需要有tags标签。
回到[Ctrl][之前的位置
输入 [Ctrl]T
.
这里,应该是 [Ctrl]]
之前的位置,有待修改。
分割一个窗口并跳转到当前光标函数实现内部
输入 [Ctrl]w ]
.
跳转到指定函数实现处
输入 :tag func
.
或输入 :tselect func
这样将跳到func函数的实现地方,tag func如果有多个将自动跳到第1个,tselect func如果多个则显示一个所有匹配列表,让你选择哪个。这里标签名可以用[Tab]进行命令补全.
新开一个窗口,查看tag的函数
输入 :stag tagname
.
这里,tagname是一个tag标签(例如函数名)效果相当于首先用:split,再用tag tagname.窗口是水平的。
如果有多个tag匹配则:
- 切换到下一个匹配标签处: 输入
:tnext
- 切换到上一个匹配标签处: 输入
:tprev
- 切换到第一个匹配标签处: 输入
:tfirst
- 切换到最后一个匹配标签处: 输入
:tlast
- 显示所有匹配标签: 输入
:tags
- 显示所有匹配标签并让你选择指定的: 输入
:tselect
。
关于代码折叠
设置可以折叠
输入 :set fdm=syntax
.
或输入 :set fdm=indent
.
这里,fdm实际上是foldmethod的简写,第1个syntax方式是按照语法进行折叠(我倾向用这个所以后面都是对这个方式折叠下的命令),第2个是对大括号内的进行折叠。
对当前代码块进行折叠
输入 zc
.
这里,需要把当前光标放置到需要折叠的代码块的内部,因为一般程序结构都是嵌套的,这个命令折叠的是最内层的代码块。
对当前代码块所在范围代码块全部折叠
输入 zC
.
这里,折叠的不仅仅是最内层的代码块了,而是连带着递归地折叠了包含该代码块的这个代码块。
展开当前代码最外层折叠
输入 zo
.
这里,是对光标下的折叠代码块最外层折叠进行打开,内层的折叠仍旧折叠着,除非你移动到那里再次用这个命令打开折叠,有时候你按一下左右方向键也会打开折叠。
展开当前代码包含的所有折叠
输入 zO
.
这里,展开的不仅仅是最外层的代码块了,而是连带着递归地展开了该代码块包含的所有内层代码块。
折叠当前文件所有可能折叠的代码
输入 zM
.
这样,将把当前文件的所有可以折叠的代码进行折叠。
展开当前文件所有折叠的代码
输入 zR
.
或输入 :set foldlevel=999
.
这样,将把当前文件的所有折叠的代码展开。
全部展开或折叠当前文件所有可以折叠的代码
输入 zi
.
这里,相当于zR和zM命令的“综合”,这个命令在全部折叠和全部展开两个命令之间进行“开关”切换。
到当前打开的折叠的开始处
输入 [z
.
到当前打开的折叠的末尾处
输入 ]z
.
跳到下一个折叠的开始处
输入 zj
.
这里,关闭的折叠也被计入。
跳到上一个折叠的末尾处
输入 zk
.
这里,关闭的折叠也被计入。
cscope的使用
cscioe功能
可以解决类似如下的问题:
- 符号在哪里实用的?
- 在哪里定义的?
- 变量从哪里得到它的值的?
- 全局变量的定义?
- 这个函数在源代码中的什么文件中?
- 什么函数调用了这个函数?
- 这个函数调用了什么函数?
- 消息“out of space”来自哪里?
- 这个源文件在目录中的结构?
- 哪些文件包含了这个头文件?
软件下载
http://sourceforge.net/project/showfiles.php?group_id=4664
软件安装
-
./configure --with-flex
(注:如果平台是Linux,最好带上--with-flex
选项) -
make
(注:我没有遇到错误) -
make install
(注: 直接安装好了)
cscope配置
修改vim配置文件vimrc.你可以修改/etc/vimrc使用所有用户都使用本配置文件,当然你还可以修改~/.vimrc
- 下载cscope配置文件:cscope_map.vim (http://cscope.sourceforge.net/cscope_maps.vim)
- 把cscope_map.vim里从 if has("cscope")? 到 endif里边的内容复制到/etc/vimrc里边去
- 里边的命令意思自己琢磨
cscope相关命令
生成索引文件,在源代码目录中输入: $cscope -Rb
另外,有的时候: $cscope -Rbkq<回车>
这里,
- R 表示把所有子目录里的文件也建立索引
- b 表示cscope不启动自带的用户界面,而仅仅建立符号数据库
- q生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
- k在生成索引文件时,不搜索/usr/include目录
更多查看man.
vim下的相关命令
简单的帮助命令列表
输入 :cs help
或输入 :cs
cs是cscope的简写命令,后面也是如此。
添加一个新的cscope数据库链接
输入 :cs add cscope.out
这样,把当前目录下面的cscope.out这个cscope数据文件添加了,就可以利用其中的内容了,如果没有链接数据库,那么就用不了相应的功能了。可以把这个命令加入到.vimrc中,省得人工输入。
查看当前已经链接的cscope数据库链接
输入 :cs show
查找相关命令
查找C语言符号,即查找函数名、宏、枚举值等出现的地方
输入 :cs find s <符号名>
.
或输入 cs f s <符号名>
.
这里,等价于 :cs find 0
.
查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
输入 :cs find g <符号名>
.
或输入 cs f g <符号名>
.
这里,等价于 :cs find 1
.
查找本函数调用的函数
输入 :cs find d <符号名>
.
或输入 :cs f d <符号名>
.
这里,等价于 :cs find 2
.
查找调用本函数的函数
输入 :cs find c <符号名>
.
或输入 :cs f c <符号名>
.
这里,等价于 :cs find 3
.
查找指定的字符串
输入 :cs find t <符号名>
.
或输入 :cs f t <符号名>
.
这里等价于 :cs find 4
查找egrep模式,相当于egrep功能,但查找速度快多了
输入 :cs find e <字符串>
.
或输入 :cs f e <字符串>
.
这里,等价于 :cs find 6
,注意没有5.
查找并打开文件,类似vim的find功能
输入 :cs find f <文件>
.
或输入 :cs f f <文件>
.
这里,等价于 :cs find 7
.
查找包含本文件的文件
输入 :cs find i <文件>
这里等价于 :cs find 8
.
以上的 cs find
均可简写为 cs f
.
将cscope的数据库内容作为tags
输入 :set cst
.
或输入 :set cscopetag
.
这样就 会把cscope的数据库当成tag文件了,在只有cscopt.out的情况下可以用[Ctrl]]进入相应的函数了。这样只用cscope不用ctags了。关闭这个功能是 :set nocst
.但是cscope无法在tag的时候自动不全标号,另外,cscope虽然搜索全局字符串似乎挺好,但是在用cscope的方式tag函数的时候,如果源文件修改了例如增加几个空行之类的,那么回出现定位错位,而ctags就不会。
察看光标下的函数
输入 [Ctrl]\g
.
这里,是加入cscope.vim的相关语句到.vimrc中之后有的快捷键。cscope.vim内容在“其他相关“里面最后有列出了。
察看调用光标下函数的函数
输入 [Ctrl]\c
.
还有其他等等,察看脚本内容就知道了,实际是 [Ctrl]\
等价于输入 :cs f
,之后输入相应的字符f,g,c等,就可以查找当前光标下标号的东西了。
到当前局部变量的定义处
输入 gd
.
这里,当前的意思是光标停留其上的单词。
到当前全局变量的定义处
输入 gD
.
跳转到当前代码块的开头
输入 [{
.
这里代码块一般是用 {}
扩起来的。
查找在头文件中的某个相关定义
输入 [Ctrl]w[Ctrl]i
.
这样,vim可以直接根据头文件进行查看,察看当前光标下的符号在头文件的相关定义。
注释第1行到第20行
输入 :1,20s/^/\/\//g
.
这里, ^
表示在行首插入,因为Vim/Vi替换命令格式中默认 /
为分隔符,这样就需要使用转义符 \
,表示 /
就要写成 \/
才可以,所以命令如上所示。强烈建议各位看官使用,省时省力省键盘还,如果shell的注释符号'#'就不用转义了。
简单重排功能
当前行向右移一个shiftwidth
输入 >>
.
这里, 整行会向右移一个 shiftwidth(预设是 8 个字元,可重设)。
当前行向左移一个shiftwidth
输入 <<
.
这里, 整行会向左移一个 shiftwidth(预设是 8 个字元,可重设)。
将 {}
, ()
或 []
等符号括起来的文本都右移
输入 >%
.
这里,您必须把光标放在这些符号( {}
, ()
或 []
)上面.
将 {}
, ()
或 []
等符号括起来的文本都左移
输入 <%
.
这里,您必须把光标放在这些符号( {}
, ()
或 []
)上面.
自动缩进选中代码的格式
- 输入
v
, - 移动光标,选择待调整的代码块,
- 输入 = 。
这里,关键是先进入选择模式选择相应的代码,然后按 ‘=’键,如果只按=就格式化当前行(需移动一下光标才看得出来)。
打开一个预览窗口来显示函数 write_char
输入 :ptag write_char
.
这样之后,光标会自动移动回原来的位置。窗口是水平的。
关闭预览窗口
输入 :pclose
.
这里,尽管当前光标不在预览窗口,也会关闭预览窗口。
在预览窗口中编辑一个指定的文件
输入 =:pedit = 。
这在编辑头文件时很有用,这里的是要编辑的文件名,还可以同时定位到函数比如: :pedit +/funcs defs.h
。这样可以在原有光标不变的情况下在预览窗口中修改。
查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配
输入 psearch <函数名>
。
这在使用没有标签文件的库函数时十分有用。虽然它不是很智能,但是它能够到库头文件中搜索。
quickfix定位代码错误的使用
Quickfix模式的主要思想是保存一个位置列表,然后提供一系列命令,实现在这个位置列表中跳转。加快你的开发速度。
假设:你编写了一个程序,在vi中输入 :make
调用makefile来编译的时候程序中有错误,回车就会返回编辑界面(实际会自动定位到第一个错误)。运行如下命令可以定位错误:
显示并定位到第n个错误
输入 :cc n
.
这样就会自动定位到第n个错误的位置,并显示相应的错误信息,如果没有n参数,就重现当前错误信息。
定位到当前错误的下一个错误处
输入 :cn
.
这样如果当前在第n个错误的状态,这样会切换到第n+1个错误并定位到相应的位置。
定位到当前错误的上一个错误处
输入 :cp
.
这样如果当前在第n个错误的状态,这样会切换到第n-1个错误并定位到相应的位置。
列出当前所有错误列表
输入 :cl
.
这样列出一个错误列表,只是显示出了所有错误回车就又回到先前界面了。
在当前窗口底部打开一个quickfix窗口列出所有错误信息
输入 :cw
.
这样会在当前窗口底部新开一个窗口,方便的看到所有错误信息,还可以把光标移动到相应的错误之处然后回车,就会回到代码窗口并定位到相应的错误位置。
回到上一个错误列表
输入 :colder
.
或输入 :col
.
这样回到上一次的quickfix错误列表,例如再次编译还有错误,这个命令返回的是上次而不是这次的错误列表,运用cw等都是上次的错误信息。
进入较新的错误列表
输入 :cnewer
.
或输入 :cnew
.
这个命令的作用和前面colder相反,进入更新的错误列表。
关于自动补全
显示自动补全列表
输入 [Ctrl]p
这里,是在插入模式下进行的,例如当前输入了 aa
字符,然后输入[Ctrl]p这样会列出所有以aa为开头的单词列表。它们会在当前缓冲区、其它缓冲区,以及当前文件所包含的头文件中查找以光标前关键字开始的单词。
选择自动补全列表中匹配的下一项
输入 [Ctrl]n
.
这样如果有多个匹配的单词项那么会高亮下一项进行选择。如果不够则循环显示。
选择自动补全列表中匹配的上一项
输入 [Ctrl]p
.
这样如果有多个匹配的单词项那么会高亮上一项进行选择。如果不够则循环显示。
自动匹配整个行
输入 [Ctrl]x[Ctrl]l
.
这里,注意要在编辑状态下面运行的,会弹出文件中所有的整个行,之后用[Ctrl]p等就可以自动匹配了。
如果CTRL-N和CTRL-P补全时查找所包含的头文件,耗时会比较久。此时,可以在’complete‘选项中去掉'i'标记 :set complete-=i
。