在很久很久以前,计算机的运算能力还很弱,终端与主机的通信也不好。在没有显示器的时代,只能通过电传打字机跟主机通信。那时候只有行编辑器,编辑的时候只能在一行中进行。需要显示哪一行,就把哪一行或者哪几行打印出来看。 Unix上使用的行编辑器是ed. 这个编辑器至今仍然在Unix/Linux/FreeBSD各系统中存在。 ed的增强版是ex. ex最大增强之处就是提供了可以全屏编辑的模式。在ex中输入:visual命令,就会切换到全屏编辑模式。好吧,这就是vi。Vi本质上就是ex编辑器的visual模式。在Linux中,ex被链接到vim上。
ex命令的最直观特点就是以冒号开头,比如我们熟悉的:q命令。 行编辑器虽然不流行已经很久了,但是ex做为vi的另一种模式,至今仍然发挥着作用。
基本上vim所有的编辑功能都提供了相应的ex命令。通过:help ex-cmd-index可以查看到这些ex命令的列表。我们写vimscript使用的功能,基本上都是ex命令。包括程序流程控制所用的:if命令,模拟正常模式下输入的:normal命令等。
前面讲了这么多历史沉钩,是希望大家能够切换一下思路。即使是在vi模式下执行ex命令,它们仍然是行编辑器的模式。也就是默认的大部分命令只对当前行有效,如果想要跨行,必须指定行号。
ex命令的一般模式是:[行地址]命令
行地址有三种指定的方法: * 直接指定行号: * 1表示第一行 * 3,5表示第3行到第5行 * 采用特殊变量表示 * .点号表示当前行 * $表示最后一行 * %表示每一行 * +n, 当前行开始向前数第n行,n省略则为1 * -n, 当前行向后数第n行,n省略则为1 * 利用搜索来定位行 /
例:将本行和上下两行一起复制到整个文件之前
:-,+t0文件操作跟文本无关,visual模式不再有优势,这时ex命令反而成为主力了。
:w 缓冲区写到文件:q 退出vi:wq 写文件并退出:x 如果修改过则写文件并退出:r 文件名,将文件读入光标开始的位置:e 文件我,读入新文件C-^: 在多个文件间切换:w命令支持文件名做为参数。 :w命令还支持将部分行写入到文件,也可以添加到文件尾。 例:将当前行开始的10行写入test.txt中:
:.,+9w test.txt这一节要说的是对于写命令的时候,vim或者说ex能够提供的帮助。
C-w : 删除至单词开头C-v : 删除至行首C-r{寄存器} : 将寄存器的内容粘贴到命令行在vi模式下,ex命令可以用tab键进行自动补全。也可以通过Ctrl-d命令列出所有的可选项。
Vim有时候需要调用外部命令来实现任务。 - :!{命令}:执行命令 - :read !{命令}:执行命令,并把返回结果读入缓冲区 - :shell: 启动一个shell来执行外部命令