1 vi 与 vim

vi 是一款文本编辑器。所有 Unix Like 系统都有 vi ,而且很多软件的编辑接口会主动呼叫 vi 。

vim 是 vi 的进阶版本,它是一款程序编辑器,支持语法高亮。

大部分发行版都用 vim 取代 vi 了,这表示当你使用 vi 这个指令时,其实就是执行 vim 。

2 vi 的使用

vi 有三种模式,一般模式可以复制、粘贴、删除、查找,命令模式可以替换、设置、保存、关闭,编辑模式可以插入、覆盖。命令模式 [Esc] 退出切回一般模式,编辑模式 [Esc] 退出切回一般模式,命令模式与编辑模式之间不能直接切换。

2.1 一般模式

2.1.1 光标移动

除常规的上下左右方向键外,右手基本键位 hjkl 也可以用来移动光标,与数字组合能实现长距离移动。例如向下移动 30 行,依次按下 30j 或 30↓ 。空格用于向后移动字符,例如向后移动 20 个字符,依次按下 20(空格) 。回车用于向下移动行,例如向后移动 G 可以跳转到指定行,例如跳转到第 20 行,依次按下 20G 。若没有前缀数字则直接跳转到末行。 0 和 $ 用于行内跳转,分别跳转到行首和行尾。

2.1.2 复制、粘贴、删除、剪切

复制、粘贴、删除是基本操作,剪切只是三者的串联。在学习之前先了解一下撤销 u 与重做 [Ctrl]+r ,以便对比操作前后的情形。

复制的基本键位是 y ,后面可以接 G 0 $ 等方位符号,且支持方位符号的数字前缀。 当使用方位符号 G 时,复制内容包含光标所在行。 粘贴的基本键位是 p ,不支持方位符号。 粘贴内容会插在光标所在行和下一行之间。

vi 剪贴板是独立的,不能粘贴系统剪贴版里的内容!

删除有两个基本键位, x 用于删除字符, d 用于删除行。注意小写 x 是向后删除,相当于 delete ,大写 X 才是向前删除,相当于 backspace 。 x 支持数字前缀,但不支持方位符号。 d 的用法与复制类似,支持方位符号和方位符号的数字前缀。

yy 复制光标所在行, dd 删除光标所在行,两者均支持数字前缀。

2.1.3 查找

查找的操作只有四个,即 /word 向下查找 word , ?word 向上查找 word , n 继续查找(方向与上一次查找相同), N 继续查找(方向与上一次查找相反)。

替换呢?替换不属于一般模式,在命令模式里。

2.1.4 重复操作

重复操作的基本键位只有一个,就是小数点 .

2.2 命令模式

2.2.1 替换

替换比查找复杂些,其基本形式为 s/word1/word2/g ,它表示用 word2 替换 光标所在行 的 word1 。如果是替换任意区间的字符串,那么就需要使用完整形式 n1,n2s/word1/word2/g ,其中 n1 与 n2 均为行号,例如全局替换运行 1,$s/word1/word2/g 。有时为了保证正确性,还会在命令末尾加上 c ,如 1,$s/word1/word2/gc ,这样在每次替换前,用户都有一次确认的机会。

2.2.2 设置

查看所有设置的命令是 :set all 。只查看非默认设置的命令是 :set:set nu 显示行号, :set nonu隐藏行号。其它设置不必记忆。

2.2.3 保存、关闭

常用的保存与关闭命令是 w 和 q 两个键位的组合, :w 表示保存, :q 表示关闭, :q! 表示不保存并关闭, :wq 表示保存并关闭, :wq! 表示强制保存并关闭。另存为只需在 :w 后追加新文件名。

2.3 编辑模式

在一般模式下,按 i 进入编辑模式。编辑模式有插入模式和覆盖模式两种,不建议使用覆盖模式。

在 vi 里面, tab 所得到的结果与空格所得到的结果是不一样的!

3 vim 的额外功能

3.1 区块选择

区块选择的基本键位只有一个 v ,大 V 选择行,小 v 选择字。 [Ctrl]+v 还能拉对角线选择!

对于选择的区块,按 y 复制,按 d 删除。

3.2 文档多开

上文说过, vi 剪贴板是独立的,不能粘贴系统剪贴版里的内容! 如果要将一个文档的内容复制到另一个另一个文档里去,该怎么办呢?这时我们就需要文档多开功能。执行 :open filename 打开新文档,执行 :e filename 后台打开新文档。

文档切换的命令较多,常用的有 [Ctrl] + 6 (实际是指符号 ^ )返回上一个文档,在命令模式下可以使用 :n:N 逐个切换。当文档数量较多时,可以先用 :files 查看文档列表,再用 :b filenumber 直接跳转到该文档。

3.3 窗口多开

窗口多开是另一种多开方式,它的优势是便于对比,既能对比多个文档,又能对比同一文档的多个位置。

分割窗口的方式有两种,上下水平分割 :sp filename ,左右垂直分割 :vsp filename ,文档序号在这里没法用。如果没有指定要打开的文档,那么 vim 会再打开一次当前文档。 再次提醒:分割的是窗口,不是文档!

[Ctrl] + w + 上下左右方向键 可以切换窗口。

4 注意事项

4.1 字符编码

iconv -f big5 -t utf8 filename

4.2 行尾符

Dos 的行尾符是 CRLF(\r\n) 即 ^M$ , Linux 的行尾符是 LF(\n) 即 $ 。

unix2dos -k filename
dos2unix -k filename