linux学习笔记——vi

vi 505
vi的诞生经历了ed、en、ex等,最初的作者是Joy,C-shell、BSD的作者,SUN公司的创始人之一,现在最通用的是vim,ex是面向行的编辑器,vi是面向屏幕的编辑器,visual editor


在使用vi时,存放数据的存储区域称为编辑缓冲区,editing buffer,你处理的内容是副本


vi有两种模式,命令模式和输入模式,在命令模式中,所键入的键都被解释成命令,在输入模式中,键入的内容直接插入到编辑缓冲区中,两种模式用用<Ese>键切换


以只读方式启动vi:view或者vi -R


当系统失败后,可以用-r(recover,恢复)选项启动vi,恢复数据: vi -r
vim将编辑缓冲区保存在一个交换文件(swap file,.swp)中,提供了出色的恢复功能


停止vi的方式有两种(在命令模式下):
ZZ:保存文件并退出
:q!<Return> 
在这里用了!,在Unix中,!字符有时候用来表示希望忽略某些类型的自动检查


用vi编辑的数据只包含纯文本:字符、字母、数字、标点符号等,但是,如果需要,也可以在编辑缓冲区插入控制字符,为了这样做,需要按^V键,后面跟希望输入的控制字符。例如,^V^C,在这里,^C实际上是一个单独的字符,尽管在屏幕上站了两个字符的空间。


大多数vi命令都是单字母或双字母的形式,如w、dd,大多数vi命令都无须按<Return>键
大多数ex命令要比vi命令长一些,且更复杂,基于这一原因,在键入过程中它们会回显在命令行上。所有的ex命令都以:(冒号)开头。例如::1,5d


移动光标:
h   将光标向左移动一个位置
j   将光标向下移动一个位置
k 将光标下上移动一个位置
l 将光标向右移动一个位置


也可以使用键盘上的方向键进行光标移动,另外,


<Backspace> 将光标向左移动一个位置
<Space> 将光标向右移动一个位置
- 将光标移动到上一行的开头
+ 将光标移动到下一行的开头
<Return> 将光标移动到下一行的开头


在当前行:
0 将光标移动到当前行的开头
$ 将光标移动到当前行的末尾
^ 将光标移动到当前行的第一个非空格、制表符的字符上


除了按字符或者按行移动光标之外,还可以以单词为单位移动光标:
w 将光标移动到下一个单词的词首
e 将光标移动到下一个单词的词尾
b 将光标移动到上一个单词的词首


W 同w,忽略标点符号
E   同e,忽略标点符号
B 同b,忽略标点符号


对于更大范围的移动,可以使用圆括号命令从一个句子跳到另一个句子:
(   向后移动到上一个句子
) 向前移动到下一个句子


同样,花括号命令可以从一个段落跳到另一个段落:
{   向后移动到上一个段落
} 向前移动到下一个段落


在vi中,句子的正式定义是一个字符串,以句号、逗号、问号或者感叹号结尾,后面至少跟两个空格或一个新行字符。
空两个空格的原因是,单词之间以一个空格分隔,以示区分
段落的定义是以一个空白行开头,并以一个空白行结束的一块文本区域


有时候,可能需要从屏幕的某一部分大范围地移动到另一部分:
H(high) 将光标移动到屏幕的顶部
M(middle) 将光标移动到屏幕的中间
L(low) 将光标移动到屏幕的最后一行


为了增强光标移动命令的功能,可以通过在命令前面键入一个数字来重复执行光标移动命令,这个数字称为重复次数(repeat count),例如10w


需要大范围移动时,可以:
^F   向下(前)移动一屏
^B 向上(后)移动一屏
^D 向下移动半屏
^U 向上移动半屏
同样,可以在光标移动命令前面键入一个数字,快速移动


跳转到前一位置
``,也就是连续键入两个反引号,可以将光标返回到前一位置
该``命令还有一个更强大的版本,允许用不可见的名称标识任意行。可以在某一行上键入m,后面跟一个字母,这个字母就是这一行的名称,例如ma,为了跳转到这一标记位置,可以键入一个`(反引号)或者'(单引号),后面跟这一行的名称,例如`a


搜索模式:
/regex 向前搜索指定的正则表达式
/ 向前重复搜索前一正则表达式
?regex 向后搜索指定的正则表达式
? 向后重复搜索前一正则表达式
搜索命令后面跟着正则表达式,按<Return>键执行搜索
n   重复上一条/或者?命令,搜索方向相同
N 重复上一条/或者?命令,搜索方向相反


使用行号
从内部讲,vi通过给编辑缓冲区中的每一行编一个号来区分各行。如果想查看这些行号,可以打开number选项,命令是
: set number
如果想除去行号,可以按如下方式关闭number选项:
:set nonumber


跳转
nG   跳转到第n行
1G   跳转到编辑缓冲区的第一行
gg   跳转到编辑缓冲区的第一行
G 跳转到编辑缓冲区的最后一行
:n 跳转到编辑缓冲区的第n行
:1 跳转到编辑缓冲区的第一行
:$ 跳转到编辑缓冲区的最后一行


插入文本
i 改变到输入模式:在当前光标位置前插入数据
a 改变到输入模式:在当前光标位置后插入数据
I 改变到输入模式:在当前行开头处插入数据
A 改变到输入模式:在当前行末尾处插入数据
o   改变到输入模式:在当前行下面插入一行
O 改变到输入模式:在当前行上面插入一行


在输入模式中,有两件事情需要记住:
1.可以使用一些按键对错误进行校正,而不必离开输入模式:
使用<Backspace>(或<Delete>)键删除一个字符,使用^W删除一个单词,使用 X(或者^U)删除整行
2.可以通过在控制字符前面加上一个^V来插入一个控制字符
也可以使用^i在当前行的开头、$a在当前行的末尾插入数据,这里描述了vi的设计之美,通过学习一些额外的命令,经常可以用一个字符的命令(I或A)来取代两个字符的命令(^i、$a)


修改文本
r 精确替换1个字符(不进入输入模式)
R 以覆盖方式替换
s 以插入方式替换1个字符(substitute)
S 以插入方式替换当前的整行
c move 以插入方式从当前光标处替换到move所给出的位置处
cc 以插入方式替换当前的整行
C 以插入方式从当前光标处替换到这一行的末尾


替换文本
这里使用的是ex的命令
:s/pattern/replace/ 替换当前行
:lines/pattern/replace/ 替换指定行
:line,lines/pattern/replace/ 替换指定范围的行
:%s/pattern/replace/ 替换所有行
在命令的末尾,可以使用c告诉vi在替换之前要求确认,而使用g(global)则表示替换该行上的所有匹配项。为了指定行号,可以使用实际的数字,也可以使用.(点号)表示当前行,或者使用$表示编辑缓冲区的最后一行。数字1表示编辑缓冲区的第一行


删除文本
vi命令如下:
x 删除当前光标处的字符
X   删除光标左边的字符
D   删除从当前光标到本行末尾末尾的字符
d move 删除从当前光标到move所给位置的字符
dd 删除当前行
另外,还有两个ex命令:
:lined 删除指定行
:line,lined 删除指定范围的行
d命令有两种特别有用的使用方法:
第一,为了删除当前行到编辑缓冲区末尾的所有行,可以使用dG
第二,为了删除当前行到编辑缓冲区开头的所有行,可以使用dgg,或者d1G
为了删除整个编辑缓冲区,可以使用
:1,$d
:%d
记住,%代表编辑缓冲区中的所有行


撤销或重复改变
u   撤销上一命令对编辑缓冲区的修改
U 恢复当前行
. 重复上一命令对编辑缓冲区的修改
u  也可以撤销自己
U  只适用于新行


恢复删除
每当删除一行或多行文本时,vi都将删除内容保存在一个特殊的存储区中,这个存储区称为编号缓冲区(numbered buffer)。vi共有9个这样的缓冲区,编号从1至9.在任何时候,都可以将一个编号缓冲区中的内容插入到编辑缓冲区中。这样做时,需要键入一个"(双引号),后面跟着缓冲区的编号,再后跟一个p或者P(put,放入)命令(提醒:当处理行时,p命令在当前行的下面输入,P命令在当前行的上面输入)。
例如,为了将编号缓冲区#1的内容插入到当前行的下面,可以使用"1p


移动文本
vi  总是在一个称为无名缓冲区(unamed buffer)的存储区中为上一次删除保存一份副本。在任何时候,都可以使用p和P命令将无名缓冲区中的内容复制到编辑缓冲区中。
p 复制上一次删除的内容,插入到光标后面/下面
P 复制上一次删除的内容,插入到光标前面/上面
xp 调换两个字符
deep 调换两个单词(光标开始处于第一个单词的左边)
ddp 调换两行


复制文本
从一个位置向另一个位置复制文本包括3步。
第一步,使用y、yy或Y命令将文本由编辑缓冲区复制到无名缓冲区中,但不删除原始文本。
第二步,将光标移动到希望插入文本的位置。
第三步,使用p或P命令执行插入。
在不删除文本的情况下将文本复制到无名缓冲区时,我们称接出(yank)了文本,y和yy的工作方式与d和dd命令的工作方式相同,只是y和yy命令接出文本,而d和dd命令删除文本。例如y10w表示接出10个单词,10yy接出10行
为了方便起见,使用Y代替yy,不过,Y命令并不与D命令类似


改变字母的大小写
vi编辑器拥有一个特殊的命令,可以将字母由小写字母变成大写字母,或者从大写字母变成小写字母。该命令就是~(波浪号)。~命令将致使vi改变当前字符的大小写,然后将光标向前移一个位置。例如7~将改变七个字母的大小写,但是~命令不会越过一行的末尾


设置选项
和大多数复杂的Unix程序一样,vi支持许多选项,从而允许用户控制vi操作的各个方面。当启动vi时,每个选项都被赋予了一个默认值。如果希望改变vi行为的一个特定方面,可以使用:set命令设置合适选项的值。该命令的语法有两种形式,因为选项本身有不同的类型:
:set [no]option...
:set option[=value]...
其中option是选项的名称,value是选项的值
vi的选项有两种类型:
第一种类型的选项是开关(switch),这种选项的值或者为关闭(off),或者为(打开)。为了打开一个开关,需要使用该开关的名称;为了关闭一个开关,需要在该开关的前面键入”no“。例如:
:set number
:set nonumber
第二种类型的选项是变量(variable),这种类型的选项包含一个值。例如,tabstop选项用来设置制表符的间距。tabstop默认值是8,例如可以这样设置:set tabstop=4
下面列举一下重要的vi选项:
开关 缩写 默认值  含义
autoindent ai off 和shift width相关,缩进以匹配上一行/下一行
autowrite aw   off 如果文本已经修改,则在切换文件前保存
errorbells   eb   off 当显示错误消息时发出嘀嘀声
exrc ex off   在当前目录中查找初始化文件
ignorecase   ic off   在搜索过程中忽略大小写
list   —— off 将制表符显示为^I,将行的结束显示为$
number   nu   off 显示行号
readonly   ro off   不允许修改编辑缓冲区的内容
showmatch   sm   off 输入模式:显示匹配的()、{}、[]
showmode smd off 当进入输入模式时显示一个提醒
wrapscan   ws off 在搜索过程中,环绕到文本的开头/末尾继续搜索
writeany    wa off 允许不需要重载!就可以写入任何文件
变量  缩写  默认值  含义
lines —— 24 文本的行数(窗口/屏幕大小-1)
shiftwidth sw   8 autoindent使用的空格数量
tabstop ts 8 制表符间距
wrapmargin   wm   0 设置自动换行时的页边距(0=off)


显示选项
为了显示一个或多个选项的值,可以使用:set命令的一种变体。其语法为:
;set [option[?]... | all]
其中option是选项的名称
为了显示所有选项的值,可以使用:
:set all
为了显示一个选项的值,可以键入该选项的名称,后面跟一个问号
:set number?


复制与移动行
有时候,通过指定行号来复制或移动行是比较方便的。对于这些操作,可以使用ex命令:co(copy)和:m(move)。这两条命令使用相同的格式。惟一的区别就是:m删除原始行,而:co不删除原始行
为了使用这些命令,需要在命令名称前面指定一个单独的行号或者一个行号范围。这些就是要复制或者移动的行。在命令名称之后,可以指定目标行号,新行将插入到目标行的下面。命令的语法为:
:x[,y]:coz
:x[,y]:mz
其中x、y、z都是行号


输入shell命令
:!command 暂停vi,执行shell命令
:!! 暂停vi,执行前一条shell命令
:sh 暂停vi,启动一个新shell(默认shell)
:!bash 暂停vi,启动一个新BASH
:!tcsh 暂停vi,启动一个新TCSH


将文件中的数据插入到编辑缓冲区中
为了将现有的文件向编辑缓冲区中读入数据,可以使用:r命令。该命令的语法为:
[line]r file
其中line是行号,file是文件的名称
:r命令读取文件的内容,并将该内容插入到编辑缓冲区中的指定行之后。例如下列命令将文件info的内容插入到第10行之后:
:10r info
如果省略了行号,那么vi将把新数据插入到当前行之后


将shell命令的输出插入到编辑缓冲区中
:r命令有一种特别有用的变体。如果在:r命令之后不是键入文件的名称,而是键入一个!,后面跟一个程序的名称,那么vi将执行该程序,并将程序的输出插入到编辑缓冲区中。 
例如,可以用:r !look asc查找单词,找到后,移到所键入的最后一行,键入J,这样把新单词连接到这一行的末尾,然后键入A,继续进行编辑
:r命令概括如下:
:liner file 在指定行后插入文件file的内容
:r file 在当前行后插入文件file的内容
:liner !program 在指定行后插入程序program的输出
:r !program    在当前行后插入程序program的输出


使用程序处理数据:fmt
使用!和!!命令将把编辑缓冲区中的行发送给另一个程序。该程序的输出将替换原始行。概括起来:
n!!program 在n个行上执行程序program
!move program 从当前行至move行执行程序program


将数据写入文件
当使用ZZ命令停止vi时,vi会自动地将数据收集起来,但是,vi中还有几条命令可以用来随时将数据写入到文件中。
:w 将数据写入原始文件
:w file 将数据写入到一个新文件中
:w! file   覆盖一个已有的文件
:w>>file 将数据追加到指定的文件中


切换到一个新文件
如果在编辑一个文件的时候,决定编辑另一个文件,这时不必退出并重启vi程序。为了切换到另外一个文件,可以使用:e 命令,后面跟新文件的名称。当开始编辑一个新文件时,编辑缓冲区中的原有内容将会丢失,所以要确保首先使用:w命令将数据保存。当使用:e命令时,vi将检查数据是否已经保存
:e file 编辑指定的文件
:e!   重新编辑当前文件,忽略自动检查
:e! file 编辑指定的文件,忽略自动检查


使用缩写
要为经常使用的单词或表达式创建缩写,可以使用:ab(abbreviate)命令,该命令语法为::ab [short long],其中,short是缩写,long是原文
例如:ab eg exceptionally gifted
从现在开始,在位于输入模式时,每当以一个单独的单词键入eg,vi都将自动地使用“exceptionally gifted”。
如果要删除一个缩写,可以用:una(un-abbreviate,反缩写)命令
:una short



可以用:map命令创建命令模式中使用的单字符的缩写,实际上,这将允许自己创建自己定制的单字符命令,这些命令称为宏(macro),语法为:
:map [x commands]
其中,x是一个字符,commands是vi或ex命令序列
例如::map K deep
移除宏可以用:unmap x命令,例如
:unmap g
:unmap #1 (#1表示F1)


初始化文件:.exrc、.vimrc
创建vi初始化文件非常简单:只需插入希望每次启动vi时自动执行的ex命令即可。具体而言,应该包括所有经常使用的:set(选项)、:ab(缩写)、:map(宏)命令。另外,还可以使用:!命令来运行shell命令。vi假定它读取的所有内容都是ex命令,因此,不需要以:开头
在vi读取初始化文件时,以"(双引号)字符开头的各行都被忽略,作为注释行
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值