本章主要学习vi编辑器中的@功能,ex脚本以及ctags工具的使用。
@功能:
命名缓冲区提供了另一种方法来创建“宏”,即可以将复杂的命令序列保存到某个命名缓冲区中,再通过@命令执行缓冲区中的内容。举个例子,首先在插入模式中输入如下一行:
然后将该行内容删除并将其保存到" a "这个命名缓冲区中,之后便可以将光标移动到某个单词的首部,执行" @a ",就可以将缓冲区中的内容作为命令进行执行。在这个例子中就是将该单词修改为function,同时仍然处于命令模式。由于@命令会被解释为vi命令,所以不管缓冲区中存储的是什么命令,都可以使用点号(.)来重复这个命令。" @@ "会重复上一个@操作。
使用ex脚本:
可以将ex命令存储在" .exrc "文件中,这样在打开vi编辑器时,这些ex命令就会自动执行。或者也可以将ex命令存储在其他的文件中,然后在打开vi编辑器时,通过 " :so scriptname " 读入该脚本文件,从而执行该脚本。举个例子," substitute.ex "脚本有如下内容:
在用vi编辑器打开某个文件后,执行如下命令,就可以执行该ex脚本:
也可以在UNIX命令行中直接将脚本作用于文件上,这里需要用到UNIX的重定向功能: " ex - filename < scriptname ",这样便可以将scriptname脚本作用于filename文件。例如:
当然我们也可以写一个shell脚本,里面包含了对ex脚本的调用,这可以让我们对文件做更灵活的修改。例如,在一个shell脚本中调用 " substitute.ex "脚本:
here document:
在shell script中,运算符<<表示将以下的行到某个字符串为止的内容作为命令的输入,这也称为here document。如下图所示,通过这种语法,可以将ex命令直接写在shell 脚本中:
这里的" end_of_script "字符串可以为任意字符串,只要该字符串不会出现在输入文本的其他地方,从而能够辨别here document结束位置即可。需要说明的是,相比于here document,将编辑命令写在shell script以外的文件更具有灵活性。
ex脚本中的注释:在ex脚本中,任何双引号后的文本在执行时都会被忽略,因此双引号可以作为注释的开头。
除了ex编辑器,UNIX提供了比ex更具有威力的编辑器:sed流编辑器与awk数据操纵语言,这些工具提供了更加强大的编辑功能。当然这是以后的学习方向了,目前还是扎扎实实地学习好vi编辑器。
编辑程序源代码:
vi编辑器为编程者提供了非常多强大的功能,包括缩排控制,搜索过程的开始与结束,ctags的使用等。
缩排控制:
如果需要使用vi中的自动缩排,需要设置如下选项:" :set autoindent "。这样当使用空格或tab键做缩排时,后面的行会自动以相同的距离做缩排。而且当你在自动缩排的情况下输入代码时,在一行的开头按下" CTRL+T "会使当前行进入下一层缩排层级,而按下" CTRL+D "则可回到上一层缩排层级。需要注意的是," CTRL+T "和" CTRL+D "是在插入模式中使用的。
" << "与" >> "命令也可以用来对代码进行缩排。" >> "默认会将代码往右移动8个空格,而" << "默认将代码往左移动8个空格。默认移动的空格数可以通过shiftwidth选项进行改变,例如通过" :set shitwidth=4 "将移动的空格数设置为4。而且可以同时移动多行,只需要在"<< "或" >> "前面加上数值即可。
当我们对代码进行缩排时,由于tab键,空格键在屏幕上都是显示空白,而且也不容易看出行结尾是否有空格,此时可以通过list选项来改变显示的状态,这个选项之前的文章已经讲过了。或者通过" :l "命令也能达到同样的效果。
一个特殊的搜索命令:
" ( ,[,{,< "都可以称为开括号,当光标位于任何一种开括号上时,按下" % "键,可以将光标移动到成对的闭括号上。同样地,当光标位于某一个闭括号上时,按下" % "键可以回到相应的开括号上。当光标不是位于括号字符上时,按下" % "键后,vi会在当前这一行寻找第一个开或闭括号,再将光标移动到该括号相对应的括号上。
使用标签(tag):
UNIX上的ctags命令可以产生一个信息文件,vi编辑器可以用该文件判断各个源文件中分别定义了哪些函数。默认情况下,这个信息文件的文件名为tags。将UNIX中的" ctags "命令和vi中的" :tag "命令结合起来使用,可以将光标快速移动到某个标签上。首先在UNIX命令行上用" ctags "命令为程序源文件创建相应的tags文件,然后在vi编辑器中用" :tag name "命令将光标移动到name函数所在的行。
在命令模式下,可以将光标移到要查找的标识符上,再输入" CTRL+[ ",也能够将光标移动到标识符所在的行。需要注意,vi查找的是以当前光标所在位置为起点的单词,而不是包含该光标的那个完整单词。而且如果查找的标签位于新的文件中,但是当前文件还没有保存,vi不会让你读入新的文件。此时必须先用" :w "命令保存当前文件,或者也可以通过 ":tag! name"来强制让vi放弃编辑结果。
关于ctags命令后续文章还将继续学习,这里只是学习ctags的简单用法。
本章vi命令总结:
" @ "," @@ "," CTRL + T "," CTRL + D "," << "," >> "," :l "," % "," :tag name "," CTRL + [ "," :tag! name "。