注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

vim 编辑多个文件  

2009-10-15 15:19:27|  分类: vim |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
来源:http://www.17xie.com/read-58481.html

无论你有多少个文件,你都可以同时编辑它们而不需要退出 Vim。本章介绍如何定义一个
文件列表,并基于这个列表工作,或者从一个文件跳转到另一个文件,又或者从一个文件
中拷贝文字,并写入到另一个文件中。


*07.1* 编辑另一个文件

在本章前,你都是为每一个文件启动一次 Vim 的。实际上还有其它办法。如下命令就可 以在 Vim 中打开另一个文件: de<de< de< :edit foo.txtde< de<de< 你可以用任何其它文件名取代上面的 "foo.txt"。Vim 会关闭当前文件并打开另一个。但 如果当前文件被修改过而没有存盘, Vim 会显示错误信息而不会打开这个新文件: de< E37: No write since last change (use ! to override) de< (de<译者注de<:在中文状态下显示: de< E37:已修改但尚未保存 (可用 ! 强制执行) de< ) de<备注de<: Vim 在每个错误信息的前面都放了一个错误号。如果你不明白错误信息的意思, 可以从帮助系统中获得更详细的说明。对本例而言: de<de< de< :help E37de< de<de< 出现上面的情况,你有多个解决方案。首先你可以通过如下命令保存当前文件: de<de< de< :writede< de<de< 或者,你可以强制 Vim 放弃当前修改并编辑新的文件。这时应该使用强制修饰符 ! : de< :edit! foo.txtde< de<de< 如果你想编辑另一个文件,但又不想马上保存当前文件,可以隐藏它: de< :hide edit foo.txtde< de<de< 原来的文件还在那里,只不过你看不见。这将在 "|22.4|: 缓冲区列表" 中解释。

*07.2* 文件列表

你可以在启动 Vim 的时候指定一堆文件。例如: de< vim one.c two.c three.cde< de<de< 这个命令启动 Vim 并告诉它你要编辑三个文件。Vim 只显示第一个。等你编辑完第一个 以后,用如下命令可以编辑第二个: de< :nextde< de<de< 如果你在当前文件中有未保存的修改,你会得到一个错误信息而无法编辑下一个文件。这 个问题与前一节执行 ":edit" 命令的问题相同。要放弃当前修改: de< :next!de< de<de< 但大多数情况下,你需要保存当前文件再进入下一个。这里有一个特殊的命令: de< :wnextde< de<de< 这相当于执行了两个命令: de< :writede< de< :nextde< de<de< de<de< 我 在 哪? 要知道当前文件在文件列表中的位置,可以de<注意de<一下文件的标题。那里应该显示类似 "(2 of 3)" 的字样。这表示你正在编辑三个文件中的第二个。 如果你要查看整个文件列表,使用如下命令: de< :argsde< de<de< 这是 "arguments" (参数) 的缩写。其输出应该象下面这样: de< one.c [two.c] three.c de< 这里列出所有你启动 Vim 时指定的文件。你正在编辑的那一个,例如,"two.c",会用中 括号括起。 移 动 到 另 一 个 参 数 要回到前一个文件: de< :previousde< de<de< 这个命令与 ":next" 相似,只不过它是向相反的方向移动。同样地,这个命令有一个快 捷版本用于 "保存再移动": de< :wpreviousde< de<de< 要移动到列表中的最后一个文件: de< :lastde< de<de< 而要移动到列表中的第一个文件: de< :firstde< de<de< 不过,可没有 ":wlast" 或者 "wfirst" 这样的命令了。 你可以在 ":next" 和 ":previous" 前面加计数前缀。例如要向后跳两个文件: de< :2nextde< de<de< de<de< 自 动 保 存 当你在多个文件间跳来跳去进行修改,你要老记着用 ":write" 保存文件。否则你就会得 到一个错误信息。 如果你能确定你每次都会将修改存盘的话,你可以让 Vim 自动保存文 件: de< :set autowritede< de<de< 如果你编辑一个你不想自动保存的文件,你可以把功能关闭: de< :set noautowritede< de<de< de<de< 编 辑 另 一 个 文 件 列 表 你可以编辑另一个文件列表而不需要退出 Vim。用如下命令编辑另三个文件: de< :args five.c six.c seven.hde< de<de< 或者使用通配符,就像在控制台上一样: de< :args *.txtde< de<de< Vim 会跳转到列表中的第一个文件。同样地,如果当前文件没有保存,你需要保存它,或 者使用 ":args!" (加了一个 !) 放弃修改。 你 编 辑 了 最 后 一 个 文 件 吗? *arglist-quit* 当你使用了文件列表,Vim 假定你想编辑全部文件,为了防止你提前退出,如果你还没有 编辑过最后一个文件。当你退出的时候,Vim 会给如下错误信息: de< E173: 46 more files to editde< de<de< 如果你确实需要退出,再执行一次这个命令就行了 (但如果在两个命令间还执行了其它命 令就无效了)。

*07.3* 从一个文件跳到另一个文件

要在两个文件间快速跳转,按 de<CTRL-^de< (美式英语键盘中 ^ 6 的上面)。例如: de< :args one.c two.c three.cde< de<de< 现在你在 one.c。 de< :nextde< de<de< 现在你在 two.c。现在使用 de<CTRL-^de< 回到 one.c。再按一下 de<CTRL-^de< 则回到 two.c。又按 一下 de<CTRL-^de< 你再回到 one.c。如果你现在执行: de< :nextde< de<de< 现在你在 three.c。de<注意de< de<CTRL-^de< 不会改变你在文件列表中的位置。只有 ":next" 和 ":previous" 才能做到这点。 你编辑的前一个文件称为 "轮换" 文件。如果你启动 Vim 而 de<CTRL-^de< 不起作用,那可能 是因为你没有轮换文件。 预 定 义 标 记 当你跳转到另一个文件后,有两个预定义的标记非常有用: de< `"de< de<de< 这个标记使你跳转到你上次离开这个文件时的位置。 另一个标记记住你最后一次修改文件的位置: de< `.de< de<de< 假设你在编辑 "one.txt",在文件中间某个地方你用 "x" 删除一个字符,接着用 "G" 命 令移到文件末尾,然后用 "w" 存盘。然后你又编辑了其它几个文件。你现在用 ":edit one.txt" 回到 "one.txt"。如果现在你用 `",Vim 会跳转到文件的最后一行;而用 `. 则跳转到你删除字符的地方。即使你在文件中移动过,但在你修改或者离开文件前,这两 个标记都不会改变。 文 件 标 记 在第四章,我们介绍过使用 "mx" 命令在文件中增加标记,那只在一个文件中有效。如果 你编辑另一个文件并在那里加了标记,这些标记都是这个文件专用的。这样,每个文件都 有一个自己的标记集,并只能在该文件中使用。 到此为止,我们都用小写字母的标记。实际上还可以使用大写字母标记,这种标记是 全局的,它们可以在任何文件中使用。例如,你在编辑一个文件 "foo.txt"。在文件的中 间 (50%) 并建立一个 J 标记 (J 表示甲): de< 50%mJde< de<de< 现在编辑文件 "bar.txt" 并在文件的最后一行放一个标记 Y (Y 表示乙): de< GmYde< de<de< 现在你可以使用 "`J" 命令跳回到 foo.txt 的中间。或者在另一个文件中输入 "`Y" 跳 回到 bar.txt 的末尾。 文件标记会被一直记住直到被重新定义。这样,你可以在一个文件中留下一个标记,然后 任意做一段时间的编辑,最后用这个标记跳回去。 让文件标记符和对应的位置建立一些关系常常是很有用的。例如,用 H 表示头文件 (Head File),M 表示 Makefile 而 C 表示 C 的代码文件。 要知道一个标记在什么地方,在 ":marks" 命令中加上标记名作为参数即可: de< :marks Mde< de<de< 你还可以带多个参数: de< :marks MCPde< de<de< 别忘了你还可以 de<CTRL-Ode< 和 de<CTRL-Ide< 在整个跳转序列中前后跳转。

*07.4* 备份文件

通常 Vim 不会产生备份文件。如果你希望的话,执行如下命令就可以了: de< :set backupde< de<de< 备份文件的文件名是在原始文件的后面加上一个 ~ 。如果你的文件名是 data.txt,则备 份文件的文件名就是 data.txt~ 。 如果你不喜欢这个名字,你可以修改扩展名: de< :set backupext=.bakde< de<de< 这会使用 data.txt.bak 而非 data.txt~。 还有一个相关选项是 'backupdir'。它指定备份文件的目录。默认情况是与原始文件 的路径一致,这在很多情况下都是合适的。 de<备注de<: 如果 'backup' 选项没有置位而 'writebackup' 选项置了位,Vim 还是会创建 备份文件的。但在文件编辑完后,这个备份文件会被自动删除。这个功能用于避 免发生异常情况导致没有存盘 (磁盘满是最常见的情况;被雷击也是一种情况, 不过很少发生)。 保 留 原 始 文 件 如果你在编辑源程序,你可能想在修改之前保留一个备份。但备份文件会在你存盘的时候 被覆盖。这样它只能保留前一个版本,而不是最早的文件。 要让 Vim 保存一个原始的文件,可以设置 'patchmode' 选项。这个选项定义需要改 动文件的第一个备份文件的扩展名。通常可以这样设: de< :set patchmode=.origde< de<de< 这样,当你第一次编辑 data.txt,作了修改并执行存盘,Vim 会保留一个名为 "data.txt.orig" 的原始文件。 如果你接着修改这个文件,Vim 会发现这个原始文件已经存在,并不再覆盖它。进一 步的备份就存在 "data.txt~" (或者你设置的 'backupext' 指定的文件) 中。 如果你让 'patchmode' 设为空 (这是默认的情况),则原始文件不会被保留。

*07.5* 文件间拷贝文本

本节解释如何在文件间拷贝文本。我们从一个简单的例子开始。编辑一个你要拷贝文本的 文件,把光标移到要拷贝的文本的开始处,用 "v" 命令启动可视模式,然后把光标移到 要拷贝文本的结尾处,输入 "y" 拷贝文本。 例如,要拷贝上面这段文字,你可以执行: de< :edit thisfilede< de< /本节解释de< de< vjjj$yde< de<de< 现在编辑你要粘贴文本的文件。把光标移到你要插入文本的地方。用 "p" 命令把文本粘 贴到那里: de< :edit otherfilede< de< /Therede< de< pde< de<de< 当然,你可以用任何命令拷贝文本。例如,用 "V" 命令选中整行的内容。或者用 de<CTRL-Vde< 选择一个矩形列块。或者使用 "Y" 拷贝一个单行,"yaw" 拷贝一个单词等。 "p" 命令把文本粘贴到光标之后,"P" 命令则粘贴到光标之前。de<注意de<, Vim 会记住 你拷贝的是一整行还是一个列块,并用相同的方式把文本贴出来。 使 用 寄 存 器 当你需要拷贝一个文件的几个地方到另一个文件,用上面的方法,你就得反复在两个文件 间跳来跳去。要避免这种情况,你可以把不同的文本拷贝到不同的寄存器中。 寄存器是 Vim 用来保存文本的地方。这里我们使用名称为 a 到 z 的寄存器 (后面 我们会发现还有其它寄存器)。让我们拷贝一个句子到 f 寄存器 (f 表示 First): de< "fyasde< de<de< "yas" 命令象以前说过的那样拷贝一个句子,而 "f 告诉 Vim 把文本拷贝到寄存器 f 。 这必须放在拷贝命令的前面。 现在,拷贝三个整行到寄存器 l (l 表示 line): de< "l3Yde< de<de< 计数前缀也可以用在 "l 的前面。要拷贝一个文本列块到寄存器 b (代表 block) 中: de< de<CTRL-Vjjwwde<"byde< de<de< de<注意de< "b 正好在 "y" 命令的前面,这是必须的。把它放在 "w" 命令的前面就不行。 现在你有了在寄存器 f,l 和 b 有三段文本。编辑另一个文件,并移到要插入文本 的地方: de< "fpde< de<de< 同样地,寄存器标识符 "f 必须在 "p" 命令的前面。 你可以用任何顺序粘贴寄存器的内容。并且,这些内容一直存在于寄存器中,直到你 拷贝其它文件到这个寄存器中。这样,你可以粘贴任意多次。 删除文本的时候,你也可以指定寄存器。使用这个方法可以移动几处文本。例如,要 删除一个单词并写到 w 寄存器中: de< "wdawde< de<de< 同样地,寄存器标识符必须在删除命令 "d" 的前面。 添 加 到 文 件 当你要在几个文件中收集文本,你可以用这个命令: de< :write >> logfilede< de<de< 这个命令将文本写入到文件的末尾。这样实现了文件添加功能。这样使你免去了拷贝,编 辑和拷贝的过程,省了两步。但你只能加到目标文件的末尾。 要只拷贝一部分内容,可以先用可视模式选中这些内容后在执行 ":write"。在第 10 章,你将学会选中一个行范围的办法。

*07.6* 显示文件

有时,你只是想查看一个文件,而没打算修改它。有一个风险是你想都没想就输入了一个 "w" 命令。要避免这个问题,以只读模式编辑这个文件。 要用只读模式启动 Vim,可以使用这个命令: de< vim -R filede< de<de< 在 Unix,如下命令可以完成相同的功能: de< view filede< de<de< 现在,你就在用只读模式阅读这个文件 "file" 了。但你执行 ":w" 命令的时候,你会得 到一个禁止写入的错误信息。 当你试图修改这个文件时,Vim 会给你一个告警提示: de< W10: Warning: Changing a readonly file de< 即使这样,你的修改还是会被接纳的。有可能你只是想排列这些文本,以便阅读。 如果你确实要改动这个文件,在 write 命令前面加上 ! 可以强制写入。 如果你的确想禁止文件修改,用这个命令: de< vim -M filede< de<de< 现在任何对文件的修改操作都会失败。例如,帮助文件就是这样的。如果你要在上面作修 改,你会得到一个错误提示: de< E21: Cannot make changes, 'modifiable' is off de< 你可以设置 -M 参数使 Vim 工作在只读模式。这个方式仍然取决于用户的意愿,因为你 可以用下面的命令去掉这层保护: de< :set modifiablede< de< :set writede<

*07.7* 修改文件名

编辑一个新文件的一个比较聪明的做法是使用一个现存的、其中大部分内容你都需要的文 件。例如,你要写一个移动文件的程序,而你已经有一个用于拷贝的程序了,这样可以这 样开始: de< :edit copy.cde< de<de< 删除你不要的东西。现在你需要用一个新的文件名保存这个文件。":saveas" 命令就是为 此设计的: de< :saveas move.cde< de<de< Vim 会用给定的名称保存文件,并开始编辑该文件。这样,下次你用 ":write",写入的 时候,被写入的就是 "move.c"。而 "copy.c" 不会被改变。 当你想改变当前文件的文件名,但不想立即保存它,用这个命令: de< :file move.cde< de<de< Vim 会把这个文件标记为 "未编辑"。这表示 Vim 知道你现在编辑的文件不是原来那个文 件了。当你写这个文件的时候,你会得到如下错误信息: de< E13: File exists (use ! to override) de< 这可以避免你不小心覆盖另一个文件。
  评论这张
 
阅读(609)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017