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