vi编辑器常用操作,vi编辑器教程
Vim编辑有不同的方法来处理各种事情。我们在学习和使用Vim编辑器(四)中已经讨论了文本块和多个文件的处理方法。有了这些命令,我们可以很好地完成工作。在这项研究中,我们将讨论更多的内容,从而使我们的Vim编辑工作更加完善。
当我们插入一个文本行时,我们可以使用P命令或P命令。不同的是,P命令插入当前行的下一行,之后光标移动到新行的开头,而P命令插入当前的上一行,之后光标移动到新行的下一行的开头。我们也可以使用gp或gP命令。不同的是,gp命令将光标移动到新行的末尾,也就是新行的下一行的开头。gP命令与相同
Vim编辑器中有一些特殊的标记,比如单引号是指光标的最后一个位置,但是这个位置不包括箭头键移动的位置。其他特殊标记包括:
]最后插入文本的开头。
[最后插入文本的结尾
当我们离开文件时光标所在的位置。
(注:这个地方书都是这么写的,但是你自己做的时候只能是,[,],而且要按两次键。我不明白:()。
到目前为止,当我们复制和删除文本时,我们还没有指明要使用哪个语域。如果我们没有指明要使用哪个寄存器,Vim将使用默认的未命名寄存器。用来表示这个寄存器的标记是两个双引号()。这里,前一个双引号用来表示一个寄存器,后一个双引号是这个寄存器的名称。所以‘a’意味着我们使用寄存器a .
我们可以指出在哪个语域中我们的复制或删除的文本应该放在我们的复制或删除的文本之前。所示寄存器的命令格式如下:
注册
在这里,register是一个小写字母,这是我们指定的寄存器的名称,这样我们就可以有26个寄存器可以使用。
一般情况下,yy复制的文本放在未命名寄存器中。我们可以使用命令 ayy 将复制的文本放到指定的寄存器中。当然,如果我们使用这个命令,复制的文本也会被放入未命名的寄存器中。
如果我们想知道押金中包括什么,我们可以使用以下命令:
:寄存器
一般我们复制或粘贴的文本会放入一个以字母命名的寄存器中,但我们也可以使用一些特殊的寄存器。
我们可以通过发出命令:registers a parameter来检查特定寄存器的内容。例如,我们可以使用以下命令检查寄存器A和X的内容:
:寄存器ax
当我们使用命令 ayy 时,我们将当前文本行的内容放入寄存器,当我们使用相应的大写字母指定寄存器时,如 Ayy ,我们将当前行的内容追加到寄存器 a 中。此时,两行文本存储在这个寄存器中,在寄存器中,j表示一行的结束。
Vim中有一些特殊的寄存器。第一个是我们已经知道的未命名寄存器,它的名字是一个双引号。还有其他寄存器1到9,寄存器1包含我们上次删除的文本,以此类推。
在古代的Vi中,Vi只能撤销三次。如果我们执行dd命令三次,也许我们不会有太多的运气使用U命令来恢复我们删除的文本。但幸运的是,这三个文本分别存储在寄存器1、2和3中。我们可以使用命令‘1P’、‘2P’、‘3P’将这些文本粘贴回来,或者我们可以使用以下命令来达到相同的结果:
P.
其他一些特殊寄存器:
寄存器描述可重写。
0的最后一个复制文本是
-最后删除的文本编号。最后插入的文本编号
%当前文件的名称编号
#替换文件的名称
/最后搜索的字符串编号
:来自最后一个“:”命令的否
_黑洞是
=表达式编号
*鼠标选中的文本是
黑洞寄存器(_)
黑洞寄存器是一个特殊的寄存器,我们放入其中的任何文本都将不复存在。当然,我们也可以使用p命令来粘贴这个寄存器中的文本,但是这样做是没有意义的,因为这个寄存器中根本没有任何内容。这种登记册也发挥着非常重要的作用。如果我们想永久删除某个文本,而不是把它放在寄存器1-9中,我们可以使用这个寄存器。比如命令dd删除一行文本,存储在寄存器1中,而我们用命令 _dd把这一行文本放入黑洞寄存器,文本将永远消失,而寄存器1中的文本保持不变。
表达式寄存器(=)(表达式寄存器)
我们可以使用表达式寄存器在文本中输入表达式。当我们输入expression寄存器启动的命令时,Vim的下部会显示一个提示行,让我们有机会在这里输入我们的表达式。然后我们可以用命令p将表达式的结果粘贴到文本中.
例如,如果我们想在文本中插入一个38*56的值,我们可以这样做:
进入命令模式,并在表达式寄存器的开头输入命令=。此时,Vim底部会显示=等待我们的输入。我们可以输入38*56,回车,然后输入命令P,这样我们的计算结果就可以插入到文本中了。
在表达式寄存器中,我们不仅可以使用常见的算术运算符,还可以使用特定于Vim的函数和运算符。如果我们不仅仅使用普通的算术运算符,也许我们需要查阅表达式文档。例如,我们可以通过表达式寄存器获得环境变量的值。如果输入=$HOME,就可以得到HOME变量的值。
剪贴板寄存器(*)(剪贴板寄存器)
剪贴板注册允许我们通过系统的剪贴板读写数据。如果是在UNIX系统上,这应该用在图形界面上。这样,我们可以使用clipboard register在不同的Vim编辑器或其他包之间剪切和复制文本。
在UNIX或Linux系统中,我们可以使用Vim编辑器和grep命令来处理所有包含指定单词的文件。这对我们非常有用,因为我们可以使用这种组合来查看或处理包含某个变量的程序文件。例如,现在我们要编辑包含变量frame_counter的C程序文件。这时,我们可以使用下面的命令:
$ vim grep-l frame _ counter * . c
(注意:这里最外面的昵称是反昵称,也就是数字键1旁边的那个,里面是单引号)
在这个命令中,grep命令在一系列文件中搜索包含指定单词的文件。这里,我们指定了-l选项,这样这个命令将列出包含这个单词的文件,而不打印找到的字符串。在这里,我们要查找的字符串frame_counter,我们可以使用这个命令来查找其他字符串或表达式。整个命令用反引号括起来。这告诉UNIX Shell运行这个命令,并假设这个命令的执行已经被命令打印出来。因此,该命令的结果是运行grep命令并生成文件列表。这些文件名放在Vim的命令行中,这样Vim就可以编辑这些文件。
也许有人会说为什么要在这里显示这个顺序呢?这是UNIX Shell的一个特性,而不是Vim作品的一部分,这也是Vim更加完美的地方。
我们可以使用以下命令设置参数列表:
:arg grep-l frame _ counter * . c
在这个参数列表中,我们可以使用命令来指定我们想要编辑的文件。例如,如果我们想编辑第三个文件,我们可以使用以下命令:
:参数3
这个命令可以让我们编辑这个文件及其在参数列表中的位置。如果我们用下面的命令启动Vim:
$ gvim一. c二. c三. c四. c五. c
这时,如果我们想编辑第四个文件,我们可以使用下面的命令:
:参数4
当我们在命令行中使用命令指定一系列文件时,我们就完成了文件列表的初始化。但是我们可以使用命令:args来指定一个新的文件列表。例如,以下命令:
:argsccc
执行这个命令后,我们开始编辑文件alpha.c,然后是文件beta.c .
有时候,我们在编辑一个文件的时候,希望在文件打开的时候,光标能够定位到我们想要的那一行。我们如何做到这一点?例如,如果我们想在第12行开始编辑文件,我们可以用命令打开文件,然后执行命令12G,使光标到达指定的行。我们还可以在vim开始指示光标的去向时,在命令后面添加行号。例如,以下命令:
$ gvim 12 file.c
我们也可以使用这个命令形式/字符串,在文件加载后将光标放在指定的字符串上。例如,我们希望在打开文件后将光标放在第一个包含字符#include处,我们可以使用以下命令:
$ gvim /#include file.c
当然,我们可以把任何命令模式放在后面。
我们可以使用各种命令来指示cmd的参数。通常;VI命令格式如下:
:vi [ cmd] {file}
以下命令也可以采用cmd的形式:
:下一个[ cmd]
:wnext [ cmd]
:上一个[ cmd]
:wprevious [ cmd]
:下一个[ cmd]
:wNext[ cmd]
:倒带[ cmd]
:最后一个[ cmd]
标记a-z只是当前文件的标记。换句话说,我们可以在一个文件中标记A,也可以在另一个文件中标记A。如果我们执行命令 A ,我们可以跳到当前文件中的标记A处。大写字母(A-Z)的标记是不同的。他不仅标记了当前文件中的一行,还标记了当前文件。例如,我们正在编辑文件one.c,并在其中做一个带有A的标记。然后我们可以在编辑文件2时执行命令A。C.
当我们在插入模式下输入文本时,我们还可以执行不同的命令。比如BS退格可以清除光标前面的字符,而CTRL-U会清除整行或者至少是你刚刚输入的内容,CTRL-W会清除光标前面的字符。当我们处于插入模式时,我们也可以移动光标,所以我们不能再使用传统的h,j,k,l,但是这时我们可以使用小箭头键来移动光标。HOME可以移动到一行的开头,END可以移动到一行的结尾。PageUp可以向上滚动,PageDown可以向下滚动。
在插入模式下,如果我们输入CTRL-A,Vim editor将插入我们上次在Vim插入状态下输入的文本。例如,如果我们在文件的一行中输入#include,那么我们使用命令J向下移动一行并插入新的一行。这时,如果我们要输入#include,可以使用命令CTRL-A来完成。CTRL-@命令与之类似,唯一不同的是执行完这个命令后,我们将退出插入模式。我们还可以使用命令CTRL-V来引用下一个字符,换句话说,任何有特殊含义的字符都会被忽略。例如,如果我们输入CTRL-V Esc,我们将在文本中插入空白。我们还可以使用命令CTRL-Vdigits来插入这个数字所指向的字符,例如,如果我们输入CTRL-V64,我们将在文本中插入@。默认情况下,Ctrl
CTRL-Y命令可以在光标上输入单词,这在我们想重复上一行的时候特别有用。
CTRL-E命令类似于CTRL-Y命令,但它可能会重复光标下方的字符。
命令CTRL-Rregister可以将我们寄存器的内容插入到文本中。如果寄存器的内容包含BS这样的特殊字符,这些特殊字符会被重新解释,就像我们从键盘输入这些字符一样。如果我们想这样做,并且只是考虑将这些字符作为普通字符,我们可以使用这个命令:CTRL-R
CTRL-R寄存器
例如,我们输入以下文本:
这是一个测试。
然后,我们使用命令 ayy 将这些文本复制到寄存器a中,之后,我们进入插入模式,输入命令CTRL-Ra,我们会看到我们刚刚复制的内容会出现在文本行中。
如果我们不希望特殊字符被重新解释,我们可以使用命令CTRL-R CTRL-R register。
命令CTRL-/CTRL-N可以离开插入模式并返回到正常模式。换句话说,这个命令类似于ESC,但是可以在任何模式下使用,似乎比ESC更强大。
最后,我们将介绍命令CTRL-O,它可以返回命令模式执行Vim命令,执行后再返回插入模式。例如,当我们执行命令CTRL-Odw时,Vim会返回到命令模式来执行命令dw,然后在执行后返回到插入模式。
我们在使用全局标记时遇到的一个问题是,当我们退出Vim时,我们设置的全局变量并不存在,我们希望保存它们。viminfo文件被设计为包含保存的标记信息和以下信息的文件:
命令行历史
查找历史
进入历史
注册
标记
缓冲列表
全局变量
保存项目的方法是打开此保存选项。我们可以用下面的命令来完成:
:设置viminfo=string
这里的字符串表示我们想要保存的内容。
这里的字符串语法是一个选项字符后跟一个参数。中间用逗号隔开。首先,‘选项’用来表示我们想为更少的文件保存本地标记。我们可以选择一个合适的数字,比如我们要选1000。那么此时的命令形式如下:
:设置viminfo-1000
f选项用于控制是否保存全局标记。如果该选项的值为0,则不会保存。如果值为1或者我们没有指定f选项,那么vim将保存这些全局标记。如果我们想使用这个功能,我们可以使用下面的命令:
:设置viminfo=1000,f1
R选项将告诉Vim一些关于可移动介质信息。在Vim中标记可移动介质上的文件将不会被保存,因为我们在Vim中跳转到软盘文件的标记是一个困难的操作。我们已经多次指出了R选项。如果我们在Windows系统上,我们可以使用下面的命令告诉Vim磁盘A和B是可移动介质:
:set viminfo=1000,f1,rA:rB:
UNIX系统中没有标准的软盘名称。一般来说,我们总是在/mnt/floppy文件下挂载软盘,所以我们可以使用下面的命令:
:设置viminfo=1000,f1,r/mnt/floppy
/选项用于控制每个寄存器中可以保存多少行。默认情况下,将保存所有行。如果是0,就不会保存。一般默认设置已经可以满足我们的要求了,就不用自己添加设置了。
:选项可用于控制:历史行的记录。我认为100可以满足我们的要求:-):
:设置viminfo=1000,f1,r/mnt/floppy,100
/选项可用于定义搜索历史的大小,100就足够了:
:设置viminfo=1000,f1,r/mnt/floppy,100,/100
(注意:Vim不会保存那些超出他的录制能力的内容,这是在选项历史中设置的)
通常,当我们启动Vim时,如果我们已经设置了hlsearch选项,编辑器会高亮显示最后搜索的内容。要关闭这个选项,我们可以在viminfo的选项列表中添加H标记,也可以在Vim开始关闭这个选项后执行命令:nohlsearch。
@选项用于控制输入历史中的行数。输入历史会记住我们输入的所有内容。
如果我们设置%选项,我们可以保存缓冲列表记录。如果我们没有在命令行上指定要编辑的文件,缓冲区列表将再次保存:
:set viminfo=1000,f1,r/mnt/floppy,100,/100,%
!用选项保存全局变量。这些全局变量的名称都是大写字母:
:set viminfo=1000,f1,r/mnt/floppy,100,/100%,
最后一个选项n用于表示viinfo的文件名。在UNIX系统中,默认为$ home/.viinfo。
我们可以把这些命令和其他一些初始化命令放在初始文件Vimrc中,这样vim退出时会自动保存viminfo文件,启动时会读取初始化。
如果我们想更清楚地保存和读取这个文件,我们可以使用下面的命令用另一个文件名保存它:
:wviminfo[文件]
这样,我们的一些设置信息就会被写入这个文件。
我们可以使用以下命令读取该文件:
:rviminfo[文件]
这将从该文件中读取设置信息。如果此信息与当前设置冲突,那么我们的设置信息将不再有效。我们可以使用以下命令来强制使用该设置信息:
:rviminfo![文件]
有时我们编辑一些文件,其中一行的宽度超过了屏幕的宽度。当一条线的宽度超过屏幕的宽度会发生什么?此时,vim会将这一行折回以适合屏幕的宽度。如果我们设置nowrap选项,Vim将使用一行来处理文件中的第一行文本。此时,超出屏幕的部分将不再出现,并从屏幕上消失。
默认情况下,Vim不显示水平滚动条。我们可以使用下面的命令让Gvim显示平面滚动条:
:设置guioptions=b
这样Gvim就可以水平滚动了。
当我们设置nowrap选项时,该命令将光标移动到当前行的第一个非空字符。g命令可以将光标移动到当前屏幕的第一个非空字符。执行此命令时,如果窗口的其他部分有文本,此部分的文本将被忽略。一些类似的命令如下:
命令含义
将当前屏幕的第一个非空字符向左移动。
首页g首页
G0将当前屏幕的第一个字符向左移动。
结束g结束
$ g$将当前屏幕的末尾向右移动
Gm移动到屏幕中间。
命令count将光标移动到屏幕中的指定列。
命令countzh可以将屏幕向左移动,移动的度量是count个字符。命令countzl与它类似,只是这个命令将屏幕向右移动。
命令zH可以向左移动一个屏幕,而命令zL可以向右移动半个屏幕。命令j或Down可以向下移动一行。这里我们需要知道的是,如果我们设置了换行选项,下面的一行可能会在屏幕上显示为几行。此时,我们需要知道,当nowrap被设置时,这些行是完全相同的行。
当我们设置换行选项时,一个长行Vim将被折叠成几行并显示在屏幕上。此时,我们可以使用命令gj或g Down来下移屏幕上显示的行。这个时候,也许我们并没有动真格的线。命令gk或g Up与之类似。
默认情况下,Vim在编辑时会折回一长行。这时,他首先在屏幕的第一行放置尽可能多的文本。如果这一行的文本超出了屏幕的范围,Vim将中断它,然后在屏幕的下一行显示其余部分。我们也可以通过以下命令关闭该选项:
:设置nowrap
这时,长句子超出屏幕的部分就从屏幕上消失了。我们可以沿着这句话移动光标,这样屏幕就会水平滚动,我们就可以看到这一行的其余部分。
当然,我们也可以定义自己的句子折叠形式:
首先我们可以告诉Vim在合适的地方打断一句话。我们可以使用以下命令来实现这一点:
:设置换行符
那么如何定义一个合适的地方呢?这由breakat选项中的字符决定。默认情况下,这些默认字符是I!@*- _;/?如果我们不想在下划线_处中断句子,我们可以使用下面的命令从列表中删除_:
:设置休息时间-=_
在正常情况下,如果一个句子被打断,Vim不会显示该句子连接的任何内容。我们可以通过设置showbreak选项来显示我们想要显示的内容信息:
:set showbreak=-
我们要讨论的最后一个问题是,当我们在屏幕的末尾打断一个句子时。我们做什么呢这时候我们可以用两种选择:一是可以不显示半行。此时,Vim编辑器将在屏幕底部显示@。这是一个很长的句子,我们不能把它全部放在屏幕上。其次,我们可以显示半行。
默认情况下,Vim采用第一种方法。如果我们想采用第二种方法,我们可以用下面的命令实现它:
:设置显示=最后一行