当初次使用vi编辑器时(无论是第一次还是作为普通用户),大多数人倾向于掌握核心命令集,使他们能够执行最经常使用的功能:导航或保存文件; 插入,更新,删除或搜索数据; 或退出而不保存更改。
但是,vi编辑器非常强大,并且具有丰富的功能。 即使使用了很多年,您仍然可以发现您从未意识到的新命令。 本文介绍的命令是鲜为人知的命令,但是它们可以通过简化您可能使用的现有方法或允许您执行您从未意识到可以用vi做的事情来帮助您更智能地工作。
在我们开始之前,仅回顾一下vi的两种模式:命令和插入。 命令模式允许用户执行命令来修改文本,浏览文件或以某种方式控制vi会话。 插入模式会将您键入的任何内容放入vi会话中的当前文件。 启动vi时,将以命令模式启动。 进入插入模式后,您可以通过按Escape键切换回命令模式。 在命令模式下按Escape键将使您进入命令模式。 本文中介绍的所有命令都应从命令模式下执行。
vi编辑器具有许多选项,这些选项确定编辑会话的外观。 要在vi中更改任何会话设置,请使用:set命令。 要显示选项和设置的列表,请使用:set all命令。
您可以设置的选项之一是number ,它可以打开和关闭行编号(请参见清单1 )。
该命令指示vi在您当前正在编辑的文件中的每个记录上显示行号。 将vi置于命令模式后,可以输入:set number并按Enter打开行号(请参见清单2 )。
您可以使用:set nonumber命令关闭行号。 您也可以使用此命令和:set number命令的简写形式,即:set nu和:set nonu 。
当需要快速计算要使用vi函数处理的行数时,显示行号特别有用。 当行数很长并且可能跨越多个屏幕时,或者您知道要处理的行数范围,但是需要找到将在适当的vi命令中使用的开始和结束行号时,尤其如此。
如果要在每次进入vi会话时显示行号,请将行set number添加到主目录中的.exrc文件中。
使用某些编程语言编写代码时,缩进是样式的重要组成部分,可确保代码更具可读性。 您可以将vi编辑器设置为在必要时自动缩进以遵循特定于语言的样式。 您可以使用autoindent打开或关闭自动缩进(请参见清单3 )。
从这一点开始,如果您在一行中使用前导空格或制表符,则随后的新行将缩进到同一位置。 在命令模式下,在vi下,键入:set autoindent ,然后按Enter打开自动缩进。 通过设置shiftwidth设置缩进级别。 例如,要将每个缩进设置为四个空格,请使用:set shiftwidth=4 (请参见清单4 )。
在命令模式下,您可以使用>>命令将缩进级别添加到现有行中,或使用<<命令来删除级别。 在这些命令前添加一个整数,以在多行之间添加或删除缩进级别。 例如,将光标放在清单4中第6行的开头,并进入命令模式后,键入5>>将缩进级别添加到接下来的5行中。 清单5显示了结果。
您可以使用:set noautoindent命令关闭自动缩进。 也可以使用它的简写版本和autoindent命令,即:set ai和:set noai 。 您也可以使用:set ai sw=4在一个命令中打开缩进并设置缩进级别。
如果要启用自动缩进,并且每次启动vi会话时都将缩进级别设置为四个空格,请将行set ai sw=4到主目录中的.exrc文件中。
如您所料,UNIX®中搜索的模式匹配区分大小写。 但是,如果您希望vi忽略大小写,则可以使用:set ignorecase命令。 使用:set noignorecase重新打开区分大小写。 您也可以使用简写版本( :set ic和:set noic )。
如果您想在每次进入vi会话时都忽略对搜索的区分大小写,则可以将行set ignorecase添加到主目录中的.exrc文件中。
您可以使用/命令在vi中搜索字符串,并指定模式以文字字符串或正则表达式进行匹配。 例如,要在文件中搜索单词echo ,请进入命令模式,键入/echo ,然后按Enter。 该命令将在清单6所示的文件中的第3行找到第一个单词。
您可以使用简单的正则表达式来指定要查找包含一个单词后接另一个单词的行。 例如,要查找包含字符串echo的第一行,然后是零个或多个字符,然后是字符串file ,则可以使用/echo.*file 。 在清单6所示的文件中,此命令将在第6行找到第一个单词。
但是,此命令将仅在两个字符串都位于同一行的情况下找到匹配项。 如果要搜索模式或字符串的第一个匹配项,而不管模式或字符串是否在同一行上,那么可以通过指定两个搜索命令并用分号( ;来进行复合搜索; )。 例如,要搜索在字符串{file}+1出现的字符串echo的第一个匹配项,可以使用/{file}+1/;/echo/ 。 在清单6所示的文件中,此命令将在第10行找到第一个单词。
当您在代码中搜索是否存在紧跟另一个命令的命令时,复合搜索特别有用,例如,在设置了特定变量之后调用函数的情况。
在文件中寻找要替换的模式时,可以指示vi将与之匹配的任何模式保存到缓冲区中,然后可以使用缓冲区参考号以替代方式重新播放。 您可以通过将模式包含在\(和\)中来完成此操作,该模式指示vi将模式保存到带编号的缓冲区(1到9)中。 然后,您可以使用缓冲区引用\1到\9替代引用这些缓冲区。
例如,要在清单7中的文件中搜索以单词Martin开头的行,并为每次出现添加前缀Mr和后缀Wicks的情况出现,请进入命令模式,输入vi命令:%s/^\(Martin\)/Mr \1 Wicks/g ,然后按Enter。
以下是该命令的各个组成部分:
:%s指示vi执行替换。 / -模式分离器。 ^\(Martin\) -查找以字符串Martin开头的行,并将该字符串保存在缓冲区1中。 / -模式分离器。 Mr \1 Wicks用字符串Mr替换字符串,然后用缓冲区1的内容替换字符串Wicks 。 / -模式分离器。 g全局更改(即,更改匹配的每一行中的每个匹配项)。您可以在搜索和替换字符串中使用缓冲区引用。
产生的更改如清单8所示。
您可以通过按M键和另一个表示书签引用的字母字符来告诉vi将书签放置在文件中的某个点。 因此,您最多有26个名为a到z的书签。 要返回上一个书签,请按后退标记( ` ),然后按书签参考字母字符。
例如,按MA键后,您将当前光标位置保存到名为a的书签中。 每当您想在编辑会话中稍后返回到该光标位置时,只需按`A键。 要在当前书签和上一个书签之间切换,可以使用双回勾( `` )命令序列。
vi编辑器最有用的“搜索/替换”功能之一是能够找到与模式匹配的字符串,对其进行更新,然后针对下一次出现重复相同的搜索,并有选择地针对该字符串重复更新,就像“查找下一个” /替换在Microsoft®Word中找到的功能。
您可能已经知道,可以通过输入命令模式,键入/ search_pattern (其中search_pattern是字符串或正则表达式),然后按Enter来在vi中搜索字符串模式。 这样做可以使您首次出现与指定模式匹配的字符串。 在这里,您可以对所定位的文本执行所需的任何操作。 例如,在按C和W键后再输入更多文本,会将找到的字符串更改为另一个单词。
要快速找到下一个匹配模式,请按N键。 找到下一个匹配项时,可以选择使用句点键( . )在此位置重复上一次文本操作,例如上一个示例中使用的更改字( cw )函数。 然后,您可以继续查找其他匹配项( n ),并可以选择使用这些键重复执行文本操作( . ),其方式与在Word中使用“查找下一个”和“替换”功能非常相似。
您可以使用波浪号( ~ )在光标下方切换字母字符的大小写。 这样做会从小写变为大写,反之亦然。 按住键将滚动显示该行中的每个字符,翻转编辑器遇到的任何字母字符的大小写。 您可以在波浪号之前输入数字字符,以表示要更改多少个字母字符。
您可能知道,您可以通过输入:! command在vi中的Shell中执行命令:! command :! command ,其中command是要执行的UNIX命令(例如, :!pwd以显示您的编辑会话所在的当前工作目录),然后按Enter。
但是,您也可以将文件的一部分作为标准输入发送到您选择的UNIX命令,并使编辑缓冲区中的同一部分被结果输出替换。 例如,如果要对清单9中显示的整个文件进行排序,而又保留在vi会话中,则可以输入:1,$!sort指示vi将第1行通过文件末尾( $ )传递到sort命令,将指定的部分替换为输出,然后按Enter。
清单10显示了sort操作的结果输出。
另外,您可以在shell命令前加上希望其从当前光标开始执行的行数。 为此,键入一个数字字符,指定行数,后跟双感叹号( !! )和UNIX命令。
例如,将光标放在清单9中第4行的开头,您将输入:
4!!awk '{print "New text",$0}'然后按Enter键在第4至7行(包括第6行)之前加上文本New text ,如清单11所示。
您可以使用管道分隔符( | )将UNIX命令串在一起,以在vi会话中创建复杂而强大的过滤。 例如,要将当前vi会话的编辑缓冲区中的文件内容替换为每行的第一个以空格分隔的字段,并按升序排序并转换为大写,请输入以下行:
:1,$!awk '{print $1}' | sort | tr [:lower:] [:upper:]您可以输入: start , end w file来保存当前正在编辑的文件的各个部分: start , end w file ,其中start是您要保存的当前文件的第一行, end是您要保存的最后一行, w表示您要写入另一个文件(或覆盖现有文件),并且file是要将指定节保存到的文件的名称。 您可以在最后一行使用$表示法指定到文件的末尾,并在w后面加双倍的大于号( >> )表示您要追加而不是覆盖文件。 清单12中的示例显示第6至9行(包括第6行和第9行)被附加到一个名为/ tmp / newfile的文件中。
vi编辑器是一个非常强大的工具,本文为您提供了许多技巧,它们有望使文件编辑更加有效。 请记住,vi总是有更多吸引眼球的东西。 编辑愉快!
翻译自: https://www.ibm.com/developerworks/aix/library/au-vitips.html
相关资源:微信小程序源码-合集6.rar