在 unix 下过活,不用 vi 是一种遗憾。也是不大可思议的。
查看了几篇文件,综合整理了一下。方便自己的使用。
这就开始吧
vi是所有UNIX系统都会提供的屏幕编辑器,它提供了一个视窗设备,通过它可以编辑文件。当然,对UNIX系统略有所知的人,或多或少都觉得vi超级难用,但vi是最基本的编辑器,所以希望读者能好好把它学起来,以后在UNIX世界里必将畅行无阻、游刃有余,因为其他几种文本处理器并非UNIX标准配备。说不定别人的Linux机器没安装joe或pico,如果您不会vi,那您可能就没辄了。
Unix 提供一系列的 ex 编辑器,包括 ex, edit 和 vi 。相对于全屏幕编辑器,现在可能很难想像如何使用 ex, edit 这种行列编辑器(有人用过 DOS 3.3 版以前所附的EDLIN 吗?)。 Vi 的原意是 "Visual",它是一个立即响应的编辑程式,也就是说可以立刻看到操作结果。
也由于 vi 是全屏幕编辑器,所以它必须控制整个终端屏幕哪里该显示些什么。而终端的种类有许多种,特性又不尽相同,所以 vi 有必要知道现在所使用的是哪一种终端。这是藉由 TERM 这个环境变量来设定,设定环境变量方面请查看所使用 shell 的说明。(除非执行 vi 的时候回应 unknow terminal type ,否则可以不用设定。)
★vi的基本概念
基本上vi可分为三种操作状态,分别是命令模式(Command mode)、插入模式(Insert mode)和底线命令模式(Last line mode),各模式的功能区分如下:
1. Comand mode: 控制屏幕光标的移动,字符或光标的删除,移动复制某区段及进入Insert mode下,或者到Last line mode。
2. Insert mode: 唯有在Insert mode下,才可做文字数据输入,按Esc等可回到Comand mode。
3. Last line mode: 将储存文件或离开编辑器,也可设置编辑环境,如寻找字符串、列出行号等。
不过可以把vi简化成两个模式,即是将Last line mode也算入Command mode,把vi分成Command 和Insert mode。
★vi的基本操作
●进入vi
在系统提示符号输入vi及文件名称后,即可进入vi全屏幕编辑画面:
$ vi testfile
有一点要特别注意,就是您进入vi之后是处于"Command mode"下,您要切换到Insert mode才能输入文字。初次用vi的用户都会想先用上下左右键移动光标,结果电脑一直叫,把自己气个半死,所以进入vi后,先不要乱动,转换入Insert后再说。
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename....filename :打开多个文件,依次编辑
●切换至Insert mode编辑文件
要如何输入资料呢?有好几个指令可以进入输入模式:
在Command mode下按'i'、'a'或'o'三键就可进入Insert mode。这时候您就可以开始输入文字了。
新增 (append)
a 从游标所在位置后面开始新增资料,游标后的资料随新增资料向后移动。
A 从游标所在列最后面的地方开始新增资料。
插入 (insert)
i 从游标所在位置前面开始插入资料,游标后的资料随新增资料向后移动。
--- 好像在 unix 还有编程有个默认的规则,涉及到插入操作就是插入到当前操作的东东之前 ---
I 从游标所在列的第一个非空白字符前面开始插入资料。
开始 (open)
o 在游标所在列下新增一列并进入输入模式。从行首开始输入文字。
O 在游标所在列上方新增一列并进入输入模式。从行首开始输入文字。
也许文字叙述看起来有点繁杂,但是只要实际操作一下马上可以了解这些操作方式。实务很重要,尤其是电脑方面的东西随时可以尝试及验证结果。极力建议实际去使用它而不要只是猛 K 文件,才有事半功倍的效用。(注: 此段为废话。)
●Insert的切换→Command mode,按Esc键
您目前处于Insert mode,您就只能一直打字。假如您发现打错字了,想用光标键往回移动,将该字删除,就要按ESC键转换回Command mode,再删除文字。
●离开vi及存文件
在Command mode下,可按冒号": "键入入Last line mode,例如:
w: 在last line mode提示符号": "前按w即可将文件存起来。将文章存入指定的文件名filename。[超常用]
: w 存档(write)。其后可加所要存档的档名。
:q! (输入"q!",强制离开并放弃编辑的文件)
#,# w filename: 另外值得一提的是 vi 的部份存档功能。如果您想摘取文章的某一段,存成另一个文件,可用这个指令#代表行号,例如30,50 w nice,将您正在编辑文章的第30~50行存成nice这个文件。
q: 按q就离开,有时如果无法离开vi,可搭配"! 强置离开vi,如"q!"
qw 或 wq: 一般建议离开时,搭配w一起使用,如此离开时还可存文件。[常用]
zz 功能与 :wq 相同。
:x:保存当前文件并退出
:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d :将n1行到n2行之间的内容删除
:e filename:关闭当前文件。打开新文件filename进行编辑
:!command:执行shell命令command
:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入
:r!command:将命令command的输出结果放到当前行 。
★Command mode功能键列表
在介绍command mode指令的时后,指令后面加上"常用"字眼的功能键,表示比较常用的vi指令,请读者您一定要学会、记住。
(1)i、a、o切换进入Insert mode。[超级常用]
(2)移动光标
vi 可以直接用键盘上的光标键来上下左右移动,但正规的vi是用小写英文字母,不要按下 caps 键
h、j、k、l,分别控制光标左、下、上、右移一格。
k或Ctrl+p:光标上移一行
j或Ctrl+n :光标下移一行
按Ctrl+B: 屏幕往后移动一页。[常用]
按Ctrl+F: 屏幕往前移动一页。[常用]
按Ctrl+U: 屏幕往后移动半页。
按Ctrl+D: 屏幕往前移动半页。
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。
按 0 (数字零): 移动文章的开头。[常用]
△--- 说明: 不好用。只是到了一行的开头。到底是什么命令阿 ---△
按 G: 移动到文章的最后。[常用]
△--- 方法: shift +g ---△
按 ^: 移到该行第一个非空白的字符。
按 0: 移到该行的开头位置。[常用]
△--- 对阿,就是只到一行的开头。怎么又能到文章的开头呢 ---△
按 $: 移到光标所在行的行尾。[常用]
按 #: 移到该行的第#个位置,例: 51、121。[常用]
△--- 到指定行的方法: #G,0 行除外 ---△
H 移动到视窗的第一列
M 移动到视窗的中间列
L 移动到视窗的最后列
b 移动到下个字的第一个字母
w 移动到上个字的第一个字母
e 移动到下个字的最后一个字母
) :光标移至句尾
( :光标移至句首
}:光标移至段落开头
{:光标移至段落结尾
nG:光标移至第n行首,最后一行直接 G
n+:光标下移n行
n-:光标上移n行
n$:光标移至第n行尾
fx 往右移动到 x 字符上
Fx 往左移动到 x 字符上
tx 往右移动到 x 字符前
Tx 往左移动到 x 字符前
; 配合 f&t 使用,重复一次
, 配合 f&t 使用,反方向重复一次
/string 往右移动到有 string 的地方
?string 往左移动到有 string 的地方
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
n(
左括号移动到句子的最前面,前面加上数字可以指定往后移动 n 个句子 句子是以 ! . ? 三种符号来界定
n)
右括号移动到下个句子的最前面,前面加上数字可以指定往后移动 n 个句子 句子是以 ! . ? 三种符号来界定
n{
左括弧移动到段落的最前面
前面加上数字可以指定往前移动 n 个段落
段落是以段落间的空白列界定
n}
右括弧移动到下个段落的最前面
前面加上数字可以指定往后移动 n 个段落
段落是以段落间的空白列界定
不要尝试背诵这些指令,否则后果自行负责。它们看起来又多又杂乱,事实上这是文字叙述本身的障碍。再强调一次,实际去使用它只要几次就可以不经大脑直接下达这些奇奇怪怪的指令,远比死记活背搞得模模糊糊强多了。(注:若真的不经大脑而误删资料与我无关。另,此段为废话。)
(3)删除文字
何谓编辑?在这里我们认为是文字的新增修改以及删除,甚至包括文字区块的搬移、复制等等。这里先介绍 vi 的如何做删除与修改。(注意: 在 vi 的原始观念里,输入跟编辑是两码子事。编辑是在指令模式下操作的,先利用指令移动游标来定位要进行编辑的地方,然后才下指令做编辑。)
x: 每按一次删除光标所在位置的后面一个字符。[超常用]
#x: 例如,6x 表删除光标所在位置的后面6个字符。[常用]
X: 大字的X,每按一次删除光标所在位置的前面一个字符。
#X: 例如,20X 表删除光标所在位置的前面20个字符。
dd: 删除光标所在行。[超常用]
#dd: 例如,6dd表删除从光标所在的该行往下数6行之文字。[常用]
s: 删除游标所在字符,并进入输入模式。
S: 删除游标所在的列,并进入输入模式。
d0:删至行首
d$:删至行尾
(4)复制
yw: 将光标所在处到字尾的字符复制到缓冲区中。
(想在和#x、#X的功能相反)
p: 将缓冲区内的字符粘贴到光标所在位置(指令'yw'与'p必须搭配使用)。
yy: 复制光标所在行。[超常用]
p: 复制单行到您想粘贴之处。(指令'yy'与'p'必须搭配使用)
#yy: 如: 6yy表示拷贝从光标所在的该行往下数6行之文字。[常用]
p:复制多行到您想粘贴之处。(指令'#yy'与'p'必须搭配使用)
"ayy: 将复制行放入buffer a, vi提供buffer功能,可将常用的数据存在buffer
△--- 试试没成功,因为在命令方式下输入 a 后要变成了输入状态,没有办法把 ayy 输入完毕 ---△
"ap: 将放在buffer a的数据粘贴。
△--- 同样,这个也不行 ---△
"b3yy: 将三行数据存入buffer b。
"b3p: 将存在buffer b的资料粘贴
(5)取代
r: 取代光标所在处的字符,r 后接著要修正的字符。 [常用]
R: 进入取代状态,新增资料会覆盖原先资料,直到按 [ESC] 回到指令模式下为止。
(6)复原(undo)上一个指令
u: 假如您误操作一个指令,可以马上按u,回复到上一个操作。[超常用]
U: 把一行的所有操作都取消,恢复到最初
.: .可以重复执行上一次的指令。
△--- 怎么用?不会 ---△
(7)更改
cw: 更改光标所在处的字到字尾$处。
c#w: 例如,c3w代表更改3个字。
(8)跳至指定行
Ctrl+G: 列出光标所在行的行号。
#G: 例如,15G,表示移动光标至文章的第15行行首。[常用]
★Last line mode 下指令简介
读者您要使用Last line mode之前,请记得先按Esc键确定您已经处于Command mode下后,再按冒号": "或"/"或"?"三键的其中一键进入Last line mode。
1.列出行号
set nu: 输入"set nu"后,会在文章的每一行前面列出行号。
2.跳到文章的某一行
#: 井号代表一个数字,在Last line mode提示符号": "前输入数字,再按Enter就会跳到该行了,如: 15[Enter]就会跳到文章的第15行。[常用]
3.寻找字符串
/关键字: 先按/,再输入您想寻找的字,如果第一次找的关键字不是您相尽可能的,可以一直按n会往下寻找到您要的关键字为止。如果想回头看已找到的,那么 N,也就是 shift+n
? 关键字: 先按?,再输入您想寻找的字,如果第一次找的关键字不是您想要的,可以按n会往前寻找到您要的关键字为止。
4.取代字符串
1,$ s/string/replae/g:
在last line mode输入"1,$ s/string/replace/g"会将全文的string字符串取代为replace字符串,其中1,$ s就是指搜寻区间为文章从头至尾的意思,g则是表示全部取代不必确认。
:g/str1/s//str2/g 功能同上
从上述替换命令可以看到:
g 放在命令末尾,表示对搜索字符串的每次出现进行替换;
不加 g,向下搜索,只对搜索字符串的首次出现进行替换;
g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
%s/string/replace/c:
同样会将全文的string字符串取代为replace字符串,和上面指令不同的地方是,% 和1,$ 是相同的功能,c则是表示要替代之前必须再次确认是否取代。
1,20s/string/replace/g: 将1至20行间的string替代为relpace字符串。
进阶编辑指令
这些编辑指令非常有弹性,基本上可以说是由指令与范围所构成。例如 dw 是由删除指令 d 与范围 w 所组成,代表删除一个字 d(elete) w(ord) 。
指令列表如下:
d 删除(delete)
y 复制(yank)
p 放置(put)
c 修改(change)
范围可以是下列几个:
e 游标所在位置到该字的最后一个字母
w 游标所在位置到下个字的第一个字母
b 游标所在位置到上个字的第一个字母
$ 游标所在位置到该列的最后一个字母
0 游标所在位置到该列的第一个字母
) 游标所在位置到下个句子的第一个字母
( 游标所在位置到该句子的第一个字母
} 游标所在位置到该段落的最后一个字母
{ 游标所在位置到该段落的第一个字母
说实在的,组合这些指令来编辑文件有一点点艺术气息。不管怎么样,它们提供更多编 辑文字的能力。值得注意的一点是删除与复制都会将指定范围的内容放到暂存区里,然后就可以用指令 p 贴到其它地方去,这是 vi 用来处理区段拷贝与搬移的办法。
某些 vi 版本,例如 Linux 所用的 elvis 可以大幅简化这一坨指令。如果稍微观察一 下这些编辑指令就会发现问题其实是定范围的方式有点杂,实际上只有四个指令罢了。
指令 v 非常好用,只要按下 v 键,游标所在的位置就会反白,然后就可以移动游标来设定范围,接著再直接下指令进行编辑即可。
对于整列操作, vi 另外提供了更方便的编辑指令。前面曾经提到过删除整列文字的指令 dd 就是其中一个;cc 可以修改整列文字;而 yy 则是复制整列文字;指令 D 则可以删除游标到该列结束为止所有的文字。
选项设置
all:列出所有选项设置情况
term:设置终端类型
ignorance:在搜索中忽略大小写
list:显示制表位(Ctrl+I)和行尾标志($)
number:显示行号
report:显示由面向行的命令修改过的数目
terse:显示简短的警告信息
warn:在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:允许在搜索模式中,使用前面不带“”的特殊字符
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
mesg:允许vi显示其他用户用write写到自己终端上的信息
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/143614/viewspace-873989/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/143614/viewspace-873989/