=============== Vim文档:vim_faq =============== **翻译:** xianwei **整理:** TocerDeng -------------------------------------------------------------------------- 这份FAQ是来自vim@vim.org邮件列表和comp.editors组的问题和答案. 有好几种方法来解决一个VIM中的问题.这份FAQ给出了其中的一种可能性.你可以 使用这份FAQ里的信息和链接探索另外的解决方法.这份FAQ里的答案的贡献者主要 是来自于Peppe, Benji, Charles Campbell 和无数的朋友. .. contents:: 目录 :depth: 2 :class: new --------------------------------------------------------------------------- 章节 1 - 总说明 =============== Vim是什么? --------------- Vim 代表着 Vi IMproved .它过去常被认为是Vi IMitation,但是确实增加了有了新的提高 所以名字的扩写的改变是非常适合. Vim 是一个文本编辑器,它几乎包括了所有来自 Unix程序"Vi"程序的命令,当然也包括了很多新增加的命令.所有的命令都可以从键盘中 敲入.这是一种优势,可以让你一直保持你的手在键盘上,而你的眼睛会一直停留在屏 幕上.对于还有一些人想使用他的人,Vim是支持鼠标的,并且是有有滚动条和菜单条 的GUI版本的. Vim是一个编辑器而不是一个文字处理器.一个文字处理器通常被用于文本的排版.这 意味着如何布置文本,改变它输出的显示效果.大部分的时候,最后的成品指的是你打 算打印出来或者是排版出来的,是为了追求一种更人性化(或别的)的方法来表达.有很 的文字处理器,现在的市面上.例如Microsoft Word,WordPerfect,FrameMaker,和Ami- Pro.(译者推荐OpenOffice) 一个编辑器只是用来输入文本.任何的排版或者布置文本都是次要的.对于一个编辑器 来说,一个人最主要关心的是如何更好的输入文本,而不是使文本如何看起来更漂亮. 现在的编辑器有多种选择,不包括Vim的话,还有,Vi,Emacs,Crisp,Brief,xedit.还有 Notepad. 更多的信息.请阅读:: :help intro 谁编写了Vim? ----------------- 大部分的Vim程序是由Bram Moolenar,所编写,和来自很多无私的贡献者.":h cred- its"来查看完整的贡献人员名单. Vim是基于Stevie开发的,它是由Tim Thompson,Tony Andres和G.R.(Fred) Walter所开 发的. 更多的资料,请读:: :help author Vim是否兼容Vi? ------------------- 是的.Vim对Vi的兼容性是非常之好的.你可以使用"-C"命令行标记来以对Vi兼容的模 式开启Vim:: $vim -C 你也可以使用:: $vim -u None 你可以可以设置'compatible'选项来开启对Vi的兼容:: :set compatible 更多的资料,请读:: :help -C :help 'compatible' :help compatible-default Vim相对Vi有哪些提高? ------------------------- 一个简短的有关于Vim相对于Vi的优点的列表已在下面列出.这个列表显示出了Vim是一 个非常符合时代特点并充满了新特性的编辑器.现代编辑器的标准特性都已经被实现, 同样重要的是那些给一般的高级用户和程序员专用的特性. **现代Vi的特性:** | 多级撤消 | 允许你设置对一个文件缓冲区中的改变进行撤消的次数.你也可以反撤消一个 | 已经撤消过的操作. | | 多窗口和缓冲区 | 每个文件都可以被显示在他们各自的窗口中.你也可以很轻易的从一个窗口移 | 动到另一个窗口中.每个文件都可以在一个Vim会话中打开也可以有一个想关 | 联的缓冲区,当然你也很容易从一个跳到另一个中去. | | 灵活的插入模式 | Vim允许你在插入模式中使用方向键在整个文件中进行移动.不用敲入更多的 | ,四处移动,然后敲入'i'或'a'. | | 宏 | Vim有一项机制允许你记录一系列的键序列,并重复任意次数. | | 可视模式 | 你可以高亮文本的一个章节并仅对这段文本执行操作. | | 块操作 | 允许选择并高亮文本中的矩形块,然后对他们执行一系列复杂的操作. | | 在线帮助系统 | 你可以很容易的找到使用Vim任何方面的帮助.帮助文件会在他们自己的窗口 | 中显示. | | 命令行编辑和历史记录 | 历史记录允许你使用方向键来重复或搜索一个已经被键入过的命令.允许你对 | 一个命令的开始部分进行匹配,只用在命令缓冲区中键入命令开始处的相似部 | 份即可.你也可以编辑一个命令来矫正改字稿或改变一些值. | | 命令行补全 | 使用TAB键,你能够补全命令,选项,文件名等等,直到为你所需要的值. | | 水平滚动 | 长行可以被水平的滚动(可以不在GUI中使用,也可以在). **高级用户特性:** | 文本格式化 | 只用两次击键,你就可以格式化文本中的打段文本,而不用使用额外的程序. | | 在插入模式中的单词补全 | Vim可以在键入的时候进行单词的补全,会对要补全的单词匹配为文件中已经 | 出现过的相似的单词. | | 跳转标签 | 就像一个internet浏览器,你可以在编辑的时候跳转到文本的前面部分,然后 | 继续向前.你的头脑因此从在文本中浏览释放,并代替为编辑. | | 自动命令 | 当读入或写入一个文件,或跳到另一缓冲区中时,命令会自动执行. | | Viminfo | 允许存储命令行历史,标记和寄存器到一个文件中,并在启动时被读入.因此 | 你可以重新调用老的搜索模式,宏等等,到一个新的Vim会话中. | | 鼠标支持 | 鼠标在xterm和MS-DOS是被支持的.它可以用来被定位光标,选择可视区域, | 粘贴寄存器内容,等等. | | 图形用户接口 | 就像期于的现代编辑器.当然,是非常容易加入你自己的菜单.当然,vim控 | 制台也是被所支持的,并被广泛的使用. | | 脚本语言 | Vim有一个非常强大的脚本语言系统,所以新的命令是很容易被支持的. | 你也可以使用Perl,Python,Tcl和Ruby来完成同样的事情! | | 插件 | 额外的程序通过在Vim中执行命令(正则表达式或脚本语言),来在启动时自动 | 加载.例如:文件探测器,网络编辑.更多的插件一直在VimOnline被开发和共 | 享中. | | 对于众多程序语言的语法高亮 | 上百种的程序语法高亮被支持.而另外的语种支持,正在不断的被加入中. | | 扩展的正则表达式 | Vim支持的扩展的正则表达式非常的类似于perl的正则表达式函数. **编程性能特性:** | 加速的编辑-编译-编辑 | 你可以在Vim中编译并自动跳到源码中的错误地方. | | 对众多编程语言的缩进 | C,C++,Java,Perl,XML和很多别的语言,在Vim输入时会被自动的识别并缩进. | | 在包含的文件中搜索单词 | Vim允许你对光标下的单词在本文中和被包含的文件中进行搜索. | | 文本对象 | | 折叠 | 确信部分的文本可以被折叠.最好的例子是,函数体.你可以对代码有个整体 | 的印象,然后折开你要认真细看的代码. | | ctags和cscope的整和 | 使用这两种非常强大的程序,你可以从一个调用的实例中跳转到这个函数中的 | 定义中去,并使用别的技巧来浏览代码. 更多的资料,请读:: :help vi-differences Vim是否免费? ----------------- Vim是慈善软件.对Vim的拷贝和使用是没有任何限制的,但是Vim的作者鼓励你能够 对慈善团体做一些贡献.有份在发行版本中的文档解释了该如何做这些. 更多的资料,请读:: :help copyright ----------------------------------------------------------------------------- 章节 2 - 资源 ============= 我从哪里可以知道关于Vim更多的知识? --------------------------------------- 你可以把你的有关Vim的问题发到vim@vim.org邮件列表中去.你也可以把你的有关于对 Vim发展的问题投递到vim-dev@vim.org邮件列表中去.Vim并没有自己的邮件组.但是相 对合适的邮件组可以用来投递的是comp.editors. "VimOnline"是一个网页,其实已经被当作Vim的主页来运做了,尽管它的主要目的是从 四出搜集tips和scripts.但是被牵连了:)! 这个页面的URL是vim.sourceforge.net或者 vim.sf.net. 最后,阅读Vi的FAQ:: http://www.faqs.org/faqs/editor-faq/vi/part1/index.html 更多的资料,请读:: :help mail-list :help internet 是否有个可利用的邮件列表? ------------------------------ 这里有一些:: 名字 描述 vim-announce 发表新的版本 vim 综合讨论 vim-dev 补丁包,bug报告,开发讨论 vim-mac Macintosh方面讨论 vim-fr 法语版块的综合讨论 vim-multibyte 多字节开发问题 vim-vms VMS上的开发 关于这些,其实只有vim和vim-dev是真正大部分人感兴趣的.vim-announce对于大部分 的人来说都是只读的,它的信息也会自动的发往给各个别的列表.另外的四个,相对用 的人都不是很多. 订阅: 发email到 -subscribe@vim.org 取消: 发email到 -unsubscribe@vim.org 获取帮助: 发email到 -help@vim.org 是否有关于Vim邮件列表的档案文件? ------------------------------------- 是的.查看 http://www.yahoogroups.com/list/, name的地方可以是vimdev, vimannounce,vim,vim-fr,vim-mac,vim-multibute,vim-vms. 作为选择的,也可以去 http://www.gmane.org 去找关于GMANE,GMANE允许你进入邮件列表,好 像他们就是新闻组.这会对那些希望浏览历史记录或只是偶然的查看下最近信息的人提 供很大的便利. 从哪里可以得到Vim的HTML/PDF/PS格式的帮助手册? -------------------------------------------------- 你可以下载HTML/PDF/PS格式的Vim帮助手册从:: http://vimdoc.sourceforge.net/ 有一个与Vim有联系的问题.如何才能确定这个问题与Vim 有关,还是与我的设置有关? ------------------------------------------------------------------------------- 首先,你应该确定这个问题与你的_vimrc或_gvimrc或着是系统vimrc或者是你自己的插 件,又或是你的一些设置文件的是否无关.为了确定,你可以使用:: $vim -N -u NONE -U NONE 这会让Vim以非兼容模式开启并不会载入你自己的_vimrc和_gvimrc文件.它也不会加载 你的插件.在这个Vim调用中,尝试去再现你的问题.假如这个问题不再出现,那么这个 问题就应该是与你自己的本地设置或是插件有关.为了在你的设置文件中定位这个问题, 你不得不进行反复的尝试并试着对你的配置文件逐行注释.你也可以使用-V命令参数来 得到更多的有关于调式信息,并分析这个问题:: $vim -V2 你可以增加这个值然后传递给-V参数来得到更多信息. 更多的信息,请读:: :help -u :help -U :help -N :help -V :help 'verbose' :help :verbose :help set-verbose 该去哪里报告bugs? ---------------------- 首先使用如下的命令来收集信息:: :source $VIMRUNTIME/bugreport.vim 现在把上面的命令所搜集的信息发到bugs@vim.org. Vim开发邮件列表(见上)是一个非常好的讨论总体bug的地方.假如你找到的bug伴随着 语法高亮或者一些别的附加特性(i.e. 不是直接在Vim内部编程实现的),试着去报告给 那个特性的维护者. 更多的资料,请读:: :help bug-reports 哪里可以获得这份FAQ? ------------------------- 这份FAQ可以在VimOnline(vim.sf.net)上找到.将来会在别的站点放置这份FAQ. 在这份FAQ中找不到我要的答案该怎么办? ----------------------------------------- 这份FAQ涵盖了Vim细节方面的大部分问题.你可以阅读Vi的FAQ来找到很多适合Vi克隆 品方面的详细信息.在comp.editors上,经常会有这种方面的帖子.你也可以在下面的 网站上找到一份拷贝 http://www.faqs.org/faqs/editor-faq/vi/part1/index.html 同样,自从Vim在过去的几年中搜集了大量的新特性后,想成功的整理出一份FAQ来,基 本上已经成了一个不可能的任务.为了尽可能实现这个目标,请发email给维护者,假 如你有一个好的问题的话.一个好的问题是指你试着自己去解决,但是失败了.(记住, Vim有非常好的文档) 我有一个patch可以实现一个新的Vim特性.我该把这个patch发到哪里? ------------------------------------------------------------------ 你可以把你的patchs发给Vim开发者邮件列表vim-dev@vim.org. 更多的资料,请读:: :help vim-dev 我有一个Vim建议或者是开发了一个新的Vim语法/缩进/文件类型/编译器插件,或开发一个新的脚本,一个新的配色方案.那么是否有一个公共网点来提供上载? ----------------------------------------------------------------------------------------------------------------------------------------- 是的.你可以使用Vim在线站点来上载你的插件/脚本,配色方案,建议,等等.这个站 点是 http://vim.sourceforge.net ---------------------------------------------------------------------------- 章节 3 - 可利用的 ================= Vim的最新版本是多少? ------------------------- 这个最新的Vim版本是2004年,6月8号发布的6.3版. 这个不同的版本的Vim发布历史在下面:: Version 6.3 06/08/2004 Version 6.2 06/01/2003 Version 6.1 03/24/2002 Version 6.0 09/27/2001 Version 5.8 05/31/2001 Version 5.7 06/24/2000 Version 5.6 01/16/2000 Version 5.5 09/21/1999 Version 5.4 07/26/1999 Version 5.3 08/31/1998 Version 5.2 08/24/1998 Version 5.1 04/07/1998 Version 5.0 02/19/1998 Version 4.6 03/13/1997 Version 4.5 10/17/1996 Version 4.2 07/05/1996 Version 4.0 05/21/1996 Version 3.0 08/16/1994 Version 2.0 12/21/1993 Version 1.27 04/23/1993 Version 1.17 04/21/1992 我从哪里可以找到Vim的最新版本? ----------------------------------- 你可以从VimOnline站点上下载到Vim最新版本的源码.这个站点的URL是 http://vim.sourceforge.net/download.php Vim可以在什么平台下运行? ----------------------------- 所有的Unix平台. 所有的Windows平台. Amiga, Atari, BeOS, DOS, Macintosh, MachTen, OS/2, RiscOS, VMS 我从哪里可以下载最新版本的Vim runtime files? ------------------------------------------------- 你可以在Vim的ftp站点上 ftp://ftp.vim.org/pub/vim/runtime directory 下载最新的版本的Vim runtime files(语法文件,文件类型插件,编译器文件,配色方 案,文档,缩进文件和键映射). ---------------------------------------------------------------------------- 章节 4 - 帮助 ============= 我该如何使用帮助文件? -------------------------- 可以找到所有Vim函数的帮助.为了使用帮助文件,可以使用":help"命令.这会带你到 主帮助文件的页面.在第一页上,你可以找到关于如何移动的说明.这样,你就可以在 一个帮助页面中移动了,当然你是在一个只读的文档上.你可以使用标签跳到详细的主 题.有两种方法可以这样做: - 在一个命令的名字上,或选项上时,使用 ""命令.只有当这个tag是一 个关键字时,才会有效.""和"g"工作起来类似于 "". - 使用":tag "命令.对所有的字符,它都会做相应的处理. 使用""跳回到刚才在帮助文件中的位置.使用":q"来关闭帮助窗口. 假如你想跳到帮助页面中的某个详细的主题上,使用":help (subject)".假如你不知道 该如何去寻找,尝试":help index"得到一份有效主题列表.使用标准的搜索键来定位 你想要的信息.你可以把":help"缩写成":h". 更多的资料,请读:: :help online-help 我该如何在Vim帮助文件中搜索一个关键字? ------------------------------------------- 你可以在输入你要的关键字后按下CTRL-D,来得到一个包含此关键字的列表.你可以可 以使用meta字符像*,\+,等等来详细的指定搜索模式:: :help init :help str*() :help '*indent 你可以在输入部分的帮助关键字后,按下TAB来扩展这个词,找到符合你所需要的匹配. 你可以继续按下TAB来查看别的匹配. 从帮助窗口中,你可以使用":tag"命令搜索关键字.例如:: :tselect /window 这个命令会列出所有的包含文本"window"的关键子.你可以从列表中选择出一个并跳入 进去. 你可以使用":helpgrep"命令在全部的帮助文件中,搜索给定的文本.这个quickfix 窗口将会打开,并显示所有匹配的行. 更多的资料,请读:: :help c CTRL-D :help c :help :tselect :help :help :help :helpgrep 我得到一个E123的错误信息,我做错了什么? ------------------------------------------- 你可以使用如下的命令来得到更多的关于错误的信息:: :help E123 更多的资料,请读:: :help error-messages 我从哪里可以知道Vim不同的模式的资料? ----------------------------------------- 你可以通过阅读 :help vim-modes 在Vim中加入了一个新的帮助文件后,怎么在帮助文件中产生这个文件的tags? ------------------------------------------------------------------------ 你可以使用":helptags"命令来重新产生Vim的帮助tag文件.例如:: :cd $VIMRUNTIME/doc :helptags 更多的资料,请读:: :help :helptags :help add-local-help 我可以使用压缩版本的帮助文件吗? ------------------------------------ 是的.你可以压缩这些帮助文件,然后仍然可以使用Vim查看它们.这会使存取帮助文 件有点延迟.而且需要使用"gzip"插件.遵循如下步骤来压缩,并使用Vim帮助文件: - 使用"gzip doc/\*.txt"来压缩所有的帮助文件 - 编辑"doc/tags"文件并修改".txt"为".txt.gz",使用如下命令:: :%s=\(\t.*\.txt\)\t=\1.gz\t= - 增加下面的代码到你的vimrc中去:: set helpfile=(dirname)/help.txt.gz 这个(dirname)指的是你的帮助文件所在的目录.这个gzip.vim插件是在Vim标准发行包 中已经被包含的,会很小心的解压这些文件.当它们与压缩的文档地址不是在同一地方 的时候,你必须得确定$VIMRUNTIME是否设置了另外的文件在哪里. 更多的资料,请读:: :help gzip-helpfile :help 'helpfile' :help gzip :help $VIMRUNTIME ---------------------------------------------------------------------------- 章节 5 - 编辑文件 ================= 我该如何在Vim中编辑时,载入另一个文件? ------------------------------------------ 这里有好几种方法使你在编辑时载入一个别的文件.最简单的方法是使用":e"(:edit) 命令:: :e 你也可以使用":n" (:next)命令来载入另一个文件到Vim中去:: :n 你也可以使用":args"命令来载入一个文件到Vim中去 :args 更多的资料,请读:: :help usr_07 :help edit-files :help :edit :help :next f :help :args f 我该如何以另外的名字存入当前的文件(另存为)并编辑一个新的文件? ------------------------------------------------------------------ 你可以使用":saveas"命令来以新的名字保存当前文件:: :saveas 作为选择的,你也可以使用下面的命令:: :w :edit # 你也可以使用":file"命令,然后再使用":w"命令:: :file :w 更多的资料,请读:: :help 07.7 :help saveas :help :file f :help :w 我该如何改变当前目录为当前文件所在目录? -------------------------------------------- 你可以使用下面的命令来改变当前目录为当前文件所在的目录:: :cd %:p:h 想要自动的改变当前目录,为当前文件所在目录的话,使用如下命令:: :autocmd BufEnter * cd %:p:h 更多的资料,请读:: :help :cd :help :lcd :help filename-modifiers :help autocommand 我该如何在写入文件时不会在文件末尾追加EOL? ----------------------------------------------- 你可以关闭'eol'选项并打开'binary'选项来在写入文件时,不在末尾追加EOL:: :set binary :set noeol :w 更多的资料,请读:: :help 'endofline' :help 'binary' :help 23.4 我该如何配置Vim使其在打开文件时停留在上次光标所在的位置? ------------------------------------------------------------- Vim会把缓冲区内上次编辑时光标最后所在的位置记录到寄存器'"'中去.你可以使用如 下的自动命令,并把它加入到你的.vimrc或.gvimrc中去,使打开文件时会光标会停留 在上一次编辑过的位置:: au BufReadPost * if line("'\") > 0 && line("'\") <= line("$") | \ exe "normal g'\"" | endif 更多的资料,请读:: :help '" :help last-position-jump 当在Vim中编辑一个文件时,这个文件被外部的程序所改动,Vim会打开一个警告窗口(类似确认对话框),每当文件被检测到,就警告一次.我怎样才可以关闭这个警告? ---------------------------------------------------------------------------------------------------------------------------------------------- 你可以设置Vim的'autoread'选项,在每当文件在外部被改动时,就自动读入:: :set autoread 你也可以使用如下的命令:: autocmd FileChangeShell * \ echohl WarningMsg | \ echo "File has been changed outside of vim." | \ echohl None 更多的资料,请读:: :help 'autoread' :help FileChangedShell :help timestamp :help :checktime 我该如何编辑文件名在光标下的文件? -------------------------------------- 你可以使用gf命令来编辑一个文件名在光标下的文件. 你可以使用CTRL-W f命令在新的窗口打开一个文件. 更多的资料,请读:: :help gf :help CTRL-W f :help 'isfname' :help 'path' :help 'suffixesadd' :help 'includeexpr' 我该如何重新载入/重新编辑当前文件? --------------------------------------- 你可以使用":edit"命令,不用详细指定文件名,来重新载入当前文件.假如你对文件 做了某些改动,你可以使用":edit!"来强制重载当前文件(你会失去你所做的改动). 更多的资料,请读:: :help :edit :help :edit! :help 'confirm' 我该如何使Vim周期性的自动保存文件? --------------------------------------- Vim不支持周期性的自动保存文件. 更多的资料,请读:: :help 'updatetime' :help CursorHold :help swap-file 我该如何以只读模式打开一个文件? ------------------------------------- 你可以使用":view"命令来以只读模式打开一个文件:: :view 这个命令对于打开的缓冲区设置了'readonly'选项.你也可以使用"-R"命令来以制度模 式打开一个文件:: $vim -R 你也可以使用符号链接在命令行中执行"view"以只读模式打开一个文件:: $view 更多的资料,请读:: :help 07.6 :help 'readonly' :help 'modifiable' :help :view :help :sview :help view :help -R :help -M 我如何编辑另外的文件而不保存对当前文件的改动? --------------------------------------------------- 你可以打开一个文件对其进行编辑而不用保存对当前文件的改动,而且可以不用失去这 些改动,使用如下的方法:: :split :new 你也可以设置'hidden'选项并编辑一个新文件:: :set hiddent :e 假如你打算抛弃对当前文件所作的改变并载入新的文件来编辑,你可以使用如下的命令:: :e! 更多的资料,请读:: :help :edit! f :help 'hidden' :help :split :help :new ---------------------------------------------------------------------------- 章节 6 - 编辑多个文件 ===================== 我该如何在Vim中一次打开多个文件? ------------------------------------- 这里有几种方法能够在Vim中一次打开多个文件.你可以使用":next"命令来详细定义一 个文件列表:: :next f1.txt f2.txt :next *.c 你可以使用:args命令来详细定义一个文件列表来作为参数:: :args f1.txt f2.txt :args *.c 在载入了文件以后,你可以使用":next"和":prev"命令来在文件中移动. 更多的资料,请读:: :help 07.2 :help :next :help :args :help argument-list 我该如何在Vim中在多个文件\缓冲区中切换? -------------------------------------------- 这里有好几种方法来切换多个文件.你可以使用"buffer"命令来切换多个文件.例如:: :buffer file1 :buffer file2 你也可以使用CTRL-^键来切换缓冲区.通过在按键以前指定一个号,你就可以编辑那个 号的缓冲区了.没有号的话,你可以按CTRL-^来选择要编辑的缓冲区. 你也可以使用":e #"命令来编辑一个特殊的缓冲区:: :e #5 更多的资料,请读:: :help edit-files :help :buffer :help CTRL-^ :help alternate-file :help 22.4 :help 07.3 我该如何在Vim中打开多个文件时,每个文件占据单独的一个窗口? -------------------------------------------------------------- 你可以使用-o和-O命令行参数来打开多个文件在垂直或竖向的Vim窗口中.例如:: $vim -o3 f1.txt f2.txt f3.txt 以上的命令会打开文件f1.txt,f2.txt,f3.txt在Vim的三个水平分割的窗口中.:: $vim -O3 f1.txt f2.txt f3.txt 这个以上的命令会打开f1.txt f2.txt f3.txt在三个垂直的Vim窗口中. 更多的资料,请读:: :help -o :help -O :help startup-options 我该如何配置Vim使其自动的载入文件,类似于载入 工作站\项目 ? --------------------------------------------------------------- 你可以使用 ":mksession"和":mkview" 命令在Vim中自动载入一些文件. 这":mksession"命令会建立一个Vim脚本来存储当前的编辑会话.你可以使用":source" 命令来载入mksession命令所产生的文件. 这":mkview"命令建立一个Vim脚本来存储当前窗口的内容.你也可以使用":loadview" 命令来载入这个脚本. 更多的资料,请读:: :help 21.4 :help 21.5 :help views-sessions :help 'sessionoptions' :help :mksession :help :source :help v:this session :help :mkview :help :loadview :help 'viewdir' :help buffers 是否可以在一个Vim实例中打开多个顶级窗口类似于Nedit或者emacs? ----------------------------------------------------------------- 不.当前是不可能的.这个特性在todo列表中. 我该如何在Vim中浏览/管理目录? ---------------------------------- 你可以使用explorer.vim插件,在标准的Vim安装包中都是支持的,可以用来浏览\探寻 目录.你可以使用下面的命令来开启文件管理器:: :e :Explore :SExplore 在文件管理器中,你可以浏览目录,重命名,删除,编辑文件. 更多的资料,请读:: :help file-explorer :help 22.1 我该如何在网络上使用ftp/scp/rcp/http编辑文件? -------------------------------------------------- 你可以使用vnetrw.vim插件,在标准的Vim包中已经被包含进去了,可以在网络使用多 种协议编辑文件.使用这个插件,可以明显的使用ftp/scp/rcp/http来载入和保存文件. 例如,在ftp上编辑一个文件,你可以使用入下的命令:: $vim ftp://matchine/path 更多的资料,请读:: :help netrw.vim ---------------------------------------------------------------------------- 章节 7 - 备份 ============= 当我编辑和保存文件时,Vim建立了一个文件名相同,但是有~后缀的文件.我该如何停止Vim建立这种文件?(或者)我该如何关闭Vim的备份文件的特性? -------------------------------------------------------------------------------------------------------------------------------------- 你设置了'backup'选项,所以Vim会在保存文件时自动建立一个备份文件.你可以清除 这个选项来停止Vim建立备份文件:: :set nobackup 记住,默认的这个选项是关闭的.你可以在初始文件中开启'backup'选项.你也可以关 闭'writebackup'选项:: :set nowritebackup 更多的资料,请读:: :help 07.4 :help bakcup-table :help 'backup' :help 'writebackup' :help 'backupskip' :help 'backupdir' :help 'backupext' :help 'backupcopy' :help backup 我该如何配置Vim使其存储所有的备份文件到一个特殊的目录中去? --------------------------------------------------------------- 你可以配置Vim的'backupdir'选项来存储所有的备份文件到一个特殊的目录中去. 例如,存储所有的备份文件到~/backup目录中,你可以使用如下命令:: :set backupdir=~/backup 更多的资料,请读:: :help 07.4 :help 'backupdir' :help backup 当我用Vim中保存一个文件时,这个文件的权限改变了.我该如何配置Vim来存储一个文件而不改变此文件的权限? ------------------------------------------------------------------------------------------------------ 这些是有可能的,假如'backupcopy'选项被设置为'no'或'auto'.请记住这个选项的默 认值是在大部分的情况下都可以正常工作的.假如这个默认的选项,替你工作的不是很 号,尝试设置'backupcopy'选项为'yes'来在存储文件时,保持文件的权限.:: :set backupcopy=yes 这个应用了后.默认的,Vim不会备份文件. 更多的资料,请读:: :help 'backupcopy' :help backup :help 'backup' :help 'writebackup' ---------------------------------------------------------------------------- 章节 8 - 缓冲区 =============== 我对一个缓冲区做了很多改动.我该如何编辑另外的缓冲区而不保存对当前缓冲区的改动,却又不失去这些改动? ------------------------------------------------------------------------------------------------------ 你可以设置'hidden'选项来编辑一个文件而不失去对当前文件所做的改动:: :set hidden 通过设置'hidden'选项,你也可以保存缓冲区的改动历史(撤销历史).否则,当你切换 文件时,这个撤消历史将会丢失. 更多的资料,请读:: :help 'hidden' :help hidden-quit :help :hide 我该如何配置Vim使其在切换到另一个缓冲区时自动保存改动过的缓冲区? --------------------------------------------------------------------- 你可以设置'autowrite'选项来在切换到另一个缓冲区时自动保存改动过的缓冲区:: :set autowrite 更多的资料,请读:: :help 'autowrite' :help 'autowriteall' :help 'hidden' 我该如何把当前窗口中的缓冲区置换位空白缓冲区? -------------------------------------------------- 你可以使用":enew"命令来载入一个空的缓冲区置换当前窗口的缓冲区. 更多的资料,请读:: :help :enew 是否有一个快捷键可以通过缓冲区号载入缓冲区? ------------------------------------------------ 你可以使用CTRL-^来通过指定缓冲区号载入一个缓冲区.例如,要载入缓冲区5,你可 以按5 CTRL-^命令. 更多的资料,请读:: :help CTRL-^ 我该如何打开当前所有的缓冲区在独自的窗口中? ------------------------------------------------ 你可以使用":ball"或者":sball"命令来打开所有在缓冲区列表中的缓冲区:: :ball 更多的资料,请读:: :help :ball 我该如何结束一个缓冲区而不退出Vim? --------------------------------------- 你可以使用":bdelete"命令来删除一个缓冲区而不结束缓冲区. 例如:: :bdelete file1 更多的资料,请读:: :help :bdelete :help :bwipeout 我有几个缓冲区是以:e filename的形式打开的,我该如何关闭其中的一个缓冲区而不结束Vim? --------------------------------------------------------------------------------------- 你可以使用":bdelete "命令来关闭缓冲区. 更多的资料,请读:: :help :delete :help :bunload :help :bwipeout 当我使用":%bd"来删除所有的缓冲区时,并不是所有的缓冲区都被删除了.为什么? ---------------------------------------------------------------------------- 在":%bd"命令中,这个'%'的范围会被置换为当前缓冲区的起始行号和终结行号.为了 代替'%'作为范围,你需要指定详细的范围.例如,为了删除所有的缓冲区,你可以使 用如下的命令":1,9999bd". 更多的资料,请读:: :help :bd 我该如何显示当前缓冲区/文件的缓冲区号? ------------------------------------------- 你可以使用2命令来显示当前缓冲区/文件的的缓冲区号.记住在CTRL-G命令前 的序号.假如这个数大于一,Vim就会显示缓冲区号. 你也可以使用如下的命令来显示当前缓冲区号:: :echo bufnr("%") 你也可以把"%n"域包含到'statusline'选项中来在状态栏上显示当前缓冲区号. 更多的资料,请读:: :help CTRL-G :help bufnr() :help :echo :help 'statusline' 我该如何删除一个缓冲区而不关闭显示这个缓冲区的窗口? --------------------------------------------------------- 你可以使用如下的命令来打开下个缓冲区并删除当前缓冲区. :bnext | bdelete 更多的资料,请读:: :help :bnext :help :bdelete :help :buffers 我该如何映射TAB键为循环打开缓冲区? ---------------------------------------- 你可以使用如下的两个映射命令,来映射CTRL-Tab键打开下个缓冲区并使用CTRL-SHIFT -Tab键来打开前一个缓冲区:: :nnoremap :bnext :nnoremap :bprevious 更多的资料,请读:: :help :bnext :help :previous =========================================================================== 章节 9 - 窗口 ============= Vim窗口与缓冲区的区别在哪? ------------------------------- 一个Vim缓冲区是一个文件载入到内存中进行编辑.原始的文件没有贝改变,直到你确 定将对此文件所做的改动写入到缓冲区的文件中.一个Vim的窗口是一个缓冲区的视口. 你可以在一个缓冲区上打开多个窗口或者几个窗口对应不同的缓冲区. 更多的资料,请读:: :help usr_08.txt :help 22.4 :help windows-intro :help Q_wi 我该如何增加Vim窗口的高度? ------------------------------- 你可以使用如下的命令来增加Vim窗口的高度:: :vert resize +N :vert resize -N :vert resize N 你可以使用CTRL-W < 或者 CTRL-W > 或者 CTRL-W | 命令. 更多的资料,请读:: :help vertical-resize :help CTRL-W > :help CTRL-W < :help window-resize 我该如何放大或缩小一个窗口? -------------------------------- 你可以放大一个窗口(将会关闭所有的窗口除了当前窗口)使用"CTRL-W o"命令或者 ":only" ex 命令. 你可以使用"CTRL-W _"命令或者":resize"ex命令来增加当前窗口的高度到最打高度为 止而不用关闭别的窗口. 你也可以使用"CTRL-W \|"命令或者":vertical resize" ex命令来增加当前窗口的宽度 到可能的最大值而不用关闭别的窗口. 你可以使用"CTRL-W ="命令来使所有窗口的高度和宽度都相等. 你页可以设置如下的选项加上上面的命令来得到更好的结果:: Method 1: 设置 'winminheight' 选项的值为0:: :set winminheight=0 默认的这个选项为1. 这个选项控制着交互式窗口的最小高度值(当这个窗口不是最小值时). 当'winminheight'选项选项的值是0,在交互式窗口中,只有状态栏会被显示. method 2:: 设置'noequalalways'选项并设置"winheight"选项到一个极大值(例如 99999):: :set noequalalways :set winheight=99999 现在,活动窗口将会被一直以它的最大值开启,假如有别的窗口的话,会继续保留, 但是只剩下状态栏. 对于上面所提到的任何方法,你不能在放大窗口后保存你的窗口布局.假如你想在放 大窗口后,你可以使用ZoomWin插件.你可以下载ZoomWin插件.你可以从Vim online 站点下载这个插件:: http://vim.sourceforge.net/scripts/script.php?script id=508 更多的资料,请读:: :help CTRL-W o :help window-resize :help 'winminheight' :help 'equalalways' :help 'winheight' :help 08.3 我该如何对所有打开的缓冲区或窗口或参数列表中的文件执行一条ex命令? ---------------------------------------------------------------------- 你可以使用":bufdo"命令来对所有的打开的缓冲区执行一条ex命令.你可以使用 ":windo"命令来对所有打开的窗口执行一条ex命令.你可以使用":argdo"命令来 对所有参数列表中的文件执行一条命令. 更多的资料,请读:: :help :windo :help :bufdo :help :argdo :help 26.3 =========================================================================== 章节 10 - 移动 ============== 我该如何跳到一个文件的首行,或者是末行? -------------------------------------------- 你可以使用'G'命令跳到文件的最后行或者用'gg'命令跳到文件中的首行. 更多的资料,请读:: :help G :help gg 在插入模式中,当我按了键进入了命令模式,这个光标左移了一格(除了在行首时).是否有可能保持住光标在同样的列? ----------------------------------------------------------------------------------------------------------------- 不.是没有可能改变这种行为的.这个光标是"always"定位在一个有效字符上(除非你 开启了虚拟编辑模式(virtual-edit mode)).所以,假如你追加文本到行末时,当你 回到命令模式的时候,这个光标**must**重新回到你键入的最后个字符上.出于一致性 的考虑,这个光标可以被退到任何的地方,只要你在一行里. 你可以在插入模式中使用CTRL-O命令来执行一条ex命令,然后回到插入模式中,而不 用移动光标列. 更多的资料,请读:: :help 'virtual' :help i CTRL-O 我该如何配置Vim来保持光标位置在我使用,,或别的键滚动文本时? ------------------------------------------------------------------------------------ 当你移动文本时,可以重置'startofline'选项来保持光标的竖直位置:: :set nostartofline 更多的资料,请读:: :help 'startofline' 文件中的某些行,超过了屏幕的最大宽度,然后回绕了.当我按下了j,k键来移动到下一行时,Vim移动的是文件中的一行,而不是屏幕是的一行.我该如何移动屏幕是的一行? --------------------------------------------------------------------------------------------------------------------------------------------------------- 你可以使用gj和gk命令在屏幕上的一行中,进行上下移动.j,k移动的是文件的中的一 行.你也可以设置'wrap'选项来避免回绕:: :set nowrap 更多的资料,请读:: :help gj :help gk :help 'wrap' 你可以使用下面的映射:: :map gk :imap gk :map gj :imap gj Vim中对句子,段落,章节的定义是什么? ---------------------------------------- 一个句子是被定义为以一个'.','!'或'?'结尾的一行,或者被一个(或二个)空格或者 .哪些字符和多少数量的空格被组成为句子的结尾,是由'joinspaces'和 'cpoptions'选项规定的. 一个段落是跟在一个空行后的,也可以使用一套标识段落的宏,这套标识符被详细定 义在'paragraphs'选项中. 一个章节跟在一个在第一列的form-feed()符号后,或者是在段落宏中的一个, 在'sections'详细定义了这些. 更多的资料,请读:: :help sentence :help 'joinspaces' :help 'cpoptions' | /^\s*j\> :help paragraph :help section :help word 我该如何跳到句子,段落,或章节的开头或结尾? ----------------------------------------------- 你可以使用如下的移动命令来跳到句子,段落,或章节的开头或结尾:: motion position where ( beginning current sentence ) end current sentence { beginning current paragraph } end current paragraph [] end previous section [[ beginning current section ][ end current section ]] beginning next section 这些移动命令都可以加个计数前缀,然后持续前跳(或后跳). 更多的资料,请读:: :help object-motions 我的文件中的某些行过长,超过了屏幕的边缘.我该如何移动Vim来查看超过屏幕右端的文本? -------------------------------------------------------------------------------------- 你可以使用如下的命令来水平的滚动窗口到左边或右边:: zl - 向左卷动 zh - 向右卷动 zL - 向左卷动半个屏幕 zH - 向右卷动半个屏幕 zs - 卷动屏幕使光标所在的位置,移动到屏幕的开始处. ze - 卷动屏幕使光标所在的位置,移动的屏幕的结束处. 你可以使用g0命令移动鼠标到屏幕行(不是文件行)的开始处,而g$命令可以移动到屏 幕行的终点处而不用卷动屏幕. 更多的资料,请读:: :help scroll-horizontal 我该如何同时卷动两个或更多的缓冲区? ----------------------------------------- 你可以对每个缓冲区设置"scrollbind"选项来同时卷动他们. 更多的资料,请读:: :help 'scrollbind' :help scroll-binding :help 'scrollopt' 当我使用方向键时,Vim改变了模式,并且插入了怪异的字符在我的文档中,但是并没有移动我的光标,这是怎么回事? ---------------------------------------------------------------------------------------------------------- 有两种可能会造成这种情况:假如你不是在一个很慢的链接上使用Vim,那么就是Vim不 理解你的键盘所产生的键序列. 假如你工作在一个很慢的连接上(例如2400bps的猫上),你可以尝试设置'timeout'或 者'ttimeout'选项.这些选项,再和'timeoutlen'和'ttimeoutlen'选项进行组合,可 能修复这个问题. 假如你的终端发送了Vim不懂的键码,那么前面的处理程序有可能会不能正确的工作. 在这种情况下,你最好的选择是映射你的键序列来匹配一些光标移动命令并保存这些 映射到你的文件中去.只要你在终端上工作,就都可以":source"这个文件. 更多的资料,请读:: :help 'timeout' :help 'ttimeout' :help 'timeoutlen' :help 'ttimeoutlen' :help :map :help vt100-cursor-keys 我该如何配置Vim,当我在一行的开始处,按下向左的键时,移动到前一行的末尾处? ------------------------------------------------------------------------------ 你可以增加'<'标志位到'whichwrap'选项中来配置Vim当光标在一行的开始处,按下向 左的键,会跳到前一行的末尾处:: :set whichwrap+=< 相似的,当光标在行末尾处,按下向右的键要移动到下一行的开始处,只要增加'>'标 志位到'whichwrap'选项中:: :set whichwrap+=> 上面的方法只能工作在正常模式和可视模式中.假如想在插入或置换模式中开启这项 功能的话,只要加入相应的'['和']'标志位. 更多的资料,请读:: :help 'whichwrap' :help '05.7' 我该如何配置Vim只工作在工作在插入模式下(无模式编辑)? ----------------------------------------------------------- 你可以设置'insertmode'选项来配置Vim使其只呆在插入模式下:: :set insertmode 设置了这个选项后,你可以把Vim当作无模式编辑器使用.假如你按下了键,Vim 不会回到正常模式中.假如想执行一个普通模式下的命令,你可以按下CTRL-O,然后 键入正常模式命令.假如想执行超过一条命令,你可以按如CTRL-L然后再键入命令. 假如想回到插入模式,按下,关闭这个选项,然后重置'insertmode'选项:: :set noinsertmode 你可以使用"evim"命令或者你可以使用"vim -y"来以无模式的方法启动Vim. 你也可以使用":startinsert"ex命令以插入模式启动Vim. 更多的资料,请读:: :help 'insertmode' :help :startinsert :help :stopinsert :help i CTRL-O :help i CTRL-L :help evim :help evim-keys 我该如何在当我卷动文本时显示一些相关的上下文? ---------------------------------------------------- 你可以设置'scrolloff'选项来显示在光标上或下的一些行数:: :set scrolloff=10 更多的资料,请读:: :help 'scrolloff' :help 'sidescrolloff' 我该如何回到上一次光标所在的位置? ---------------------------------------- 你可以使用''或``命令,在新的跳转前,跳到上一次光标所在的位置.你可以使用 CTRL-O命令跳到较老的光标位置,而CTRL-I命令将会到跳转列表中较新的地方. 更多的资料,请读:: :help 03.10 :help mark-motions :help jump-motions =========================================================================== 章节 11 - 搜索文本 ================== 在我以某种模式搜索到了一个匹配的文本时,所有的匹配都以高亮显示.我该如何暂时/永久 关闭高亮? ----------------------------------------------------------------------------------------------- 'hlsearch'选项控制是否打开对上次模式的匹配进行高亮.默认的,这个选项是不会 开启的.假如这个选项是被设置在多个系统使用的vimrc文件中,那么你该通过如下的 命令关闭搜索高亮:: :set nohlsearch 暂时的关闭搜索高亮,使用:: :nohlsearch 你也可以清除搜索的高亮,通过搜索不在本文件中的模式(例如,搜索模式'asdf'). 更多的资料,请读:: :help 'hlsearch' :help :nohlsearch 我该如何在搜索模式中插入一个回车符? ----------------------------------------- 你可以在一个模式中使用'\r'或者来插入一个回车符号.在Vim脚本 中,更加适合使用'\r'来代替回车符. 更多的资料,请读:: :help sub-replace-special 我该如何搜索字符^M? ------------------------- 你可以先键入CTRL-V键,然后键入CTRL-M键,来搜索^M字符:: /^V^M 你也可以使用"\r"字符.在Vim脚本中,"\r"字符是首选. 更多的资料,请读:: :help c CTRL-V :help using CTRL-V :help /\r 我该如何搜索/替代看起来像'~R','~S',这类的字符? ---------------------------------------------------- 你可以使用'ga'命令来显示特殊字符的ascii 值/码.例如,让我们假设这个ascii值 是142.然后你使用如下的命令来搜索特殊的字符:: /^V142 ^V是按CTRL-V输入的. 更多的资料,请读:: :help ga :help using_CTRL_V :help 24.8 我该如何高亮一个文件中的所有空白字符(non-printable)? ---------------------------------------------------------- 你可以使用如下的命令和搜索模式来高亮文件的所有空白字符:: :set hlsearch /\(\p\|$\)\@!. 更多的资料,请读:: :help /\p :help /bar :help /$ :help /\( :help /\@! :help 'hlsearch' 我该如何搜索一个文件中的完整的单词? ----------------------------------------- 你可以搜索完整的单词,只要使用\<和\>原子操作符即可.例如:: /\ \<原子操作符匹配单词的开头,而\>标志着单词的结尾. 更多的资料,请读:: :help /\< :help /\> 我该如何搜索光标下的单词? ------------------------------- 你可以通过按下*键来向前搜索位于光标下的单词.想往后搜索,请按#键.请记住, 使用这个命令被搜索的是整个单词. 更多的资料,请读:: :help star :help # :help g* :help g# :help 03.8 :help search-commands 我该如何搜索一个单词而不用考虑大小写(大写或小写)? ------------------------------------------------------- 当搜索一个模式时,为了总是忽略大小写,可以设置'ignorecase'选项:: :set ignorecase 当只想搜索某个特殊的模式时,忽略大小写,可以设置'ignorecase'选项:: /\c 更多的资料,请读:: :help 'ignorecase' :help /ignorecase :help /\c 我该如何搜索一个连续出现两次的单词? ----------------------------------------- 你可以使用如下的命令来定位出现两次的单词:: /\(\w\+\)\_s\+\1\> /\(\k\+\)\_s\+\1\> 使用'\w'和'\k'的主要不同之处在于,后者使用时基于的'iskeyword'选项包含了一些 重音符号和别的语言的一些特殊符号. 更多的资料,请读:: :help /\1 :help /\( :help /\) :help /\< :help /\> :help /\w :help /\k :help /\+ :help /\ x :help 'iskeyword' 我该如何搜索缓冲区中某个单词的的出现次数? ------------------------------------------------ 你可以使用如下的命令来计算缓冲区中特定单词的出现次数:: :let cnt=0 :g/\/let cnt=cnt+1 :echo cnt 这会计算单词出现的行的行数.你可以使用如下的命令:: :%s/\/&/g 为了计算文件中的alphabetic word数,你可以使用:: :%s/\a\+/&/g 为了计算有非空白字符合成的单词数,你可以使用:: :%s/\S\+/&/g 更多的资料,请读:: :help count-items :help word-count :help v g CTRL-G :help 12.5 我该如何置光标位置到匹配模式中的单词的结尾处? ---------------------------------------------------- 你可以使用'e'偏移到搜索命令来置光标到匹配单词的末尾处.例如:: /mypattern/e 更多的资料,请读:: :help search-offset :help / 我该如何搜索空行? ------------------------ 你可以使用下面的命令搜索空行:: /^$ 或 /^\s*$ 更多的资料,请读:: :help /^ :help /4 :help /\s :help /* :help search-commands 我该如何搜索只包含单个字符的行? -------------------------------------- 你可以使用如下的命令来搜索只包含单个字符的的行:: /^/s*\a\s*$ 更多的资料,请读:: :help /^ :help /\a :help /\s :help /* :help /$ 我该如何搜索/替换多个文件中的某个字符串? ----------------------------------------------- 你可以使用'argdo'或'bufdo'或'windo'命令来对多个文件执行ex命令.例如:: :argdo %s/foo/bar/g 更多的资料,请读:: :help :argdo :help :bufdo :help :windo 我在一个映射中使用了":s"substitute命令.当对某种模式的搜索失败了,这个映射也就终止了.我希望即使这个substitue命令失败了,也能够继续执行映射中的命令.我该如何做? ------------------------------------------------------------------------------------------------------------------------------------------------------------------ 你可以使用'e'标志加给substitute命令,即使当一个模式搜索失败了,也可以执行映 射中的别的命令. 更多的资料,请读:: :help :s flags 我该如何搜索一行中第n次出现的字符? ----------------------------------------- 为了搜索一行中第n次出现的字符,你可以在'f'命令假上记数前缀.例如,搜索第5次 在行中出现的字符@,你可以使用命令5f@.这是假设光标在行的开始处-而且第一个字 符不是你要搜索的那个字符. 更多的资料,请读:: :help f :help F :help t :help T :help ; :help , 我该如何置换一个tab(或者别的字符)为一个回车符(新行符)? ------------------------------------------------------------- 你可以使用如下的命令来替换一个tab(或者别的字符)为一个换行符(新行符):: :s/\t/\r/ 记住,在上面的命令中,假如你使用\n代替\r,那么tab字符将不会被替换为新行符. 更多的资料,请读:: :help sub-replace-special :help NL-used-for-Nul :help CR-used-for-NL 我该如何根据ascii值来搜索字符? ------------------------------------- 你可以在"/"命令后按下CTRL-V后,跟10进制或16进制或8进制数来根据ascii值搜索字 符.为了确定某个字符的ascii值,你可以使用":ascii"或"ga"命令. 更多的资料,请读:: :help i CTRL-V digit :help :ascii :help ga 我该如何搜索长行? ------------------------ 你可以在搜索命令中使用正则表达式搜索长行或者行中包含很多较长的字符系列.例 如,搜索所有超过80个字符的行,你可以使用如下的命令:: /^.\{80}.*$ /^.*\80c.*$ 更多的资料,请读:: :help /\{ :help /\%c 我该如何显示当前缓冲区中所有包含模式匹配的行? ---------------------------------------------------- 你可以使用如下的命令来显示当前缓冲区中所有包含某种模式的行:: :g//p 例如,下面的命令会显示缓冲区中所有包含"vim"的行:: :g/vim/p 假如你想获得相应的行数,键入如下的命令:: :g//# 更多的资料,请读:: :help :global :help :print :help :number 我该如何搜索一个跨越多行的字符串? ---------------------------------------- 你可以使用\_x正则表达式的原子操作符来搜索一个跨越多行的文本.例如,搜索一个 字符串"Hello world",你可以使用如下的搜索命令:: /Hello\_sWorld 这将会匹配单词"hello"跟一个新行符和另一行行首的单词"world".当然这个新行符 也可以是一个空格符.当搜索"Hello World"字符串时:: /Hello\_s\+World 更多的资料,请读:: :help 27.8 :help pattern-atoms :help /\ :help pattern-searches 我该如何搜索一个缓冲区中特定的行范围内的模式呢? ------------------------------------------------------ 你可以使用\%>l和\%10l\%<20l 更多的资料,请读:: :help /\%l =========================================================================== 章节 12 - 修改文本 ================== 我该如何删除文件中,所有尾部的空白符(space 和 tab)? -------------------------------------------------------- 你可以对整个文件使用":substitute"命令来搜索并删除所有的尾部空白符:: :%s/\s\+$// 更多的资料,请读:: :help :% :help :s :help /\s :help /\+ :help /$ 我该如何置换所有多个连续的空白为单个空白符? ------------------------------------------------- 你可以使用如下的命令来置换所有出现的多个空白符为单个空白符:: :%s/ \{2, }/ /g 更多的资料,请读:: :help :%s :help :s :help /\{ :help :s flags 我该如何置换一系列的空行为单个空行? ----------------------------------------- 你可以使用如下的命令来减少一系列的空行为一行:: :v/./.,/./-1join 对于这个命令的解释如下:: :v/./ 对所有的空行执行某项操作. ./ 使用当前行作为行范围的首行 /./ 使用包含单个字符的行作为末行 -1 调整行的范围把最后行的前一行作为末行 j 把所有范围内的行合并 记住,假如空行是在文件的底部的话,那么这个命令将会报错.为了矫正这个错误, 你可以在文件的末尾假如一个临时行,执行完了命令后,在去掉那行. 更多的资料,请读:: :help :v :help :join :help cmdline-ranges :help collapse 我该如何删除文件中的所有空白行?我该如何删除所有只包含空白符的行? ---------------------------------------------------------------------- 想删除所有的空白行,可以使用下面的命令:: :g/^$/d 想删除那些行中只有空白符(space | tab)的行,使用下面的命令:: :g/^\s\+$/d 删除那些只有空白符或者什么都没有的行,使用如下命令:: :g/^\s*$/d 我该如何copy/yank当前单词? -------------------------------- 你可以使用"yiw"(yank无空白符单词)命令或者"yaw"(yank含空白符单词)命令来 copy/yank当前单词. 更多的资料,请读:: :help 04.6 :help 04.8 :help iw :help yank :help text-objects :help objects 我该如何yank一行内的部分文本,而不会yanking整个行? -------------------------------------------------------- 你可以定义一个详细的移动命令来yank一行内的部分文本.例如,yank当前文本从当 前的光标下到字符x为止,使用yfx或者Fx或者tx或Tx.打算yank到第n列,使用n|.打算 yank到下一个'word'出现为止时,使用/word.假如打算yank到另一行的第n列,首先可以 使用'ma'命令来标记位置,然后到需要yank的起始位置然后使用命令y`a(记住引号的方 向) 更多的资料,请读:: :help yank :help motion.txt :help 4.6 我该如何在我已经往寄存器内存入文本后,继续往积存器中追加文本? ------------------------------------------------------------------ 当你在对寄存器执行某些操作后,假如你使用的是大写寄存器名,那么新的文本将会被 追加入到已存在的内容中去.例如,假如你已经有一些文本在积存器"a".那么,假如你打 算继续加入文本,你可以使用大写的"A"积存器名.假如你使用了小写的,那么原先的内 容将会被覆盖. 更多的资料,请读:: :help quote :help quote alpha :help 10.1 我该如何yank一个跨越多行的完整的句子? ------------------------------------------- 想yank一个圆括号内的,跨越多行的句子,可以使用yank操作符跟一个移动命令.例如:: y) 在句子中,你可以使用'yi)'来yank这个句子. 更多的资料,请读:: :help yank :help (motion) :help object-motions :help 04.6 我该如何yank缓冲区内所有包含某种模式的行? ----------------------------------------------- 你可以使用":global"命令来yang所有的包含模式的行到一个寄存器中.然后把寄存器 中的内容粘贴到缓冲区中:: :let @a='' :g/mypattern/y A 第一个命令,是用来清除寄存器的内容.第二条命令拷贝所有的包含"mypattern"的行 到寄存器"a"中.记住大写字母的"A"是被用于追加匹配的行到寄存器中去的.现在你可 以使用"ap命令来粘贴寄存器的内容到缓冲区上. 更多的资料,请读:: :help :g :help :y :help let-register :help quote alpha :help put :help registers :help :registers 我该如何删除所有不包含某种模式的行? ------------------------------------------ 你可以使用":v"命令来删除所有不包含某种模式的行:: :v/pattern/d 或者 :g!/pattern/d 更多的资料,请读:: :help :v :help :g 我该如何在每个匹配的模式行前面加入自定义的一行? ------------------------------------------------------ 你可以使用如下的命令每个模式匹配的行的前面加入自己定义的一行:: :g/pattern/normal Oi 当然你也可以使用Y命令yank某行,然后使用如下的命令来插入这些行:: g/pattern/put! 更多的资料,请读:: :help :g :help :put :help insert :help 0 是否有方法可以对包含模式的行的前一行进行某种操作? -------------------------------------------------------- 你可以使用":global"命令来操作包含特殊模式行的前一行:: :g//+{cmd} 更多的资料,请读:: :help :g :help :range 我该如何对所有包含某种模式的行执行某项命令? -------------------------------------------------- 你可以使用":global"(:g)命令来对所有包含模式的行执行某项命令:: :g/my pattern/d 假如你想使用non-Ex命令,你可以使用":normal"命令:: :g/my pattern/normal {command} 除非你使用的命令被重映射过,可以考虑使用":normal!"来进行代替(记住"!"). 更多的资料,请读:: :help :global :help :v :help :normal 我是否能拷贝光标上面的字符到光标当前的位置? -------------------------------------------------- 在插入模式下,你可以拷贝通过按下来拷贝光标上的字符到光标当前位置.而 拷贝下面的字符可以按. 更多的资料,请读:: :help i CTRL-Y :help i CTRL-E 我该如何插入一个空白行到当前行的上面/下面,而不用进入插入模式? -------------------------------------------------------------------- 你可以使用":put"ex命令来插入空白行.例如, 尝试:: :put ='' :put! ='' 更多的资料,请读:: :help :put 我该如何在当前缓冲区中插入当前文件的文件名? -------------------------------------------------- 有几种方法可以在当前缓冲区中插入当前文件的文件名.在插入模式下,你可以使用 %或者=expand("%")命令.在正常模式下,你可以使用":put =@%"命令. 更多的资料,请读:: :help i CTRL-R :help expand() :help !! 我该如何插入Vim寄存器的内容到当前缓冲区中? -------------------------------------------------- 在插入模式下,你可以使用命令来插入寄存器的内容.例如,使用 a来插入寄存器a中的内容到当前缓冲区中. 在正常模式下,你可以使用":put "命令来插入的内容.例如,使 用":put d"命令来插入寄存器"d"中的内容到当前缓冲区中. 更多的资料,请读:: :help i CTRL-R :help :put 我该如何移动光标越过行终结符,并在这个位置插入些文本? ----------------------------------------------------------- 你可以设置"virtualedit"选项来移动光标越过end-of-line,并在这个位置插入字符. 想启动虚拟模式,使用:: :set virtualedit=all 更多的资料,请读:: :help 'virtualedit' 我该如何在Vim中置换光标下的单词(例如:junk)为"foojunkbar"? ---------------------------------------------------------------- 这里有几种方法做这些.假如这个单词是行中的第一个单词,使用如下的命令:: :exe "s/".expand("")."/foo&bar." 为了匹配更加严格的单词,你可以使用更加复杂的置换命令:: :exe 's/\<'.expand("").'\%>'.(col(".")-1).'c\>/foo&bar/' 你也可以使用命令:: ciwfoo"bar 更多的资料,请读:: :help :substitute :help expand() :help col() :help /\%c 我该如何置换一个目录中所有文件中的一段特定文本? ------------------------------------------------------ 你可以使用"argdo"命令来对在参数中指定的文件执行置换命令:: :args * :argdo %s///ge | update 更多的资料,请读:: :help :args f :help :argdo :help :s flags 我有一些数据在文件中.我该如何增大/减小文件中的数? -------------------------------------------------------- 你可以使用CTRL-A来增大数字,使用CTRL-X来减小这个数.你也可以指定详细的需要增 大或减小的数.这个可以工作在10,8,16进制的数下.你也可以改变Vim使用的基数,需要 修改'nrformats'选项. 更多的资料,请读:: :help 26.2 :help CTRL-A :help CTRL-X :help 'nrformats' 我该如何在":substitute"命令中使用上一次使用过的搜索模式? --------------------------------------------------------------- 想在":substitute"命令中使用上一次的搜索模式.不需要重新指定:: :s/pattern/newtext/ :s//sometext/ 在第二个":s"命令中,搜索模式并没有被详细指定过,但是第一个":s"命令中的搜索模 式会被使用到. 假如你想改变搜索模式,但是重复置换模式,你可以使用special right hand side,你 可以使用波浪符:: :s/newpattern/~/ 更多的资料,请读:: :help :s :help :& :help :~ :help sub-replace-special 我该如何使用":substitute"命令改变字符串的大小写? -------------------------------------------------------- 你可以在":substitute"命令中在置换字符串中使用特殊的字符来改变匹配字符串的大 小写.例如,想改动字符串"MyString"为大写,你可以使用如下的命令:: :%s/MyString/\U&/g 想改为小写,你可以使用如下命令:: :%s/MyString/\L&/g 想改动当前行的所有单词的第一个字符,为大写字符,你可以使用下面的命令:: :/\<\(.\)\(\k*\)\>/\u\1\L\2/g 更多的资料,请读:: :help sub-replace-special :help :substitute :help \U :help \L :help \u 我该如何键入那些不在键盘上的字符? ---------------------------------------- 你可以使用digraphs来键入那些不在键盘上的字符.你可以使用":digraphs"命令来显 示所有当前定义的连字.你可以使用":digraphs"命令来增加新的连字图标到列表中. 更多的资料,请读:: :help digraphs :help 'digraphs' :help 24.9 是否有命令来删除任何一个或者所有的连字图标? -------------------------------------------------- 没有.digraphs表是在编译时被定义的.你只能往里面加入新的.在todo列表中,已经打 算加入一个命令来删除所有的图标. 在插入模式中,当我按下backspace键,它只会删除我在这个插入模式实例中所键入的字符.我该如何使用删除我在以前的插入模式中所键入的字符? ------------------------------------------------------------------------------------------------------------------------------------------------- 你可以设置"backspace"选项来擦除上次插入模式中所键入的字符:: :set backspace=indent,eol,start 更多的资料,请读:: :help 'backspace' :help i backspacing 我有一个文件,其中的一些行超过了72字符,并以"+"结尾,然后就饶行了.我该如何快速合并这些行? --------------------------------------------------------------------------------------------- 你可以使用":global"命令来搜索并合并这些行:: :g/+$/j 然后,上面的例子,只能用来合并两行.下面有两个更复杂的例子可以合并所有连续的 以"+"结尾的行:: :g/*$/,/\(^\|[^+]\)$/j :g/+$/mark a \ .,/\(^\|[^+]\)$/s/+$// | 'a,.j 更多的资料,请读:: :help :g :help :j :help :mark 我该如何粘贴被yank的文本到一个新行中去? ---------------------------------------------- 你可以使用":put"命令来粘贴被yank的文本到新行中去:: :put =@" 更多的资料,请读:: :help :put :help quote = 我该如何改变文本中单词/字符/块的大小写? ---------------------------------------------- 你可以使用"~"命令拉来转变字符的大小写. 你可以使用"gUiw"或者"viwU"命令来改变光标下的单词为大写,也可以使用"guiw"或者 "viwu"来改为小写. 你可以使用"viw~"或者"g~iw"命令转换光标下单词的大小写(大写转成小写,或相反). 你也可以使用"gUgU"命令来转换当前行都为大写,也可以使用"gugu"把当前行都转换为 小写. 你可以使用"g~g~"来切换当前行的大小写状态.你可以使用"g~{motion}"或者使用 "{Visual}~"命令来切换一个文件块的大小写. 更多的资料,请读:: :help case 我该如何键入那些不在键盘上的ASCII字符? --------------------------------------------- 你可以通过按下CTRL-V然后跟上ASCII字符号来输入那些不在键盘上的ASCII字符.你也 可以使用digraphs来输入特殊的ASCII字符. 更多的字符,请读:: :help i CTRL-V digit :help digraphs :help 45.5 我该如何置换文件中那些不可显示(non-printable)字符? --------------------------------------------------------- 想置换一个不可显示字符,你首先要确定那个字符的ASCII值.你可以使用":ascii"ex 命令或者普通模式下的"ga"命令来显示当前光标下字符的ASCII值. 你可以通过输入CTRL-V后跟一个10进制数1-255(没有前导的0),或者跟x加一个16进制 数00-FF,又或者是0-0377(有前导的0),或者是u加一个16进制数0-FFFF,还或者是U加一 个16进制数0-7FFFFFFF. 另外一个办法就是使用":digraphs"ex命令来显示所有字符的连字,以及他们的10进制 值和字符.你可以键入CTRL-K后跟二个字母数字型字符(一个连字)来输入一个不可显 示字符. 更多资料,请读:: :help :ascii :help i CTRL-V :help i CTRL-V digit :help :digraphs 我该如何从一个缓冲区中删除相同的行? ------------------------------------------ 你可以使用下列用户定义的命令来从缓冲区中删除所有用户定义的行:: :command -range=% Uniq ,g/^\%<l\(.*\)\n\1$/d 假如以上你的命令到你的.vimrc文件中,然后调用":Uniq"来删除所有的相同的行? 我该如何给文件中的所有行,加上正确的行数前缀? --------------------------------------------------- 你可以使用几种方法来给文件中的所有行加上行前缀,一些方法在下面列出:: :%s/^/\=line('.').' ' :%s/^/\=strpart(line(".")." ",0, 5) :g/^/exec "s/^/".strpart(line"."." ", 0, r) 更多的资料,请读:: :help sub-replace-special :help line() :help expr6 :help strpart() :help :execute :help :global 我该如何交换两个字符/单词/行? ------------------------------------ 你可以使用"xp"来交换两个字符.'x'会删除当前光标下的字符,而'p'会粘贴干才删除 掉的字符到当前光标的右边.这样就可以交换两个字符了. 你可以使用"deep"的合成命令来交换两个单词(光标必须得停留在第一个单词的左边空 白处). 你可以使用"ddp"来交换两行.'dd'会删除行,而'p'会粘贴删除的行到当前的行下面.这 样就可以交换两行了. 所有上面的操作都会改变"的无名寄存器. 你可以使用":m +"ex命令来交换两行而不用改动寄存器中的内容. 更多的资料,请读:: :help x :help p :help dd :help d :help e :help linewise-register :help quotequote :help :move 我该如何改变用做单词定界符的字符? ---------------------------------------- Vim使用被'iskeyword'选项定义的字符作为单词定界符.默认的选项是"@,48-57,_, 192-255". 例如,假如想增加':'为单词定界符,你可以使用:: :set iskeyword+=:: 想删除单词定界符的'_',你可以使用:: :set iskeyword-=_ 更多的资料,请读:: :help 'iskeyword' :help word =========================================================================== 章节 13 - 插入模式下的补全 ========================== 我该如何在插入模式下补全单词或行? --------------------------------------- 在插入模式下,你可以使用CTRL-P和CTRL-N键来补全单词.CTRL-N会向前搜索匹配的单 词.而CTRL-P会向后搜索匹配的单词. 在插入模式中,你可以使用CTRL-X CTRL-L命令序列来对光标前的字符序列相同的行进 行补全.假如想得到下一个匹配,可以按CTRL-P或CTRL-N键.在插入模式中,有很多的键 或方法可以用来补全单词. Vim支持对以下条目的补全:: CTRL-X CTRL-F 文件名 CTRL-X CTRL-L 整行 CTRL-X CTRL-D macro definitions (also in include files) CTRL-X CTRL-I 当前和被包含的文件 CTRL-X CTRL-K 字典里的单词 CTRL-X CTRL-T 辞典里的单词 CTRL-X CTRL-] tags CTRL-X CTRL-V Vim命令行 更多的资料,请读:: :help 24.3 :help ins-completion 我该如何在插入模式下进行文件名的补全? ------------------------------------------- 在插入模式下,你可以使用CTRL-X CTRL-F命令序列来以当前行中,光标前的相同的字符 进行文件名的补全. 更多的资料,请读:: :help compl-filename 我使用CTRL-P/CTRL-N在插入模式下补全单词.我该如何在刚补全的单词后继续补全单词? ----------------------------------------------------------------------------------- 你可以使用CTRL-X CTRL-N和CTRL-X CTRL-P在刚补全的单词后继续补全单词. 更多的资料,请读:: :help i CTRL-X CTRL-P :help i CTRL-X CTRL-N :help ins-completion =========================================================================== 章节 14 - 格式化文本 ==================== 我该如何格式化一个文本段落使其在每个回饶行后插入一个新行符? ----------------------------------------------------------------- 你可以使用'gq'命令来格式化段落,他们将会根据当前的'textwidth'设置来格式化文 本. 记住gq操作符后该跟一个移动命令来操作一个范围内的文本.例如:: gqgq - 格式化当前行 gqqp - 格式化当前段落 gq3j - 格式当前行和接着的三行 更多的资料,请读:: :help gq :help formatting :help usr 25.txt :help motion.txt 我该如何格式化文件中的长行使每行包含少于'n'个的字符? ---------------------------------------------------------- 你可以设置'textwidth'选项来控制出现在文件中的行的字符数.例如,想控制行的字符 宽度为70字符,你可以使用下面的命令:: set textwidth=70 现在可以把文件中的长行断开为'textwidth'选项规定的长度,你可以使用:: :g/./normal gqq 更多的资料,请读:: :help 'textwidth' :help gq 我该如何合并一些短行来形成一个段落? ----------------------------------------- 首先,确定'textwidth'选项设置一个高的值:: :set textwidth=99999 下一步,使用命令来合并短行来形成一个段落:: 1GgqG 以上的命令会操作整个文件.假如想对特定范围内的段落进行格式化,使用:: :'a,'bg/\S/normal gq} 更多的资料,请读:: :help gq :help G :help gqq ------ 我该如何在插入模式下缩进行? --------------------------------- 在插入模式下,你可以按CTRL-T键来在当前行的起始处插入一个缩进.在插入模式下,你 可以使用CTRL-D键来删除当前行起始处的shiftwidth或indent.你也可以使用 CTRL-O >>和CTRL-O <<命令来在插入模式下缩进当前行. 更多的资料,请读:: :help i_CTRL-T :help i_CTRL-D :help i_0_CTRL-D :help i_CTRL-O :help >> :help << 我该如何格式化/缩进整个文件? ---------------------------------- 你可以使用gg=G命令来格式化/缩进整个文件:: gg - 到文件头位置 = - 执行缩进 G - 到文件尾 更多的资料,请读:: :help gg :help = :help G :help 'formatprg' :help C-indenting 我该如何增加或减少当前行的缩进? ------------------------------------- 你可以使用'>>'和'<<'命令来增加或减少当前行的缩进. 更多的资料,请读:: :help shift-left-right :help >> :help << :help 'shiftwidth' 我该如何缩进块或组? ------------------------- 你可以在可视模式选择一个行组然后按>或<来缩进/反缩进这个组.你也可以使用下面 的ex-command来缩进这些行:: :10,20> 更多的资料,请读:: :help shift-left-right :help v > :help v < :help :< :help :> 当我使用<,>键缩进时,标准的8-tabstops代替了当前的'tabstop'设置.为什么? --------------------------------------------------------------------------- 使用">"操作符时,使用的格数是由'shiftwidth'选项控制的.'tabstop'设置并没有被 用于缩进.想改变缩进使用的空格数,使用如下命令:: :set shiftwidth=4 更多的资料,请读:: :help 'shiftwidht' :help >> :help 'softtabstop' 我该如何关闭文件的自动缩进? ---------------------------------- 默认的,文件的自动缩进是没有开启的.检查配置文件(.vimrc, .gvimrc)中有关缩进的 设置.确认":filetype indent on"命令没有出现.假如出现了,删除他.当然,基于你自 己的选择,你也可以来检查'autoindent','smartindent','cindent'和'indentexpr' 选项并按需要来关闭他们. 更多的资料,请读:: :help :filetype-indent-off :help 'autoindent' :help 'smartindent' :help 'cindent' :help 'indentexpr' 我该如何在当我编辑邮件的时候自动的把'textwidth'设置为特殊的值? --------------------------------------------------------------------- 你可以使用'FileType'自动命令来设置'textwidth'选项:: autocmd FileType mail set tw= 更多的资料,请读:: :help :autocmd :help FileType :help usr 43.txt 是否有方法使Vim魔法般的自动断行? --------------------------------------- 有.设置'textwidth'选项来做为一行长度的首选值.然后Vim将会自动的进行断行了. 例如:: :set textwidth=75 更多的资料,请读:: :help 'textwidth' 更多资料,请读:: :help 'textwidth' :help ins-textwidth :help 'formatoptions' :help fo-table :help formatting 我在自己的文件中看到了很多^M符号.我尝试着设定'fileformat'选项,为'dos',然后是'unix',再跟'mac'.但是似乎没有什么效果.我该如何隐藏这些字符? ---------------------------------------------------------------------------------------------------------------------------------------------- 当一个文件被载入Vim中,文件的格式是由以下的东西所决定: - 假如所有的行都是以新行符()结尾,那么这个文件格式就是'unix'. - 假如所有的行以结尾,那么这个文件格式就是'dos'. - 假如所有的行都以结尾,那么这个文件格式就是'mac'. 假如这个文件有一些行以结尾,有一些行以结尾,那么文件格式就为'unix'. 你可以通过设置'fileformat'选项,并保存文件,来改变当前文件的格式:: :set fileformat=dos :w 想显示当前文件的格式,使用:: :set fileformat? 上面的工作方式是由'fileformats'选项控制的.你可以尝试如下的命令:: :set fileformats+=unix :e :set fileformat=unix :w 假如想删除当前文件所有行尾的回车符,你可以用如下命令:: :%s/\r^// 假如想强迫Vim使用一种特殊的格式,你可以在编辑一个文件时,使用如下命令:: :e ++f=dos filename 更多的资料,请读:: :help 'fileformats' :help 'fileformat' :help file-formats :help DOS-format-write :help Unix-format-write :help Mac-format-write :help dos-file-formats :help 23.1 :help ++ff 当我从一个应用程序处复制了很多文本,粘贴到Vim缓冲区中的时候,所有的格式对齐(缩进)都没了,我该如何修正这些问题? ------------------------------------------------------------------------------------------------------------------ 文本缩进的消失是由于不同的Vim中关于缩进的设置略有不同造成的(例如autoindent, smartindent,textwidth etc).在粘贴文本到Vim前,你可以设置'paste'选项:: :set paste 在粘贴完了文本后,你可以关闭这些选项:: :set paste! 假如你能通过 \* 寄存器存取剪贴板,然后你可以使用CTRL-R CTRL-O \*,粘贴无缩进的文 本. 更多的资料,请读:: :help 'paste' :help 'pastetoggle' :help i_CTRL-R_CTRL_O :help clipboard :help xterm-clipboard :help gui-clipboard 当一个长行饶行(wrap为"on"),所饶的行中的字符变成了'@'.假如我尝试滚动屏幕来安放这些行,那么'@'符号消失了然后这些行的字符又出现了.vim是如何控制这些行为的? ------------------------------------------------------------------------------------------------------------------------------------------------------------- 你可以设置'display'选项为'lastline'来尽可能的显示窗口最后的行以代替显示'@'字符:: :set display=lastline 更多的字符,请读:: :help 'display' 我该如何转换文件Tab字符为空格字符? ----------------------------------------- 你可以使用":retab"命令来跟使用当前对'expandtab'和'tabstop'的设置来转变当前 文件中的Tab字符.例如,转变所有的字符为空格,使用:: :set expandtab :retab 更多的资料,请读:: :help 'display' -------- 我该如何能够合并两行而不用增加或减少任何的空格字符? ---------------------------------------------------------- 默认的,当你使用"J"或":join"命令,Vim会在断行的处增加一个空格.假如这行以空格 符结尾或者以')'作为下一行的开始字符,那么Vim将不会往Vim中增加空格字符. 假如想合并行而不用增加或减少任何空白符,你可以使用gJ或":join!"命令. 更多的资料,请读:: :help gJ :help :join :help J :help 10.5 :help 'joinspaces' :help 'cpoptions' :help 'formatoptions' =========================================================================== 章节 15 - 可视模式 ================== 我该如何做矩形块拷贝? --------------------------- 你可以使用可视模式中的块拷贝.使用CTRL-V键来开启块拷贝模式.使用任何的移动键 来移动光标,然后使用y操作符来yank可视模式中选择的文本. 假如CTRL-V不能如预期般的工作,可能是因为在windows系统中的mswin.vim脚本被 vimrc所调用,来模仿一些别的程序中的快捷键,导致了CTRL-Q被重映射. 更多的资料,请读:: :help 04.4 :help blockwise-visual :help visual-mode :help Q vi 我该如何删除文件中的竖向文本? ----------------------------------- 你可以在Vim的可视模式下执行块操作来选择竖向文本,并执行操作(删除,修改,拷贝, 等等). 更多的资料,请读:: :help visual-block :help visual-operators 我该如何对可视模式中被选择的文本执行Ex命令? ------------------------------------------------- 当你在可视模式下选择了一定范围的文本,那么<寄存器被设置为指向可视区域的开始 处而>寄存器指向了结尾.你可以使用这些寄存器来指定区域,并执行ex命令.在可视化 模式中选择了文本后,按下":"或跳入到命令行模式.Vim会自动插入可视区域'<','>'. 你可以对可视区域运行任何Ex命令. 更多的资料,请读:: :help v :: :help '< :help '> 我该如何对被选择的竖向文本执行Ex命令? ------------------------------------------- 所有的Ex命令都是对整行的.假如你想对竖向文本执行Ex命令,那么Vim会把命令作用于 所有被选择的行上(包括被选择的列).你可以使用vis.vim插件来完成这方面的工作,从 http://vim.sourceforge.net上可以得到. 更多的资料,请读:: :help cmdline-ranges :help 10.3 :help cmdline-lines 我该如何在可视模式下选择整个文件? --------------------------------------- 你可以在可视模式下使用ggVG来选择整个文件:: gg - 到文件开始处 V - 开启可视模式的行选择 G - 到文件尾 更多的资料,请读:: :help gg :help linewise-visual :help G 当我在可视模式中选择了部分文本后,按了>键来缩进被选择的行,缩进模式也就结束了.我该如何重新选择这个区域来做更多的操作?(或着)我该如何重新选择上一次可视模式所选择的区域? -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 你可以在使用'gv'命令来重新选择上一次选择的文本.你也可以使用'<和'>来跳到可视 模式中的开始和结束处. 更多的资料,请读:: :help gv :help '< :help '> 我该如何跳到可视模式中选择区域的开始/结束处? -------------------------------------------------- 你可以使用'o'命令来跳到开始/结束处. 更多的资料,请读:: :help v o 当我用鼠标选择了文本后并按下了:来输入一个ex命令时,被选择的文本被置换成了:字符.我该如何用鼠标像在可视模式下那样选择了文本后,可以输入命令? ---------------------------------------------------------------------------------------------------------------------------------------------- 假如你通过设置'selectmode'选项来配置Vim,用选择模式代替可视模式,那么就会出现 这种情况.可以先检查这个值:: :set selectmode? 被人所熟知的选择模式非常类似于可视模式.当你使用"behave mswin"命令时,那么这个 选项就会被自动设置.选择模式看起来很像可视模式,而且在MS-Windows下也是非常类似 的. 更多的资料,请读:: :help Select-mode :help 'selectmode' :help 9.4 :help :behave 当我用鼠标选择了文本后,Vim进如了选择模式而不是可视模式.为什么? -------------------------------------------------------------------- 'selectmode'选项控制了,当用鼠标选取文本后,是否会启动选择模式.想在使用鼠标选 择文本后开启可视模式,可以从'selectmode'选项删除'mouse'值来实现这个功能:: :set selectmode-=mouse 记住默认的,'selectmode'选项会被设置为空,所以一般都是使用可视模式的. 跟多的资料,请读:: :help 'selectmode' :help Select-mode :help :behave 我该如何以可视模式选择上次拷贝/粘贴过的文本? --------------------------------------------------- 你可以使用'[和']标志来以可视模式选择上次拷贝/粘贴过的文本.'[标记着上次拷贝/ 粘贴文本的开头而']标记着结尾.想以可视模式来重选择文本,可以使用命令'[v']. 更多的资料,请读:: :help '[ :help '] :help 'a :help v =========================================================================== 章节 16 - 命令行模式 ==================== 我该如何在命令模式中或着一个ex命令中使用当前文件的名字? ------------------------------------------------------------- 在命令行中,'%'字符会解释为当前文件的名字.在一些命令中,可能不得不使用 expand("%")来得到文件的名字:: "!perl% 更多的资料,请读:: :help : % :help cmdline-special :help expand() 我该如何在命令行中有效率的编辑文本? ----------------------------------------- 你可以使用命令行窗口来编辑Vim命令行文本.在正常模式下,可以使用"q:"打开Vim的 命令行窗口.在命令行模式中,使用CTRL-F键.在这个窗口中,命令历史记录会被显示出 来.你可以使用正常的Vim键/命令来编辑任何以前/新的命令行.假如想执行一个命令, 可以按下enter/return键. 形似的,搜索历史可以用"g/"和"g?"命令来编辑. 更多的资料,请读:: :help cmdline-window 我该如何切换Vi模式到Ex模式? --------------------------------- 你可以使用Q命令来从Vi模式切换到Ex模式.想从Ex模式切换回Vi模式,可以使用:vi命 令. 更多的资料,请读:: :help Q :help gQ :help Ex-mode :help :vi 我该如何拷贝一个Ex命令的外部输出到一个缓冲区中去? ------------------------------------------------------- 想拷贝一个Ex命令的输入到一个缓冲区中去,你首先得把命令所产生的输出到一个寄存 器中去.你可以使用":redir"命令把外部输出的内容导入到寄存器中.例如:: :redir @a :g/HelloWorld/p :redir END 现在寄存器'a'已经包含了来自ex命令"g/HelloWord/p"的输出了.现在你可以粘贴寄存 器'a'的文本到缓冲区中了.你也可以发送/追加一个ex命令的输出到一个文件中,但是 要使用'redir'命令. 你可以增加":global"命令和":silent"作为前缀,来避免这些行被写入到屏幕上. 想重定向一个Ex命令的输出到一个文件中去,你可以使用如下的命令集:: :redir > myfile :g/HelloWord/p :redir END 更多的资料,请读:: :help :redir :help :silent 当我在命令行中按下tab键来补全文件名时,假如有超过一个匹配那么Vim会补全第一个匹配的文件名并显示所有匹配文件名的列表.我该如何配置Vim仅显示所有的匹配文件名而不会补全为第一个匹配的文件名? -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 你可以修改'wildmode'选项来配置Vim在命令行补全文件名的方式.在这里,你可以设置 'wildmode'选项为'list':: :set wildmode=list 更多的资料,请读:: :help 'wildmode' 我该如何拷贝文本从缓冲区到命令行中或者从命令行到缓冲区中? --------------------------------------------------------------- 在从缓冲区中yanking文本后,使用CTRL-R 0在命令行中粘贴文本,就可以从缓冲区中 拷贝文本到命令行中了.你也可以yank文本到一个指定的寄存器中然后使用CTRL-R 来粘贴文本到命令行中.你也可以使用CTRL-R CTRL-W来粘贴光标下的单词 到命令行中. 想从命令行中抽取文本拷贝到缓冲区中,你可以使用":p命令来粘贴:寄存器中的内容. 经常使用的命令行存储在:寄存器中. 另外一种方法可以实现这些功能的就是在普通模式下使用q:或在命令行模式下使用 CTRL-F来打开命令行窗口模式.在命令行窗口模式你可以使用所有的Vim命令来编辑命 令行. 更多的资料,请读:: :help c CTRL-R :help quote :: :help cmdline-window 我该如何把一条命令放入到命令行历史中而不用执行它? ------------------------------------------------------- 想把一条命令放入到命令的历史记录中而不执行它,只用输入命令并按来结束这 个命令即可. 更多的资料,请读:: :help c 我该如何增加命令行的高度? ------------------------------- 你可以通过修改'cmdheight'悬想来增加命令行的高度:: :set cmdheight=2 更多的资料,请读:: :help 'cmdheight' :help hit-enter :help 05.7 =========================================================================== 章节 17 - VIMINFO ================= 当我调用Vim时,我得到了一条错误信息是有关在viminfo文件中存在非法字符的问题.我该如何去掉这些错误信息? --------------------------------------------------------------------------------------------------------- 你可以删除$HOME/.viminfo或者$HOME/_viminfo来去掉这些错误信息. 更多的资料,请读:: :help viminfo-errors :help viminfo-file-name :help viminfo :help 21.3 我该如何关闭viminfo特性? ------------------------------ 默认的,viminfo特性是被关闭的.假如viminfo特性被一个系统广泛支持的vimrc文件所 开启,那么你可以通过在你自己的.vimrc中设置'viminfo'选项为空串来关闭viminfo特 性:: :set viminfo="" 更多的资料,请读:: :help 'viminfo' 我该如何跨越多个Vim会话,来保存和使用Vim标记? --------------------------------------------------- 你可以使用viminfo文件来跨越多个Vim会话保存并恢复Vim标记.想使用viminfo文件, 首先必须得确定'viminfo'选项不为空.想保存并恢复Vim标记,那么'viminfo'选项不能 包含'f'标志位或者对于'f'选项的值必须得大于0. 更多的资料,请读:: :help 21.3 :help viminfo :help 'viminfo' :help :wviminfo :help :rviminfo =========================================================================== 章节 18 - 远程编辑 ================== ------ 我该如何发送一个命令到Vim服务器端要求写入所有的缓冲区到硬盘中? -------------------------------------------------------------------- 你可以使用如下的Vim远程服务函数来做这些:: $gvim --servername myVIM --remote-send "<-\>:wall" 更多的资料,请读:: :help client-server :help CTRL-\ CTRL-N :help :wall 我该从哪里得到有关于Vim远程服务函数的文档? ------------------------------------------------ 你可以使用下面的命令来得到关于Vim远程服务函数的文档资料:: :help client-server =========================================================================== 章节 19 - 选项 ============== 我该如何以较简单的方式配置Vim? ------------------------------------ 你可以使用":options"命令打开Vim选项窗口:: :options 这个窗口可以被用于查看和设置所有的选项. 更多的资料,请读:: :help :options 我该如何把一个值固定到一个选项上? --------------------------------------- 我该如何设置一个只会影响当前缓冲区/窗口的选项? ---------------------------------------------------- 一些Vim选项有局部/全局值.局部值可以被用于一个指定的缓冲区/窗口.而全局值可以 被用于所有的缓冲区或窗口. 当一个Vim选项使用":set"命令来改变Vim选项的值时,全局值和局部值都被改变.你可 以使用":setlocal"变量来仅修改这个选项的局部值而":setglobal"命令仅修改这个选 项的全局值. 你可以使用":setlocal"命令来设置一个仅影响当前文件/缓冲区的选项:: :setlocal textwidth=70 记住并不是所有的选项都有一个局部值的.你可以使用":setlocal"命令来设置一个只 局部于某个缓冲区/窗口的选项,当然,前提是这个选项有局部值. 你也可以使用如下的命令来设置局部选项:: :let &l:{option-name} = 更多的资料,请读:: :help :setlocal :help local-options 我该如何在一个Vim选项中使用空格符? ---------------------------------------- 想在Vim选项的值中使用空格符,你可以使用转义空格符.例如:: :set tags=tags\ /usr/tags 更多的资料,请读:: :help option-backslash 我该如何把对Vim选项的一些设置加入(插入)到文件的内容中去? -------------------------------------------------------------- 你可以使用模式行来增加Vim选项设置到文件内容中去.例如,在C文件中,你可以增加如 下的命令到文件的头部或尾部中去:: /* vim:sw=4 */ 当编辑C文件时,这将会设置'shiftwidth'选项为4.想完成这个功能,那么必须设置 'modeline'选项.默认的,'modeline'选项被设置.'modelines'会严格的指定Vim会检查 大约多少行. 更多的资料,请读:: :help 21.6 :help modeline :help auto-setting :help 'modeline' :help 'modelines' 我该如何显示文件中行的行号? --------------------------------- 你可以设置'number'选项来显示所有行的行号:: :set number 更多的资料,请读:: :help 'number' 我该如何改变使用"number"选项所开启的显示行号所占的列的宽度? ----------------------------------------------------------------- 'number'选项所开启的行号显示,所站的列宽度是靠Vim中编程硬性实现的.所以是没有 可能改变的. 现在这个要求,已经被加入到Vim列表中了:: "Add an option to set the width of the 'number' column. Eight positions is often more than needed. Or adjust the width to the length of the file? Add patch that adds 'numberlen' option. (James Harvey) Other patch with min and max from Emmanuel Renieris (2002 Jul 24) Other patch with out an option by Gilles Roy (2002 Jul 25)" 我该如何查看文件中的所有不可显示字符如space,tabs和newlines? ----------------------------------------------------------------- 你可以设置'list'选项来查看你文件中的所有不可显示字符:: :set list 当这个选项设置后,你可以查看所有的space,tabs,newlines,trailing space和 wrapped lines. 想要不显示这些非可见字符(默认的),你可以重置'list'选项:: :set nolist (or) :set list! ":set list!"命令将会 你可以修改'listchars'选项来配置如何显示那些不可见字符.例如,下面的命令就是把 尾部空格符显示为'.'字符. :set listchar=trail:. 更多的资料,请读:: :help 'listchars' :help 'list' 我该如何配置Vim来显示当前行号,和列号? ------------------------------------------- 你可以设置'ruler'选项来在状态栏上显示当前的行号和列号:: :set ruler 更多的资料,请读:: :help 'ruler' 我该如何显示当前Vim所在的模式? ------------------------------------- 你可以设置'showmode'选项来显示当前Vim的模式.在插入,置换,和可视模式中,Vim会 显示当前模式在末行中:: :set showmode 更多的资料,请读:: :help 'showmode' 我该如何配置Vim使其在状态栏上显示未完的/未决的命令? ---------------------------------------------------------- 你可以设置'showcmd'选项来在状态栏上显示为完的/未决的命令:: :set showcmd 更多的资料,请读:: :help 'showcmd' 我该如何配置Vim在状态行上显示未决的/部分的命令? ------------------------------------------------------ 你可以设置'showcmd'来在状态行上显示为决的/部分的命令:: :set showcmd 更多的资料,请读:: :help 'showcmd' 我该如何配置Vim来显示不同的设置/值? ------------------------------------------ 你可以设置'statusline'选项来显示不同的值/设置在Vim的状态行上. 更多的资料,请读:: :help 'statusline' :help 'laststatus' :help 'rulerformat' :help 'ruler' 我该如何配置Vim来总是显示状态行? --------------------------------------- 你可以设置'laststatus'选项为2来总是显示状态行:: :set laststatus=2 更多的资料,请读:: :help 'laststatus' 我该如何对Vim进行一项设置使其可以在Vim的 invocations/instances/sessions 中通用? -------------------------------------------------------------------------------------- 我该如何使一个Vim设置可以相当稳定的在不同Vim的invocations/instances/sessions通用? ---------------------------------------------------------------------------------------- 假如想通用的话,请增加你的设置到.vimrc或.gvimrc文件中.你也可以使用":mkvimrc" 命令来对于当前设置产生一个vimrc文件. 更多的资料,请读:: :help save-settings :help vimrc :help gvimrc :help vimrc-intro :help :mkvimrc :help initialization 我该如何当我按下了时过了一秒后,听到一次响声? -------------------------------------------------------- 这是正常的行为.假如你的窗口闪烁了,那么你是得到了可视的响声.否则,你应该听到 一次响声. Vim需要一个过期时间来辨别一个转义符和正常的键序列.当你在正常模式下按了键(即 使是在插入模式下),然后这个键是个映射的开始,Vim将会等待小会时间来查看剩下的 键序列.假如在给定的过期时间之前能够完成这个映射序列,那么这个键所映射的序列 将会被实现.假如你中断了这个映射,那么关于这些键的正常行为将会被执行. 例如,假如你有一个映射是如此定义的":imap vvv Vim is great!!",然后你迅速的键 入"vvv",那么"Vim is great!!"将会插入到你的文本中去.但是假如你键入了"vv v"那 么这些文字会插入到你的文本中.或者你键入的相当慢,相当慢指的是你键入的时间超 过了规定的过期时间.把这个过期时间设置的大些,可以帮助你减轻因为较慢的输入速 度而产生的问题. 更多的资料,请读:: :help ttimeout 我该如何使'c'和's'命令显示一个'$',而不是删除我正在改变的字符? -------------------------------------------------------------------- 想使'c'和's'命令显示'$'代替删除字符,可以增加$标志到'cpoptions'选项中去:: :set cpoptions+=$ 更多的资料,请读:: :help 'cpoptions' 我该如何使用单个":set"命令删除一个Vim选项中的多个标志? ------------------------------------------------------------- 你可以通过按照它们在选项中出现的顺序,通过使用":set"命令来删除多个标志.例如, 你使用下面的命令来删除'formatoptions'选项里的't'和'n'标志:: :set formatoptions-=tn 't'和'n'标志将会从'formatoptions'选项中删除,仅当'formatoptions'选项包含这个 顺序的标志:'tn'.否则,它将不会删除这个标记.为了避免这个问题,你应该一个一个的 删除标志:: :set formatoptions-=t formatoptions-=n 更多的资料,请读:: :set :set-= =========================================================================== 章节 20 - 映射 ============== 我该如何知道某个键被映射做什么? ------------------------------------- 想知道一个键被映射为什么,可以使用如下的命令:: :map :map! 你也可以使用下面的命令来检查特殊模式下的映射,":cmap",":nmap",":vmap",":ima- p",":omap",之类. 更多的资料,请读:: :help map-listing :help map-overview 我该如何列出所有用户定义的键映射? --------------------------------------- 你可以使用下列命令来列出所有用户定义的键映射:: :map 更多的资料,请读:: :help map-listing 我该如何解射(unmap)一个已被用于映射的键? ---------------------------------------------- 你可以使用":unmap"命令来解射一个前面被用于映射的键:: :unmap :unmap! 对于更多模式下的映射,你可以使用命令:: :nunmap/:vunmap/:ounmap/:iunmap/:lunmap/:cunmap 下列的命令在解射一个局部于缓冲区的映射会失败:: :unmap 想解射一个局部于缓冲区的映射键,你必须使用关键字在unmap命令中:: :unmap :unmap! 更多的资料,请读:: :help :unmap :help map-modes :help map-local :help 'mapleader' 对于键,我不能建立它的映射,这是怎么回事? --------------------------------------------------- 首先确定这个键确实已经传送给了Vim.在插入没收下,按CTRL-V后,在敲入想要的键 我该如何映射小键盘上的键? ------------------------------- 首先确定小键盘上的键已经传给Vim了.接下来,你可以使用下面的命令来映射小键盘上 的键了:: :map 可以是kHome,kEnd,kPageUp,kPageDown,kPlus,kMinus, kDivide,kMultiply,kEnter,etc. 更多的资料,请读:: :help key-code :help terminal-options 我该如何建立一个只工作在可视模式下的映射? ----------------------------------------------- 你可以建立指定模式下的映射(普通,命令,插入,可视,等等).想建立一个只工作在可视 模式下的映射,使用":vmap"命令:: :vmap 更多的资料,请读:: :help :vmap :help map-modes :help 40.1 在一个Vim脚本中,我该如何知道哪些键被用于映射,以使我用于映射的键不会和 --------------------------------------------------------------------------- 已存在的映射想冲突? Vim使用键盘上的绝大多数的键.你可以使用作为映射中的前缀来定义键而不 会和Vim中使用的键想冲突.例如:: :map S s :map j j :map k k 默认的会被替换成\,所有用户该敲入:: \s \j \k 来调用上面的映射命令.用户可以改变mapleader变量为任何他们想要的键:: :let mapleader = "," 当在写一个插件或别的脚本的时候,更多的,比较可取的方法是使用:noremap代替:map 来避免用户定义的映射所导致的边际效果. 更多的资料,请读:: :help :help :help write-plugin 我该如何映射escape键? --------------------------- 你可以使用":map"命令来映射Escape键为别的键.例如,下面的命令就是映射excape键为 CTRL-O:: :map 我该如何映射一个键,使其不执行任何操作? -------------------------------------------- 你可以在按下某个键时映射那个键为来不执行操作.例如,在下面的命令中,按下后 不会执行任何操作:: :map :map! 更多的资料,请读:: :help :help :map :help :map! :help map-modes 我想使用来缩进一个文本块,用Shift-Tab来反缩进一个文本块.我该如何映射这些键?这个功能于textpad, visual studio之类的软件非常类似. ----------------------------------------------------------------------------------------------------------------------------------------- 使用下面的映射:: :inoremap :nnoremap >> :nnoremap :vnoremap > :vnoremap 记住,映射只会在接受到正确的键序列才开始工作.这是GUI Vim中最需要注意的. 更多的资料,请读:: :help :inoremap :help :nnoremap :help :vnoremap :help :help i CTRL-O :help >> :help << :help 在我的映射中像这样的特殊字符不能辨认.我该如何配置Vim来辨认这些特殊字符? ---------------------------------------------------------------------------------- 检查'cpoptions'选项的值:: :set cpoptions? 假如这个选项中包含了'<'标志,那么特殊字符将不会被辨认.删除'cpoptions'选项中的'<' 标志:: :set cpo-=< 也可以,检查'compatible'选项的值:: :se compatiable? 这个'compatible'选项必须得重置:: :se nocompatible 更多的资料,请读:: :help 'cpoptions' :help 'compatible' 我该如何在映射中使用'|'来分隔多个命令? --------------------------------------------- 你可以在map中使用反斜杠转义'|'字符:: :map _l :!ls \| more 你也可以尝试下面的命令:: :map _l :!ls more 也有另外的方法完成这个功能. 更多资料,请读:: :help map bar 假如我有一个映射是以另一个映射/缩写的开始作为结尾的,我该如何保持住原有的映射不至于扩展成为另一个? -------------------------------------------------------------------------------------------------------- 使用":noremap lhs rhs"代替使用":map lhs rhs".对于缩写,使用"noreabbrev lhs rhs". 这里的"nore"前缀阻止了映射或缩写再次被扩展. 更多的资料,请读:: :help :noremap :help :noreabbrev 有时当我按下一个键的时候,为什么Vim需要花费一秒或者更多的时间来处理这个键? -------------------------------------------------------------------------------- 首先你要确定你没有使用下面的命令来对这个键实行某种映射:: :map 假如有定义某个键的影射,而这个映射的键超过一个字符,那么Vim将会等待下个字符的输入 来判定这个是否是映射的键.例如,假如你映射了"ab",然后你按下了"b",Vim会等待下一个键 的输入.假如下个键是"b",Vim将会执行映射.否则,Vim会处理为正常的按下了"ab".假如 'timeout'选项设置了(默认的),那么Vim将会等待'timeoutlen'选项所规定的时间直到超过 这个时间. 更多的时间,请读:: :help map-typing :help 'timeoutlen' :help 'ttimeoutlen' :help 'timeout' :help 'ttimeout' :help vt100-cursor-keys :help slow-fast-terminal 我该如何映射一个键对可视模式中选择的文本执行一个外部命令? ---------------------------------------------------------------- 你可以在可视模式下使用":vmap"命令来映射一个键.在映射的命令序列中,你首先得拷 贝出文本,然后使其在'"'寄存器中可见.现在,你可以对寄存器中的内容执行外部命令 了.例如,对一个可视块中的文本执行外部命令"perldoc",你可以这样按下面的方法做:: :vmap y:!exec "!perldoc '" . @" . "'" 假如你希望在可视模式下使用映射的命令工作,但是不一定和高亮的文本一起,你可以 使用如下的命令:: :vmap :!perldoc 我该如何在映射Ctrl-I键时不影响键? --------------------------------------------- Ctrl-I和有同样的键码,所以Vim不能区分Ctrl-I和键.当你映射Ctrl-I键时, 键也同样会被映射(反之亦然).同样的限制也适用于Ctrl-[和键. 更多的资料,请读:: :help keycodes =========================================================================== 章节 21 - 缩写 ============== 我该如何让Vim自动矫正拼写错误的单词? ------------------------------------------ 你可以使用缩写来矫正那些拼写错误的单词.例如,下面的缩写被用来矫正"teh"为"the":: :abbreviate teh the Vim支持插入模式,置换模式和命令行模式中的缩写. 更多的资料,请读:: :help 24.7 :help abbreviations :help Q_ab 我该如何建立映射多行的缩写? --------------------------------- 你可以在文本中插入""来建立映射多行的缩写:: iabbrev #c -------------------------- Date:------------ 使用了上面的缩写后,当你敲入#c,下面的文本将会被插入:: -------------------------- -- Date:: -- ----------- 更多的资料,请读:: :help abbreviations 当我的缩写被扩伸后,一个额外的空格会加入到扩伸的文本之后.我该如何去掉这个字符? ----------------------------------------------------------------------------------- 想要去掉文本后的那个空格字符,你可以通过按下CTRL-]来扩展缩写来实现.那么缩写被扩展 时将不会加入多余的空格. 另外一种方法是使用下面的函数和命令:: function! Eatchar(pat) let c = nr2char(getchar()) return (c =~ a:pat) ? '':c endfunction command! -nargs=+ Iabbr execute "iabbr" . "=Eatchar('\\s')" 现在,你可以使用新的"Iabbr"命令代替内置的"iabbrev"命令来定义缩写,扩展后的文本将不 会在尾部加入新的空格符. 更多的资料,请读:: :help abbreviations 我该如何在文件中,插入当前的日期/时间? ------------------------------------------- 你可以使用strftime()函数来插入当前的日期/时间戳到文件中去.例如,你可以使用下面的 缩写:: iabbrev dts =strftime("%y/%m/%d/%H:%M") 使用了上面的缩写后,当你在插入模式中敲入dts,它将会被扩展为日期/时间戳. 一些别的形式跟日期有关的缩写列在下面了:: iabbrev mdyl =strftime("%a %d %b %Y") iabbrev mdys =strftime("%y%m%d") iabbrev mdyc =strftime("%c") iabbrev hml =strftime("%d/%m/%y %H:%M:%S") iabbrev hms =strftime("%H:%M:%S") 更多的资料,请读:: :help strftime() :help i_CTRL-R 我该如何在插入模式中避免缩写被扩展开? ------------------------------------------- 你可以输入了缩写词的部分内容后,按CTRL-V来阻止插入模式中的缩写被扩展开. 更多的资料,请读:: :help abbreviations =========================================================================== 章节 22 - 记录和重放 ==================== 我该如何重复一个编辑性质的操作(插入,删除,粘贴,等等)? ---------------------------------------------------------- 你可以使用'.'命令来重复上次的编辑操作.这个命令将会重复上次所做的较简单的改动 如插入,删除,改动,粘贴,等等. 更多的资料,请读:: :help 04.3 :help single-repeat :help Q_re 我该如何记录并重复一套键的序列? ------------------------------------- 你可以在正常模式中使用'q'命令来记录一套键的序列,并把它存储在寄存器中.例如,在 普通模式下,你可以按q,后面再跟一个寄存器名(0-9a-bA-Z")来启动记录.想终止/停止记 录可以再按次q.你可以按@后跟寄存器名.e.g. @a 来重放/重复被记录的键序列. 另外一种方法是使用"-w"命令参数来启动Vim:: $vim -w Vim将会记录所有在指定文件"file_name"中的字符.你可以使用命令参数"-s"来使用指定 文件中的命令:: $vim -s 更多的资料,请读:: :help 10.1 :help recording :help -w :help -s 我该如何编辑/修改一套已记录的键序列? ------------------------------------------ 被记录的键序列存储在寄存器中.你可以粘贴寄存器的文本到一个Vim的缓冲区中,编辑 这些文本,再拷贝这些文本到寄存器中.你也可以使用":let"命令来修改寄存器的内容. 例如:: :let @a = "iHello World\" 更多的资料,请读:: :help recording :help 10.1 :help let-register :help <> :help 'cpoptions' 我该如何把一套键序列写入到一个文件中去? --------------------------------------------- 记录的键序列是被存储在寄存器中的.你可以先粘贴这些寄存器的内容到Vim缓冲区中.然 后你可以把缓冲区的内容保存到文件中去.你也可以修改这些文本,然后再把这些内容放入 到寄存器中以此来修改其中的内容.例如,你使用qa .... q来记录了一套键序列.记录的键 序列存储在寄存器'a'中.你可以使用"ap来粘贴寄存器'a'中的内容. 更多的资料,请读:: :help recording :help 10.1 我使用了寄存器0来记录我的键序列(i.e. q0 .... q).在记录的时候,我拷贝了一些文本.当我在第一次记录这套键序列后,我就不能再次使用了. ------------------------------------------------------------------------------------------------------------------------------------ 寄存器0包含了最后一次拷贝操作所拷贝的文本.在你记录键序列时,当执行了拷贝操作后, 寄存器0的内容将会被拷贝的文本所覆盖.所以你记录在寄存器0中的键序列,都丢失了.你 可以考虑使用别的寄存器. 更多的资料,请读:: :help registers =========================================================================== 章节 23 - 自动命令 ================== 我该如何在我修改只读文件时自动执行某些命令? ------------------------------------------------- 你可以使用FileChangeRO自动命令事件,在只读文件被修改时执行一条命令.例如,你可以 使用这个事件来检查一个只读文件:: :autocmd FileChangeRO * call MyCheckoutFunction() 更多的资料,请读:: :help FileChangeRO 我该如何在每当我进入一个缓冲区时就自动执行某条命令? --------------------------------------------------------- 你可以使用BufEnter自动命令事件来在你每次进入一个缓冲区时自动执行某些命令.例如:: :autocmd BufEnter *.c set formatoptions=croqt 更多的资料,请读:: :help BufEnter 我该如何在每当我进入一个窗口的时候自动执行某条命令? --------------------------------------------------------- 你可以使用WinEnter自动命令事件来在你每次进入一个窗口时自动执行某些命令.例如:: :autocmd WinEnter *.c call MyFunction() 更多的资料,请读:: :help WinEnter 从一个自动命令中,我该如何确定哪些文件或缓冲区是被自动命令所执行的? ------------------------------------------------------------------------ 你可以使用特殊的 我该如何在每当Vim失去焦点时自动的保存对缓冲区所做的改动? -------------------------------------------------------------- 你可以定义一个自动命令事件FocusLost,来在当Vim失去焦点时自动保存对缓冲区做做的 改动:: :autocmd FocusLost * wall 更多的资料,请读:: :help FocusLost :help :wall 我该如何在当Vim退出时自动执行/运行一些函数来做些清理工作? --------------------------------------------------------------- 你可以使用VimLeave自动命令事件来在Vim结束前执行/运行一个函数.例如:: :autocmd VimFLeave * call MyCleanupFunction() 更多的资料,请读:: :help VimLeave =========================================================================== 章节 24 - 语法高亮 ================== 我该如何关闭/开启语法高亮? -------------------------------- 默认的,Vim的语法高亮是被关闭的.想开启语法高亮,你可以使用下列命令:: :syntax enable or :syntax on 想关闭语法高亮,你可以使用下面的命令:: :syntax off 更多的资料,请读:: :help 06.1 :help 06.4 :help :syntax-enable :help :syntax-on :help :syn-clear 我该如何改变Vim使用的前景色和背景色? ------------------------------------------ Vim使用"Normal"高亮组,来定义背景色和前景色.想改变背景/前景色,你可以修改"Normal" 高亮组.例如,设置背景色为蓝色,而前景色为白色,你可以这样做:: :highlight Normal ctermbg=blue ctermfg=white guibg=blue guifg=white 假如你使用的Motif或者是Athena上的VimGUI版本,那么你可以修改.Xdefaults文件来设置 Vim的前景色和背景色:: Vim.foreground: Black Vim.backround: Wheat 你也可以使用"-foreground"和"-background"命令行参数来定义前景色和背景色.这些 参数只在Motif或Athena版本中支持:: $gvim -foreground Black -background Wheat 更多的资料,请读:: :help :highlight :help .Xdefaults :help -gui 我该如何改变高亮色以使其适合暗/亮的背景? ---------------------------------------------- 你可以设置'background'选项为'dark'或'light'来改变高亮色以使适合暗/亮背景:: :set background=dark 更多的资料,请读:: :help 'background' :help 6.2 我该如何改变使用了":set number"命令后显示的行号的颜色? ------------------------------------------------------------ 行号显示使用的是LineNr高亮组.想显示当前的颜色设置,使用:: :hi LineNr 想改变LineNr高亮组中的颜色.可以这样:: :hi linenr guifg=red guibg=black 在GVIM中,将会有红色的行号和黑色的底. 跟多的资料,请读:: :help :highlight 我该如何改变在可视模式下被选择文本块的颜色? ------------------------------------------------- 你可以修改'Visual'高亮组来修改可视模式中选择的文本块的颜色:: :highlight Visual guibg=red 更多的资料,请读:: :help :highlight :help hl-Visual 我该如何高亮'list'选项所规定的特殊字符(tabs, trailing spaces, end of line, etc)? -------------------------------------------------------------------------------------- 你可以修改"Nontext"和"SpecialKey"高亮组来高亮那些被'list'选项所规定的特殊字符:: :highlight NonText guibg=red :highlight SpecialKey guibg=green "NonText"高亮组是被"listchars"选项中的"eol","extends","precedes"设置所使用.而 "SpecialKey"高亮组是被"trail"和"tab"设置所使用. 更多的资料,请读:: :help 'listchars' :help hl-NonText :help hl-SpecialKey 我该如何在我的.vimrc/.gvimrc文件中规定陪色方案,让每次Vim启动时都使用指定的陪色方案? ----------------------------------------------------------------------------------------- 你可以在你的.vimrc或.gvimrc文件中使用"colorscheme"命令来指定一种配色方案:: colorscheme evening 更多的资料,请读:: :help :colorscheme Vim的语法高亮文件被损坏了.当我编辑某些文件时.某些文件的部分没有被高亮或者没有被正确的高亮. ------------------------------------------------------------------------------------------------ Vim并不会读取整个文件来分析文本的语法高亮属性.它会在你查看文件时开始分析.这 样可以节省很多时间,但有时这样产生的颜色是错误的.一个简单的办法是使用CTRL-L刷 新屏幕.或者向后滚动下屏幕,然后在向前滚动就可以刷新屏幕了.你也可以使用下面的 命令:: :syntax sync fromstart 记住屏幕的刷新有可能非常的慢. 更多的资料,请读:: :help :syn-sync :help :sync-sync-first 是否有内置的函数来高亮相匹配的括号? ----------------------------------------- 不.Vim并不支持高亮相匹配的括号.你可以尝试使用Charles Campbell开发的插件:: http://vim.sourceforge.net/tips/tip.php?tip_id=177 你可以使用'%'来跳到相匹配的括号.你可以设置'showmatch'选项,使在插入模式时可以 暂时跳转到相匹配的括号. 更多的资料,请读:: :help % :help 'showmatch' :help 'matchtime' :help 'matchpairs' 我该如何关闭C注释的语法高亮? ----------------------------------- 你可以使用下面的命令来关闭C注释的语法高亮:: :highlight clear comment 更多的资料,请读:: :help c-syntax 我该如何增加自己的语法高亮扩展到Vim所支持的标准语法文件中去? ------------------------------------------------------------------- 你不应该增加自己的扩展到Vim自身所提供的语法文件中去.当你安装另个版本的Vim时, 你将会失去你所做的改动.解决的办法是,你应该在~/.vim/after/syntax目录中建立一个 于原语法文件同名的文件,然后加入你对这个文件的扩展. 更多的资料,请读:: :help mysyntaxfile-add :help 'runtimepath' 我该如何使用自己的语法文件置换随Vim发行的标准语法文件? ------------------------------------------------------------- 你可以在Vim runtime语法目录(~/.vim/syntax)中建立一个与语法文件同名的文件然后 替换掉它,在自己的文件中加入自己想要的扩展即可.例如,想替换Unix系统的c.vim语法 文件,可以把新的c.vim文件放入到~/.vim/syntax目录中.在MS-Windows系统中,可以把新 的语法文件放入到$HOME/vimfiles/syntax或$VIM/vimfiles/syntax目录中. 更多的资料,请读:: :help mysyntaxfile-replace :help 44.11 :help mysyntaxfile 我该如何高亮某列后的所有字符? ------------------------------------ 你可以使用":match"命令来高亮某个列后的所有字符:: :match Todo '\%>75v.\+' 这将会高亮75列后的所有字符. 更多的资料,请读:: :help :match :help /\%v :help /\+ :help /. 我该如何转换一个源文件(.c, .h, etc)为一个带有相应Vim语法高亮的HTML文件? ------------------------------------------------------------------------------ 你可以使用2html.vim脚本来转换一个源文件为一个带有Vim语法高亮的HTML文件.使用下 面的命令:: :runtime! syntax/2html.vim 更多的资料,请读:: :help convert-to-HTML 我该如何列出当前所有语法高亮组的定义? -------------------------------------------- 你可以使用":highlight"(没有参数)ex命令来列出所有当前高亮语法组的定义. 更多的资料,请读:: :help :highlight =========================================================================== 章节 25 - 编写Vim脚本 ===================== 我该如何列出所有被Vim载入的脚本? -------------------------------------- 你可以使用":scriptnames"命令来列出所有被Vim载入的脚本:: :scriptnames 更多的资料,请读:: :help :scriptnames 我该如何调试Vim脚本? -------------------------- Vim有内置的调试器来调试Vim插件和脚本.使用调试器你可以设置断点并可以step through 插件函数. 更多的资料,请读:: :help debug-scripts :help -D ------- 我从Vim中(或者是当运行一个脚本时)得到一些错误提示/信息,这些信息迅速就被清理了.我该如何再次显示这些信息? ------------------------------------------------------------------------------------------------------------- 你可以使用":messages"命令来显示前个信息:: :messages 更多的资料,请读:: :help :messages :help :echoerr :help :echomsg :help message-history 我该如何在跨越多个Vim invocations保存并恢复一些插件的详细信息? -------------------------------------------------------------------- Vim会保存并恢复那些以大写字母开头并不包含任何小写字母的全局变量.想这样工作, 那么必须在'viminfo'选项中包含'!'标志.Vim将会存储这些变量在viminfo文件中. 更多的资料,请读:: :help 'viminfo' :help viminfo-file :help variables 我该如何在Vim函数中启动插入模式? -------------------------------------- 你可以使用":startinsert"命令来在一个Vim函数中启动插入模式. 更多的资料,请读:: :help :startinsert 我该如何在Vim函数中改动光标的位置? ---------------------------------------- 你可以使用cursor()函数来定位光标的位置:: call cursor(lnum, col) 你也可以使用下面的命令来改动光标的位置:: exe "normal! " . lnum . "G" . col . "|" 更多的资料,请读:: :help cursor() :help bar 我该如何在.vimrc文件中检查环境变量的值? --------------------------------------------- 你可以在环境变量面前加个'$'字符来在Vim脚本/函数中使用它.你可以使用$env_var这 样的语法来引用它的值:: if $EDITOR == 'vi' endif 更多的资料,请读:: :help expr-env 我该如何在Vim函数中检查某个环境变量是否被设置? ---------------------------------------------------- 你可以使用exists()函数来检查某个环境变量是否存在:: if exists("$MY_ENV_VAR") endif 更多的资料,请读:: :help exists() :help expr-env 我该如何调用/使用Vim内置函数? ------------------------------------ 你可以使用":call"命令来调用Vim内置函数:: :call cursor(10,20) 你可以使用":echo"命令来显示函数所返回的值:: :echo char2nr('a') 你也可以使用":let"命令把函数的返回值分配给一个变量:: :let a = getline('.') 想存储函数的返回值到一个Vim寄存器中,你可以使用下面的命令:: :let @a = system('ls') 上面的命令将会存储'ls'命令的返回值到寄存器'a'中. 更多的资料,请读:: :help :call :help :echo :help :let :help :let-register :help user-functions :help usr_41.txt 我在我的Vim脚本中使用了很多正常模式命令.我该如何在这些正常模式命令中避免用户定义的映射并使用这些正常模式命令的标准Vim函数? --------------------------------------------------------------------------------------------------------------------------------- 你可以在你的脚本中使用"normal!"命令来调用正常模式下的命令.这将会使用正常模式 中命令的标准函数而不会使用用户定义的映射. 更多的资料,请读:: :help :normal 我该如何把当前可视模式中被选择的文本存放到Vim变量/寄存器中? ------------------------------------------------------------------ 你可以把当前可视模式中被选择的文本拷贝到寄存器中,然后在拷贝到变量中来实现这 功能:: :normal! gvy :let myvar = @" 上面的命令会拷贝可视模式中被选择的文本到变量"myvar"中. 你也可以使用下面的命令:: :normal! gv"*y 在上面的命令中,gv将会重选择上次可视模式中被选择的文本,接下来的命令将会拷贝文本 到*(剪贴版)寄存器中.当然,作为选择,你可以在'guioptions'选项中设置'a'标志来自动的 拷贝可视模式中选择的文本到*寄存器中.想把这些作为可视模式映射中的一部分,你可以使 用一个类似于下面的命令:: :vmap "*y:call .. 更多的资料,请读:: :help gv :help :normal :help let-@ :help quotestar :help clipboard :help registers 我有部分文本在Vim变量'myvar'中.我想使用这些文本作为":s"替换命令中'mytext'的替换文本.我该如何做? ------------------------------------------------------------------------------------------------------ 你可以使用'execute'命令来计算这个变量:: :execute '%s/mytext/' . myvar . '/' 更多的资料,请读:: :help :execute 你也可以在替换命令中使用"\="命令来计算变量:: :%s/mytext/\=myvar/ 更多的资料,请读:: :help sub-replace-special 某个Vim变量(bno)包含了一个缓冲区号.我该如何使用这个变量来打开相应的缓冲区? --------------------------------------------------------------------------------- :buffer命令是不能接受变量名的.它只能接受缓冲区号/缓冲区名.你可以使用":execute" 命令来求变量的值.例如:: :execute "buffer " . bno 更多的资料,请读:: :help :execute 我该如何存储Vim选项的值到Vim变量中? ------------------------------------------ 你可以给选项名加上'&'字符然后使用"let"命令分配这些选项的值给Vim的变量.例如,存 储'textwidth'选项的值到一个Vim变量"old_tw"中,可以按下面的命令使用:: :let old_tw=&tw 假如想实现相反的功能,可以设置'textwidth'选项的值为存储在'old_tw'变量中的值,你 可以使用下面的命令:: :let &tw = old_tw 更多的资料,请读:: :help expr-option :help let-option 我在一个Vim函数中拷贝并插入一些文本到了一个缓冲区中.我该如何在Vim函数中缩进这些插入的文本? ------------------------------------------------------------------------------------------------- 你可以使用下面的命令来格式化要插入的文本:: :normal '[='] 更多的资料,请读:: :help '[ :help '] :help = :help :normal 我该如何在Vim脚本中得到当前光标下的字符? ----------------------------------------------- 你可以使用getline()函数并使用字符串索引[]来得到字符:: :echo getline(".")[col(".") - 1] 在上面的命令中,getline(".")会返回当前行的文本.字符串的索引是以0开始的,你可以 使用"string[index]"的形式来得到当个字符.col(".")会返回当前光标所在的列号;上面 的调整是为了得到字符串中正确的字符串. 作为选择的,你可以使用下面的命令序列来得到光标下的字符:: normal! vy let ch=@" 记住,上面的命令会修改'<和'>标记. 更多的资料,请读:: :help getline() :help col() :help expr-() 我该如何得到无后缀名的文件名? ------------------------------------ 你可以得到无后缀名的文件名,只要使用下面的命令:: :echo expand("%:r") 使用上面的命令,你可以直接使用文件名修饰符:: :cd %:p:h :!gcc -o %:r.o % 更多的资料,请读:: :help filename-modifiers :help expand() :help cmdline-special :help fnamemodify() 我该如何得到当前文件的basename? -------------------------------------- 你可以使用:t文件名修饰符来得到当前文件的basename:: :echo expand("%:t") 更多的资料,请读:: :help filename-modifiers 我该如何使Vim函数的输出输入到当前缓冲区? ----------------------------------------------- 你可以使用下面的命令来来插入函数的返回值:: =MyFunc() 记住,这只会插入函数的返回值. 更多的资料,请读:: :help i_CTRL-R :help i_CTRL-R_CTRL-R :help i_CTRL-R_CTRL-O :help expression 我该如何在一个Vim函数中调用外部程序? ------------------------------------------- 有几种方法可以从Vim函数中调用外部函数.你可以使用内置的system()函数来调用外部 程序并得到结果:: :let output = system("ls") 你可以使用"!"ex-command来运行外部程序. 更多的资料,请读:: :help system() :help :! :help 10.9 我该如何得到使用":!"命令所执行的程序的返回状态? ------------------------------------------------------ 你可以使用预定义的Vim v:shel_error变量来得到上次运行shell命令的返回状态值. 更多的资料,请读:: :help v:shell_error 我该如何确定当前缓冲区是否被修改过? ------------------------------------------ 你可以检查'modified'选项的值来确认当前缓冲区是否被修改过:: :set modified? 在一个Vim脚本中,你可以检查'modified'选项的值:: if &modified echo "File is modified" endif 更多的资料,请读:: :help 'modified' 我很喜欢在Vim脚本的普通命令中使用回车符.我该如何定义回车符? ------------------------------------------------------------------ 你可以使用":execute"命令来在一些普通命令中使用特殊字符:: :execute "normal \" :execute "normal ixxx\" 更多的资料,请读:: :help :execute :help expr-quote 我该如何在Vim脚本中分隔长行? ----------------------------------- 你可以通过在下一行的开始处加上反斜杆来分隔长行.例如:: ab LIB_PATH -I"D:\dev-cpp\include" -L"D:\dev-cpp\lib" \ -lglut32 -lopengl32 -lglu32 -lglew32 (译者注:原文中奇怪的没有给出例子,这是我的gvimrc中的例子) 更多的资料,请读:: :help line-continuation 每当我试着用"execute 'echo Myfunc()'"命令来执行我的函数时,光标会移动到当前缓冲区的最上端.为什么? ------------------------------------------------------------------------------------------------------- ":execute"命令会运行参数所指定的普通模式命令.在下面的命令中:: :execute "echo Myfunc()" 上面的调用"echo Myfunc()"会返回0.那么":execute"命令将会运行普通模式下面的命令 "0",这将会移动光标到文件的头部.想调用一个Vim函数,你可以使用":call"命令来代替 ":execute"命令:: :call Myfunc() 更多的资料,请读:: :help :call :help :execute :help :echo :help user-functions :help 41.5 :help 41.6 我该如何载入/执行寄存器中的内容? --------------------------------------- 假如你拷贝了一系列命令到Vim寄存器(例如寄存器'a'),然后你可以使用下面的命令来载 入寄存器的内容:: :@a 或者:: :exe @a 更多的资料,请读:: :help :@a 在调用了Vim函数或映射后,当我按了'u'键来撤消上次的改变,Vim撤消了映射或函数所做的所有改动.为什么? ------------------------------------------------------------------------------------------------------ 当你调用了一个函数或一个映射,所有被函数/映射所执行的操作都被只认为是一个操作. 当你按了'u'想撤消上次操作,那么所有被函数/映射所做的改动都被撤消. 更多的资料,请读:: :help undo-redo :help map-undo 我该如何在另一个脚本/插件中调用一个以s:所定义的函数(脚本局部函数)? ------------------------------------------------------------------------- 以s:为前缀的Vim函数是被用于建立脚本的局部函数.这样的函数只能在脚本内部使用而 不能在别的脚本中使用.在一个脚本/插件中定义的函数,想让别的插件/脚本使用,那么不 要加入s:前缀. 更多的资料,请读:: :help script-variable :help script-local :help :scriptnames 是否可以卸载一个已经被载入的脚本?换句话说,可以对所有被载入的脚本中的命令取反? ------------------------------------------------------------------------------------ 不能.是不可能反向或撤消被载入脚本所执行的命令的. 更多的资料,请读:: :help :source ============================================================================= 章节 26 - 插件 ============== 我该如何对不同类型的文件设置不同的选项? --------------------------------------------- 你可以建立文件文件类型插件来对不同类型的文件设置不同的选项.你可以使用下面的命 令来启动文件类型插件:: :filetype plugin on 文件类型插件是一个Vim脚本,每当Vim打开或着建立了一个此类型的文件都会载入这段脚 本.例如,当编辑C程序的时候(文件类型'c')想确保'textwidth'选项是被设置为80,可以在 下面的文件中:: ~/.vim/ftplugin/c.vim (Unix) %HOME%\vimfiles\ftplugin\c.vim (Windows) 加入下面的命令:: setlocal textwidth=80 你也可以使用自动命令在编辑特定类型文件的时候,设置一些特定的选项.例如,仅对于 \*.txt文件设置'textwidth'选项的值为75,你可以使用下面的命令:: autocmd BufRead *.txt setlocal textwidth=80 更多的资料,请读:: :help filetype-plugin :help add-filetype-plugin :help autocmd :help 40.3 我从网络上拷贝了一个Vim插件/语法/缩进/配色/文件类型插件文件.我该把他们拷贝到哪里可以让Vim找到他们? -------------------------------------------------------------------------------------------------------- 你可以把Vim runtime文件(插件,语法文件,缩进文件,配色方案,文件类型插件,等等)放 到'runtimepath'选项中所规定的其中一个路径中去.想查看'runtimepath'选项的值,可 以使用下面的命令:: :set runtimepath 对于Unix系统,通常是"$HOME/.vim"目录.对于MS-Windows系统,那么通常是$VIM\vimfiles 或者$HOME\vimfiles目录.根据runtime file的类型,你该决定把它放入到runtime目录中 的哪个子目录中.子目录基本上在下面已经列出来了:: color/ - 颜色配置文件 compiler/ - 编译文件 doc/ - 文档 ftplugin/ - 文件类型插件 indent/ - 缩进脚本 keymap/ - 键映射文件 lang/ - 菜单翻译 plugin/ - 插件脚本 syntax/ - 语法文件 tutor/ - vimtutor文件 更多的资料,请读:: :help your-runtime-dir :help 'runtimepath' :help :runtime 我该如何扩展一个已存在的文件类型插件? ------------------------------------------- 你可以在$VIMRUNTIME/after/ftplugin或着$VIMRUNTIME/ftplugin目录下面建立一个文件 来扩展一个已存在的文件类型插件.新建立的文件名必须和已存在的文件类型插件同名.你 可以把你的扩展加入到新的文件中去. 假如你把文件放在after/ftplugin runtime目录中,那么Vim将会首先载入已存在的文件类 型插件,然后再载入你建立的文件.假如你把文件放在$VIMRUNTIME/ftplugin runtime目录 下,那么Vim会首先载入新的文件,然后在载入已经存在的文件类型插件. 更多的资料,请读:: :help ftplugin-overrule :help filetype-plugin :help add-filetype-plugin :help 'runtimepath' 我该如何关闭掉已经载入的Vim插件? -------------------------------------- 你可以重置'loadplugins'选项来关闭已经载入的插件:: :set noloadplugins 你也可以指定"--noplugin"命令行插件参数来停止载入插件:: $vim --noplugin 更多的资料,请读:: :help 'loadplugins' :help --noplugin :help load-plugins 我该如何开启/关闭文件类型插件? ------------------------------------ 默认的,Vim不会载入文件类型插件.你可以使用下面的命令来配置Vim载入文件类型插件:: filetype plugin on 你可以选择不载入文件类型插件,使用下面的命令:: filetype plugin off 更多的资料,请读:: :help filetype-plugin-on :help filetype-plugin-off :help :filetype 我该如何 -------------- 我该如何关闭Vim的目录浏览插件? ------------------------------------ 想关闭Vim的目录浏览插件,增加下列的行到你的.vimrc文件:: let loaded_explorer = 1 更多的资料,请读:: :help file-explorer 我该如何对那些文件名符合某种模式或有特定后缀名的文件设置文件类型选项? --------------------------------------------------------------------------- 你可以对那些文件名符合某种模式或有特定后缀名的文件设置'filetype'选项.例如,对 有后缀'.x'的文件设置'filetype'选项为'c',使用下面的命令:: autocmd! BufRead,BufNewFile *.x setfiletype c 一个相对更好的办法,是在~/.vim目录下(或是'runtimepath'选项中指定的目录之一) 建立一个filetype.vim文件,并加入下面的行:: " my filetype file if exists("did_load_filetypes") finish endif augroup filetypedetect au! BufRead,BufNewFile \*.x setfiletype c augroup END 更多的资料,请读:: :help new-filetype :help 43.2 :help :setfiletype =========================================================================== 章节 27 - 编辑程序文件 ====================== 我该如何开启对c/c++文件的自动缩进? ---------------------------------------- 你可以开启基于文件类型的缩进,使用:: :filetype indent on 假如你只想开启自动c缩进,使用:: :set cindent 更多的资料,请读:: :help 'cindent' :help C-indenting :help filetype 我该如何配置c/c++文件所使用的缩进文件? -------------------------------------------- 你可以通过修改'cinoptions','cinkeys',和'cinwords'选项来配置Vim的c缩进. 更多的资料,请读:: :help 'cindent' :help 'cinoptions' :help 'cinkeys' :help 'cinwords' :help C-indenting :help cinoptions-values :help 'smartindent' 我该如何关闭自动缩进的特性? --------------------------------- 默认,自动缩进是不会开启的.你必须在.vimrc或者.gvimrc文件中进行配置来开启自动缩 进.你可以关闭自动,如下:: :filetype indent off 或者:: :set nocindent 当然,也可以检查下面值的选项:: :set autoindent? :set smartindent? :set indentexpr? 更多的资料,请读:: :help 'cindent' :help filetype-indent-off :help 'autoindent' :help 'smartindent' :help 'indentexpr' 我该如何改变自动缩进所使用的空格字符数? --------------------------------------------- 你可以修改'shiftwidth'选项的值来改变自动缩进所使用的空格数:: :set shiftwidth=4 更多的资料,请读:: :help 'shiftwidth' 我使用Vim来编辑c程序.我该如何显示宏/变量的定义? ----------------------------------------------------- 你可以使用[d命令来显示宏,而[i来显示变量的定义. 更多的资料,请读:: :help [d :help [i :help include-search :help 29.4 :help 29.5 我使用Vim来编辑c程序.我该如何在一个块中跳到一个代码块的开始/结束位置? --------------------------------------------------------------------------- 你可以在代码块中使用'[{'命令来跳到代码块的开始处而用']}'跳到代码块的结束位置. 更多的资料,请读:: :help [{ :help ]} :help various-motions 是否有方法可以关闭C++文件的自动插入"//"注释的行为? 假如我在以"//"开头的一行中,然后我在上/下面开了一个新行,那么Vim会自动的插入新的"//"字符. ------------------------------------------------------------------------------------------------------------------------------------------------ 你可以改变'comments'选项的值来停止Vim自动的插入C++的注释符("//").例如:: :set comments=str:/*,mb:*,el:*/ 更多的资料,请读:: :help 'comments' :help format-comments 我该如何在一系列行的行首加入'#'字符? ------------------------------------------ 首先,使用可视块选择模式(CTRL-V)来选择所有行的第一个字符.按'I'来开始在行首插入 字符.敲入注释字符,然后按来退出插入模式.Vim就会自动的在所有被选择的行首插 入干才你所输入的字符了. 更多的资料,请读:: :help visual-block :help blockwise-operators :help v_b_I 我该如何编辑一个与C源文件同名的头文件? -------------------------------------------- 你可以使用下面的命令来编辑一个与C源文件同名的头文件:: :e %:t:r.h 你可以使用下面的命令,在分割的新窗口中编辑文件:: :sp %:t:r.h 在上面的命令中,百分比符号会被扩展为当前文件名.":t"修饰符会被解释为文件名的尾部 的组成部分.":r"修饰符会被解释为文件名的主要成分. .h是附加在文件名主要成分后面 的,以此来得到我们想要的头文件名. 另一种方法是使用下面的命令:: :sfind %:t:r.h 这个命令将会在'path'选项中,所指定的目录中搜索需要的头文件. 更多的资料,请读:: :help cmdline-special :help filename-modifiers :help :sfind :help 'path' 我该如何在当我敲入注释的时候自动的插入注释符(leaders)? ------------------------------------------------------------- 想在敲入注释的时候自动的插入注释符,需要在'formatoptions'选项中加入'r'和'o'标 记:: :set formatoptions+=ro 你也可以增加'c'标记来使用'textwidth'选项的设置来自动的饶行注释,增加'q'标记来 使用'gq'命令来格式化注释:: :set formatoptions=croq 更多的注释,请读:: :help 30.6 :help format-comments :help 'comments' :help fo-table =========================================================================== 章节 28 - QUICKFIX ================== 我该如何在Vim中建立程序? ------------------------------ 你可以在Vim中使用":make"命令来建立程序.":make"命令将会使用'makeprg'选项来运行 程序. 更多的资料,请读:: :help 30.1 :help make_makeprg :help 'makeprg' :help 'makeprg' :help :make :help qucikfix 当我在Vim中运行make命令,在编译程序时我得到了Vim的错误列表.当编译完后,这个错误列表消失了,我使用:clist命令来再次查看消息.是否有别的方法来查看这些错误信息? -------------------------------------------------------------------------------------------------------------------------------------------------------------- 你可以使用":copen"或":cwindow"命令来打开quickfix窗口,这个窗口里会包含编译器的 输出.你可以在这个窗口中选择不同的错误行,然后就会跳到源码窗口所对应的行中. 更多的资料,请读:: :help :copen :help :cwindow :help quickfix =========================================================================== 章节 29 - 折叠 ============== 我该如何扩展Vim所支持的折叠? ---------------------------------- 你可以使用'foldexpr'选项来使用一个用户定义的函数来实现新的折叠.例如,想折叠下 面形式的子函数为一个单行:: sub foo { my $barf; $barf = 3; return $barf; } 你可以使用下面的命令:: set foldmethod=expr set foldexpr=MyFoldExpr(v:lnum) fun! MyFoldExpr(line) let str = getline(a:line) if str =~ '^sub\>' return '1' elseif str =~ '^}' return '<1' else return foldlevel(a:line - 1) endif endfun 更多的资料,请读:: :help 'foldexpr' :help fold-expr 当我设置了'foldmethod'选项来开启折叠,所有的折叠都关闭了.我该如何阻止这种行为? ----------------------------------------------------------------------------------- 你可以设置'foldlevelstart'选项为一个特殊的值来仅关闭指定值上的折叠:: :set foldlevelstart=99 更多资料,请读:: :help 'foldlevelstart' 我该如何在编辑某个文件时控制住将被打开的折叠数? ----------------------------------------------------- 你可以修改'foldlevelstart'选项来在你开始编辑文件时控制住被打开的折叠数.想在开 始编辑文本时,所有的折叠都是关闭的:: :set foldlevelstart=0 想在开始编辑时,所有的折叠都是被打开的,你可以使用:: :set foldlevelstart=999 更多的资料,请读:: :help 'foldlevelstart' 我该如何使用鼠标来开启和关闭折叠? --------------------------------------- 你可以点击最左边列上显示的+和-来打开和关闭折叠.想这样工作的话,你该设置 'foldcolumn'为一个大于的值:: :set foldcolumn=2 更多的资料,请读:: :help 'foldcolumn' 我该如何改变关闭的折叠上所显示的文本? ------------------------------------------- 你可以使用'foldtext'选项来改变关闭的折叠上所显示的文本. 更多的资料,请读:: :help 'foldtext' :help fold-foldtext :help 'fillchars' 我该如何在不同的Vim会话中保存和恢复人工建立的折叠? -------------------------------------------------------- 你可以使用":mkview"命令来保存认为建立的折叠.然后,你可以使用":loadview"命令来 恢复折叠.想这样工作的话,必须得在'viewoptions'包含"folds". 更多的资料,请读:: :help 28.4 :help :mkview :help :loadview :help 'viewoptions' :help 'viewdir' :help :mksession :help 'sessionoptions' =========================================================================== 章节 30 - Vim的外部程序 ======================= 我能否在Vim窗口中运行一个shell? ------------------------------------- 现在的Vim还不能在Vim的窗口中运行shell和别的外部的程序. 更多的资料,请读:: :help shell-window 作为选择的,你可以尝试使用Unix "screen"或者'splitvt'程序. 你也可以使用Brian Strurk所写的vimsh插件来在Vim窗口中运行一个shell.想使用这个 插件,那么在建立Vim的时候必须得有对python的支持.更多的资料,可以查看下面的URL:: http://vim.sourceforge.net/scripts/script.php?script_id=165 我该如何传递光标下的单词到某个外部程序中? ----------------------------------------------- 你可以使用专门的关键字来传递光标下的单词到某个外部程序中.例如:: :!dict 更多的资料,请读:: :help 我该如何把某个shell命令的输出输入到Vim的缓冲区中? ------------------------------------------------------- 你可以使用":r !"命令来把某个shell命令的输出输入到Vim的缓冲区中.例如,插入shell 命令"ls"的输出,你可以使用下面的命令:: :r !ls 想插入shell命令的输出到首行中,你可以使用下面的命令:: :0r !ls 更多的资料,请读:: :help :r! 我该如何把当前缓冲区的内容传到一个外部的命令中,并置换当前缓冲区的内容为此命令的输出? ------------------------------------------------------------------------------------------ 你可以使用:!命令来把当前缓冲区的内容传到一个外部命令中并置换当前缓冲区的内容 为此命令的输出.例如,想使用Unix sort命令排序当前缓冲区的内容,你可以使用下面的 命令:: :%!sort 仅打算排序10-20行,你可以使用下面的命令:: :10,20!sort 当然,假如你想把缓冲区的内容输出到外部命令中,但是不希望把结果重新返回到缓冲区 中,你可以使用:: :w !sort 上面的命令将会把整个缓冲区的内容传到排序命令中.记住,在'w'和'!'中的空格是必须 的.想仅传送某个范围内的行,你可以使用:: :10,20w !sort 上面的命令将会把10-20行的内容传到排序命令中. 更多的资料,请读:: :help :range! :help 10.9 :help :w c 我该如何排序我文章中的某个部分? ------------------------------------- 你可以传送文件的一部分到Unix "sort"工具中来排序这个文件.例如:: :5,100!sort 你也可以使用可视块,然后对选择的文本使用"!sort"命令. 想使用可视块排序(),读来自Vim online网页上的tip:: http://vim.sourceforge.net/tips/tip.php?tip_id=588 是否有一步步指导你在Vim中使用slrn的手册? ---------------------------------------------- 查看下面的链接来得到有关于在Vim中使用Slrn的的信息:: http://thingy.apana.org.au/~fun/slrn/ 我该如何把Vim作为一个pager来使用? --------------------------------------- 你可以使用$VIMRUNTIME/macros/less.sh shell脚本来把Vim作为pager来使用,在标准的 Vim发行版本中,这个都已经被加入了.这个shell脚本使用$VIMRUNTIME/macros/less.vim Vim脚本来提供 更多的资料,请读:: :help less 我该如何在Vim中查看Unix的man文档? --------------------------------------- 你可以使用在标准Vim发行版本中提供的man.vim插件来查看Unix的man文档.想使用这个 插件,增加下面的行到你的启动vimrc文件中:: runtime ftplugin/man.vim 你也可以按下K键来运行'keywordprg'选项所指定的程序,将会对光标下的单词起作用. 默认的,'keywordprg'是被设置为对光标下的关键字运行man. 更多的资料,请读:: :help man-plugin :help K :help 'keywordprg' 我该如何修改Vim所支持的diff命令? -------------------------------------- 默认的,Vim diff是被'diff'命令所支持的.你可以通过修改'diffexpr'选项来改变它的 工作方式. 更多的资料,请读:: :help diff-diffexpr :help 'diffexpr' 我该如何使用Vim的diff模式,但是却不开启折叠? -------------------------------------------------- 你可以使用下面的命令行来对二个文件启动Vim的diff模式,且不开启折叠:: $vim -o file1 file2 "+windo set diff scrollbind scrollopt+=hor nowrap" 假如你喜欢竖向的分割窗口,那么把"-o"替换成"-O". 更多的资料,请读:: :help vimdiff =========================================================================== 我该如何建立有缓冲区详细资料的菜单? ----------------------------------------- 增加缓冲区的菜单已经被加入到Vim的TODO列表中了.同时,你可以想尝试由 Michael Geddes's提供的插件:: http://vim.sourceforge.net/scripts/script.php?script_id=246 我该如何修改被GUI Vim所使用的字体? ---------------------------------------- 你可以修改'guifont'选项来修改GUI Vim所使用的字体.想显示当前这个选项的值,你可 以使用:: :set guifont? 你可以增加所显示的字体名称到.vimrc文件中,以跨越多个Vim会话来使用这个字体.例如, 增加下面的行到.vimrc文件中,以使用Andale Mono字体. set guifont=Andale_Mono:h10:cANSI 对于Win32, GTK和Photon版本的Vim来说,你可以使用下面的命令来打开一个对话框,以帮 助你选择字体:: :set guifont=* 你也可以使用-font Vim命令行选项来指定被正常文本所使用的字体. 更多资料,请读:: :help 'guifont' :help 'guifontset' :help 'guifontwide' :help font-sizes :help -font :help -boldfont :help -italicfont :help -menufont :help -menufontset 当启动GUI Vim时,我该如何指定GVIM窗口的位置? ------------------------------------------------- 你可以使用"-geometry"命令行参数来指定GUI Vim窗口的位置.例如:: $gvim -geometry 80x25+100+300 更多的资料,请读:: :help 31.4 :help -geom 我该如何给GVim增加水平的滚动条? ------------------------------------- 你可以通过修改'guioptions'选项来开启水平的滚动条:: :set guioptions+=b 更多的资料,请读:: :help 'guioptions' :help gui-horiz-scroll 我该如何使滚动条默认只在左边显示? --------------------------------------- 你可以增加'l'标记到'guioptions'选项来使滚动条只在左边显示:: :set guioptions+=l :set guioptions-=r 更多的资料,请读:: :help 'guioptions' :help gui-scrollbars 我该如何删除Vim的菜单栏? ------------------------------ 你可以通过从'guioptions'选项中删除'm'标记来删除Vim菜单栏:: :set guioptions-=m 更多的资料,请读:: :help 'guioptions' 我使用GUI Vim.当我按下ALT键和某个字母时,相应的菜单栏被选中了.我不希望这样,我希望执行我映射的ALT-组合键.我该如何做? ----------------------------------------------------------------------------------------------------------------------------- 你可以使用'winaltkeys'选项来关闭使用ALT键来选择一个菜单:: :set winaltkeys=no 更多的资料,请读:: :help 'winaltkeys' :help :simalt 是否可以在拖拉滚动条来滚动文本时,让光标保持在原处? -------------------------------------------------------- 在Vim的设计思路中,光标的位置,在normal,visual,select和insert模式中,都是被作为 一个可视点而存在的.所以假如不修改Vim的话,那么这点是无法办到的.当滚动条在被拖 拉时,光标将会被移动,所以它会一直可见.一种解决这个办法的途径是,使用Vim的标记. 你可以使用ma标记当前位置,然后滚动了部分文本后,在使用`a后,跳转到老位置上.你也 可以使用来自Vim online网点的建议:: http://www.vim.org/tip_view.php?tip_id=320 更多的资料,请读:: :help mark-motions 我该如何在gvim中,使用":browse"命令时,都会进入一个特定的目录进行浏览? -------------------------------------------------------------------------- 你可以设置'browsedir'选项的新值以改变":browse"命令所浏览的默认目录:: :set browsedir='' 更多的资料,请读:: :help 'browsedir' 有些问题,比如当某个文件在Vim的外部被修改时,Vim会显示一个GUI对话框.我该 ----------------------------------------------------------------------------- 如何把这种GUI对话框换成终端的对话框? 你可以在'guioptions'选项中设置'c'标记来配置Vim使用终端对话框以代替GUI对话框:: :set guioptions+=c 更多的资料,请读:: :help 'guioptions' 我尝试使用GUI Vim作为我的xxx程序的编辑器.当这个xxx程序登陆到GUI Vim来编辑一个文件时,控制立即重新返回到了xxx程序中.我该如何启动GUI Vim,使控制仅在我退出Vim后,才重新返返回到xxx程序中? ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 你可以用'-f'(前台)命令行选项来启动GUI Vim:: $gvim -f 默认的,GUI Vim会在启动Vim后,和程序失去连接.带有'-f'选项,GUI Vim将不会在启动时 于程序失去连接. 更多的资料,请读:: :help gui-fork :help -f 为什么"Select Font"对话框不能显示我机器上安装的所有字体? --------------------------------------------------------------- Vim仅支持固定宽度(mono-spaced)的字体.比例(矢量?)字体是不支持的.在"Select Font" 对话框中,只有等宽字体才被显示. 更多的资料,请读:: :help font-size :help 'guifont' 我该如何在Vim的命令行模式中使用鼠标? ------------------------------------------- 你可以在'mouse'选项中增加'c'标记以使可以在Vim命令行模式中使用鼠标:: :set mouse+=c 更多的资料,请读:: :help mouse-using :help gui-mouse :help 09.2 当我使用鼠标中键来滚动文本时,它会粘贴上次所拷贝的文本.我该如何取消这种 ----------------------------------------------------------------------------- 行为? 你可以映射鼠标中键为来关闭鼠标中键的行为:: :map :map! 更多的资料,请读:: :help gui-mouse-mapping :help 我该如何改变GUI Vim窗口的大小,以及在屏幕上的位置? -------------------------------------------------------- 你可以使用"winpos"命令来改变Vim窗口的位置.想改变窗口的大小,你可以修改"lines" 和"columns"选项. 例如,下面的命令行将会把GUI Vim窗口定位在屏幕X,Y坐标50,50的地方,并且大小设置为 50行高,80列宽:: :winpos 50 50 :set lines=50 :set columns=80 由'winpos'命令所指定的参数,是Vim窗口的像素坐标位置.'lines'和'columns'选项专门 指定了用于窗口的行数以及宽度所用到的字符数. 更多的资料,请读:: :help 31.4 :help :winpos :help 'lines' :help 'columns' :help GUIEnter =========================================================================== 章节 31 - ======================= 章节 32 - UNIX 上的 VIM ======================= =========================================================================== 章节 33 - MS-WINDOWS 上的 VIM ============================= 在MS-Windows中,CTRL-V并不能开启块选择模式.这是怎么回事? ------------------------------------------------------------- mswin.vim脚本,提供了相当多的键映射和选项以使Vim的行为类似于一个MS-Window程序. 其中的一个映射就是把CTRL-V映射为在MS-Windows程序中的粘贴.这会关闭原来的使用 CTRL-V开启块选择模式的功能.mswin.vim脚本映射CTRL-Q为开启块选择模式.所以你可以 使用CTRL-Q代替使用CTRL-V. 更多的资料,请读:: :help CTRL-V :help CTRL-V-alternative :help CTRL-Q :help 10.5 当我按下了CTRL-Y键,它的行为却类似于CTRL-R键.我该如何配置Vim使其恢复它本来的功能? -------------------------------------------------------------------------------------- mswin.vim脚本把CTRL-Y映射为CTRL-R.mswin.vim脚本这样影射CTRL-Y是使Vim的行为更加 的类似于标准的MS-Windows程序.在":help CTRL-Y"中给出了解释.你可以选择在mswin.vim 中把映射CTRL-Y的那行注释掉,或者是选择你的.vimrc中删除掉载入mswin.vim脚本的语句. 我该如何总是以最大化的方式启动GUI VIM? -------------------------------------------- 你可以使用"simalt"命令来最大化Vim的窗口.你可以使用GUIEnter自动命令来在Vim启动 时最大化Vim窗口:: autocmd GUIEnter * simalt ~x 更多的资料,请读:: :help :simalt :help GUIEnter :help gui-win32-maximized 在做了一些编辑操作后,Vim当住了.光标变成了一个空的矩形.我不能输入任何的字符.这是怎么回事? ------------------------------------------------------------------------------------------------ 最可能的情况是,你在Vim中使用了鼠标滚轮来滚动文本.在Vim中使用智能(intellimouse) 鼠不安全,这个问题是众所周知的.想避免这个问题,可以关闭Vim所支持的Universal scrolling. 更多的资料,请读:: :help intellimouse-wheel-problems 我使用的是WindowsXP,最大化Vim时的显示速度非常的慢.我该如何加快这个速度? ----------------------------------------------------------------------------- 你可能的原因是因为你在显示属性中开启了'Smooth edges of screen fonts'.尝试关闭 它,或者修改圆滑方法为"Standard". 在cygwin中使用vim,有什么推荐的设置吗? ------------------------------------------- 你可以使用下面的跟Vim有关的设置:: :set shellcmdflag=-c :set shellquote= :set shellslash " Use the forward slash for expansion. :set shellxquote=\" :set shell=d:\cygwin\bin\bash.exe " Use the bash shell :set shellpipe=2>&1| tee :set shellredir=>%s 2>&1 我尝试在Vim diff模式下使用GNU diff.当我在命令行上运行diff时,它可以工作.当我尝试在Vim中使用diff时,它失败了.我该如何做? --------------------------------------------------------------------------------------------------------------------------- 这是一个在Vim中使用GNU diff的问题.你可以尝试使用由Ron Aaron开发的GNU diff.exe 从下面的网址中可以获得,他所写的diff.exe:: http://www.mossbayeng.com/~ron/vim/builds.html 是否可以使用Vim作为MS-Windows Outlook邮件客户端的外部编辑器? ------------------------------------------------------------------ 你可以使用"cubiclevim" COM Add-In来把Vim作为MS-Windows outlook邮件客户端的编 辑器.查看下面的URL来得到更多的相关信息:: http://sourceforge.net/projects/cubiclevim 记住,现在这个只能工作在2000和XP的MS-Office 中. 我使用Vim来编辑HTML文件.我该如何启动IE来预览当前文件的HTML页面? --------------------------------------------------------------------- 你可以使用下面的命令:: :!start c:\progra~1\intern~1\iexplore.exe file://%:p 我非常想在MS VS中使用Vim.我该如何做? ------------------------------------------- 你可以下面并使用OLE版本的Vim(例如:gvim61ole.zip).这个文件包含了教你如何在VS中 使用Vim的指示. 更多的资料,请读:: :help MSVisualStudio 我该把_vimrc和_gvimrc放到哪里? ------------------------------------- 你该把_vimrc和_gvimrc文件放到由VIM环境变量所指向目录中.假如你和别人共享系统, 那么你可以把文件放入到某个目录中,并设置HOME变量到这个目录中. 更多的资料,请读:: :help $HOME-use :help _vimrc 每次在我保存文件时,Vim就会警告这个文件在外部被修改过了.为什么? --------------------------------------------------------------------- 假如你在每次保存文件时,得到的警告信息跟下面一样:: WARNING: The file has been changed since reading it!!! Do you really want to write to it (y/n)? 那么,这个是在保存时间时,和MS-Windows有关的一个BUG.Vim会在每次对文件做了修改 后,会记住这个文件的时间戳. =========================================================================== 章节 34 - 打印 ============== 我该如何打印出一个带所有行行号的文件? ------------------------------------------- 你可以设置'printoptions'选项并使用":hardcopy"命令来打印你的文件:: :set printoptions=number:y :hardcopy 更多的资料,请读:: :help 'printoptions' :help :hardcopy 我该如何在打印文件时,顺便打印出此文件所带有的语法高亮颜色? ---------------------------------------------------------------- 你可以使用":hardcopy"命令来打印一个文件,这样出来的文件是带有相应的语法高亮颜 色的.你可以使用2html.vim脚本把你的文件转换为HTML文件,然后打印出相关的HTML文件. 更多的资料,请读:: :help syntax-printing :help 2html.vim :help :hardcopy :help printing =========================================================================== 章节 35 - 编译VIM ================= 我该如何在Unix系统上从源码中编译并建立Vim? ------------------------------------------------ 在一个Unix系统中,想从源码中编译并建立Vim需要遵循下面的步骤: - 从下面的站点中下载源码和run-time文件归档包(vim-##.tar.bz2): ftp://ftp.vim.org/pub/vim/unix - 使用bzip2和tar工具包,释放归档文件,用下面的命令:: :bunzip2 -c | tar -xf - - 运行'make'命令来使用默认的配置,配置并建立Vim. - 运行'make install'命令按安装Vim在默认的目录中. 想开启/关闭不同的Vim特性,需要在运行'make'命令前,使用不同的标志包含/不包含某 些Vim的特性,然后把这些标志和'configure'命令合用.想列出'configure'命令,所使用 的选项,使用:: $ configure -help 更多的资料,请读:: :help install 我该如何在Unix中安装Vim在我的home目录或别的目录而不是默认的安装目录中? ---------------------------------------------------------------------------- 想安装Vim不在默认的安装路径中,你可以在运行configure脚本时使用--prefix选项来 指定要安装的目录:: $ ./configure --prefix=/users/xyz 你也可以开启/关闭不同的Vim特性,只用在configure脚本中假如不同的参数.更多的关于 这些选项的信息,运行:: $ ./configure --help 更多的资料,请读:: :help install-home :help install 我该如何在MS-Windows系统,从源文件中建立Vim? ------------------------------------------------- 在MS-Windows系统中,Vim可以使用Visual C++ compiler或者Borland C++ compiler或着 Ming GCC或者cygwin gcc compiler.遵循下面的步骤,在MS-Windows中,从源文件中编译并 建立Vim:: - 从下面的站点中下载source(vim##src.zip),runtime(vim##rt.zip)和extra(vim-##-extra.tar.gz)归档包: ftp://ftp.vim.org/pub/vim/pc - 释放归档文件到某个目录中(例如,c:\vimsrc) - 基于安装的编译器,你可以使用相应的makefile来对源文件进行编译并建立.对于VC++ 使用Make_mvc.mak makefile,对于borland C++使用Make_bc5.mak makefile,对于 Make_ming.mak makefile,而cygwin gcc使用Make_cyg.mak makefile. 根据你是否想建立GUI版本的Vim或者终端版本的Vim,你可以传递不同的参数给makefiles. 在成功的编译并对源码进行建立后,你可以拷贝vim.exe或gvim.exe文件到你想要的目录 中,顺便还要加上从runtime归档文件中的文件. 你可以查看下面的站点来得到在MS-Windows使用不同的编译器建立Vim的额外信息:: http://mywebpage.netscape.com/SharpPeople/vim/howto/index.html 更多的资料,请读:: :help install Vim的帮助文件,语法文件,缩进文件都从我的Vim安装包中不见了.我该如何安装这些文件? ------------------------------------------------------------------------------------ Vim帮助文件,语法文件,缩进文件和别的runtime file都是Vim runtime包的一部分.你 需要下载并安装Vim runtime包.例如,对于MS-Windows,Vim 6.1 runtime包的名字是 vim61rt.zip. 更多的资料,请读:: :help install 我已经从源码中建立了Vim并使用"make install"安装了Vim包.我是否还需要保存源码目录? -------------------------------------------------------------------------------------- 不,一旦你建立并安装了Vim在某个目录中,不是指Vim的源码目录(例如,/usr/bin或者 /usr/local/bin),那么你就可以删除源码所在的目录了. 我该如何在compile time确定Vim的特性是否被开启? ---------------------------------------------------- 你可以使用":version"命令来确定Vim的特性是否在compile time时被开启.这项特性 被开启,会有前缀"+".假如没有被开启,会有"-"前缀. 假如你想在某个脚本中测试某个特性,你可以使用has()函数:: if has("menu") " Set up some menus endif 更多的资料,请读:: :help :version :help +feature-list :help has() 我能否建立Vim而不包含对GUI的支持? --------------------------------------- 能.你可通过选项开启/关闭很多包含在GUI里面的特性,来建立Vim. 更多的资料,请读:: :help install 在Unix系统上建立Vim时,我得到了"undefined reference to term_set_winsize'错误.我该如何解决这个问题? ------------------------------------------------------------------------------------------------------- 你会得到这个错误是因为你在建立过程中没有定位termlib,termcap或者ncurses库. 你需要安装ncurses-dev包来解决这个问题. ------ =========================================================================== 章节 36 - 杂项 ============== 我该如何使用Vim编辑二进制文件? ------------------------------------ 你可以设置下面的选项来在Vim中编辑二进制文件:: :set binary :set display=uhex 你也可以使用"-b"命令行选项来编辑一个二进制文件:: $ vim -b 你也可以使用xxd使用包(Vim发行包的一部分)来编辑二进制文件. 更多的资料,请读:: :help 23.4 :help edit-binary :help hex-editing :help -b :help 'binary' :help 'endofline' :help 'display' 我该如何关闭可视的错误闪烁提示和错误响铃? ----------------------------------------------- 你可以同时关闭可视的错误闪烁提示和错误响铃,使用下面的命令:: :set visualbell t_vb= 更多的资料,请读:: :help 'visualbell' :help 'errorbells' :help t_vb 我该如何在一个缓冲区中显示某个字符的ascii值? -------------------------------------------------- 你可以使用'ga'命令来显示光标所在字符的ascii值. 更多的资料,请读:: :help ga :help :ascii 我能否在Vim命令中,使用0作为记数? -------------------------------------- 你在Vim命令中,不能使用0作为记数,因为0本身有也是个命令,它会移动到行首. 更多的资料,请读:: :help 0 :help count 我该如何关闭Vim的欢迎屏幕? -------------------------------- 你可以关闭Vim的欢迎屏幕,通过在'shortmess'选项中增加'I'标记:: :set shortmess+=I 更多的资料,请读:: :help :intro :help 'shortmess' 我该如何避免"hit enter to continue"的快捷提示? ---------------------------------------------------- 假如一些信息在屏幕上,而且屏幕将被重画,那么Vim将会出现提示"hit enter to continue".你可以在'shortmess'选项中增加'T'标记来截取这方面的信息.这可以帮助 你去掉hit-enter提示:: :set shortmess+=T 你也可以设置'cmdheight'选项来增加命令行的高度:: :set cmdheight=2 更多的资料,请读:: :help hit-enter :help avoid-hit-enter :help 'shortmess' :help 'cmdheight' 我该如何在命令行中调用Vim对一组文件执行一组命令? ------------------------------------------------------ 有几种方法可以在命令行中调用Vim来对一组文件执行一组命令.你可以使用一系列"-c" 选项来指定一组命令:: $vim -c "" -c "" *.txt 在"-c"命令行选项后面所指定的ex-command将会按顺序一个个执行.你也可以使用"-c" 命令行选项,并使用"|"字符来分隔ex命令:: $vim -c " | " *.txt 在上面的命令中,假如一个ex命令失败了,那么所有的剩余的ex命令都不会被执行. 例如,在命令行中指定置换文件中的"ABC"为"DEF",你可以使用下面的命令:: $vim -c "%s/ABC/DEF/ge" | update" myfile.txt 想从命令中,置换多个文件中的"ABC"为"DEF",你可以使用下面的命令:: $vim -c "argdo %s/ABC/DEF/ge | update" *.txt 你也可以存储一组的命令到一个文件中,并使用"-s"命令选项来对一批文件执行这些命令, 例如,假如这组命令被存储在mycmds.txt中,那么你可以使用下面的命令:: $vim -s mycmds.txt *.pl 更多的资料,请读:: :help -c :help -s 我该如何在插入模式中,不离开插入模式运行普通模式的命令? ------------------------------------------------------------ 你可以在按CTRL-O然后跟一个普通模式的命令,来在插入模式下执行普通模式的命令. 想执行多个普通模式的命令,按CTRL-L键,后面跟任意多个普通命令,然后按来重新 返回到插入模式. 更多的资料,请读:: :help i_CTRL-O :help i_CTRL-L 我该如何在启动Vim时,自动进入插入模式? ------------------------------------------- 你可以使用":startinsert"的ex命令来以插入模式启动Vim:: $vim +startinsert myfile.txt 上面的命令将会打开文件"myfile.txt"并进入插入模式,而光标会定位在第一行的第一个 字符.想打开文件的时候,自动定位在最后行的最后的字符上,你可以使用下面的命令:: $vim +startinsert! myfile.txt 更多的资料,请读:: :help :startinsert =========================================================================== .. vim:set tw=78 ai fo+=n fo-=l ft=rst