要如何输入资料呢?有好几个指令可以进入输入模式:
新增 (append)
a 从光标所在位置后面开始新增资料,光标后的资料随新增资料向后移动。
A 从光标所在列最后面的地方开始新增资料。
插入 (insert)
i 从光标所在位置前面开始插入资料,光标后的资料随新增资料向后移动。
I 从光标所在列的第一个非空白字元前面开始插入资料。
开始 (open)
o 在光标所在列下新增一列并进入输入模式。
O 在光标所在列上方新增一列并进入输入模式。
也许文字叙述看起来有点繁杂,但是只要实际操作一下马上可以了解这些操作方式。实务很重要,尤其是电脑方面的东西随时可以尝试及验证结果。极力建议实际去使用它而不要只是猛 K 文件,才有事半功倍的效用。(注:此段为废话。)
VIM 基本编辑
配合一般键盘上的功能键,像是方向键、[Insert] 、[Delete] 等等,现在你应该已经可以利用 VIM 来处理文字资料了。当然 VIM 还提供其他许许多多功能让文字的处理更形方便,有兴趣的看倌请继续。
在继续下去之前先来点 BCC 吧。电脑有许多厂牌,不同的硬体及作业系统。PC 也不是仅仅只有 IBM PC 及其相容品而已。事实上,包括键盘,终端机等等往往都有不同的规格。这代表什麽?
在文书编辑软体上会遇这样的问题,某些电脑的键盘上没有特定的几个功能键!那麽不就有某些功能不能用了?这个问题在 Unix 系统上也一样,几乎各大电脑厂商都有自己的 Unix 系统,而 VIM 的操作方法也会随之有点出入。我们固然可以用 PC 的键盘来说明 VIM 的操作,但是还是得提一下这个问题。
删除与修改
何谓编辑?在这里我们认为是文字的新增修改以及删除,甚至包括文字区块的搬移、复制等等。这里先介绍 VIM 的如何做删除与修改。(注意:在 VIM 的原始观念里,输入跟编辑是两码子事。编辑是在指令模式下操作的,先利用指令移动光标来定位要进行编辑的地方,然后才下指令做编辑。)
x 删除光标所在字元。
dd 删除光标所在的列。
r 修改光标所在字元,r 后接著要修正的字元。
R 进入取代状态,新增资料会覆盖原先资料,直到按 [ESC] 回到指令模式下为止。
s 删除光标所在字元,并进入输入模式。
S 删除光标所在的列,并进入输入模式。
其实呢,在 PC 上根本没有这麽麻烦!输入跟编辑都可以在输入模式下完成。例如要删除字元,直接按 [Delete] 不就得了。而插入状态与取代状态可以直接用 [Insert] 切换,犯不著用什麽指令模式的编辑指令。不过就如前面所提到的,这些指令几乎是每台终端机都能用,而不是仅仅在 PC 上。
在指令模式下移动光标的基本指令是 h, j, k, l 。想来各位现在也应该能猜到只要直接用 PC 的方向键就可以了,而且无论在指令模式或输入模式下都可以。多容易不是。
当然 PC 键盘也有不足之处。有个很好用的指令 u 可以恢复被删除的资料,而 U 指令则可以恢复光标所在列的所有改变。这与某些电脑上的 [Undo] 按键功能相同。
VIM 进阶应用
相信现在对於 VIM 应该已经有相当的认识。处理文字也不会有什麽麻烦才对。如果有兴趣善用 VIM 的其它功能进一步简化操作过程,不妨继续看下去。
移动光标
由於许多编辑工作是藉由光标来定位,所以 VIM 提供许多移动光标的方式,这个我们列几张简表来说明(这些当然是指令模式下的指令):
指令 说明 功能键
0 移动到光标所在列的最前面 HOME
$ 移动到光标所在列的最后面 END
^d 向下半页
^f 向下一页 PageDown
^u 向上半页
^b 向上一页 PageUp
指令 说明
H 移动到视窗的第一列
M 移动到视窗的中间列
L 移动到视窗的最后列
b 移动到下个字的第一个字母
w 移动到上个字的第一个字母
e 移动到下个字的最后一个字母
^ 移动到光标所在列的第一个非空白字元
指令 说明
n- 减号移动到上一列的第一个非空白字元
n+ 加号移动到下一列的第一个非空白字元
nG 直接用数字 n 加上大写 G 移动到第 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 个段落
不要尝试背诵这些指令,否则后果自行负责。它们看起来又多又杂乱,事实上这是文字叙述本身的障碍。再强调一次,实际去使用它只要几次就可以不经大脑直接下达这些奇奇怪怪的指令,远比死记活背搞得模模糊糊强多了。(注:若真的不经大脑而误删资料与我无关。另,此段为废话。)
进阶编辑指令
这些编辑指令非常有弹性,基本上可以说是由指令与范围所构成。例如 dw 是由删除指令 d 与范围 w 所组成,代表删除一个字 d(elete) w(ord) 。
指令列表如下:
d 删除(delete)
y 复制(yank)
p 放置(put)
c 修改(change)
范围可以是下列几个:
e 光标所在位置到该字的最后一个字母
w 光标所在位置到下个字的第一个字母
b 光标所在位置到上个字的第一个字母
$ 光标所在位置到该列的最后一个字母
0 光标所在位置到该列的第一个字母
) 光标所在位置到下个句子的第一个字母
( 光标所在位置到该句子的第一个字母
} 光标所在位置到该段落的最后一个字母
{ 光标所在位置到该段落的第一个字母
说实在的,组合这些指令来编辑文件有一点点艺术气息。不管怎麽样,它们提供更多编辑文字的能力。值得注意的一点是删除与复制都会将指定范围的内容放到暂存区里,然后就可以用指令 p 贴到其它地方去,这是 VIM 用来处理区段拷贝与搬移的办法。
某些 VIM 版本,例如 Linux 所用的 elVIMs 可以大幅简化这一坨指令。如果稍微观察一下这些编辑指令就会发现问题其实是定范围的方式有点杂,实际上只有四个指令罢了。指令 v 非常好用,只要按下 v 键,光标所在的位置就会反白,然后就可以移动光标来设定范围,接著再直接下指令进行编辑即可。
对於整列操作, VIM 另外提供了更方便的编辑指令。前面曾经提到过删除整列文字的指令 dd 就是其中一个;cc 可以修改整列文字;而 yy 则是复制整列文字;指令 D 则可以删除光标到该列结束为止所有的文字。
档案指令
档案指令多以 : 开头,跟编辑指令有点区别。例如前面提到结束编辑的指令就是 :q。现在就简单说明一下作为本篇故事的结尾:
:q 结束编辑(quit)
如果不想存档而要放弃编辑过的档案则用 :q! 强制离开。
:w 存档(write)
其后可加所要存档的档名。
可以将档案指令合在一起,例如 :wq 即存档后离开。
zz 功能与 :wq 相同。
另外值得一提的是 VIM 的部份存档功能。可以用 :n,mw filename 将第 n 行到第 m 行的文字存放的所指定的 filename 里去哩。时代在变,世界在变, VIM 也在变,不过大致上就这样。好了,但愿从此以后王子跟公主过著幸福快乐的生活。
:wq
新增 (append)
a 从光标所在位置后面开始新增资料,光标后的资料随新增资料向后移动。
A 从光标所在列最后面的地方开始新增资料。
插入 (insert)
i 从光标所在位置前面开始插入资料,光标后的资料随新增资料向后移动。
I 从光标所在列的第一个非空白字元前面开始插入资料。
开始 (open)
o 在光标所在列下新增一列并进入输入模式。
O 在光标所在列上方新增一列并进入输入模式。
也许文字叙述看起来有点繁杂,但是只要实际操作一下马上可以了解这些操作方式。实务很重要,尤其是电脑方面的东西随时可以尝试及验证结果。极力建议实际去使用它而不要只是猛 K 文件,才有事半功倍的效用。(注:此段为废话。)
VIM 基本编辑
配合一般键盘上的功能键,像是方向键、[Insert] 、[Delete] 等等,现在你应该已经可以利用 VIM 来处理文字资料了。当然 VIM 还提供其他许许多多功能让文字的处理更形方便,有兴趣的看倌请继续。
在继续下去之前先来点 BCC 吧。电脑有许多厂牌,不同的硬体及作业系统。PC 也不是仅仅只有 IBM PC 及其相容品而已。事实上,包括键盘,终端机等等往往都有不同的规格。这代表什麽?
在文书编辑软体上会遇这样的问题,某些电脑的键盘上没有特定的几个功能键!那麽不就有某些功能不能用了?这个问题在 Unix 系统上也一样,几乎各大电脑厂商都有自己的 Unix 系统,而 VIM 的操作方法也会随之有点出入。我们固然可以用 PC 的键盘来说明 VIM 的操作,但是还是得提一下这个问题。
删除与修改
何谓编辑?在这里我们认为是文字的新增修改以及删除,甚至包括文字区块的搬移、复制等等。这里先介绍 VIM 的如何做删除与修改。(注意:在 VIM 的原始观念里,输入跟编辑是两码子事。编辑是在指令模式下操作的,先利用指令移动光标来定位要进行编辑的地方,然后才下指令做编辑。)
x 删除光标所在字元。
dd 删除光标所在的列。
r 修改光标所在字元,r 后接著要修正的字元。
R 进入取代状态,新增资料会覆盖原先资料,直到按 [ESC] 回到指令模式下为止。
s 删除光标所在字元,并进入输入模式。
S 删除光标所在的列,并进入输入模式。
其实呢,在 PC 上根本没有这麽麻烦!输入跟编辑都可以在输入模式下完成。例如要删除字元,直接按 [Delete] 不就得了。而插入状态与取代状态可以直接用 [Insert] 切换,犯不著用什麽指令模式的编辑指令。不过就如前面所提到的,这些指令几乎是每台终端机都能用,而不是仅仅在 PC 上。
在指令模式下移动光标的基本指令是 h, j, k, l 。想来各位现在也应该能猜到只要直接用 PC 的方向键就可以了,而且无论在指令模式或输入模式下都可以。多容易不是。
当然 PC 键盘也有不足之处。有个很好用的指令 u 可以恢复被删除的资料,而 U 指令则可以恢复光标所在列的所有改变。这与某些电脑上的 [Undo] 按键功能相同。
VIM 进阶应用
相信现在对於 VIM 应该已经有相当的认识。处理文字也不会有什麽麻烦才对。如果有兴趣善用 VIM 的其它功能进一步简化操作过程,不妨继续看下去。
移动光标
由於许多编辑工作是藉由光标来定位,所以 VIM 提供许多移动光标的方式,这个我们列几张简表来说明(这些当然是指令模式下的指令):
指令 说明 功能键
0 移动到光标所在列的最前面 HOME
$ 移动到光标所在列的最后面 END
^d 向下半页
^f 向下一页 PageDown
^u 向上半页
^b 向上一页 PageUp
指令 说明
H 移动到视窗的第一列
M 移动到视窗的中间列
L 移动到视窗的最后列
b 移动到下个字的第一个字母
w 移动到上个字的第一个字母
e 移动到下个字的最后一个字母
^ 移动到光标所在列的第一个非空白字元
指令 说明
n- 减号移动到上一列的第一个非空白字元
n+ 加号移动到下一列的第一个非空白字元
nG 直接用数字 n 加上大写 G 移动到第 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 个段落
不要尝试背诵这些指令,否则后果自行负责。它们看起来又多又杂乱,事实上这是文字叙述本身的障碍。再强调一次,实际去使用它只要几次就可以不经大脑直接下达这些奇奇怪怪的指令,远比死记活背搞得模模糊糊强多了。(注:若真的不经大脑而误删资料与我无关。另,此段为废话。)
进阶编辑指令
这些编辑指令非常有弹性,基本上可以说是由指令与范围所构成。例如 dw 是由删除指令 d 与范围 w 所组成,代表删除一个字 d(elete) w(ord) 。
指令列表如下:
d 删除(delete)
y 复制(yank)
p 放置(put)
c 修改(change)
范围可以是下列几个:
e 光标所在位置到该字的最后一个字母
w 光标所在位置到下个字的第一个字母
b 光标所在位置到上个字的第一个字母
$ 光标所在位置到该列的最后一个字母
0 光标所在位置到该列的第一个字母
) 光标所在位置到下个句子的第一个字母
( 光标所在位置到该句子的第一个字母
} 光标所在位置到该段落的最后一个字母
{ 光标所在位置到该段落的第一个字母
说实在的,组合这些指令来编辑文件有一点点艺术气息。不管怎麽样,它们提供更多编辑文字的能力。值得注意的一点是删除与复制都会将指定范围的内容放到暂存区里,然后就可以用指令 p 贴到其它地方去,这是 VIM 用来处理区段拷贝与搬移的办法。
某些 VIM 版本,例如 Linux 所用的 elVIMs 可以大幅简化这一坨指令。如果稍微观察一下这些编辑指令就会发现问题其实是定范围的方式有点杂,实际上只有四个指令罢了。指令 v 非常好用,只要按下 v 键,光标所在的位置就会反白,然后就可以移动光标来设定范围,接著再直接下指令进行编辑即可。
对於整列操作, VIM 另外提供了更方便的编辑指令。前面曾经提到过删除整列文字的指令 dd 就是其中一个;cc 可以修改整列文字;而 yy 则是复制整列文字;指令 D 则可以删除光标到该列结束为止所有的文字。
档案指令
档案指令多以 : 开头,跟编辑指令有点区别。例如前面提到结束编辑的指令就是 :q。现在就简单说明一下作为本篇故事的结尾:
:q 结束编辑(quit)
如果不想存档而要放弃编辑过的档案则用 :q! 强制离开。
:w 存档(write)
其后可加所要存档的档名。
可以将档案指令合在一起,例如 :wq 即存档后离开。
zz 功能与 :wq 相同。
另外值得一提的是 VIM 的部份存档功能。可以用 :n,mw filename 将第 n 行到第 m 行的文字存放的所指定的 filename 里去哩。时代在变,世界在变, VIM 也在变,不过大致上就这样。好了,但愿从此以后王子跟公主过著幸福快乐的生活。
:wq
----------------------------------------
- 进入vi的命令
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename....filename :打开多个文件,依次编辑
移动光标类命令
h :光标左移一个字符
l :光标右移一个字符
space:光标右移一个字符
Backspace:光标左移一个字符
k或Ctrl+p:光标上移一行
j或Ctrl+n :光标下移一行
Enter :光标下移一行
w或W :光标右移一个字至字首
b或B :光标左移一个字至字首
e或E :光标右移一个字j至字尾
) :光标移至句尾
( :光标移至句首
}:光标移至段落开头
{:光标移至段落结尾
nG:光标移至第n行首
n+:光标下移n行
n-:光标上移n行
n$:光标移至第n行尾
H :光标移至屏幕顶行
M :光标移至屏幕中间行
L :光标移至屏幕最后行
0:(注意是数字零)光标移至当前行首
$:光标移至当前行尾
屏幕翻滚类命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。
插入文本类命令
i :在光标前
I :在当前行首
a:光标后
A:在当前行尾
o:在当前行之下新开一行
O:在当前行之上新开一行
r:替换当前字符
R:替换当前字符及其后的字符,直至按ESC键
s:从当前光标位置处开始,以输入的文本替代指定数目的字符
S:删除指定数目的行,并以所输入文本代替之
ncw或nCW:修改指定数目的字
nCC:修改指定数目的行
删除命令
ndw或ndW:删除光标处开始及其后的n-1个字
do:删至行首
d$:删至行尾
ndd:删除当前行及其后n-1行
x或X:删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u:删除输入方式下所输入的文本
搜索及替换命令 :
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
:s/p1/p2/g:将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换
选项设置
all:列出所有选项设置情况
term:设置终端类型
ignorance:在搜索中忽略大小写
list:显示制表位(Ctrl+I)和行尾标志($)
number:显示行号
report:显示由面向行的命令修改过的数目
terse:显示简短的警告信息
warn:在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:允许在搜索模式中,使用前面不带“/”的特殊字符
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
mesg:允许vi显示其他用户用write写到自己终端上的信息
最后行方式命令
:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d :将n1行到n2行之间的内容删除
:w :保存当前文件
:e filename:打开文件filename进行编辑
:x:保存当前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:执行shell命令command
:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指
定n1,n2,则表示将整个文件内容作为command的输入
:r!command:将命令command的输出结果放到当前行。
Vim
(
Vi Improved)
是一个类似于
vi
的文本编辑器,在
Vi
的基础上增加了很多新的特性和功能。
Vim
以其强大的功能和可定制能力,成为
Linux/Unix
环境下开源的最重要的编辑器之一(另一个是
Emacs
),被众多开发者所喜爱。笔者此时所用的是最新的
7.1
版本。
与大部分其它编辑器不同,进入
Vim
后,缺省状态下键入的字符并不会插入到所编辑的文件之中。
Vim
的模式(
mode
,可以简单地理解为
“
状态
”
)概念非常重要。需要知道,
Vim
有以下几个模式:
1)
正常(
normal
)模式,缺省的编辑模式;下面如果不加特殊说明,提到的命令都直接在正常模式下输入;任何其它模式中都可以通过键盘上的
Esc
键回到正常模式。
2)
命令(
command
)模式,用于执行较长、较复杂的命令;在正常模式下输入
“:”
(一般命令)、
“/”
(正向搜索)或
“?”
(反向搜索)即可进入该模式;命令模式下的命令要输入回车键(
Enter
)才算完成。
3)
插入(
insert
)模式,输入文本时使用;在正常模式下键入
“i”
(
insert
)或
“a”
(
append
)即可进入插入模式(也有另外一些命令,如
“c”
,也可以进入插入模式,但这些命令有其它的作用)。
4)
可视(
visual
)模式,用于选定文本块;可以在正常模式下输入
“v”
(小写)来按字符选定,输入
“V”
(大写)来按行选定,或输入
“Ctrl-V”
来按方块选定。
5)
选择(
select
)模式,与普通的
Windows
编辑器较为接近的选择文本块的方式;在以可视模式和选择模式之一选定文本块之后,可以使用
“Ctrl-G”
切换到另一模式
——
该模式很少在
Linux
上使用,本文中就不再介绍了。
u 设置vim语法高亮显示和自动缩进
二、接下来设置
vim
的配置文件
1
、配置文件的位置
在目录
/etc/
下面,有个名为
vimrc
的文件,这是系统中公共的
vim
配置文件,对所有用户都有效。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:
“
.
vimrc
”
。例如,
/root
目录下,通常已经存在一个
.
vimrc
文件。
2
、设置语法高亮显示
1)
打开
vimrc
,添加以下语句来使得语法高亮显示:
syntax on
2)
如果此时语法还是没有高亮显示,那么在
/etc
目录下的
profile
文件中添加以下语句:
export TERM=xterm-color
3
、设置
Windows
风格的
C/C++
自动缩进(添加以下
set
语句到
vimrc
中)
1
)
设置(软)制表符宽度为
4
:
set tabstop=4
set softtabstop=4
2
)
设置缩进的空格数为
4
set shiftwidth=4
3
)
设置自动缩进
:即每行的缩进值与上一行相等;使用
noautoindent
取消设置:
set autoindent
4
)
设置
使用
C/C++
语言的自动缩进方式:
set cindent
5
)设置
C/C++
语言的具体缩进方式(以我的
windows
风格为例):
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
6
)如果想在左侧显示文本的行号,可以用以下语句:
set nu
7
)最后,如果没有下列语句,就加上吧:
if &term=="xterm"
set t_Co=8
set t_Sb=^[[4%dm
set t_Sf=^[[3%dm
endif