不管你有多少文件要编辑,你都可以在Vim在处理它们。可以定义一个要编辑的文件列表, 从一个文件转到另一个文件, 也可以在不同文件之间复制粘贴。
a、编辑另一个文件
b、文件列表
c、切换到另一文件
d、备份
e、在文件间复制粘贴
f、 查看文件
g、更改文件名
编辑另一个文件:
目前为止我们使用Vim的方式还是为每一个要编辑的文件运行一次Vim。 这是最简单的用法。
:edit foo.txt
可以在当前Vim中开始编辑另一个文件。 当然你可以用任何文件名来替代"foo.txt"。 Vim会关闭当前正在编辑的文件打开指定的新文件进行编辑,如果当前文件还有未存盘的内容, Vim会显示如下的错误消息同时也不会打开另一个文件:
E37: No write since last change (use ! to override)
此时,你可以有几种选择,你可以保存该文件:
:write
或者你可以强制Vim丢弃当前未保存的修改并开始编辑新的文件,使用强制执行修饰符:
:edit ! foo.txt
如果你想编辑另一个文件, 但又不想保存当前文件中的改动, 你可以使它变为一个隐藏的缓冲区:
:hide edit foo.txt
文件列表:
你可以在启动Vim时就指定要编辑多个文件, 如:
vim one.c two.c three.c
该命令启动Vim并告诉它你要编辑3个文件,Vim将在启动后只显示第一个文件。完成该文件的编辑后, 可以以命令:
:next
开始下一个文件的编辑,如果你的当前文件中有未存盘的内容, 你会象前面一样得到一个错误消息,“:next"命令也不会继续, 这与前面提到的":edit"命令一样, 要放弃这些改动,用:
:next!
但多数情况下人们还是要保存工作成果并继续下一个文件的编辑.有一个命令合并了这个过程:
:wnext
这个命令完成以下两个单独命令的工作:
:write
:next
当前在编辑哪个文件?
可以通过查看窗口的标题条得知你当前正在编辑的文件名,应该也会同时显示出象"(2 of 3)"这样的信息。这意味着你正是编辑一个由3个
文件组成的文件列表中的第2个。
如果你想查看整个列表中就有哪些文件,使用命令:
:args
这是"arguments"的简写形式, 输出结果形如:
one.c [two.c] three.c
这就是你启动Vim时指定的要编辑的文件列表,你当前正在编辑的那一个文件将会以方括号括起来。
移到另一个文件:
要回到前一个文件:
:previous
就跟":next"命令一样, 不过它是朝向另一个文件。同样有一个对应的快捷方式命令:
:wprevious
要移到最后一个文件:
:last
到第一个:
:first
不过没有":wlast"或者":wfirst"这样的命令。
你也可以在":next"和":previous"命令前面使用一个命令计数, 要向前跳过2个文件:
:2next
自动存盘
当你在不同文件之间转移时, 你必需记住用":write"命令来存盘.否则就会得到一个错误消息. 如果你确定自己每次都是要保存文件, 就可以告诉Vim每当需要时就自动保存文件, 不必过问:
:set autowrite
如果你正在编辑一个不希望它被自动保存的文件, 还可以把该选项关闭:
:set noautowrite
编辑另一个文件列表:
不用重新启动Vim, 你就可以重新定义一个文件列表. 下面的命令定义了要编辑3个文件:
:args five.c six.c seven.h
或者用一个通配符, 就象在shell使用通配符一样:
:args *.txt
Vim会打开列表中的第一个文件. 同样, 如果当前文件被改动但没有存盘, 你需要先保存当前的文件, 或者用":args!"(加了一个!)放弃当前文件中未存盘的内容.
你编辑过最后一个文件了吗?
当你有一个列表的文件要编辑时, Vim假设你要全部编辑它们. 为防止你漏掉某些文件过早地退出, Vim会在你没有编辑过最后一个文件就想退出时给出一个错误信息:
E173: 46 more files to edit
如果你确定要退出, 只要再执行一次退出命令. 这次可以真正退出了(但是不要在这两次执行同样的命令中间再做其它操作)
切换到另一文件:
要在两个文件间快速切换, 使用CTRL-^(在美语键盘上^位于字母键区的6上). 如:
:args one.c two.c three.c
当前编辑的文件是one.c。
:next
现在变成two.c了. 使用CTRL-^可以让你再回到one.c. 再执行一次CTRL-^又会再转到two.c 如此循环, 如果你执行的是:
:next
现在你会转到three.c. 注意CTRL-^命令并不改变当前你在文件列表中的位置, 只有命令":next"和":previous"才会引起此位置的变化.
你上一个编辑的文件叫"alternate"文件. 所以刚进入Vim时就用这个命令的话它就无事可做, 因为你还没有编辑过任何其它的文件.
在文件间复制粘贴:
本节讲述如何在不同文件之间复制内容, 我们以一个简单的例子开始. 首先编辑你希望从中复制内容的文件. 将光标移到某处文件并按下"v". 该命令将开始Visual模式. 现在把光标移到要复制文件的末尾按下"y". 该命令将yanks(复制)被选择的内容.
要复制上面这一段的话, 你要做的是
:edit thisfile
/This
vjjjj$y
现在开始编辑你希望把复制的内容放入其中的文件. 把光标置于你希望复制内容的地方, 用"p"把此前复制的内容粘贴到这里.
:edit otherfile
/There
p
当然你可以用其它的命令来yank要复制的内容. 比如用"V"命令进入Visual模式整行整行地选择文本. 或者用CTRL-V来选择一个矩形块的内容. 或者用"Y"选择当前行单行的内容, 用"yaw"来yank-a-word, 等等.
"p"命令将把复制的内容放到光标之后. "P"则可以把要复制的内容放在光标之前. 注意Vim会知道你复制的内容是整行的内容还是一个矩形块, 粘贴这些内容时也会采用相应的方式.
向文件中追加内容
要把多行文本收集到一起写入一个文件, 可以用命令:
:write >> logfile
这将会把当前文件的内容追加到文件"logfile". 这样做避免了你使用前面的方法去复制内容, 编辑log文件. 这样可以省去两个环节. 但它
的局限是只能在文件的最后追加内容.要想只追加几行的内容到文件中去, 可以在使用命令":write"之前先在Visual模式下选定要写入的内容. 在第10章你会了解其它选择文本行的
办法.
查看文件:
有时候你只想查看文件的内容而已, 并不会向其中写入什么东西. 但不假思索就用":w"可会招致覆盖原始文件的风险. 要避免这种错误, 可以以只读方式编辑文件.
下面的命令以只读方式运行Vim:
vim -R file
现在你将在只读模式编辑"file",此时尝试用":w"会招来一个错误消息告诉你该文件不能被保存.
如果你尝试修改这个文件的话也会得到一个警告消息:
W10: Warning: Changing a readonly file
不过你还是可以做出修改. 这样人们可以为了方便浏览起见格式化该文件.
如果你改动了该文件但忘了它是只读的, 你还是可以保存该文件.在":write"命令之后使用!强制执行修饰符1.
如果是想强制性地避免对文件进行修改, 可以用命令:
vim -M file
这样每个修改文件的尝试都会失败. 帮助文件就是这样, 比如, 你试着去修改帮助文件时会看到这样的错误信息:
E21: Cannot make changes, °modifiable° is off
你可以用-M选项告诉Vim工作在viewer模式. 这都是表明你自愿如此, 毕竟下面的命令还是可以去掉这层保护:
:set modifiable
:set write
更改文件名:
编辑一个新文件的最好办法是以一个内容相似的文件为基础进行修改. 比如, 你要写一个移动文件的程序. 同时你已经有了一个可以复制文件的程序, 你可以这样开始:
:edit copy.c
你可以删除其中不需要的部分. 现在可以把它存成一个新文件了.":saveas" 命令正好可堪此任:
:saveas move.c
Vim会以给定的文件名保存当前缓冲区中的内容, 同时开始编辑该文件. 这样下次你再用":write"命令的话, 它就是存成"move.c", 而"copy.c"还保持原来的内容.
如果你想改变当前正在编辑的文件名, 但不想保存该文件, 就可以用命令:
:file move.c
Vim将把该文件标记为"not edited". 这意味着Vim知道这不是你进入Vim时开始编辑的文件. 你保存该文件时就会收到这样的错误信息:
E13: File exists (use ! to override)
这可以保护你意外地覆盖了其它文件.