翻译: xianwei
整理: TocerDeng
这份FAQ是来自vim@vim.org邮件列表和comp.editors组的问题和答案. 有好几种方法来解决一个VIM中的问题.这份FAQ给出了其中的一种可能性.你可以 使用这份FAQ里的信息和链接探索另外的解决方法.这份FAQ里的答案的贡献者主要 是来自于Peppe, Benji, Charles Campbell 和无数的朋友.
目录
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程序是由Bram Moolenar,所编写,和来自很多无私的贡献者.":h cred- its"来查看完整的贡献人员名单.
Vim是基于Stevie开发的,它是由Tim Thompson,Tony Andres和G.R.(Fred) Walter所开 发的.
更多的资料,请读:
:help author
是的.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会话中打开也可以有一个想关
联的缓冲区,当然你也很容易从一个跳到另一个中去.
灵活的插入模式
Vim允许你在插入模式中使用方向键在整个文件中进行移动.不用敲入更多的
<ESC>,四处移动,然后敲入'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的作者鼓励你能够 对慈善团体做一些贡献.有份在发行版本中的文档解释了该如何做这些.
更多的资料,请读:
:help copyright
你可以把你的有关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到 <NAME>-subscribe@vim.org 取消: 发email到 <NAME>-unsubscribe@vim.org 获取帮助: 发email到 <NAME>-help@vim.org
是的.查看 http://www.yahoogroups.com/list/<name>, name的地方可以是vimdev, vimannounce,vim,vim-fr,vim-mac,vim-multibute,vim-vms.
作为选择的,也可以去 http://www.gmane.org 去找关于GMANE,GMANE允许你进入邮件列表,好 像他们就是新闻组.这会对那些希望浏览历史记录或只是偶然的查看下最近信息的人提 供很大的便利.
你可以下载HTML/PDF/PS格式的Vim帮助手册从:
http://vimdoc.sourceforge.net/
首先,你应该确定这个问题与你的_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
首先使用如下的命令来收集信息:
:source $VIMRUNTIME/bugreport.vim
现在把上面的命令所搜集的信息发到bugs@vim.org.
Vim开发邮件列表(见上)是一个非常好的讨论总体bug的地方.假如你找到的bug伴随着 语法高亮或者一些别的附加特性(i.e. 不是直接在Vim内部编程实现的),试着去报告给 那个特性的维护者.
更多的资料,请读:
:help bug-reports
这份FAQ可以在VimOnline(vim.sf.net)上找到.将来会在别的站点放置这份FAQ.
这份FAQ涵盖了Vim细节方面的大部分问题.你可以阅读Vi的FAQ来找到很多适合Vi克隆 品方面的详细信息.在comp.editors上,经常会有这种方面的帖子.你也可以在下面的 网站上找到一份拷贝
同样,自从Vim在过去的几年中搜集了大量的新特性后,想成功的整理出一份FAQ来,基 本上已经成了一个不可能的任务.为了尽可能实现这个目标,请发email给维护者,假 如你有一个好的问题的话.一个好的问题是指你试着自己去解决,但是失败了.(记住, Vim有非常好的文档)
你可以把你的patchs发给Vim开发者邮件列表vim-dev@vim.org.
更多的资料,请读:
:help vim-dev
是的.你可以使用Vim在线站点来上载你的插件/脚本,配色方案,建议,等等.这个站 点是 http://vim.sourceforge.net
这个最新的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
你可以从VimOnline站点上下载到Vim最新版本的源码.这个站点的URL是 http://vim.sourceforge.net/download.php
所有的Unix平台. 所有的Windows平台. Amiga, Atari, BeOS, DOS, Macintosh, MachTen, OS/2, RiscOS, VMS
你可以在Vim的ftp站点上 ftp://ftp.vim.org/pub/vim/runtime directory 下载最新的版本的Vim runtime files(语法文件,文件类型插件,编译器文件,配色方 案,文档,缩进文件和键映射).
可以找到所有Vim函数的帮助.为了使用帮助文件,可以使用":help"命令.这会带你到 主帮助文件的页面.在第一页上,你可以找到关于如何移动的说明.这样,你就可以在 一个帮助页面中移动了,当然你是在一个只读的文档上.你可以使用标签跳到详细的主 题.有两种方法可以这样做:
在一个命令的名字上,或选项上时,使用 "<Ctrl-]>"命令.只有当这个tag是一
个关键字时,才会有效."<Ctrl-LeftMouse>"和"g<LeftMouse>"工作起来类似于
"<Ctrl-]>".
使用":tag <subject>"命令.对所有的字符,它都会做相应的处理.
使用"<Ctrl-T>"跳回到刚才在帮助文件中的位置.使用":q"来关闭帮助窗口.
假如你想跳到帮助页面中的某个详细的主题上,使用":help (subject)".假如你不知道 该如何去寻找,尝试":help index"得到一份有效主题列表.使用标准的搜索键来定位 你想要的信息.你可以把":help"缩写成":h".
更多的资料,请读:
:help online-help
你可以在输入你要的关键字后按下CTRL-D,来得到一个包含此关键字的列表.你可以可 以使用meta字符像*,\+,等等来详细的指定搜索模式:
:help init<C-D> :help str*()<C-D> :help '*indent<C-D>
你可以在输入部分的帮助关键字后,按下TAB来扩展这个词,找到符合你所需要的匹配. 你可以继续按下TAB来查看别的匹配.
从帮助窗口中,你可以使用":tag"命令搜索关键字.例如:
:tselect /window
这个命令会列出所有的包含文本"window"的关键子.你可以从列表中选择出一个并跳入 进去.
你可以使用":helpgrep"命令在全部的帮助文件中,搜索给定的文本.这个quickfix 窗口将会打开,并显示所有匹配的行.
更多的资料,请读:
:help c CTRL-D :help c <Tab> :help :tselect :help :help :help :helpgrep
你可以使用如下的命令来得到更多的关于错误的信息:
:help E123
更多的资料,请读:
:help error-messages
你可以通过阅读
:help vim-modes
你可以使用":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=
这个(dirname)指的是你的帮助文件所在的目录.这个gzip.vim插件是在Vim标准发行包 中已经被包含的,会很小心的解压这些文件.当它们与压缩的文档地址不是在同一地方 的时候,你必须得确定$VIMRUNTIME是否设置了另外的文件在哪里.
更多的资料,请读:
:help gzip-helpfile :help 'helpfile' :help gzip :help $VIMRUNTIME
这里有好几种方法使你在编辑时载入一个别的文件.最简单的方法是使用":e"(:edit) 命令:
:e <filename>
你也可以使用":n" (:next)命令来载入另一个文件到Vim中去:
:n <filename(s)>
你也可以使用":args"命令来载入一个文件到Vim中去
:args <filename(s)>
更多的资料,请读:
:help usr_07 :help edit-files :help :edit :help :next f :help :args f
你可以使用":saveas"命令来以新的名字保存当前文件:
:saveas <newfilename>
作为选择的,你也可以使用下面的命令:
:w <newfilename> :edit #
你也可以使用":file"命令,然后再使用":w"命令:
:file <newfilename> :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'选项并打开'binary'选项来在写入文件时,不在末尾追加EOL:
:set binary :set noeol :w
更多的资料,请读:
:help 'endofline' :help 'binary' :help 23.4
Vim会把缓冲区内上次编辑时光标最后所在的位置记录到寄存器'"'中去.你可以使用如 下的自动命令,并把它加入到你的.vimrc或.gvimrc中去,使打开文件时会光标会停留 在上一次编辑过的位置:
au BufReadPost * if line("'\") > 0 && line("'\") <= line("$") |
\ exe "normal g'\"" | endif
更多的资料,请读:
:help '" :help last-position-jump
你可以设置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不支持周期性的自动保存文件.
更多的资料,请读:
:help 'updatetime' :help CursorHold :help swap-file
你可以使用":view"命令来以只读模式打开一个文件:
:view <filename>
这个命令对于打开的缓冲区设置了'readonly'选项.你也可以使用"-R"命令来以制度模 式打开一个文件:
$vim -R <filename>
你也可以使用符号链接在命令行中执行"view"以只读模式打开一个文件:
$view <filename>
更多的资料,请读:
:help 07.6 :help 'readonly' :help 'modifiable' :help :view :help :sview :help view :help -R :help -M
你可以打开一个文件对其进行编辑而不用保存对当前文件的改动,而且可以不用失去这 些改动,使用如下的方法:
:split <new_filename> :new <new_filename>
你也可以设置'hidden'选项并编辑一个新文件:
:set hiddent :e <new_filename>
假如你打算抛弃对当前文件所作的改变并载入新的文件来编辑,你可以使用如下的命令:
:e! <new_filename>
更多的资料,请读:
:help :edit! f :help 'hidden' :help :split :help :new
这里有几种方法能够在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
这里有好几种方法来切换多个文件.你可以使用"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
你可以使用-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
你可以使用 ":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
不.当前是不可能的.这个特性在todo列表中.
你可以使用explorer.vim插件,在标准的Vim安装包中都是支持的,可以用来浏览\探寻 目录.你可以使用下面的命令来开启文件管理器:
:e <directory> :Explore :SExplore
在文件管理器中,你可以浏览目录,重命名,删除,编辑文件.
更多的资料,请读:
:help file-explorer :help 22.1
你可以使用vnetrw.vim插件,在标准的Vim包中已经被包含进去了,可以在网络使用多 种协议编辑文件.使用这个插件,可以明显的使用ftp/scp/rcp/http来载入和保存文件. 例如,在ftp上编辑一个文件,你可以使用入下的命令:
$vim ftp://matchine/path
更多的资料,请读:
:help netrw.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的'backupdir'选项来存储所有的备份文件到一个特殊的目录中去. 例如,存储所有的备份文件到~/backup目录中,你可以使用如下命令:
:set backupdir=~/backup
更多的资料,请读:
:help 07.4 :help 'backupdir' :help backup
这些是有可能的,假如'backupcopy'选项被设置为'no'或'auto'.请记住这个选项的默 认值是在大部分的情况下都可以正常工作的.假如这个默认的选项,替你工作的不是很 号,尝试设置'backupcopy'选项为'yes'来在存储文件时,保持文件的权限.:
:set backupcopy=yes
这个应用了后.默认的,Vim不会备份文件.
更多的资料,请读:
:help 'backupcopy' :help backup :help 'backup' :help 'writebackup'
你可以设置'hidden'选项来编辑一个文件而不失去对当前文件所做的改动:
:set hidden
通过设置'hidden'选项,你也可以保存缓冲区的改动历史(撤销历史).否则,当你切换 文件时,这个撤消历史将会丢失.
更多的资料,请读:
:help 'hidden' :help hidden-quit :help :hide
你可以设置'autowrite'选项来在切换到另一个缓冲区时自动保存改动过的缓冲区:
:set autowrite
更多的资料,请读:
:help 'autowrite' :help 'autowriteall' :help 'hidden'
你可以使用":enew"命令来载入一个空的缓冲区置换当前窗口的缓冲区.
更多的资料,请读:
:help :enew
你可以使用CTRL-^来通过指定缓冲区号载入一个缓冲区.例如,要载入缓冲区5,你可 以按5 CTRL-^命令.
更多的资料,请读:
:help CTRL-^
你可以使用":ball"或者":sball"命令来打开所有在缓冲区列表中的缓冲区:
:ball
更多的资料,请读:
:help :ball
你可以使用":bdelete"命令来删除一个缓冲区而不结束缓冲区. 例如:
:bdelete file1
更多的资料,请读:
:help :bdelete :help :bwipeout
你可以使用":bdelete <buffername>"命令来关闭缓冲区.
更多的资料,请读:
:help :delete :help :bunload :help :bwipeout
在":%bd"命令中,这个'%'的范围会被置换为当前缓冲区的起始行号和终结行号.为了 代替'%'作为范围,你需要指定详细的范围.例如,为了删除所有的缓冲区,你可以使 用如下的命令":1,9999bd".
更多的资料,请读:
:help :bd
你可以使用2<CTRL-G>命令来显示当前缓冲区/文件的的缓冲区号.记住在CTRL-G命令前 的序号.假如这个数大于一,Vim就会显示缓冲区号.
你也可以使用如下的命令来显示当前缓冲区号:
:echo bufnr("%")
你也可以把"%n"域包含到'statusline'选项中来在状态栏上显示当前缓冲区号.
更多的资料,请读:
:help CTRL-G :help bufnr() :help :echo :help 'statusline'
你可以使用如下的命令来打开下个缓冲区并删除当前缓冲区.
:bnext | bdelete
更多的资料,请读:
:help :bnext :help :bdelete :help :buffers
你可以使用如下的两个映射命令,来映射CTRL-Tab键打开下个缓冲区并使用CTRL-SHIFT -Tab键来打开前一个缓冲区:
:nnoremap <C-Tab> :bnext<CR> :nnoremap <S-C-Tab> :bprevious<CR>
更多的资料,请读:
:help :bnext :help :previous
一个Vim缓冲区是一个文件载入到内存中进行编辑.原始的文件没有贝改变,直到你确 定将对此文件所做的改动写入到缓冲区的文件中.一个Vim的窗口是一个缓冲区的视口. 你可以在一个缓冲区上打开多个窗口或者几个窗口对应不同的缓冲区.
更多的资料,请读:
:help usr_08.txt :help 22.4 :help windows-intro :help Q_wi
你可以使用如下的命令来增加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
你可以使用":bufdo"命令来对所有的打开的缓冲区执行一条ex命令.你可以使用 ":windo"命令来对所有打开的窗口执行一条ex命令.你可以使用":argdo"命令来 对所有参数列表中的文件执行一条命令.
更多的资料,请读:
:help :windo :help :bufdo :help :argdo :help 26.3
你可以使用'G'命令跳到文件的最后行或者用'gg'命令跳到文件中的首行.
更多的资料,请读:
:help G :help gg
不.是没有可能改变这种行为的.这个光标是"always"定位在一个有效字符上(除非你 开启了虚拟编辑模式(virtual-edit mode)).所以,假如你追加文本到行末时,当你 回到命令模式的时候,这个光标**must**重新回到你键入的最后个字符上.出于一致性 的考虑,这个光标可以被退到任何的地方,只要你在一行里.
你可以在插入模式中使用CTRL-O命令来执行一条ex命令,然后回到插入模式中,而不 用移动光标列.
更多的资料,请读:
:help 'virtual' :help i CTRL-O
当你移动文本时,可以重置'startofline'选项来保持光标的竖直位置:
:set nostartofline
更多的资料,请读:
:help 'startofline'
你可以使用gj和gk命令在屏幕上的一行中,进行上下移动.j,k移动的是文件的中的一 行.你也可以设置'wrap'选项来避免回绕:
:set nowrap
更多的资料,请读:
:help gj :help gk :help 'wrap'
你可以使用下面的映射:
:map <Up> gk :imap <Up> <C-o>gk :map <Down> gj :imap <Down> <C-o>gj
一个句子是被定义为以一个'.','!'或'?'结尾的一行,或者被一个(或二个)空格或者 <tab>.哪些字符和多少数量的空格被组成为句子的结尾,是由'joinspaces'和 'cpoptions'选项规定的.
一个段落是跟在一个空行后的,也可以使用一套标识段落的宏,这套标识符被详细定 义在'paragraphs'选项中.
一个章节跟在一个在第一列的form-feed(<C-L>)符号后,或者是在段落宏中的一个, 在'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
你可以使用如下的命令来水平的滚动窗口到左边或右边:
zl - 向左卷动 zh - 向右卷动 zL - 向左卷动半个屏幕 zH - 向右卷动半个屏幕 zs - 卷动屏幕使光标所在的位置,移动到屏幕的开始处. ze - 卷动屏幕使光标所在的位置,移动的屏幕的结束处.
你可以使用g0命令移动鼠标到屏幕行(不是文件行)的开始处,而g$命令可以移动到屏 幕行的终点处而不用卷动屏幕.
更多的资料,请读:
:help scroll-horizontal
你可以对每个缓冲区设置"scrollbind"选项来同时卷动他们.
更多的资料,请读:
:help 'scrollbind' :help scroll-binding :help 'scrollopt'
有两种可能会造成这种情况:假如你不是在一个很慢的链接上使用Vim,那么就是Vim不 理解你的键盘所产生的键序列.
假如你工作在一个很慢的连接上(例如2400bps的猫上),你可以尝试设置'timeout'或 者'ttimeout'选项.这些选项,再和'timeoutlen'和'ttimeoutlen'选项进行组合,可 能修复这个问题.
假如你的终端发送了Vim不懂的键码,那么前面的处理程序有可能会不能正确的工作. 在这种情况下,你最好的选择是映射你的键序列来匹配一些光标移动命令并保存这些 映射到你的文件中去.只要你在终端上工作,就都可以":source"这个文件.
更多的资料,请读:
:help 'timeout' :help 'ttimeout' :help 'timeoutlen' :help 'ttimeoutlen' :help :map :help vt100-cursor-keys
你可以增加'<'标志位到'whichwrap'选项中来配置Vim当光标在一行的开始处,按下向 左的键,会跳到前一行的末尾处:
:set whichwrap+=<
相似的,当光标在行末尾处,按下向右的键要移动到下一行的开始处,只要增加'>'标 志位到'whichwrap'选项中:
:set whichwrap+=>
上面的方法只能工作在正常模式和可视模式中.假如想在插入或置换模式中开启这项 功能的话,只要加入相应的'['和']'标志位.
更多的资料,请读:
:help 'whichwrap' :help '05.7'
你可以设置'insertmode'选项来配置Vim使其只呆在插入模式下:
:set insertmode
设置了这个选项后,你可以把Vim当作无模式编辑器使用.假如你按下了<Esc>键,Vim 不会回到正常模式中.假如想执行一个普通模式下的命令,你可以按下CTRL-O,然后 键入正常模式命令.假如想执行超过一条命令,你可以按如CTRL-L然后再键入命令. 假如想回到插入模式,按下<Esc>,关闭这个选项,然后重置'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
'hlsearch'选项控制是否打开对上次模式的匹配进行高亮.默认的,这个选项是不会 开启的.假如这个选项是被设置在多个系统使用的vimrc文件中,那么你该通过如下的 命令关闭搜索高亮:
:set nohlsearch
暂时的关闭搜索高亮,使用:
:nohlsearch
你也可以清除搜索的高亮,通过搜索不在本文件中的模式(例如,搜索模式'asdf').
更多的资料,请读:
:help 'hlsearch' :help :nohlsearch
你可以在一个模式中使用'\r'或者<CTRL-V><CTRL-M>来插入一个回车符号.在Vim脚本 中,更加适合使用'\r'来代替回车符.
更多的资料,请读:
:help sub-replace-special
你可以先键入CTRL-V键,然后键入CTRL-M键,来搜索^M字符:
/^V^M
你也可以使用"\r"字符.在Vim脚本中,"\r"字符是首选.
更多的资料,请读:
:help c CTRL-V :help using CTRL-V :help /\r
你可以使用'ga'命令来显示特殊字符的ascii 值/码.例如,让我们假设这个ascii值 是142.然后你使用如下的命令来搜索特殊的字符:
/^V142
^V是按CTRL-V输入的.
更多的资料,请读:
:help ga :help using_CTRL_V :help 24.8
你可以使用如下的命令和搜索模式来高亮文件的所有空白字符:
:set hlsearch /\(\p\|$\)\@!.
更多的资料,请读:
:help /\p :help /bar :help /$ :help /\( :help /\@! :help 'hlsearch'
你可以搜索完整的单词,只要使用\<和\>原子操作符即可.例如:
/\<myword\>
\<原子操作符匹配单词的开头,而\>标志着单词的结尾.
更多的资料,请读:
:help /\< :help /\>
你可以通过按下*键来向前搜索位于光标下的单词.想往后搜索,请按#键.请记住, 使用这个命令被搜索的是整个单词.
更多的资料,请读:
:help star :help # :help g* :help g# :help 03.8 :help search-commands
当搜索一个模式时,为了总是忽略大小写,可以设置'ignorecase'选项:
:set ignorecase
当只想搜索某个特殊的模式时,忽略大小写,可以设置'ignorecase'选项:
/\c<pattern>
更多的资料,请读:
: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/\<your_word\>/let cnt=cnt+1 :echo cnt
这会计算单词出现的行的行数.你可以使用如下的命令:
:%s/\<word\>/&/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
你可以使用'e'标志加给substitute命令,即使当一个模式搜索失败了,也可以执行映 射中的别的命令.
更多的资料,请读:
:help :s flags
为了搜索一行中第n次出现的字符,你可以在'f'命令假上记数前缀.例如,搜索第5次 在行中出现的字符@,你可以使用命令5f@.这是假设光标在行的开始处-而且第一个字 符不是你要搜索的那个字符.
更多的资料,请读:
:help f :help F :help t :help T :help ; :help ,
你可以使用如下的命令来替换一个tab(或者别的字符)为一个换行符(新行符):
:s/\t/\r/
记住,在上面的命令中,假如你使用\n代替\r,那么tab字符将不会被替换为新行符.
更多的资料,请读:
:help sub-replace-special :help NL-used-for-Nul :help CR-used-for-NL
你可以在"/"命令后按下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/<pattern>/p
例如,下面的命令会显示缓冲区中所有包含"vim"的行:
:g/vim/p
假如你想获得相应的行数,键入如下的命令:
:g/<pattern>/#
更多的资料,请读:
: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和\%<l正则表达式原子操作符来搜索一定行范围内的模式.
例如,要搜索缓冲区中位于第10行和第30行内的单词'white'时,你可以使用如下的命令:
/white\%>10l\%<20l
更多的资料,请读:
:help /\%l
你可以对整个文件使用":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
你可以使用"yiw"(yank无空白符单词)命令或者"yaw"(yank含空白符单词)命令来 copy/yank当前单词.
更多的资料,请读:
:help 04.6 :help 04.8 :help iw :help yank :help text-objects :help objects
你可以定义一个详细的移动命令来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操作符跟一个移动命令.例如:
y)
在句子中,你可以使用'yi)'来yank这个句子.
更多的资料,请读:
:help yank :help (motion) :help object-motions :help 04.6
你可以使用":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<line of text goes here>
当然你也可以使用Y命令yank某行,然后使用如下的命令来插入这些行:
g/pattern/put!
更多的资料,请读:
:help :g :help :put :help insert :help 0
你可以使用":global"命令来操作包含特殊模式行的前一行:
:g/<pattern>/+{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
在插入模式下,你可以拷贝通过按下<Ctrl-Y>来拷贝光标上的字符到光标当前位置.而 拷贝下面的字符可以按<Ctrl-E>.
更多的资料,请读:
:help i CTRL-Y :help i CTRL-E
你可以使用":put"ex命令来插入空白行.例如, 尝试:
:put ='' :put! =''
更多的资料,请读:
:help :put
有几种方法可以在当前缓冲区中插入当前文件的文件名.在插入模式下,你可以使用 <C-R>%或者<C-R>=expand("%")命令.在正常模式下,你可以使用":put =@%"命令.
更多的资料,请读:
:help i CTRL-R :help expand() :help !!
在插入模式下,你可以使用<C-R><register>命令来插入寄存器的内容.例如,使用 <C-R>a来插入寄存器a中的内容到当前缓冲区中.
在正常模式下,你可以使用":put <register>"命令来插入<register>的内容.例如,使 用":put d"命令来插入寄存器"d"中的内容到当前缓冲区中.
更多的资料,请读:
:help i CTRL-R :help :put
你可以设置"virtualedit"选项来移动光标越过end-of-line,并在这个位置插入字符. 想启动虚拟模式,使用:
:set virtualedit=all
更多的资料,请读:
:help 'virtualedit'
这里有几种方法做这些.假如这个单词是行中的第一个单词,使用如下的命令:
:exe "s/".expand("<cword>")."/foo&bar."
为了匹配更加严格的单词,你可以使用更加复杂的置换命令:
:exe 's/\<'.expand("<cword>").'\%>'.(col(".")-1).'c\>/foo&bar/'
你也可以使用命令:
ciwfoo<C-R>"bar<Esc>
更多的资料,请读:
:help :substitute :help expand() :help col() :help /\%c
你可以使用"argdo"命令来对在参数中指定的文件执行置换命令:
:args * :argdo %s/<your_text>/<replacement_text>/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"命令中使用上一次的搜索模式.不需要重新指定:
:s/pattern/newtext/ :s//sometext/
在第二个":s"命令中,搜索模式并没有被详细指定过,但是第一个":s"命令中的搜索模 式会被使用到.
假如你想改变搜索模式,但是重复置换模式,你可以使用special right hand side,你 可以使用波浪符:
:s/newpattern/~/
更多的资料,请读:
:help :s :help :& :help :~ :help sub-replace-special
你可以在":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"选项来擦除上次插入模式中所键入的字符:
:set backspace=indent,eol,start
更多的资料,请读:
:help 'backspace' :help i backspacing
你可以使用":global"命令来搜索并合并这些行:
:g/+$/j
然后,上面的例子,只能用来合并两行.下面有两个更复杂的例子可以合并所有连续的 以"+"结尾的行:
:g/*$/,/\(^\|[^+]\)$/j :g/+$/mark a \ .,/\(^\|[^+]\)$/s/+$// | 'a,.j
更多的资料,请读:
:help :g :help :j :help :mark
你可以使用":put"命令来粘贴被yank的文本到新行中去:
:put =@"
更多的资料,请读:
:help :put :help quote =
你可以使用"~"命令拉来转变字符的大小写.
你可以使用"gUiw"或者"viwU"命令来改变光标下的单词为大写,也可以使用"guiw"或者 "viwu"来改为小写.
你可以使用"viw~"或者"g~iw"命令转换光标下单词的大小写(大写转成小写,或相反).
你也可以使用"gUgU"命令来转换当前行都为大写,也可以使用"gugu"把当前行都转换为 小写.
你可以使用"g~g~"来切换当前行的大小写状态.你可以使用"g~{motion}"或者使用 "{Visual}~"命令来切换一个文件块的大小写.
更多的资料,请读:
:help case
你可以通过按下CTRL-V然后跟上ASCII字符号来输入那些不在键盘上的ASCII字符.你也 可以使用digraphs来输入特殊的ASCII字符.
更多的字符,请读:
:help i CTRL-V digit :help digraphs :help 45.5
想置换一个不可显示字符,你首先要确定那个字符的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 <line1>,<line2>g/^\%<<line2>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
在插入模式下,你可以使用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-X CTRL-N和CTRL-X CTRL-P在刚补全的单词后继续补全单词.
更多的资料,请读:
:help i CTRL-X CTRL-P :help i CTRL-X CTRL-N :help ins-completion
你可以使用'gq'命令来格式化段落,他们将会根据当前的'textwidth'设置来格式化文 本.
记住gq操作符后该跟一个移动命令来操作一个范围内的文本.例如:
gqgq - 格式化当前行 gqqp - 格式化当前段落 gq3j - 格式当前行和接着的三行
更多的资料,请读:
:help gq :help formatting :help usr 25.txt :help motion.txt
你可以设置'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 :>
使用">"操作符时,使用的格数是由'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'
你可以使用'FileType'自动命令来设置'textwidth'选项:
autocmd FileType mail set tw=<your_value>
更多的资料,请读:
:help :autocmd :help FileType :help usr 43.txt
有.设置'textwidth'选项来做为一行长度的首选值.然后Vim将会自动的进行断行了. 例如:
:set textwidth=75
更多的资料,请读:
:help 'textwidth'
更多资料,请读:
:help 'textwidth' :help ins-textwidth :help 'formatoptions' :help fo-table :help formatting
当一个文件被载入Vim中,文件的格式是由以下的东西所决定:
假如所有的行都是以新行符(<NL>)结尾,那么这个文件格式就是'unix'.
假如所有的行以<CR><NL>结尾,那么这个文件格式就是'dos'.
假如所有的行都以<CR>结尾,那么这个文件格式就是'mac'.
假如这个文件有一些行以<CR>结尾,有一些行以<CR><NL>结尾,那么文件格式就为'unix'.
你可以通过设置'fileformat'选项,并保存文件,来改变当前文件的格式:
:set fileformat=dos :w
想显示当前文件的格式,使用:
:set fileformat?
上面的工作方式是由'fileformats'选项控制的.你可以尝试如下的命令:
:set fileformats+=unix :e <your_file> :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中关于缩进的设置略有不同造成的(例如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
你可以设置'display'选项为'lastline'来尽可能的显示窗口最后的行以代替显示'@'字符:
:set display=lastline
更多的字符,请读:
:help 'display'
你可以使用":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'
你可以使用可视模式中的块拷贝.使用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命令.在可视化 模式中选择了文本后,按下":"或跳入到命令行模式.Vim会自动插入可视区域'<','>'. 你可以对可视区域运行任何Ex命令.
更多的资料,请读:
:help v :: :help '< :help '>
所有的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
假如你通过设置'selectmode'选项来配置Vim,用选择模式代替可视模式,那么就会出现 这种情况.可以先检查这个值:
:set selectmode?
被人所熟知的选择模式非常类似于可视模式.当你使用"behave mswin"命令时,那么这个 选项就会被自动设置.选择模式看起来很像可视模式,而且在MS-Windows下也是非常类似 的.
更多的资料,请读:
:help Select-mode :help 'selectmode' :help 9.4 :help :behave
'selectmode'选项控制了,当用鼠标选取文本后,是否会启动选择模式.想在使用鼠标选 择文本后开启可视模式,可以从'selectmode'选项删除'mouse'值来实现这个功能:
:set selectmode-=mouse
记住默认的,'selectmode'选项会被设置为空,所以一般都是使用可视模式的.
跟多的资料,请读:
:help 'selectmode' :help Select-mode :help :behave
你可以使用'[和']标志来以可视模式选择上次拷贝/粘贴过的文本.'[标记着上次拷贝/ 粘贴文本的开头而']标记着结尾.想以可视模式来重选择文本,可以使用命令'[v'].
更多的资料,请读:
:help '[ :help '] :help 'a :help v
在命令行中,'%'字符会解释为当前文件的名字.在一些命令中,可能不得不使用 expand("%")来得到文件的名字:
"!perl%
更多的资料,请读:
:help : % :help cmdline-special :help expand()
你可以使用命令行窗口来编辑Vim命令行文本.在正常模式下,可以使用"q:"打开Vim的 命令行窗口.在命令行模式中,使用CTRL-F键.在这个窗口中,命令历史记录会被显示出 来.你可以使用正常的Vim键/命令来编辑任何以前/新的命令行.假如想执行一个命令, 可以按下enter/return键.
形似的,搜索历史可以用"g/"和"g?"命令来编辑.
更多的资料,请读:
:help cmdline-window
你可以使用Q命令来从Vi模式切换到Ex模式.想从Ex模式切换回Vi模式,可以使用:vi命 令.
更多的资料,请读:
:help Q :help gQ :help Ex-mode :help :vi
想拷贝一个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
你可以修改'wildmode'选项来配置Vim在命令行补全文件名的方式.在这里,你可以设置 'wildmode'选项为'list':
:set wildmode=list
更多的资料,请读:
:help 'wildmode'
在从缓冲区中yanking文本后,使用CTRL-R 0在命令行中粘贴文本,就可以从缓冲区中 拷贝文本到命令行中了.你也可以yank文本到一个指定的寄存器中然后使用CTRL-R <register>来粘贴文本到命令行中.你也可以使用CTRL-R CTRL-W来粘贴光标下的单词 到命令行中.
想从命令行中抽取文本拷贝到缓冲区中,你可以使用":p命令来粘贴:寄存器中的内容. 经常使用的命令行存储在:寄存器中.
另外一种方法可以实现这些功能的就是在普通模式下使用q:或在命令行模式下使用 CTRL-F来打开命令行窗口模式.在命令行窗口模式你可以使用所有的Vim命令来编辑命 令行.
更多的资料,请读:
:help c CTRL-R :help quote :: :help cmdline-window
想把一条命令放入到命令的历史记录中而不执行它,只用输入命令并按<Esc>来结束这 个命令即可.
更多的资料,请读:
:help c <Esc>
你可以通过修改'cmdheight'悬想来增加命令行的高度:
:set cmdheight=2
更多的资料,请读:
:help 'cmdheight' :help hit-enter :help 05.7
你可以删除$HOME/.viminfo或者$HOME/viminfo来去掉这些错误信息.
更多的资料,请读:
:help viminfo-errors :help viminfo-file-name :help viminfo :help 21.3
默认的,viminfo特性是被关闭的.假如viminfo特性被一个系统广泛支持的vimrc文件所 开启,那么你可以通过在你自己的.vimrc中设置'viminfo'选项为空串来关闭viminfo特 性:
:set viminfo=""
更多的资料,请读:
:help 'viminfo'
你可以使用viminfo文件来跨越多个Vim会话保存并恢复Vim标记.想使用viminfo文件, 首先必须得确定'viminfo'选项不为空.想保存并恢复Vim标记,那么'viminfo'选项不能 包含'f'标志位或者对于'f'选项的值必须得大于0.
更多的资料,请读:
:help 21.3 :help viminfo :help 'viminfo' :help :wviminfo :help :rviminfo
你可以使用如下的Vim远程服务函数来做这些:
$gvim --servername myVIM --remote-send "<-\><C-N>:wall<CR>"
更多的资料,请读:
:help client-server :help CTRL-\ CTRL-N :help :wall
你可以使用下面的命令来得到关于Vim远程服务函数的文档资料:
:help client-server
你可以使用":options"命令打开Vim选项窗口:
:options
这个窗口可以被用于查看和设置所有的选项.
更多的资料,请读:
:help :options
一些Vim选项有局部/全局值.局部值可以被用于一个指定的缓冲区/窗口.而全局值可以 被用于所有的缓冲区或窗口.
当一个Vim选项使用":set"命令来改变Vim选项的值时,全局值和局部值都被改变.你可 以使用":setlocal"变量来仅修改这个选项的局部值而":setglobal"命令仅修改这个选 项的全局值.
你可以使用":setlocal"命令来设置一个仅影响当前文件/缓冲区的选项:
:setlocal textwidth=70
记住并不是所有的选项都有一个局部值的.你可以使用":setlocal"命令来设置一个只 局部于某个缓冲区/窗口的选项,当然,前提是这个选项有局部值.
你也可以使用如下的命令来设置局部选项:
:let &l:{option-name} = <value>
更多的资料,请读:
:help :setlocal :help local-options
想在Vim选项的值中使用空格符,你可以使用转义空格符.例如:
:set tags=tags\ /usr/tags
更多的资料,请读:
:help option-backslash
你可以使用模式行来增加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'选项所开启的行号显示,所站的列宽度是靠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)"
你可以设置'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'
你可以设置'ruler'选项来在状态栏上显示当前的行号和列号:
:set ruler
更多的资料,请读:
:help 'ruler'
你可以设置'showmode'选项来显示当前Vim的模式.在插入,置换,和可视模式中,Vim会 显示当前模式在末行中:
:set showmode
更多的资料,请读:
:help 'showmode'
你可以设置'showcmd'选项来在状态栏上显示为完的/未决的命令:
:set showcmd
更多的资料,请读:
:help 'showcmd'
你可以设置'showcmd'来在状态行上显示为决的/部分的命令:
:set showcmd
更多的资料,请读:
:help 'showcmd'
你可以设置'statusline'选项来显示不同的值/设置在Vim的状态行上.
更多的资料,请读:
:help 'statusline' :help 'laststatus' :help 'rulerformat' :help 'ruler'
你可以设置'laststatus'选项为2来总是显示状态行:
:set laststatus=2
更多的资料,请读:
:help 'laststatus'
假如想通用的话,请增加你的设置到.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'命令显示'$'代替删除字符,可以增加$标志到'cpoptions'选项中去:
:set cpoptions+=$
更多的资料,请读:
:help 'cpoptions'
你可以通过按照它们在选项中出现的顺序,通过使用":set"命令来删除多个标志.例如, 你使用下面的命令来删除'formatoptions'选项里的't'和'n'标志:
:set formatoptions-=tn
't'和'n'标志将会从'formatoptions'选项中删除,仅当'formatoptions'选项包含这个 顺序的标志:'tn'.否则,它将不会删除这个标记.为了避免这个问题,你应该一个一个的 删除标志:
:set formatoptions-=t formatoptions-=n
更多的资料,请读:
:set :set-=
想知道一个键被映射为什么,可以使用如下的命令:
:map <key> :map! <key>
你也可以使用下面的命令来检查特殊模式下的映射,":cmap",":nmap",":vmap",":ima- p",":omap",之类.
更多的资料,请读:
:help map-listing :help map-overview
你可以使用下列命令来列出所有用户定义的键映射:
:map
更多的资料,请读:
:help map-listing
你可以使用":unmap"命令来解射一个前面被用于映射的键:
:unmap <key> :unmap! <key>
:nunmap/:vunmap/:ounmap/:iunmap/:lunmap/:cunmap
下列的命令在解射一个局部于缓冲区的映射会失败:
:unmap <key>
想解射一个局部于缓冲区的映射键,你必须使用<buffer>关键字在unmap命令中:
:unmap <buffer> <key> :unmap! <buffer> <key>
更多的资料,请读:
:help :unmap :help map-modes :help map-local :help 'mapleader'
首先确定这个键确实已经传送给了Vim.在插入没收下,按CTRL-V后,在敲入想要的键
首先确定小键盘上的键已经传给Vim了.接下来,你可以使用下面的命令来映射小键盘上 的键了:
:map <kSomething> <your_command>
<kSomething>可以是kHome,kEnd,kPageUp,kPageDown,kPlus,kMinus, kDivide,kMultiply,kEnter,etc.
更多的资料,请读:
:help key-code :help terminal-options
你可以建立指定模式下的映射(普通,命令,插入,可视,等等).想建立一个只工作在可视 模式下的映射,使用":vmap"命令:
:vmap <F3> <your mapping here>
更多的资料,请读:
:help :vmap :help map-modes :help 40.1
已存在的映射想冲突?
Vim使用键盘上的绝大多数的键.你可以使用<leader>作为映射中的前缀来定义键而不 会和Vim中使用的键想冲突.例如:
:map <leader>S <C-W>s :map <leader>j <C-W>j :map <leader>k <C-W>k
默认的<leader>会被替换成\,所有用户该敲入:
\s \j \k
来调用上面的映射命令.用户可以改变mapleader变量为任何他们想要的键:
:let mapleader = ","
当在写一个插件或别的脚本的时候,更多的,比较可取的方法是使用:noremap代替:map 来避免用户定义的映射所导致的边际效果.
更多的资料,请读:
:help <Leader> :help <LocalLeader> :help write-plugin
你可以使用":map"命令来映射Escape键为别的键.例如,下面的命令就是映射excape键为 CTRL-O:
:map <C-O> <Esc>
你可以在按下某个键时映射那个键为<Nop>来不执行操作.例如,在下面的命令中,<F7>按下后 不会执行任何操作:
:map <F7> <Nop> :map! <F7> <Nop>
更多的资料,请读:
:help <Nop> :help :map :help :map! :help map-modes
使用下面的映射:
:inoremap <S-Tab> <C-O><LT><LT> :nnoremap <Tab> >> :nnoremap <S-Tab> <LT><LT> :vnoremap <Tab> > :vnoremap <S-Tab> <LT>
记住,<S-Tab>映射只会在接受到正确的键序列才开始工作.这是GUI Vim中最需要注意的.
更多的资料,请读:
:help :inoremap :help :nnoremap :help :vnoremap :help <S-Tab> :help i CTRL-O :help >> :help << :help <LT>
检查'cpoptions'选项的值:
:set cpoptions?
假如这个选项中包含了'<'标志,那么特殊字符将不会被辨认.删除'cpoptions'选项中的'<' 标志:
:set cpo-=<
也可以,检查'compatible'选项的值:
:se compatiable?
这个'compatible'选项必须得重置:
:se nocompatible
更多的资料,请读:
:help 'cpoptions' :help 'compatible'
你可以在map中使用反斜杠转义'|'字符:
:map _l :!ls \| more<CR>
你也可以尝试下面的命令:
:map _l :!ls <bar> more<CR>
也有另外的方法完成这个功能.
更多资料,请读:
:help map bar
使用":noremap lhs rhs"代替使用":map lhs rhs".对于缩写,使用"noreabbrev lhs rhs". 这里的"nore"前缀阻止了映射或缩写再次被扩展.
更多的资料,请读:
:help :noremap :help :noreabbrev
首先你要确定你没有使用下面的命令来对这个键实行某种映射:
:map <key>
假如有定义某个键的影射,而这个映射的键超过一个字符,那么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 <F7> y:!exec "!perldoc '" . @" . "'"<CR>
假如你希望在可视模式下使用映射的命令工作,但是不一定和高亮的文本一起,你可以 使用如下的命令:
:vmap <F7> :<C-U>!perldoc <cword><CR>
Ctrl-I和<Tab>有同样的键码,所以Vim不能区分Ctrl-I和<Tab>键.当你映射Ctrl-I键时, <Tab>键也同样会被映射(反之亦然).同样的限制也适用于Ctrl-[和<Esc>键.
更多的资料,请读:
:help keycodes
你可以使用缩写来矫正那些拼写错误的单词.例如,下面的缩写被用来矫正"teh"为"the":
:abbreviate teh the
Vim支持插入模式,置换模式和命令行模式中的缩写.
更多的资料,请读:
:help 24.7 :help abbreviations :help Q_ab
你可以在文本中插入"<CR>"来建立映射多行的缩写:
iabbrev #c ------------------------<CR>-- Date:<CR>--<CR>----------
使用了上面的缩写后,当你敲入#c,下面的文本将会被插入:
-------------------------- -- Date:: -- -----------
更多的资料,请读:
:help abbreviations
想要去掉文本后的那个空格字符,你可以通过按下CTRL-]来扩展缩写来实现.那么缩写被扩展 时将不会加入多余的空格.
另外一种方法是使用下面的函数和命令:
function! Eatchar(pat)
let c = nr2char(getchar())
return (c =~ a:pat) ? '':c
endfunction
command! -nargs=+ Iabbr execute "iabbr" <q-args> . "<C-R>=Eatchar('\\s')<CR>"
现在,你可以使用新的"Iabbr"命令代替内置的"iabbrev"命令来定义缩写,扩展后的文本将不 会在尾部加入新的空格符.
更多的资料,请读:
:help abbreviations
你可以使用strftime()函数来插入当前的日期/时间戳到文件中去.例如,你可以使用下面的 缩写:
iabbrev dts <C-R>=strftime("%y/%m/%d/%H:%M")<CR>
使用了上面的缩写后,当你在插入模式中敲入dts,它将会被扩展为日期/时间戳.
一些别的形式跟日期有关的缩写列在下面了:
iabbrev mdyl <C-R>=strftime("%a %d %b %Y")<CR>
iabbrev mdys <C-R>=strftime("%y%m%d")<CR>
iabbrev mdyc <C-R>=strftime("%c")<CR>
iabbrev hml <C-R>=strftime("%d/%m/%y %H:%M:%S")<CR>
iabbrev hms <C-R>=strftime("%H:%M:%S")<CR>
更多的资料,请读:
:help strftime() :help i_CTRL-R
你可以输入了缩写词的部分内容后,按CTRL-V来阻止插入模式中的缩写被扩展开.
更多的资料,请读:
:help abbreviations
你可以使用'.'命令来重复上次的编辑操作.这个命令将会重复上次所做的较简单的改动 如插入,删除,改动,粘贴,等等.
更多的资料,请读:
:help 04.3 :help single-repeat :help Q_re
你可以在正常模式中使用'q'命令来记录一套键的序列,并把它存储在寄存器中.例如,在 普通模式下,你可以按q,后面再跟一个寄存器名(0-9a-bA-Z")来启动记录.想终止/停止记 录可以再按次q.你可以按@后跟寄存器名.e.g. @a 来重放/重复被记录的键序列.
另外一种方法是使用"-w"命令参数来启动Vim:
$vim -w <file_name>
Vim将会记录所有在指定文件"file_name"中的字符.你可以使用命令参数"-s"来使用指定 文件中的命令:
$vim -s <file_name>
更多的资料,请读:
:help 10.1 :help recording :help -w :help -s
被记录的键序列存储在寄存器中.你可以粘贴寄存器的文本到一个Vim的缓冲区中,编辑 这些文本,再拷贝这些文本到寄存器中.你也可以使用":let"命令来修改寄存器的内容. 例如:
:let @a = "iHello World\<Esc>"
更多的资料,请读:
:help recording :help 10.1 :help let-register :help <> :help 'cpoptions'
记录的键序列是被存储在寄存器中的.你可以先粘贴这些寄存器的内容到Vim缓冲区中.然 后你可以把缓冲区的内容保存到文件中去.你也可以修改这些文本,然后再把这些内容放入 到寄存器中以此来修改其中的内容.例如,你使用qa .... q来记录了一套键序列.记录的键 序列存储在寄存器'a'中.你可以使用"ap来粘贴寄存器'a'中的内容.
更多的资料,请读:
:help recording :help 10.1
寄存器0包含了最后一次拷贝操作所拷贝的文本.在你记录键序列时,当执行了拷贝操作后, 寄存器0的内容将会被拷贝的文本所覆盖.所以你记录在寄存器0中的键序列,都丢失了.你 可以考虑使用别的寄存器.
更多的资料,请读:
:help registers
你可以使用FileChangeRO自动命令事件,在只读文件被修改时执行一条命令.例如,你可以 使用这个事件来检查一个只读文件:
:autocmd FileChangeRO * call MyCheckoutFunction()
更多的资料,请读:
:help FileChangeRO
你可以使用BufEnter自动命令事件来在你每次进入一个缓冲区时自动执行某些命令.例如:
:autocmd BufEnter *.c set formatoptions=croqt
更多的资料,请读:
:help BufEnter
你可以使用WinEnter自动命令事件来在你每次进入一个窗口时自动执行某些命令.例如:
:autocmd WinEnter *.c call MyFunction()
更多的资料,请读:
:help WinEnter
你可以使用特殊的
你可以定义一个自动命令事件FocusLost,来在当Vim失去焦点时自动保存对缓冲区做做的 改动:
:autocmd FocusLost * wall
更多的资料,请读:
:help FocusLost :help :wall
你可以使用VimLeave自动命令事件来在Vim结束前执行/运行一个函数.例如:
:autocmd VimFLeave * call MyCleanupFunction()
更多的资料,请读:
:help VimLeave
默认的,Vim的语法高亮是被关闭的.想开启语法高亮,你可以使用下列命令:
:syntax enable or :syntax on
想关闭语法高亮,你可以使用下面的命令:
:syntax off
更多的资料,请读:
:help 06.1 :help 06.4 :help :syntax-enable :help :syntax-on :help :syn-clear
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
行号显示使用的是LineNr高亮组.想显示当前的颜色设置,使用:
:hi LineNr
想改变LineNr高亮组中的颜色.可以这样:
:hi linenr guifg=red guibg=black
在GVIM中,将会有红色的行号和黑色的底.
跟多的资料,请读:
:help :highlight
你可以修改'Visual'高亮组来修改可视模式中选择的文本块的颜色:
:highlight Visual guibg=red
更多的资料,请读:
:help :highlight :help hl-Visual
你可以修改"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文件中使用"colorscheme"命令来指定一种配色方案:
colorscheme evening
更多的资料,请读:
:help :colorscheme
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注释的语法高亮:
:highlight clear comment
更多的资料,请读:
:help c-syntax
你不应该增加自己的扩展到Vim自身所提供的语法文件中去.当你安装另个版本的Vim时, 你将会失去你所做的改动.解决的办法是,你应该在~/.vim/after/syntax目录中建立一个 于原语法文件同名的文件,然后加入你对这个文件的扩展.
更多的资料,请读:
:help mysyntaxfile-add :help 'runtimepath'
你可以在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 /.
你可以使用2html.vim脚本来转换一个源文件为一个带有Vim语法高亮的HTML文件.使用下 面的命令:
:runtime! syntax/2html.vim
更多的资料,请读:
:help convert-to-HTML
你可以使用":highlight"(没有参数)ex命令来列出所有当前高亮语法组的定义.
更多的资料,请读:
:help :highlight
你可以使用":scriptnames"命令来列出所有被Vim载入的脚本:
:scriptnames
更多的资料,请读:
:help :scriptnames
Vim有内置的调试器来调试Vim插件和脚本.使用调试器你可以设置断点并可以step through 插件函数.
更多的资料,请读:
:help debug-scripts :help -D
你可以使用":messages"命令来显示前个信息:
:messages
更多的资料,请读:
:help :messages :help :echoerr :help :echomsg :help message-history
Vim会保存并恢复那些以大写字母开头并不包含任何小写字母的全局变量.想这样工作, 那么必须在'viminfo'选项中包含'!'标志.Vim将会存储这些变量在viminfo文件中.
更多的资料,请读:
:help 'viminfo' :help viminfo-file :help variables
你可以使用":startinsert"命令来在一个Vim函数中启动插入模式.
更多的资料,请读:
:help :startinsert
你可以使用cursor()函数来定位光标的位置:
call cursor(lnum, col)
你也可以使用下面的命令来改动光标的位置:
exe "normal! " . lnum . "G" . col . "|"
更多的资料,请读:
:help cursor() :help bar
你可以在环境变量面前加个'$'字符来在Vim脚本/函数中使用它.你可以使用$env_var这 样的语法来引用它的值:
if $EDITOR == 'vi' endif
更多的资料,请读:
:help expr-env
你可以使用exists()函数来检查某个环境变量是否存在:
if exists("$MY_ENV_VAR")
endif
更多的资料,请读:
:help exists() :help expr-env
你可以使用":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
你可以在你的脚本中使用"normal!"命令来调用正常模式下的命令.这将会使用正常模式 中命令的标准函数而不会使用用户定义的映射.
更多的资料,请读:
:help :normal
你可以把当前可视模式中被选择的文本拷贝到寄存器中,然后在拷贝到变量中来实现这 功能:
:normal! gvy :let myvar = @"
上面的命令会拷贝可视模式中被选择的文本到变量"myvar"中.
你也可以使用下面的命令:
:normal! gv"*y
在上面的命令中,gv将会重选择上次可视模式中被选择的文本,接下来的命令将会拷贝文本 到*(剪贴版)寄存器中.当然,作为选择,你可以在'guioptions'选项中设置'a'标志来自动的 拷贝可视模式中选择的文本到*寄存器中.想把这些作为可视模式映射中的一部分,你可以使 用一个类似于下面的命令:
:vmap <F3> "*y:call ..
更多的资料,请读:
:help gv :help :normal :help let-@ :help quotestar :help clipboard :help registers
你可以使用'execute'命令来计算这个变量:
:execute '%s/mytext/' . myvar . '/'
更多的资料,请读:
:help :execute
你也可以在替换命令中使用"\="命令来计算变量:
:%s/mytext/\=myvar/
更多的资料,请读:
:help sub-replace-special
:execute "buffer " . bno
更多的资料,请读:
:help :execute
你可以给选项名加上'&'字符然后使用"let"命令分配这些选项的值给Vim的变量.例如,存 储'textwidth'选项的值到一个Vim变量"old_tw"中,可以按下面的命令使用:
:let old_tw=&tw
假如想实现相反的功能,可以设置'textwidth'选项的值为存储在'old_tw'变量中的值,你 可以使用下面的命令:
:let &tw = old_tw
更多的资料,请读:
:help expr-option :help let-option
你可以使用下面的命令来格式化要插入的文本:
:normal '[=']
更多的资料,请读:
:help '[ :help '] :help = :help :normal
你可以使用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()
你可以使用:t文件名修饰符来得到当前文件的basename:
:echo expand("%:t")
更多的资料,请读:
:help filename-modifiers
你可以使用下面的命令来来插入函数的返回值:
<C-R>=MyFunc()
记住,这只会插入函数的返回值.
更多的资料,请读:
:help i_CTRL-R :help i_CTRL-R_CTRL-R :help i_CTRL-R_CTRL-O :help expression
有几种方法可以从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'
你可以使用":execute"命令来在一些普通命令中使用特殊字符:
:execute "normal \<CR>" :execute "normal ixxx\<Esc>"
更多的资料,请读:
:help :execute :help expr-quote
你可以通过在下一行的开始处加上反斜杆来分隔长行.例如:
ab LIB_PATH -I"D:\dev-cpp\include" -L"D:\dev-cpp\lib"
\ -lglut32 -lopengl32 -lglu32 -lglew32
(译者注:原文中奇怪的没有给出例子,这是我的gvimrc中的例子)
更多的资料,请读:
:help line-continuation
":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
当你调用了一个函数或一个映射,所有被函数/映射所执行的操作都被只认为是一个操作. 当你按了'u'想撤消上次操作,那么所有被函数/映射所做的改动都被撤消.
更多的资料,请读:
:help undo-redo :help map-undo
以s:为前缀的Vim函数是被用于建立脚本的局部函数.这样的函数只能在脚本内部使用而 不能在别的脚本中使用.在一个脚本/插件中定义的函数,想让别的插件/脚本使用,那么不 要加入s:前缀.
更多的资料,请读:
:help script-variable :help script-local :help :scriptnames
不能.是不可能反向或撤消被载入脚本所执行的命令的.
更多的资料,请读:
:help :source
你可以建立文件文件类型插件来对不同类型的文件设置不同的选项.你可以使用下面的命 令来启动文件类型插件:
: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 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'
你可以重置'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的目录浏览插件,增加下列的行到你的.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
你可以开启基于文件类型的缩进,使用:
:filetype indent on
假如你只想开启自动c缩进,使用:
:set cindent
更多的资料,请读:
:help 'cindent' :help C-indenting :help filetype
你可以通过修改'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'
你可以使用[d命令来显示宏,而[i来显示变量的定义.
更多的资料,请读:
:help [d :help [i :help include-search :help 29.4 :help 29.5
你可以在代码块中使用'[{'命令来跳到代码块的开始处而用']}'跳到代码块的结束位置.
更多的资料,请读:
:help [{
:help ]}
:help various-motions
你可以改变'comments'选项的值来停止Vim自动的插入C++的注释符("//").例如:
:set comments=str:/*,mb:*,el:*/
更多的资料,请读:
:help 'comments' :help format-comments
首先,使用可视块选择模式(CTRL-V)来选择所有行的第一个字符.按'I'来开始在行首插入 字符.敲入注释字符,然后按<ESC>来退出插入模式.Vim就会自动的在所有被选择的行首插 入干才你所输入的字符了.
更多的资料,请读:
:help visual-block :help blockwise-operators :help v_b_I
你可以使用下面的命令来编辑一个与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'
想在敲入注释的时候自动的插入注释符,需要在'formatoptions'选项中加入'r'和'o'标 记:
:set formatoptions+=ro
你也可以增加'c'标记来使用'textwidth'选项的设置来自动的饶行注释,增加'q'标记来 使用'gq'命令来格式化注释:
:set formatoptions=croq
更多的注释,请读:
:help 30.6 :help format-comments :help 'comments' :help fo-table
你可以在Vim中使用":make"命令来建立程序.":make"命令将会使用'makeprg'选项来运行 程序.
更多的资料,请读:
:help 30.1 :help make_makeprg :help 'makeprg' :help 'makeprg' :help :make :help qucikfix
你可以使用":copen"或":cwindow"命令来打开quickfix窗口,这个窗口里会包含编译器的 输出.你可以在这个窗口中选择不同的错误行,然后就会跳到源码窗口所对应的行中.
更多的资料,请读:
:help :copen :help :cwindow :help quickfix
你可以使用'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
你可以设置'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'
你可以使用":mkview"命令来保存认为建立的折叠.然后,你可以使用":loadview"命令来 恢复折叠.想这样工作的话,必须得在'viewoptions'包含"folds".
更多的资料,请读:
:help 28.4 :help :mkview :help :loadview :help 'viewoptions' :help 'viewdir' :help :mksession :help 'sessionoptions'
现在的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
你可以使用专门的关键字<cword>来传递光标下的单词到某个外部程序中.例如:
:!dict <cword>
更多的资料,请读:
:help <cword>
你可以使用":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的的信息:
http://thingy.apana.org.au/~fun/slrn/
你可以使用$VIMRUNTIME/macros/less.sh shell脚本来把Vim作为pager来使用,在标准的 Vim发行版本中,这个都已经被加入了.这个shell脚本使用$VIMRUNTIME/macros/less.vim Vim脚本来提供
更多的资料,请读:
:help less
你可以使用在标准Vim发行版本中提供的man.vim插件来查看Unix的man文档.想使用这个 插件,增加下面的行到你的启动vimrc文件中:
runtime ftplugin/man.vim
你也可以按下K键来运行'keywordprg'选项所指定的程序,将会对光标下的单词起作用. 默认的,'keywordprg'是被设置为对光标下的关键字运行man.
更多的资料,请读:
:help man-plugin :help K :help 'keywordprg'
默认的,Vim diff是被'diff'命令所支持的.你可以通过修改'diffexpr'选项来改变它的 工作方式.
更多的资料,请读:
:help diff-diffexpr :help 'diffexpr'
你可以使用下面的命令行来对二个文件启动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
你可以修改'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
你可以使用"-geometry"命令行参数来指定GUI Vim窗口的位置.例如:
$gvim -geometry 80x25+100+300
更多的资料,请读:
:help 31.4 :help -geom
你可以通过修改'guioptions'选项来开启水平的滚动条:
:set guioptions+=b
更多的资料,请读:
:help 'guioptions' :help gui-horiz-scroll
你可以增加'l'标记到'guioptions'选项来使滚动条只在左边显示:
:set guioptions+=l :set guioptions-=r
更多的资料,请读:
:help 'guioptions' :help gui-scrollbars
你可以通过从'guioptions'选项中删除'm'标记来删除Vim菜单栏:
:set guioptions-=m
更多的资料,请读:
:help 'guioptions'
你可以使用'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
你可以设置'browsedir'选项的新值以改变":browse"命令所浏览的默认目录:
:set browsedir='<your_dir>'
更多的资料,请读:
:help 'browsedir'
如何把这种GUI对话框换成终端的对话框?
你可以在'guioptions'选项中设置'c'标记来配置Vim使用终端对话框以代替GUI对话框:
:set guioptions+=c
更多的资料,请读:
:help 'guioptions'
你可以用'-f'(前台)命令行选项来启动GUI Vim:
$gvim -f
默认的,GUI Vim会在启动Vim后,和程序失去连接.带有'-f'选项,GUI Vim将不会在启动时 于程序失去连接.
更多的资料,请读:
:help gui-fork :help -f
Vim仅支持固定宽度(mono-spaced)的字体.比例(矢量?)字体是不支持的.在"Select Font" 对话框中,只有等宽字体才被显示.
更多的资料,请读:
:help font-size :help 'guifont'
你可以在'mouse'选项中增加'c'标记以使可以在Vim命令行模式中使用鼠标:
:set mouse+=c
更多的资料,请读:
:help mouse-using :help gui-mouse :help 09.2
行为?
你可以映射鼠标中键为<Nop>来关闭鼠标中键的行为:
:map <MiddleMouse> <Nop> :map! <MiddleMouse> <Nop>
更多的资料,请读:
:help gui-mouse-mapping :help <Nop>
你可以使用"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
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
mswin.vim脚本把CTRL-Y映射为CTRL-R.mswin.vim脚本这样影射CTRL-Y是使Vim的行为更加 的类似于标准的MS-Windows程序.在":help CTRL-Y"中给出了解释.你可以选择在mswin.vim 中把映射CTRL-Y的那行注释掉,或者是选择你的.vimrc中删除掉载入mswin.vim脚本的语句.
你可以使用"simalt"命令来最大化Vim的窗口.你可以使用GUIEnter自动命令来在Vim启动 时最大化Vim窗口:
autocmd GUIEnter * simalt ~x
更多的资料,请读:
:help :simalt :help GUIEnter :help gui-win32-maximized
最可能的情况是,你在Vim中使用了鼠标滚轮来滚动文本.在Vim中使用智能(intellimouse) 鼠不安全,这个问题是众所周知的.想避免这个问题,可以关闭Vim所支持的Universal scrolling.
更多的资料,请读:
:help intellimouse-wheel-problems
你可能的原因是因为你在显示属性中开启了'Smooth edges of screen fonts'.尝试关闭 它,或者修改圆滑方法为"Standard".
你可以使用下面的跟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中使用GNU diff的问题.你可以尝试使用由Ron Aaron开发的GNU diff.exe 从下面的网址中可以获得,他所写的diff.exe:
http://www.mossbayeng.com/~ron/vim/builds.html
你可以使用"cubiclevim" COM Add-In来把Vim作为MS-Windows outlook邮件客户端的编 辑器.查看下面的URL来得到更多的相关信息:
http://sourceforge.net/projects/cubiclevim
记住,现在这个只能工作在2000和XP的MS-Office 中.
你可以使用下面的命令:
:!start c:\progra~1\intern~1\iexplore.exe file://%:p<CR>
你可以下面并使用OLE版本的Vim(例如:gvim61ole.zip).这个文件包含了教你如何在VS中 使用Vim的指示.
更多的资料,请读:
:help MSVisualStudio
你该把_vimrc和_gvimrc文件放到由VIM环境变量所指向目录中.假如你和别人共享系统, 那么你可以把文件放入到某个目录中,并设置HOME变量到这个目录中.
更多的资料,请读:
:help $HOME-use :help _vimrc
假如你在每次保存文件时,得到的警告信息跟下面一样:
WARNING: The file has been changed since reading it!!! Do you really want to write to it (y/n)?
那么,这个是在保存时间时,和MS-Windows有关的一个BUG.Vim会在每次对文件做了修改 后,会记住这个文件的时间戳.
你可以设置'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
在一个Unix系统中,想从源码中编译并建立Vim需要遵循下面的步骤:
从下面的站点中下载源码和run-time文件归档包(vim-##.tar.bz2):
使用bzip2和tar工具包,释放归档文件,用下面的命令:
:bunzip2 -c <filename> | tar -xf -
想开启/关闭不同的Vim特性,需要在运行'make'命令前,使用不同的标志包含/不包含某 些Vim的特性,然后把这些标志和'configure'命令合用.想列出'configure'命令,所使用 的选项,使用:
$ configure -help
更多的资料,请读:
:help install
想安装Vim不在默认的安装路径中,你可以在运行configure脚本时使用--prefix选项来 指定要安装的目录:
$ ./configure --prefix=/users/xyz
你也可以开启/关闭不同的Vim特性,只用在configure脚本中假如不同的参数.更多的关于 这些选项的信息,运行:
$ ./configure --help
更多的资料,请读:
:help install-home :help install
在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帮助文件,语法文件,缩进文件和别的runtime file都是Vim runtime包的一部分.你 需要下载并安装Vim runtime包.例如,对于MS-Windows,Vim 6.1 runtime包的名字是 vim61rt.zip.
更多的资料,请读:
:help install
不,一旦你建立并安装了Vim在某个目录中,不是指Vim的源码目录(例如,/usr/bin或者 /usr/local/bin),那么你就可以删除源码所在的目录了.
你可以使用":version"命令来确定Vim的特性是否在compile time时被开启.这项特性 被开启,会有前缀"+".假如没有被开启,会有"-"前缀.
假如你想在某个脚本中测试某个特性,你可以使用has()函数:
if has("menu")
" Set up some menus
endif
更多的资料,请读:
:help :version :help +feature-list :help has()
能.你可通过选项开启/关闭很多包含在GUI里面的特性,来建立Vim.
更多的资料,请读:
:help install
你会得到这个错误是因为你在建立过程中没有定位termlib,termcap或者ncurses库. 你需要安装ncurses-dev包来解决这个问题.
你可以设置下面的选项来在Vim中编辑二进制文件:
:set binary :set display=uhex
你也可以使用"-b"命令行选项来编辑一个二进制文件:
$ vim -b <binary_file_name>
你也可以使用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
你可以使用'ga'命令来显示光标所在字符的ascii值.
更多的资料,请读:
:help ga :help :ascii
你在Vim命令中,不能使用0作为记数,因为0本身有也是个命令,它会移动到行首.
更多的资料,请读:
:help 0 :help count
你可以关闭Vim的欢迎屏幕,通过在'shortmess'选项中增加'I'标记:
:set shortmess+=I
更多的资料,请读:
:help :intro :help 'shortmess'
假如一些信息在屏幕上,而且屏幕将被重画,那么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来对一组文件执行一组命令.你可以使用一系列"-c" 选项来指定一组命令:
$vim -c "<ex_command_1>" -c "<ex_command_2>" *.txt
在"-c"命令行选项后面所指定的ex-command将会按顺序一个个执行.你也可以使用"-c" 命令行选项,并使用"|"字符来分隔ex命令:
$vim -c "<ex_command_1> | <ex_command_2>" *.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键,后面跟任意多个普通命令,然后按<Esc>来重新 返回到插入模式.
更多的资料,请读:
:help i_CTRL-O :help i_CTRL-L
你可以使用":startinsert"的ex命令来以插入模式启动Vim:
$vim +startinsert myfile.txt
上面的命令将会打开文件"myfile.txt"并进入插入模式,而光标会定位在第一行的第一个 字符.想打开文件的时候,自动定位在最后行的最后的字符上,你可以使用下面的命令:
$vim +startinsert! myfile.txt
更多的资料,请读:
:help :startinsert