vi编辑器学习使用之七
vi是一个强大的编辑器,他不仅可以用来处理我们平时的文本工作,他还可以用写程序文件。在vi中有许多命令可以方便的完成我们的程序处理工作。在用vi进行程序处理时,vi充分的显示出来了他的强大之处,他可以实现在语法加亮显示,实现自动缩进,实现括号匹配,还可以在程序中实现查找和跳转。
我们可以用这样的命令在vi中打开语法加亮显示的功能::syntax on。这样以后我们在输入的字符中,vi就会自动的识别出关键字,字符串以及其他的一些语法元素,并以不同的颜色来显示出来。这对于程序员来说是一个巨大的帮助。当然你可以自定义语法加亮显示的颜色。
一般情况下,vi的这种语法加亮显示的功能可以工作的很好,但是有时我们也遇到一些小小的麻烦。也许我们都遇到过背景是白色而字体是浅黄色的情况,在这样的情况下是非常难读的。vi编辑器有两种语法加亮的办法,一种是当背景为浅色时用,而另一种是当背景为深色时用的。当我们启动vi时,他会检测我们所使用的端是哪一种背景颜色,是浅色还是深色,然后再应用语法加亮的颜色方案。当然了,有的时候vi也是可以检测出错的。我们可以用这样的命令来知道我们的背景的情况::set background?。这样vi就会在底端给出我们具体的显示。如果vi检测的并不正确,我们可以用这样的命令来为他赋下正确的值::set background=light或是:set background=dark.当然我们要清楚的知道,这样的操作要在打开语法加亮的命令之前来执行。vi实现语法加亮显示的功能是通文件的扩展名来文件的类型从而实现功能的。但是有时我们在编辑一个C程序文件时并没有使用传统的扩展名,那么我们如何来告诉vi我们正在编辑的文件的类型呢?解决的办法就是用filetype这个选项。例如我们要告诉vi我们正在编辑的是一个C程序文件我们可以这样的来做::set filetype=c。这样以后vi就会知道我们正在编辑的是一个C程序文件并正确的加亮语法显示。
除了语法加亮显示的功能以外,vi还提供了缩进的功能。命令<<将使当前行向左移动一个移位宽度,而命令>>将使当前向右移动一个移位宽度。这个所谓的是移位宽度具体是多少呢?在vi中默认的是八个空格的宽度。然而平时的经验可以表明当缩进是四个空格宽度时最有利于程序的阅读。那么我们如何将这个移动宽度定为四个空格的长度呢?这时我们就可以用下面的命令来做到::set shiftwidth=4.而这时的命令仅是对当前的一行有效,我们也可以像其他的vi命令一样的在命令前用数字做为前缀还指定命令作用的范围。如5<<就将缩进五行。
在vi中还有许多自动进行缩进的选项,一般有以下的几种:C缩进(cindent):这是C语言的缩进形式,采用这样的缩进方式的程序语言有:C,C++,Java等。当采用这种缩进格式时,vi就会自动的采用标准的C语言形式。还有一种形式是smartindent:在这种缩进模式中,每一行都和前一行有相同的缩进量,同时这种缩进形式能正确的识别出花括号,当遇到右花括号(}),则取消了缩进形式。另外的一种缩进形式便是所谓的自动缩进(autoindent):在这种缩进形式中,新增加的行和前一行有相同的缩进形式。vi编辑器可以很好的识别出C,C++,Java以及其他的一些结构化程序设计语言,并且能用C语言的缩进格式来很好的处理程序的缩进结构。我们可以用这样的命令来打开C语言形式的缩进结构::set cindent.这样以后vi编辑器就会用C语言的缩进形式来正确的处理程序文件。一般而言C缩进结构可以满中绝大多数人的需要,当然了不同的人有不同的编程风格,如果你不喜欢这样的缩进结构,你可以自己定义自己的缩进形式。也许我们做程序设计的人并不想每一次想要编辑C程序文件时都要用命令:set cindent来打开C缩进形式,为了解决这样的问题,我们可以改写vi的配置文件来使vi能够自动的完成这样的工作。我们在.vimrc(UNIX/LINUX)或是_vimrc(WINDOWS)中加入下面的几句:
:filetype on
:autocmd FileType c,cpp:set cindent
第一行是打开vi文件类型识别功能,第二行是如果所识别的文件类型为C或是C++文件那么便打C缩进形式。
在vi中除了C缩进形式以外我们还有smartindent缩进形式可以来用。在smartindent这种缩进模式中能够正确的识别出{和}。同时增加了识C语言关键字的功能。如果一行是以#开头的,那么这种格式将会被特殊对待而不采用缩进格式。这种缩进格式不如cindent,但是却强于autoindent。另外的一种缩进形式便函是autoindent。在其他的一些结构化程序设计语言如Pascal,Per或是Python语言中,我们所希望的是新的一行能和上一行有相同的缩进形式,这时我们便可以打开autoindent缩进形式,:set autoindent。这样就可以很好的来满足我们的要求了。
vi不仅有这些功能,而且还有更多的功能来快速的处理程序文件。其中一个便是可以快速的在文件中定位变量及宏定义等。其中一些常用到的命令有:
[CTRL_I/]CTRL_I 在本文件中以及在由#include命令包含进来的文件中进行查找光标下面的文字
gd/gD 查找变量的定义
[CTRL_D/]CTRL_D 跳到宏定义的地方
[d/]d/[D/]D 显示宏定义
这几个命令中有一些需要说明的地方:[CTRL_I/]CTRL_I命令用来查找光标下面的文字,查找的范围不仅是在本文件中进行查找,而且还要查找由#include所包含进来的文件中进条查找。变显查找的命令gd和gD有时并不能完美的完我们想要做工作。这是因为vi在理解C和C++的语法方面有一些小的限制。但是大多数的情况下这几个命令还是可以很好的来完成我们工作的。[d/命令可以显示以当前光标下的内容为为名字的第一个宏定义,]d也有着同样的作用,所不同的只是后者是从当前光标处查找下一个宏定义。当然这两个命令也可以在由#inlcude所包含进来的文件中进行查找。[D/]D命令可以用来列出文件中的宏定义。这两个命令有着同样的作用,所不同的只是前者是列出当前光标以后的宏定义,而后者是从当前光标处的下一个宏开始列出文件中的宏义。(注:此处由此书看来似乎是这样的,但是自己亲自来做时并没有出现这样效果)
我们在编写程序时常常要做的一件事便是括号的匹配,我们在vi中可以用%命令来确定匹配的括号。例如我们将光标定位在其中一个括号处,然后执行命令%,光标就会定位在与其相匹配的括号处。有时我们在编写了一段程序后却想着要将这一段程序进行缩进,这时我们可以用这样的命令来做到:将光标定位在第一个或是最后一个包含着所要缩进的程序块的括号处,然后执行下面的命令:>%,这样就可以将这个程序右缩进一段距离。但是我们发现执行这个命令后花括号也一样的进行了缩进,有时我们这并不是我们想要的,我们想要的是仅括号内的文本进行缩进。这时我们又应如何来做呢?这时我们可以用这样的命令:>i{.这个命令是说仅括号内的文本进行缩进。我们还可以用可视化的模式来缩进文本块,具体的做法是这样的:
1 将光标定位在左括号或是右括号处。
2 进入可视化模式:v
3 选中括号内的文本:i}
4 缩进:>
当我们用vi来编辑我们的程序文件时,他提供给了我们定位程序函数的功能。这对于我们想要理解一个程序是非常有帮助的。vi所定位的函数被包含在一个由ctags的程序建立的文件当中。要建立一个名为tags的这样的文件,我们可以输入这样的命令来完成:$ctags *.c
这样以后当我们在vi中来编辑我们的程序文件时我们就可以任意的跳转到我们想要去的函数处,当然这得要求我们想要到函数存在。我们可以用这样的命令来到达我们要到的地方:
:tag function
这个命令甚至可以查找得到在其他文件中的函数。
在完成函数跳转的功能命令中还有几个强大而有趣的命令。CTRL_]命令跳转到以光标下的字符串为函数名的函数处。这样就大大的方便了我们在C程序查找函数的需要。例如你正在看一段名为write_block的函数程序,而在这个程序中调用了函数write_line。这个被调用的函数具体是来做什么的呢?我们可以将光标定位在这个函数上,然用执行命令CTRL_]。这样vi就会马上跳转到这个函数的定义处。我们就可以清楚的看到这个函数的实现的方法。而在这个函数中又调用了函数write_char,这时我们可以用同样的方法来查看这个函数的定义过程。命令:tags可以列出我们已经访问过的函数名称。但是我们在走了一段路以后想回去又该怎么来做呢?命令CTRL_T可以使我们回到上一个访问的函数处。我们为了在函数跳转的命令,我们要用命令ctags建立这文件来存放在C程序中所出现在的函数名,这时vi要建立一个栈来存入函数名。我们用命令CTRL_T回到上一个访问的函数处,这时我们还可以用命令:tag来向前走一步,即回到前一个访问的函数处。我们也还可以像其他大多数的vi命令一样在此命令之前用数字来做前缀,指明要执行的次数。我们还可以用这样的命令::tag function。这样我们就可以来到指定的函数处。
当我们用命令:tag时是将当前窗口中的内容由函数的内容所代替了。我们也可以打开一个新窗口来显示函数的内容。这时我们就要用到下面的命令::stag tag。这个命令是要打开一个新窗口来显示tag指定的函数内容。我们也可以用命令CTRL_W_]来打开一个新窗口显示以光标下的字符串为函数名的函数内容。我们也可以在这个命令前加下数字count做为前缀,这打开的窗口就是count这样的高度。
我想我们常会有这样的情况,那就是我们想要跳到一个函数处却记清他的名字究竟是什么?这是我们要怎么办呢?在vi中有一个很好的解决办法,那就是我们可以用:tag /name来找到你想要的内容。例如在我们上面所举过的例子中曾提到了函数write_line。但是现在我们记不得他的全名了,只是记得好像有一个line。这时我们如何来找到呢?我们可以用这样的命令来做::tag /line。这样vi就会将我们带到write_line定义的地方。我们还可以借助于一些表达式来精确的定位我们要去的地方。例子如我们似乎记得有一个函数是以read开头的,这时我们可以这样的来查找::tag /^read。这个是说read所要查找的内容是以read开头的。或者说我们不能十分清楚的记得一函数的名称是DoFile,do_file还是Do_File。这时我们也可以这样的来查找::tag /DoFile/|do_file/|Do_File。或者是我们可以写成这样的表达式::tag /[Dd|o_/=[Ff|ile。这样我们就可以找到我们想要的内容了。一般情况下我们用这样的命令来查找时并不能精确的得到我们想要的东西,而是得到许多匹配的选项。而我们可以用命令:tselect来列出所有这些合要求的内容。这个列表一般由这样的一些内容组成:
第一列的数字是这些标记(tag)的编号,第二列这些内容的优先级,他一般包含三个字母:F完全匹配,如果没有则是忽略的情况;S静态标记,如果没有,则是全局标记;C则是说是这个标在当前的文件中。在执行完这个命令后,:tselect会给我们一个机会,我们可以选择到标号为哪一个的内容处去,或者是选择离开。命令g]与命令:tselect相类似,只是他是以光标下的内容为查找内容的。命令:tjump的作用与:tselect命令相同,所不同的只是当执行的结果只有一项内容时,则自动的选中这个结果。命令gCTRL_]与此相同,只是他是当前光标下的内容为查找对象的。其他的一些相关的命令如下:
:count tnext 到下一个标记处
:count tprevious 到上一个标记处
:cout tNext 到上一个标记处
:cout trewind 到第一个标记处
:cout tlast 到最后一个标记处
命令:stselect与:tselect命令相同,所不同的只是前者将打开一个新窗口来显示执行的结果。与其类似的命令还有:stjump.
当我们在编写makefile文件时我们所需要的缩进是一个tab,而不是8个空格。这样的区别是很难在屏幕上看出来的。这时我们可以用这样的命令::set list,这样以后tab则显示为^I,同时在每一行的末尾显示$,这样我们就会很好的来区分这些细小的分别了,同时还有助我们来检查我们程序的正确性。当然我们也可以选择用其他的字符来显示,通过listchars选项我们可以做到这一点。如果我们设置了expandtab选项,那么我们输入一个tab时,vi实际上插入的空格。这对于我们编写makefile文件时是很不方便的。如果我们想真正的输入一个tab,而不是插入空格,这时我们可以输入CTRL_V<Tab>,这时的CTRL_V告诉vi不要忽略以后的字符。有时在一个makefile文件中包含许多的文件,我们可以对这些文件进行排序,具体的做法如下:
1 将光标放在文件列表的起始点
2 用命令标记这个位置:ma
3 到这个列表的底部
4 执行命令排序:!'a sort
我们也可以在可视模式下来排序:
1 移动到要排序的文本的顶部
2 进入可视化模式:V
3 移动到文本的底部
4 执行命令:!sort
vi编辑器还可以允许我们在vi中执行编译程序的make命令,其命令为:make,这时就会来编译程序,同时会显示出错误来。这时我们就可以移到到出错的地方来修正我们的错误,然后再重新编译,直到成功。如果我们的程序编译有错误,vi就会显示出错误的提示信息和错误的地方,同时vi会自动到第一个出现错误的地方。我们在修改完错误以后,可以用命令:cnext来到下一个出错误的地方继续我们的工作。命令:cprevious和命令:cNext可以回到上一个错误的地方。命令:clast可以到最后一个出错的地方,而命令:crewind可以到第一个出现错误的地方。而命令:cnfile可以到下一文件第一个出错的地方。如果我们此时忘记了出现在的错误是什么,我们可以用这样的命令来显示出错信息::cc,如果我们想看到一个错误的列表,我们可以用这样的命令来完成::clist。我们还可以用命令来显示一定范围内的错误。如:
:clist3,5 显示第三行到第五行的错误
:clsit,5 显示第一行到第五行的错误
:clsist5, 显示第五行到最后一行的错误
如果我们已经运行make命令并且生成我们自己的错误信息的文件,我们可以用这样的命令来告诉vi这些情况::cfile error-file。error-file是make或是编译输出的文件。如果我们没有error-file文件,那么我们可以使用errorfile这个选项在。退出错误的状态可以用命令::cquit.这些命令对于我们在使用一个集成的开发环境时会显得更有用一些.
errorfile选项会建立一个默认的文件,这个文件会被命令:clist和-q命令行选项所使用,但是这个文件并不会成为:make命令的输出文件。如果我们想要建立自己的默认错误文件可以使用下面的命令::set errorfile=error.list
:grep与:make相类似,他是执行外部的命令程序grep并显示输出。例如我们要在程序文件中查找变量ground_point我们可以使用下面的命令:
:grep -w ground_point *.c
-w 是告诉grep程序包仅查找单词ground_point,而不是任意匹配的结果。与前面的命令相类似,:cnext,:cprevious,:cc等命令可以在这个匹配的列表中进行移动,:crewind,:clast分别移到到列表中的第一个和最后一个。:cnfile到下一个文件是的第一个。
vi是一个强大的编辑器,他不仅可以用来处理我们平时的文本工作,他还可以用写程序文件。在vi中有许多命令可以方便的完成我们的程序处理工作。在用vi进行程序处理时,vi充分的显示出来了他的强大之处,他可以实现在语法加亮显示,实现自动缩进,实现括号匹配,还可以在程序中实现查找和跳转。
我们可以用这样的命令在vi中打开语法加亮显示的功能::syntax on。这样以后我们在输入的字符中,vi就会自动的识别出关键字,字符串以及其他的一些语法元素,并以不同的颜色来显示出来。这对于程序员来说是一个巨大的帮助。当然你可以自定义语法加亮显示的颜色。
一般情况下,vi的这种语法加亮显示的功能可以工作的很好,但是有时我们也遇到一些小小的麻烦。也许我们都遇到过背景是白色而字体是浅黄色的情况,在这样的情况下是非常难读的。vi编辑器有两种语法加亮的办法,一种是当背景为浅色时用,而另一种是当背景为深色时用的。当我们启动vi时,他会检测我们所使用的端是哪一种背景颜色,是浅色还是深色,然后再应用语法加亮的颜色方案。当然了,有的时候vi也是可以检测出错的。我们可以用这样的命令来知道我们的背景的情况::set background?。这样vi就会在底端给出我们具体的显示。如果vi检测的并不正确,我们可以用这样的命令来为他赋下正确的值::set background=light或是:set background=dark.当然我们要清楚的知道,这样的操作要在打开语法加亮的命令之前来执行。vi实现语法加亮显示的功能是通文件的扩展名来文件的类型从而实现功能的。但是有时我们在编辑一个C程序文件时并没有使用传统的扩展名,那么我们如何来告诉vi我们正在编辑的文件的类型呢?解决的办法就是用filetype这个选项。例如我们要告诉vi我们正在编辑的是一个C程序文件我们可以这样的来做::set filetype=c。这样以后vi就会知道我们正在编辑的是一个C程序文件并正确的加亮语法显示。
除了语法加亮显示的功能以外,vi还提供了缩进的功能。命令<<将使当前行向左移动一个移位宽度,而命令>>将使当前向右移动一个移位宽度。这个所谓的是移位宽度具体是多少呢?在vi中默认的是八个空格的宽度。然而平时的经验可以表明当缩进是四个空格宽度时最有利于程序的阅读。那么我们如何将这个移动宽度定为四个空格的长度呢?这时我们就可以用下面的命令来做到::set shiftwidth=4.而这时的命令仅是对当前的一行有效,我们也可以像其他的vi命令一样的在命令前用数字做为前缀还指定命令作用的范围。如5<<就将缩进五行。
在vi中还有许多自动进行缩进的选项,一般有以下的几种:C缩进(cindent):这是C语言的缩进形式,采用这样的缩进方式的程序语言有:C,C++,Java等。当采用这种缩进格式时,vi就会自动的采用标准的C语言形式。还有一种形式是smartindent:在这种缩进模式中,每一行都和前一行有相同的缩进量,同时这种缩进形式能正确的识别出花括号,当遇到右花括号(}),则取消了缩进形式。另外的一种缩进形式便是所谓的自动缩进(autoindent):在这种缩进形式中,新增加的行和前一行有相同的缩进形式。vi编辑器可以很好的识别出C,C++,Java以及其他的一些结构化程序设计语言,并且能用C语言的缩进格式来很好的处理程序的缩进结构。我们可以用这样的命令来打开C语言形式的缩进结构::set cindent.这样以后vi编辑器就会用C语言的缩进形式来正确的处理程序文件。一般而言C缩进结构可以满中绝大多数人的需要,当然了不同的人有不同的编程风格,如果你不喜欢这样的缩进结构,你可以自己定义自己的缩进形式。也许我们做程序设计的人并不想每一次想要编辑C程序文件时都要用命令:set cindent来打开C缩进形式,为了解决这样的问题,我们可以改写vi的配置文件来使vi能够自动的完成这样的工作。我们在.vimrc(UNIX/LINUX)或是_vimrc(WINDOWS)中加入下面的几句:
:filetype on
:autocmd FileType c,cpp:set cindent
第一行是打开vi文件类型识别功能,第二行是如果所识别的文件类型为C或是C++文件那么便打C缩进形式。
在vi中除了C缩进形式以外我们还有smartindent缩进形式可以来用。在smartindent这种缩进模式中能够正确的识别出{和}。同时增加了识C语言关键字的功能。如果一行是以#开头的,那么这种格式将会被特殊对待而不采用缩进格式。这种缩进格式不如cindent,但是却强于autoindent。另外的一种缩进形式便函是autoindent。在其他的一些结构化程序设计语言如Pascal,Per或是Python语言中,我们所希望的是新的一行能和上一行有相同的缩进形式,这时我们便可以打开autoindent缩进形式,:set autoindent。这样就可以很好的来满足我们的要求了。
vi不仅有这些功能,而且还有更多的功能来快速的处理程序文件。其中一个便是可以快速的在文件中定位变量及宏定义等。其中一些常用到的命令有:
[CTRL_I/]CTRL_I 在本文件中以及在由#include命令包含进来的文件中进行查找光标下面的文字
gd/gD 查找变量的定义
[CTRL_D/]CTRL_D 跳到宏定义的地方
[d/]d/[D/]D 显示宏定义
这几个命令中有一些需要说明的地方:[CTRL_I/]CTRL_I命令用来查找光标下面的文字,查找的范围不仅是在本文件中进行查找,而且还要查找由#include所包含进来的文件中进条查找。变显查找的命令gd和gD有时并不能完美的完我们想要做工作。这是因为vi在理解C和C++的语法方面有一些小的限制。但是大多数的情况下这几个命令还是可以很好的来完成我们工作的。[d/命令可以显示以当前光标下的内容为为名字的第一个宏定义,]d也有着同样的作用,所不同的只是后者是从当前光标处查找下一个宏定义。当然这两个命令也可以在由#inlcude所包含进来的文件中进行查找。[D/]D命令可以用来列出文件中的宏定义。这两个命令有着同样的作用,所不同的只是前者是列出当前光标以后的宏定义,而后者是从当前光标处的下一个宏开始列出文件中的宏义。(注:此处由此书看来似乎是这样的,但是自己亲自来做时并没有出现这样效果)
我们在编写程序时常常要做的一件事便是括号的匹配,我们在vi中可以用%命令来确定匹配的括号。例如我们将光标定位在其中一个括号处,然后执行命令%,光标就会定位在与其相匹配的括号处。有时我们在编写了一段程序后却想着要将这一段程序进行缩进,这时我们可以用这样的命令来做到:将光标定位在第一个或是最后一个包含着所要缩进的程序块的括号处,然后执行下面的命令:>%,这样就可以将这个程序右缩进一段距离。但是我们发现执行这个命令后花括号也一样的进行了缩进,有时我们这并不是我们想要的,我们想要的是仅括号内的文本进行缩进。这时我们又应如何来做呢?这时我们可以用这样的命令:>i{.这个命令是说仅括号内的文本进行缩进。我们还可以用可视化的模式来缩进文本块,具体的做法是这样的:
1 将光标定位在左括号或是右括号处。
2 进入可视化模式:v
3 选中括号内的文本:i}
4 缩进:>
当我们用vi来编辑我们的程序文件时,他提供给了我们定位程序函数的功能。这对于我们想要理解一个程序是非常有帮助的。vi所定位的函数被包含在一个由ctags的程序建立的文件当中。要建立一个名为tags的这样的文件,我们可以输入这样的命令来完成:$ctags *.c
这样以后当我们在vi中来编辑我们的程序文件时我们就可以任意的跳转到我们想要去的函数处,当然这得要求我们想要到函数存在。我们可以用这样的命令来到达我们要到的地方:
:tag function
这个命令甚至可以查找得到在其他文件中的函数。
在完成函数跳转的功能命令中还有几个强大而有趣的命令。CTRL_]命令跳转到以光标下的字符串为函数名的函数处。这样就大大的方便了我们在C程序查找函数的需要。例如你正在看一段名为write_block的函数程序,而在这个程序中调用了函数write_line。这个被调用的函数具体是来做什么的呢?我们可以将光标定位在这个函数上,然用执行命令CTRL_]。这样vi就会马上跳转到这个函数的定义处。我们就可以清楚的看到这个函数的实现的方法。而在这个函数中又调用了函数write_char,这时我们可以用同样的方法来查看这个函数的定义过程。命令:tags可以列出我们已经访问过的函数名称。但是我们在走了一段路以后想回去又该怎么来做呢?命令CTRL_T可以使我们回到上一个访问的函数处。我们为了在函数跳转的命令,我们要用命令ctags建立这文件来存放在C程序中所出现在的函数名,这时vi要建立一个栈来存入函数名。我们用命令CTRL_T回到上一个访问的函数处,这时我们还可以用命令:tag来向前走一步,即回到前一个访问的函数处。我们也还可以像其他大多数的vi命令一样在此命令之前用数字来做前缀,指明要执行的次数。我们还可以用这样的命令::tag function。这样我们就可以来到指定的函数处。
当我们用命令:tag时是将当前窗口中的内容由函数的内容所代替了。我们也可以打开一个新窗口来显示函数的内容。这时我们就要用到下面的命令::stag tag。这个命令是要打开一个新窗口来显示tag指定的函数内容。我们也可以用命令CTRL_W_]来打开一个新窗口显示以光标下的字符串为函数名的函数内容。我们也可以在这个命令前加下数字count做为前缀,这打开的窗口就是count这样的高度。
我想我们常会有这样的情况,那就是我们想要跳到一个函数处却记清他的名字究竟是什么?这是我们要怎么办呢?在vi中有一个很好的解决办法,那就是我们可以用:tag /name来找到你想要的内容。例如在我们上面所举过的例子中曾提到了函数write_line。但是现在我们记不得他的全名了,只是记得好像有一个line。这时我们如何来找到呢?我们可以用这样的命令来做::tag /line。这样vi就会将我们带到write_line定义的地方。我们还可以借助于一些表达式来精确的定位我们要去的地方。例子如我们似乎记得有一个函数是以read开头的,这时我们可以这样的来查找::tag /^read。这个是说read所要查找的内容是以read开头的。或者说我们不能十分清楚的记得一函数的名称是DoFile,do_file还是Do_File。这时我们也可以这样的来查找::tag /DoFile/|do_file/|Do_File。或者是我们可以写成这样的表达式::tag /[Dd|o_/=[Ff|ile。这样我们就可以找到我们想要的内容了。一般情况下我们用这样的命令来查找时并不能精确的得到我们想要的东西,而是得到许多匹配的选项。而我们可以用命令:tselect来列出所有这些合要求的内容。这个列表一般由这样的一些内容组成:
第一列的数字是这些标记(tag)的编号,第二列这些内容的优先级,他一般包含三个字母:F完全匹配,如果没有则是忽略的情况;S静态标记,如果没有,则是全局标记;C则是说是这个标在当前的文件中。在执行完这个命令后,:tselect会给我们一个机会,我们可以选择到标号为哪一个的内容处去,或者是选择离开。命令g]与命令:tselect相类似,只是他是以光标下的内容为查找内容的。命令:tjump的作用与:tselect命令相同,所不同的只是当执行的结果只有一项内容时,则自动的选中这个结果。命令gCTRL_]与此相同,只是他是当前光标下的内容为查找对象的。其他的一些相关的命令如下:
:count tnext 到下一个标记处
:count tprevious 到上一个标记处
:cout tNext 到上一个标记处
:cout trewind 到第一个标记处
:cout tlast 到最后一个标记处
命令:stselect与:tselect命令相同,所不同的只是前者将打开一个新窗口来显示执行的结果。与其类似的命令还有:stjump.
当我们在编写makefile文件时我们所需要的缩进是一个tab,而不是8个空格。这样的区别是很难在屏幕上看出来的。这时我们可以用这样的命令::set list,这样以后tab则显示为^I,同时在每一行的末尾显示$,这样我们就会很好的来区分这些细小的分别了,同时还有助我们来检查我们程序的正确性。当然我们也可以选择用其他的字符来显示,通过listchars选项我们可以做到这一点。如果我们设置了expandtab选项,那么我们输入一个tab时,vi实际上插入的空格。这对于我们编写makefile文件时是很不方便的。如果我们想真正的输入一个tab,而不是插入空格,这时我们可以输入CTRL_V<Tab>,这时的CTRL_V告诉vi不要忽略以后的字符。有时在一个makefile文件中包含许多的文件,我们可以对这些文件进行排序,具体的做法如下:
1 将光标放在文件列表的起始点
2 用命令标记这个位置:ma
3 到这个列表的底部
4 执行命令排序:!'a sort
我们也可以在可视模式下来排序:
1 移动到要排序的文本的顶部
2 进入可视化模式:V
3 移动到文本的底部
4 执行命令:!sort
vi编辑器还可以允许我们在vi中执行编译程序的make命令,其命令为:make,这时就会来编译程序,同时会显示出错误来。这时我们就可以移到到出错的地方来修正我们的错误,然后再重新编译,直到成功。如果我们的程序编译有错误,vi就会显示出错误的提示信息和错误的地方,同时vi会自动到第一个出现错误的地方。我们在修改完错误以后,可以用命令:cnext来到下一个出错误的地方继续我们的工作。命令:cprevious和命令:cNext可以回到上一个错误的地方。命令:clast可以到最后一个出错的地方,而命令:crewind可以到第一个出现错误的地方。而命令:cnfile可以到下一文件第一个出错的地方。如果我们此时忘记了出现在的错误是什么,我们可以用这样的命令来显示出错信息::cc,如果我们想看到一个错误的列表,我们可以用这样的命令来完成::clist。我们还可以用命令来显示一定范围内的错误。如:
:clist3,5 显示第三行到第五行的错误
:clsit,5 显示第一行到第五行的错误
:clsist5, 显示第五行到最后一行的错误
如果我们已经运行make命令并且生成我们自己的错误信息的文件,我们可以用这样的命令来告诉vi这些情况::cfile error-file。error-file是make或是编译输出的文件。如果我们没有error-file文件,那么我们可以使用errorfile这个选项在。退出错误的状态可以用命令::cquit.这些命令对于我们在使用一个集成的开发环境时会显得更有用一些.
errorfile选项会建立一个默认的文件,这个文件会被命令:clist和-q命令行选项所使用,但是这个文件并不会成为:make命令的输出文件。如果我们想要建立自己的默认错误文件可以使用下面的命令::set errorfile=error.list
:grep与:make相类似,他是执行外部的命令程序grep并显示输出。例如我们要在程序文件中查找变量ground_point我们可以使用下面的命令:
:grep -w ground_point *.c
-w 是告诉grep程序包仅查找单词ground_point,而不是任意匹配的结果。与前面的命令相类似,:cnext,:cprevious,:cc等命令可以在这个匹配的列表中进行移动,:crewind,:clast分别移到到列表中的第一个和最后一个。:cnfile到下一个文件是的第一个。