第三章 正文编辑
vi是屏幕编辑程序。这表示屏幕的内容是被编辑的文件的一个窗口。vi对文件所做的修改是在文件的副本上进行的,并不直接对源文件本身进行修改。如果在编辑过程中发生了错误,可以将修改的结果全部放弃,重新回到原始的文件。只当认为一切进行顺利,并发出保存修改结果的命令时,才会修改了的文本取代原始文件。
进入vi编辑程序:
$ vi filename
vi编辑程序有三种操作方式:编辑方式,插入方式和命令方式。
编辑方式的主要用途是在被编辑的文件中移动光标的位置,进行剪切和粘贴、删除和插入操作。在此方式下,保存退出命令为连按两次Z键。
光标定位
除上下箭头外带可以用k(上移)、j(下移)、h(左移)、l(右移)来完成同样的功能
ctrl-f 在文件中前移一页(相当于page down);
ctrl-b 在文件中后移一页(相当于page up)
在屏幕上找到需要的一页时,可以用下面的命令快速移动光标:
H 将光标移到屏幕上的起始行(或最上行);
M 将光标移到屏幕中间;
L 将光标移到屏幕最后一行
H和L命令前可以加数字,表示移进屏幕的行数。如2H将光标移到屏幕的第2行,3L将光标移到倒数第3行。
当将光标移到所要的行时,行中的正确位置可以用下面的命令来实现:
w 右移光标到下一个字的开头;
e 右移光标到一个字的末尾;
b 左移光标到前一个字的开关;
0 左移光标到本行的开始;
^ 移动光标到行中第一个非空字符;
$ 右移光标到本行末尾
搜索字符串
/ string 向后搜索给定字符串
?string 向前搜索给定字符串
n 向前或向后搜索,找出字符串下次出现的位置
替换和删除
rc 用c替换当前光标批示的字符;
x 删除当前光标位置的字符;
dw 删除光标右面的字;
db 删除光标前面的字;
dd 删除光标所在的行,并去掉空隙。
在上面的任何命令前面加上数字,它们的功能扩充如下:
nrc 从光标位置开始用c替换n字符;
nx 从光标位置开始删除n个字符;
ndw 在光标右面删除n个字;
ndb 在光标前面删除n个字;
ndd 删除n行,并去掉空隙。
其它常用的删除命令(前面不能加数字):
d$ 从当前光标起删除字符直到行的结束;
d0 从当前光标起删除字符直到行的开始;
J 删除本行的回车字符(CR),并和下一行合并。
剪切和粘贴
p(小写) 将缓冲区的内容粘贴到当前光标的后面;
P(大写) 将缓冲区的内容粘贴到当前光标的前面。
yy 将当前行复制到剪切缓冲区;
nyy 将n行复制到剪切缓冲区。
撤销和重复
u 撤销前一条命令的结果;
· 重复最后一条修改正文的命令
插入方式
退出插入方式:ESC键
进入插入方式:
i 在光标左面插入正文
a 在光标右面插入正文
I 在光标行的开关插入
A 在光标行的末尾插入
正文替换:
s 用新正文替换光标所指的字符;
cw 用新正文替换光标右边的字;
cb 用新正文替换光标前面的字;
cd 用新正文替换当前光标行。
在这组命令的前面加上数字,它们的功能进一步扩充:
ns 用新正文替换光标后面的n个字符;
ncw 替换光标后面的n个字;
ncb 替换光标前面的n个字;
ncd 用新正文替换下面的n行。
增加行:
o 在光标所在行下面增加新行;
O 在光标所在行上面增加新行。
其它命令:
c$ 用新正文替换从光标开始到本行末尾的所有字符;
c0用新正文替换从光标开始到本行开关的所有字符。
命令方式
进入:送入冒号
退出:
:q 在未作修改的情况下退出;
:q! 将任何修改作废,退出编辑程序。
:w 将编辑的内容写到原始文件中去;
:wq 写文件和退出编辑程序(相当于ZZ);
:w file 将编辑的内容写到名称为file的文件中去;
:r file 将file文件的内容读入,放在当前光标行的后面;
:e file 编辑新文件file代替旧的内容;
:f file 将当前正文的名称改为file;
:f 打印当前正文的名称和状态。
:a,bw file 将a行到b行的内容写到file中。
:n 将光标移到第n行
例子:
:345 将光标移到第345行;
:345w myfile 将第345行写到myfile文件中;
:3,8w myfile 将第3行到第8行写到myfile文件中;
:1,.w myfile 将第1行到当前行写到myfile文件中;
:.,$w myfile 将当前行到最后一行写到myfile文件中;
:.,.+4w myfile 从当前行开始将5行的内容写到myfile文件中;
:1,$w myfile 写整个文件(相当于:w myfile)。
字符串搜索
:/str/ 将光标前移到下一个包含str字符串的行;
str? 将光标后移到最近的包含str字符串的行;
:/str/w myfile 将第一个包含str字符串的行写到myfile文件中;
:/str1/,/str2/w myfile 将从包含str1的行到包含str2的行的正文写到myfile文件中。
规则表达式
例子:
找出以字符串struct开头的行:
:/^struct/
^字符比较每行开头的字符串
^ 放在字符串前面,匹配行首的字;
$ 放在字符串后面,匹配行尾的字;
\< 匹配一个字的字头;
\> 匹配一个字的字尾;
. 匹配任何单个正文字符;
[str] 匹配str中的任何单个字符;
[^str] 匹配任何不在str中的单个字符;
[a-b] 匹配a到b之间的任一字符;
* 匹配前一个字符的0次或多次出现;
\ 不管后面的字符的特殊含义。
正文替换
:s/str1/str2/ 用str2替换行中首次出现的str1;
:s/str1/str2/g 用str2替换行中每一个str1;
:.,$s/str1/str2/g 用tr2替换当前行到文件末尾的所有str1;
:1,$s/str1/str2/g 用str2替换整个文件中的str1;
:g/str1/s//str2/g 另一种用str2替换文件中每一个str1的方法。
在这些替换命令中,g放在命令的末尾表示在当前光标行中对搜索字符串的每次出现重复使用本命令。不加g,命令只对行中搜索字符串的首次出现进行替换操作。g放在命令的开头规定命令对文件中所有包含搜索字符串的行进行替换操作。
删除正文
:d 删除当前光标行;
:3d 在正文中删除3行;
:.,$d 从当前光标行到文件末尾全部删除;
:/str1/,/str2/d 删除从str1到str2的所有行。
编辑程序的选项
:set option 设置option变量的不同值;
其中option指定变量和设置的值。一些有用的选项是:
autoindent 自动缩进。可以用noautoindent选项来关闭它。
ignorecase 不区分规则表达中的任何大小写字母。可以用noignorecase来关闭。
number 显示行号。nonumber关闭。
ruler 标尺(在屏幕底行显示)。noruler来关闭此选项。
tabstop 设置按一次Tab键跳过的空格数。格式是:set tabstop=n。默认为8个空格。
shell切换
:!commard 执行commard命令后回到编辑程序。