Linux 基础之文本编辑 vim

本文介绍 vim(版本 7.4) 的一般用法

vim 是功能强大的文本编辑器,是 vi 的增强版。

1
vim [options] [file ..]

使用 vim 编辑一个文件的最常用命令就是:

1
vim file

其中 file 可以是一个新文件,也可以是原有文件。这样的命令执行后将打开编辑器,显示文件 file 的内容。如图所示:

如果是一个新文件,底部左边会显示 “file” [新文件] 的字样,右边显示 0,0-1 表示当前光标所在行数和字符数。如果打开的是一个老文件,底部左边显示 “file” 3L, 66C 字样,表示文件名,当前光标所处行号,文件总字节数。文件中没有字符的地方会以字符~ 开头。

现在还不能进行编辑,vim 编辑文件有几种模式,当前所处模式是普通模式,可以移动光标、执行复制粘贴等命令;另外还有两种常用模式:插入模式和底行模式。
开始进入的一般都是普通模式,按如下键将进入插入模式:

  • a 在光标所在位置下一个字符开始输入
  • A 在光标所在行尾开始输入
  • i 在光标所在位置开始输入
  • I 在光标所在行首开始输入
  • o 在光标所在行下新增一行,并在新增行行首开始输入
  • O 在光标所在行上新增一行,并在新增行行首开始输入

进入插入模式后,底部会出现 – 插入 – 字样;这时就可以在光标位置进行输入了。从插入模式退回到普通模式按 ESC 键。

在普通模式按如下键将进入底行模式:

  • : 执行命令
  • / 正向搜索
  • ? 反向搜索

从底行模式退回到普通模式需按两次 ESC 键

底行模式执行: q(quit) 表示退出编辑器,如果对文件内容进行过更改,需要执行: wq(write quit) 来保存退出;如果不保存退出则需要执行: q! 强制退出;强制保存退出为: wq!。

下面列出一些在普通模式下可以执行的命令及它们的作用:

  1. 文本修改:
    • . 重复上一个命令
    • x 删除光标位置的字符
    • d 从光标处开始剪切
    • dd 剪切光标所在位置的整行 (保存在临时缓冲区)
    • ndd n 为数字,表示从当前行开始,从上到下剪切 n 行
    • p 将缓冲区中的内容放到当前行之下
    • np n 是数字,相当于执行 n 次 p 命令
    • P 将缓冲区中的内容放到当前行之上
    • y 从光标处开始复制
    • yy 复制当前行 (保存在临时缓冲区)
    • nyy n 为数字,表示从当前行开始,从上到下复制 n 行
    • r 替换光标所在位置的一个字符
    • R 从光标位置开始替换,并进入文本输入模式 (ESC 退出)
    • u 撤销上一次操作
    • ZZ 保存退出
  2. 移动光标:
    • h 或左箭头键 光标向左移动一格
    • l 或右箭头键 光标向右移动一格
    • j 或下箭头键 光标向下移动一格
    • k 或上箭头键 光标向上移动一格
    • 0 光标移动到当前行开头
    • ^ 光标移动到当前行非空白字符 (如空格、tab 键等) 的开头
    • $ 光标移动到当前行结尾
    • g_ 光标移动到当前行非空白字符的结尾
    • w 光标移动到下一个单词的开头
    • e 光标移动到下一个单词的结尾
    • * 匹配光标所在单词,移动到下一个相同的单词
    • # 匹配光标所在单词,移动到上一个相同的单词
    • f{ 光标移动到当前行的下一个字符 {处,{可以换成其他字符
    • F} 光标移动到当前行的上一个字符} 处
    • t, 光标移动到当前行的下一个逗号之前一个字符处
    • T, 光标移动到当前行的上一个逗号之后一个字符处
    • % 移动到成对括号的另一半括号处,包括 () {} []. 需要先将光标移动到括号上。
    • gg 光标移动到文件第一行行首
    • G 光标移动到文件最后一行行首
    • 回车键 光标移动到下一行行首

这里只列出一部分,初学者也许会觉得太多,记不住。其实只要记住其中几个,就完全可以使用了;其他的作用大多是使你的操作更简便快捷。

vim 中的各种命令,大多可以组合使用:

  • 比如要删除光标当前所在位置一直到行尾,可以执行 d$;
  • 比如要在当前位置插入 50 个‘word’,只需执行 50iword ESC 按完 ESC 键之后这 50 个单词就被插入了;
  • 比如要粘贴被复制的内容,但希望粘贴 5 次,则执行 5p;
  • 比如要再次执行上一次命令 5 次,则执行 5.;
  • 熟练使用这些命令将极大提高编写文件的速度。

在插入模式下 (普通模式按 a、i、o 等),输入一个单词的开头,然后按 CTRL-P 或 CTRL-N 就会自动补齐。

底行模式共三个开始字符 (:、/、?),其中 / 和? 用来匹配模式搜索:

如搜索文件内字符串 centos:

1
/centos

输入这个字符串之后按回车,vim 就会将所有匹配的字符串高亮显示,按下 n 键,光标就会跳到下一个匹配字符串处,按 N 键,光标就会跳到上一个匹配处。(想想 man 查询)
使用? 和 / 的作用相同,不过是方向相反。

: 可以执行许多命令,如前面介绍过的保存退出命令: wq。下面介绍部分底行模式命令:

  • :set nu 显示行号
  • :set nonu 隐藏行号
  • :r file - 读取文件 file 内容并写入当前编辑的文件中,内容从光标当前位置下一行开始插入。
  • :w file 将当前编辑的内容写入一个新文件 file 中。
  • :s /pattern/string/ 将匹配 pattern 的字符串替换成 string
  • :x 作用和: wq 相同,保存并退出。
  • :! command 暂时离开 vim 并执行 shell 命令 command。
  • :help 查看帮助
  • :.= 显示当前行号
  • := 显示总行数
  • :n 移动光标到第 n 行行首

这些命令也可以组合如执行 shell 命令并将结果写入当前行的下一行:

1
:r!ls -l

还能组合其他模式下的命令如替换当前行所有匹配模式的字符串:

1
:s/pattern/string/g # g 表示全局

如替换本文件中所有匹配模式的字符串:

1
:%s/pattern/string/g # % 表示所有行

如替换指定行的匹配字符串:

1
:n,ms/pattern/string/g

这里 n 和 m 都是数字,代表行号。可以用点号. 代表当前行

如删除当前行到第五行的内容:

1
:.,5d

当当前行处于第五行以下时,会有反向删除的提示。

正则表达式

使用 /pattern 和: s/pattern/string 时,pattern 是一个正则表达式,用来匹配一个字符串的模式。

正则表达式和之前介绍的通配符 (基础命令介绍二) 有一些相似的地方,但要注意区分两者的不同。

通配符主要是用于对文件名的匹配,正则表达式不仅可以用于匹配文件名,事实上,它可以进行任何字符串的匹配。它要比通配符更通用,大多数编程语言和一些工具中 (如 vim、grep、awk、sed) 都有对正则表达式的直接支持。

下面介绍一部分将要用到的正则表达式的概念和用法:

  1. 匹配位置:
    • ^ 表示行开头
    • $ 表示行结尾
    • < 表示单词开头
    • > 表示单词结尾
  2. 匹配字符:
    • . 表示匹配任意单个字符 (相当于通配符中的?)
    • […] 表示匹配括号内任意单个字符
    • [^…] 表示匹配任意一个非列出字符 #参照通配符描述
    • \a 匹配英文字符,等同于 [a-zA-Z] 或[[:alpha:]]。
    • \A 匹配非英文字符,等同于 [^a-zA-Z]。
    • \d 匹配数字,等同于 [0-9] 或[[:digit:]]。
    • \D 匹配非数字,等同于 [^0-9]。
    • \x 匹配十六进制数字,等同于 [0-9A-Fa-f] 或[[:xdigit:]]。
    • \X 匹配非十六进制数字,等同于 [^0-9A-Fa-f]。
    • \w 匹配单词,等同于 [0-9A-Za-z_]。
    • \W 匹配非单词,等同于 [^0-9A-Za-z_]。
    • \t 匹配 TAB 字符。
    • \s 匹配空白字符,等同于 [\t] 或[[:blank:]]。
    • \S 匹配非空白字符,等同于 [^ \t]。
    • \u 匹配大写字母,等同于 [A-Z] 或[[:upper:]]。
    • \U 匹配非大写字母。
    • \n 匹配换行
    • \r 匹配回车
    • (…) 匹配并捕获,用 \ 1 \2 \3 … 来引用被捕获的字符串。
    • | 表示逻辑或
  3. 匹配数量:
    • * 表示匹配前一个字符零到任意多次,相当于 {0,}。
    • + 表示匹配前一个字符一到任意多次,相当于 {1,}。
    • ? 表示匹配前一个字符零到一次,相当于 {0,1}。# 注意和通配符? 的区别
    • {n,m} 表示匹配前一个字符 n 到 m 次。

在使用正则表达式时,有时需要在特殊字符之前加上转义字符 “\” 来使特殊字符表示它的字面意思而不是它的特殊意义,在特定的工具中使用正则时,也需要这样做来避免特殊字符被工具本身解释。

vim 在使用如下正则表达式时需要将特殊字符转义:\<…\>、\{n,m}、\(…\)、\?、\+、\| 下面结合正则举例说明 vim 中模式匹配及部分命令用法

匹配字符串 world 并使光标停留在匹配行后第三行行首:

1
/world/+3

将第三行到第八行行首添加注释符号 //:

1
:3,8s/^/\/\//

注意这里的行首符 ^ 和转义符’\’的用法

如:

1
:%g/^\sxyz/normal dd

此命令作用是全局匹配以空白后接 xyz 开头的行,并执行普通模式下的命令 dd

如匹配 6 个以上的小写字母:

1
/\a\{6,}

如交换冒号: 两侧的字符串:

1
:s/\(.*\):\(.*\)/\2:\1/ #注意这里是如何引用之前匹配的分组的

如将所有 tag、tog 和 tug 分别改为 hat、hot 和 hut

1
:%s/t\([aou]\)g/h\1t/g

如匹配 hello 或 world 两个单词:

1
/\<hello\>\|\<world\>

这里只列出部分 vim 用到的正则表达式,关于正则的更多内容,以后的文章中还会有描述和举例。

vim编辑器是很强大的,这里只描述了部分初级使用方法。vim还能使用视图模式,编辑多文本,设置键盘映射,多剪贴板,录制宏,使用插件等等。完全可以用vim作为IDE来使用。但相对来说,vim的学习曲线比较陡峭,不同的应用场景,需要记忆的命令和方法数量也是完全不同的。建议在学习中,每次只熟悉几个命令,一段时间后,就能流畅快捷的编辑文本了。

热评文章