vi编辑器命令,vi编辑器如何运行
Vi编辑器学会使用(七)
Vi是一个强大的编辑器。它不仅可以用来处理我们平时的文字工作,还可以用来编写程序文件。vi中有很多命令可以方便的完成我们的程序处理。在使用vi进行程序处理时,vi充分展示了自己的实力。他可以实现语法中的高亮,自动缩进,括号匹配,程序中的搜索跳转。
我们可以用这样的命令:syntax on打开vi中的语法高亮功能。这样,vi会自动识别输入字符中的关键词、字符串等语法元素,并用不同的颜色显示出来。这对程序员来说是一个很大的帮助。当然,您可以自定义语法来突出显示颜色。
总的来说,vi的这种语法高亮功能工作得很好,但有时我们会遇到一些小麻烦。可能我们都遇到过背景是白色,字体是淡黄色的情况,非常难读。Vi编辑器有两种方式突出语法,一种是背景较亮的时候,一种是背景较暗的时候。当我们启动vi时,他会检测我们用的是哪种背景色,是亮还是暗,然后应用语法高亮的配色方案。当然,有时候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缩进:这是C语言的缩进形式,采用这种缩进方式的编程语言有:C、C、Java等。当采用这种缩进格式时,vi会自动采用标准的C语言形式。还有一个smartindent:在这种缩进模式下,每一行都和前一行缩进一样,这种缩进模式可以正确识别花括号。当遇到右花括号(})时,缩进模式被取消。另一种缩进形式是所谓的自动缩进:在这种形式的缩进中,新添加的行与前一行具有相同的缩进形式。vi编辑器可以很好的识别C、C、Java等结构化编程语言,可以用C语言的缩进格式很好的处理程序的缩进结构。我们可以用这样的命令打开C语言中的缩进结构:set cindent。这样,vi编辑器就可以使用C语言中的缩进形式来正确处理以后的程序文件。一般来说,C缩进结构可以满足大多数人的需求。当然,不同的人有不同的编程风格。如果不喜欢这种缩进结构,可以自己定义缩进形式。可能我们程序员不想用这个命令:设置cindent在每次要编辑C程序文件的时候打开C缩进。为了解决这个问题,我们可以重写vi的配置文件,这样vi就可以自动完成这个任务。我们把下面的句子加到。vimrc(UNIX/LINUX)或_vimrc(WINDOWS):
:文件类型打开
:autocmd文件类型c,CPP:set c ident
第一行是打开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跳转到定义宏的地方。
显示宏定义
这些命令中有几点需要说明:【Ctrl _ I/】Ctrl _ I命令用于查找光标下方的文字。搜索的范围不仅仅是这个文件,还包括#include包含的文件。显式搜索命令gd和gD有时候并不能完美的完成我们想要做的工作。这是因为vi在理解C和C语法上有一些小的局限性。但是在大多数情况下,这些命令仍然可以很好地完成我们的工作。【d/command可以显示以当前光标下的内容为名称的第一个宏定义,】d也有同样的功能,只是后者从当前光标开始寻找下一个宏定义。当然,这两个命令也可以在#inlcude包含的文件中进行搜索。[D/]D命令可用于列出文件中的宏定义。这两个命令具有相同的功能,只是前者在当前光标之后列出宏定义,而后者从当前光标处的下一个宏开始列出文件中的宏含义。(注:从这本书上看这里好像是这样,但是我自己做的时候没有这样的效果)
我们写程序的时候经常做的一件事就是括号的匹配。在vi中,我们可以使用%命令来确定匹配的括号。例如,如果我们将光标定位在其中一个括号处,然后执行%命令,光标将定位在与之匹配的括号处。有时候,写完一个程序,我们想缩进它。这时我们可以通过这样的命令来做到:将光标定位在包含要缩进的程序块的第一个或最后一个括号处,然后执行下面的命令:%,使程序向右缩进一定的距离。然而,我们发现在执行这个命令后,花括号以同样的方式缩进。有时候,这不是我们想要的。我们想要的是只缩进括号中的文本。那我们该怎么办?这时候我们可以用这个命令:i{。这个命令意味着只有括号中的文本缩进。我们也可以在可视模式下缩进文本块。具体方法如下:
1将光标定位在左括号或右括号处。
2进入可视化模式:V
3检查括号中的文字:i}
4缩进:
当我们使用vi编辑我们的程序文件时,他为我们提供了定位程序函数的功能。这对我们理解一个程序很有帮助。vi定位的函数包含在ctags程序创建的文件中。要创建这样一个名为tags的文件,我们可以通过输入以下命令来完成它:$ctags *。c
这样,以后我们在vi中编辑自己的程序文件时,就可以跳转到我们想要的函数,这当然要求我们希望函数存在。我们可以使用这样的命令来到达我们要去的地方:
:标签功能
这个命令甚至可以在其他文件中找到函数。
函数命令中有几个强大而有趣的命令来完成函数跳转。CTRL_]命令跳转到以光标下的字符串作为函数名的函数。这大大方便了我们在C程序中寻找函数的需要。比如你正在看一个函数程序叫write_block,函数write_line在这个程序中被调用。这个被调用的函数到底是做什么的?我们可以把光标放在这个函数上,执行命令CTRL_]。这将立即跳转到该函数的定义。我们可以清楚地看到如何实现这个功能。在这个函数中,再次调用了write_char函数,所以我们可以用同样的方法来检查这个函数的定义过程。命令:标签可以列出我们访问过的函数的名字。但是走了很长一段路想回去怎么办?命令CTRL_T可以将我们带回上一次访问的函数。对于函数跳转的命令,我们需要使用命令ctags来创建这个文件来存储C程序中出现的函数名。这时vi需要建立一个栈来存储函数名。我们使用命令CTRL_T返回到最后访问的函数,然后我们也可以使用命令:tag前进一步,即返回到最后访问的函数。像大多数其他vi命令一样,我们也可以在这个命令前面加上一个数字来表示要执行的次数。我们也可以使用command: tag函数。所以我们可以得到指定的函数。
当我们使用command: tag时,当前窗口的内容被函数的内容所替换。我们也可以打开一个新窗口来显示函数的内容。此时,我们将使用以下命令:stag标记。该命令打开一个新窗口,显示tag指定的函数内容。我们也可以使用命令CTRL_W_]打开一个新窗口,以光标下的字符串作为函数名来显示函数内容。我们也可以在这个命令前面加上count这个数字,打开的窗口就是count的高度。
我想我们经常会遇到这样的情况,我们想跳转到一个函数,但是却不记得它的名字是什么。我们该怎么办?vi中有一个很好的解决方法,就是我们可以使用:tag /name来找到你想要的内容。例如,上面的示例中提到了函数write_line。但是现在我们记不清他的全名了,只知道好像有一行。这个时候怎么才能找到呢?我们可以用这样的命令:tag /line。这会把我们带到write_line定义的地方。我们也可以用一些表达来准确定位我们要去的地方。例如,如果我们似乎记得一个函数是以read开头的,我们可以这样查找它:标记/^read.这意味着read要寻找的东西是从read开始的。或者我们记不清楚一个函数的名字是DoFile,do_file还是Do_File。这个时候我们也可以这样查:tag /DoFile/do_file/Do_File。或者我们可以写这个表达式:tag /[Ddo_/=[Ffile。这样我们就能找到我们想要的。一般来说,当我们使用这样的命令进行搜索时,我们并不能完全得到我们想要的,而是许多匹配的选项。并且我们可以使用命令:tselect来列出所有这些满意的内容。该列表通常包含如下内容:
第一列的数字就是这些标签的编号,第二列这些内容的优先级一般包含三个字母:F完全匹配,如果不匹配则忽略;s标签,如果不是,就是全局标签;c表示这在当前文件中被标记。执行这个命令后,tselect会给我们一个机会,我们可以选择哪些内容被标记,或者选择离开。G]类似于命令:tselect,只是它查找光标下的内容。命令:tjump的功能与命令:tselect的功能相同,只是当执行的结果只有一个内容时,会自动选择结果。命令gCTRL_]与此相同,只是当前光标下的内容是搜索对象。其他一些相关命令如下:
:数到下一个标记
:计数到前一个标记
:从下一个标记开始
:cout trewind到第一个标记
:最后一个标记
命令:stselect与:tselect相同,只是前者会打开一个新窗口显示执行结果。类似的命令有:stjump。
当我们编写makefile文件时,我们需要的缩进是一个制表符,而不是八个空格。这种差异在屏幕上很难看出来。这时候我们可以使用command: set list,这样以后tab就显示为I,每行的末尾都会显示$这样就可以很好的区分这些小的区别,同时也可以帮助我们检查自己程序的正确性。当然,我们也可以选择使用其他字符来显示它。我们可以通过listchars选项做到这一点。如果我们设置expandtab选项,那么当我们输入一个制表符时,vi实际插入的空格。这对于我们写makefile文件来说非常不方便。如果我们想真正的输入一个制表符而不是插入一个空格,那么我们可以输入CTRL_V Tab,然后CTRL_V告诉vi不要忽略未来的字符。有时候一个makefile包含很多文件,我们可以对这些文件进行排序。具体方法如下:
1将光标放在文件列表的起点。
用命令ma标记这个位置
3到这个列表的底部
4执行命令sort:一种
我们也可以在视觉模式下进行排序:
1移动到要排序的文本的顶部。
2进入可视化模式:V
3移动到文本的底部
4执行命令:分类
vi的编辑器也可以让我们在vi中执行编译器的make命令,它的命令是:make。然后编译器会编译程序,会显示错误。这时候我们就可以移动到错误的地方改正错误,然后重新编译,直到成功。如果我们的程序编译有错误,vi会显示错误信息和错误的地方,vi会自动转到第一个错误的地方。在我们纠正了错误之后,我们可以使用命令:cnext转到下一个发生错误的地方并继续我们的工作。Command: cprevious和command: cNext可以回到上一个错误的地方。Command: clast可以转到最后一个错误,而command: crewind可以转到第一个错误。而命令:cnfile可以转到下一个文件中的第一个错误。如果我们此时忘记了错误是什么,我们可以使用这样的命令来显示错误消息:cc。如果我们想要查看错误列表,我们可以使用这样的命令:clist。我们还可以使用命令来显示一定范围内的错误。比如:
:clist3,5显示第三行到第五行的错误。
:clsit,5显示第一行到第五行的错误。
:clsist5,显示从第五行到最后一行的错误。
如果我们已经运行了make命令并生成了我们自己的错误消息文件,我们可以用这样的命令:cfile error-file告诉vi这些事情。错误-文件是生成或编译的输出文件。如果我们没有错误文件,那么我们可以使用。可以使用命令:cquit退出错误状态。当我们使用集成开发环境时,这些命令会更有用。
errorfile选项将创建一个默认文件,该文件将由command: clist和-q命令行选项使用,但该文件不会成为:make命令的输出文件。如果我们想要构建自己的默认错误文件,我们可以使用以下命令:set errorfile=error.list
:grep类似于:make,因为它执行外部命令程序grep并显示输出。例如,如果我们想在程序文件中找到变量ground_point,我们可以使用下面的命令:
:grep -w地面点*。c
-w是告诉grep包只查找单词ground_point,而不查找任何匹配的结果。与前面的命令类似,诸如:cnext,cprevious,cc这样的命令可以在这个匹配列表中移动,而:c rewind,class可以分别移动到列表的第一个和最后一个。cnfile到下一个文件是第一个。