什么是人鱼线无插件Vim技巧-呼叫地瓜
无插件Vim技巧-呼叫地瓜
http://justcoding.iteye.com/blog/2304779无插件Vim编程技巧博客分类:
Ubuntu / Mac / Github / Aptana / Nginx / Shell / Linux
相信大家看过《简明Vim教程》也玩了《Vim大冒险》 的游戏了,相信大家对Vim都有一个好的入门了。我在这里把我日常用Vim编程的一些技巧列出来给大家看看,希望对大家有用,另外,也是一个抛砖引玉的过 程,也希望大家把你们的技巧跟贴一下,我会更新到这篇文章中。另外,这篇文章里的这些技巧全都是vim原生态的,不需要你安装什么插件。我的Vim的版本是7.2。浏览代码
首先,我们先从浏览代码开始。有时候,我们需要看多个文件,所以,传统的做法是,我们开多个tty终端,每个tty里用Vim打开一个文件,然后来回切换。这很没有什么效率。我们希望在一个Vim里打开多个文件,甚至浏览程序目录。
浏览目录的命令很简单:(你也可以直接vim一个目录)
:E
注意,是大写。于是,你会看到下面这样的界面:
无插件Vim编程技巧
这个界面中,你可以用 j, k 键上下移动,然后回车,进入一个目录,或是找开一个文件。你可以看到上面有一堆命令:
【 – 】 到上级目录
【D】删除文件(大写)
【R】改文件名(大写)
【s】对文件排序(小写)
【x】执行文件
当然,打开的文件会把现有已打开的文件给冲掉——也就是说你只看到了一个文件。
如果你要改变当前浏览的目录,或是查看当前浏览的目录,你可以使用和shell一样的命令:
:cd <dir> – 改变当前目录
:pwd – 查看当前目录缓冲区
其实,你用:E 浏览打开的文件都没有被关闭,这些文件都在缓冲区中。你可以用下面的命令来查看缓冲区:
:ls
于是,在你的Vim下,你会看到如下界面:
无插件Vim编程技巧
你 可以看到Vim打开了四个文件,编号是4,5,6,7,如果你要切换打开的文件,这个时候,你不要按回车(按了也没事,只不过按了就看不到:ls 输出的buffer列表了),你可以使用下面的命令切换文件(buffer后面的4表示切到4号文件也就是src/http/ngx_http.c):
:buffer 4
或是:
:buffer src/http/ngx_http.c
注意,
你可以像在Shell中输入命令按Tab键补全一样补全Vim的命令。
也可以用像gdb一样用最前面的几个字符,只要没有冲突。如:buff
你还可以动用如下命令,快速切换:
:bnext缩写 :bn:bprevious 缩写 :bp:blast 缩写 :bl:bfirst缩写 :bf
上图中,我们还可以看到5有一个%a,这表示当前文件,相关的标记如下:
– (非活动的缓冲区)a (当前被激活缓冲区)h (隐藏的缓冲区)% (当前的缓冲区)# (交换缓冲区)= (只读缓冲区)+ (已经更改的缓冲区)窗口分屏浏览
相信你在《Vim的窗口分屏》一文中,你已经知道了怎么拆分窗口了。其实,我更多的不是用拆分窗口的命令,而是用浏览文件的命令来分隔窗口。如:
把当前窗口上下分屏姜超老婆,并在下面进行目录浏览:
:He 全称为 :Hexplore (在下边分屏浏览目录)
如果你要在上面,你就在 :He后面加个 !,
:He! (在上分屏浏览目录)
如果你要左右分屏的话,你可以这样:
:Ve 全称为 :Vexplore (在左边分屏间浏览目录,要在右边则是 :Ve!)
下图是分别用:He 和 :Ve搞出来的同时看三个文件:
无插件Vim编程技巧
在分屏间的跳转和切换在《Vim的窗口分屏》一文中提过了:先按Ctrl + W,然后按方向键:h j k l分屏同步移动
要让两个分屏中的文件同步移动,很简单,你需要到需要同步移动的两个屏中都输入如下命令(相当于使用“铁锁连环”):
:set scb
如果你需要解开,那么就输入下面的命令:
:set scb!
注:set scb 是set scrollbind 的简写。Tab页浏览目录
分屏可能会让你不爽,你可能更喜欢像Chrome这样的分页式的浏览,那么你可以用下面的命令:
:Te 全称是 :Texplorer
下图中,你可以看到我用Te命令打开了三页,就在顶端我们可以可以看到有三页,其中第一页Tab上的数字3表示那一页有3个文件。
无插件Vim编程技巧
我们要在多个Tabe页中切换,在normal模式下,你可以使用下面三个按键(注意没有冒号):
gt – 到下一个页
gT – 到前一个页
{i} gt – i是数字,到指定页,比如:5 gt 就是到第5页
你可以以使用 【:tabm {n}】来切换Tab页。
gvim应该是:Ctrl+PgDn 和 Ctrl+PgUp 来在各个页中切换。
如果你想看看你现在打开的窗口和Tab的情况,你可以使用下面的命令:
:tabs
于是你可以看到:
无插件Vim编程技巧
使用如下命令可以关闭tab:(当然,我更喜欢使用传统的:q, :wq来关闭)
:tabclose [i]– 如果后面指定了数字沸多里达克 ,那就关闭指定页,如果没有就关闭当前页
最后提一下,如果你在Shell命令行下,你可以使用 vim 的 -p 参数来用Tab页的方式打开多个文件,比如:
vim -p cool.cpp shell.cpp haoel.cppvim -p *.cpp
注:如果你想把buffer中的文件全转成tab的话,你可以使用下面的命令
:bufdo tab split保存会话
如果你用Tab或Window打开了好些文件的文件,还设置了各种滚屏同步,或是行号……,那么,你可以用下面的命令来保存会话:(你有兴趣你可以看看你的 mysession.vim文件内容,也就是一个批处理文件)
:mksession ~/.mysession.vim
如果文件重复,vim默认会报错,如果你想强行写入的话,你可以在mksession后加! :
:mksession! ~/.mysession.vim
于是下次,你可以这样打开这个会话:
vim -S ~/.mysession.vim
保存完会话后,你也没有必要一个一个Tab/Windows的去Close雷迪菜菜族。你可以简单地使用:
:qa – 退出全部
:wqa -保存全部并退出全部Quickfix
假如我们有一个hello.cpp文件和一个makefile,于是我们可以直接在vim下输入 :make , 于是就可以make这个hello.cpp文件,如果出错了,我们需要按回车返回,这个时候,我们可以使用下面的命令来把出错显到在vim的分屏中:
:cw
于是,就会出现下面右边的那个样子:(是不是看上去和我一样很帅?)
无插件Vim编程技巧
上图中左边是我的makefile,右边是我的错误百出的源代码,右边下面是quickfix窗屏。你可以看到quickfix窗屏指向的第一个错误已经定位到我们相就错误的文件行上了。
你可以使用像浏览文件那样用j, k在quckfix窗屏中上下移动到相应的错误上然后按回车,然后就可以在上面的窗屏里定位到相应的源文件的代码行。但是,如果是这样的话, 你要定位下一条错误还得用Ctrl +W 回到quickfix屏中来然后重复来过。
你可以使用下面的命令而不用回到quickfix中来:
:cp 跳到上一个错误
:cn 跳到下一个错误
:cl 列出所有错误
:cc 显示错误详细信息
下面我们来看另一个quickfix的功能。
如果你用过vim的cscope插件,你就知道cscope可以用来查找相当的代码,但cscope需要事先生成一个数据库,对一些简单的查找,其实,我们用vim的grep命令就可以了,不需要专门为之生成数据库。vim的grep命令和shell的几乎一样。
我们来看个例子:
比如我们正在浏览nginx的代码,这时,我想看看哪里用到了nginx的NGX_HTTP_VAR_INDEXED宏。于是,我可以在vim里输入如下的命令:
:grep -r –include=”*.[ch]”NGX_HTTP_VAR_INDEXED src/
上 面这个命令意思是递归查询src目录下所有的.c和.h文件,其中包括NGX_HTTP_VAR_INDEXED宏。然后,你就会看到vim到 shell里去执行并找到了相关的文件,按回车返回vim后,别忘了用 【:cw 】把grep的输出取回来,于是我们就有下面的样子:
无插件Vim编程技巧
然后同上面一样,你可以用 j,k 键移动quickfix里的光标到相应的行,然后按回车定位文件,或是使用【:cn】或【:cp】来移动到定位。(这样,你会把多个文件打开到缓冲区,别忘了【:ls】来查看缓冲区)
你看,到这里,一个小小的IDE就这样产生了,而且,最帅的时,我们连一点插件都没有装,也没有在.vimrc文件中配置过什么。关键字补全
我们还是坚持不用任何插件。我们来看看是怎么个自动补全的。
在insert模式下,我们可以按如下快捷键:
【Ctrl +N】 – 当你按下这它时,你会发现Vim就开始搜索你这个目录下的代码,搜索完成了就会出现一个下拉列表(居然是粉紫色的,真是丑死了)
下图是我输入了ngx_http_然后按ctrl+n出现的样子,它已经帮我补全了一个,但是我不想要这个。什么是人鱼线然后,在Vim的下方我们可以看到状态变成了“关键字补全”,然后后面有^N^P的提示,意思就是告诉你还有一个Ctrl+P.
无插件Vim编程技巧
【Ctrl + P】 – 接下来你可以按这个键,于是回到原点,然后你可以按上下光标键来选择相应的Word。
对于上面那个例子,我们按下了Ctrl+P后出现下面的这个样子。我们可以看到,光标回到了一开始我输入的位置,然后你可以干两件事,一个是继续输入(这可以帮助过滤关键词),另一个是用“光标键”上移或下移来选择下拉列表中的关键字,选好后回车,就补全了。
无插件Vim编程技巧
与此类似的,还有更多的补齐,都在Ctrl +X下面:
Ctrl + X 和 Ctrl + D 宏定义补齐
Ctrl + X 和 Ctrl + ] 是Tag 补齐
Ctrl + X 和 Ctrl + F 是文件名 补齐
Ctrl + X 和 Ctrl + I 也是关键词补齐,但是关键后会有个文件名,告诉你这个关键词在哪个文件中
Ctrl + X 和 Ctrl +V 是表达式补齐
Ctrl + X 和 Ctrl +L 这可以对整个行补齐,变态吧。其它技巧字符相关
【guu 】 – 把一行的文字变成全小写。或是【Vu】
【gUU】 – 把一行的文件变成全大写吴艳樱。或是【VU】
按【v】键进入选择模式,然后移动光标选择你要的文本,按【u】转小写蔡小豆,按【U】转大写
【ga】 – 查看光标处字符的ascii码
【g8】 – 查看光标处字符的utf-8编码
【gf】 – 打开光标处所指的文件 (这个命令在打到#include头文件时挺好用的,当然,仅限于有路径的)
【*】或【#】在当前文件中搜索当前光标的单词缩进相关
【>>】向右给它进当前行 【<<】向左缩进当前行
【=】 – 缩进当前行 (和上面不一样的是,它会对齐缩进)
【=%】 – 把光标位置移到语句块的括号上,然后按=%,缩进整个语句块(%是括号匹配)
【G=gg】 或是 【gg=G】 – 缩进整个文件(G是到文件结尾,gg是到文件开头)复制粘贴相关
按【v】 键进入选择模式,然后按h,j,k,l移动光标,选择文本,然后按 【y】 进行复制,按 【p】 进行粘贴。
【dd】剪切一行(前面加个数字可以剪切n行),【p】粘贴
【yy】复制一行(前面加个数字可以复制n行),【p】粘贴光标移动相关
【Ctrl + O】向后回退你的光标移动
【Ctrl + I 】向前追赶你的光标移动
这两个快捷键很有用,可以在Tab页和Windows中向前和向后trace你的光标键,这也方便你跳转光标。读取Shell命令相关
【:r!date】 插入日期
上面这个命令,:r 是:read的缩写,!是表明要运行一个shell命令,意思是我要把shell命令的输出读到vim里来。vim的终级插件
CentOS下:yum erase emacs
Ubuntu下:apt-get remove emacs
对了,以前本站也有一篇小短文《如何在vim中得到你最喜爱的IDE特性》你也可以看看。用Vim编程——配置与技巧博客分类:
Ubuntu / Mac / Github / Aptana / Nginx / Shell / Linux
本文介绍如何用强大的文本编辑器Vim编程。只要配置得当,效果堪比一个IDE。配置
基本配置:
C代码
"开启语法高亮
syntaxon
"依文件类型设置自动缩进
filetypeindentpluginon
"显示当前的行号列号:
setruler
"在状态栏显示正在输入的命令
setshowcmd
"关闭/打开配对括号高亮
"NoMatchParen
DoMatchParen
行号的显示与隐藏:
C代码
"显示行号:
setnumber
"为方便复制,用<F2>开启/关闭行号显示:
nnoremap<F2>:setnonumber!<CR>:setfoldcolumn=0<CR>
启用Modeline(即允许被编辑的文件以注释的形式设置Vim选项,详见Vim Wiki: Modeline magic):
C代码
setmodeline
如果终端使用的是深色背景:
C代码
"为深色背景调整配色
setbackground=dark插件管理
下文的配置很多都依赖于第三方开发的 Vim 插件。为了方便地安装和维护这些插件,推荐先安装一种插件管理工具,目前较为流行的是Vundle和pathogen。二者功能类似,但 Vundle 的配置更灵活, pathogen 则相对简洁。二者都能很好地与Git结合,安装插件十分方便。
如果你使用 Git 管理你的配置文件,那么还可以将 Pathogen 或 Vundle 与 Git 的 Submodule 功能管理插件结合,使得在多台电脑间同步插件及在本地更新插件变得十分便捷。
C代码
#在存放配置文件的主文件夹下,添加一个submodule
gitsubmoduleaddhttps://github.com/gmarik/vundle.git.vim/bundle/vundle
#用类似的办法添加多个插件后,以后升级插件只需:
gitsubmoduleupdate
#如果其它电脑checkout出配置文件后,要先:
gitsubmoduleinit
插件管理工具无需通过系统的包管理系统安装,只要将需要的文件放在~/.vim/目录中即可。这样,一套配置文件也可以方便地用在多个不同的系统环境中。代码补全
Vim 7已经内置了代码补全功能[6],补全操作可分为两种:
关键字补全
即简单地补全到文档中已有的词,快捷键为Ctrl-N或Ctrl-P。
智能补全
Vim 7中引入 Omni Complete,可根据语义补全,快捷键为Ctrl-X Ctrl-O。
Vim的补全菜单操作方式与一般IDE的方式不同,可加入如下设置:
C代码
"让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
setcompleteopt+=longest
"离开插入模式后自动关闭预览窗口
autocmdInsertLeave*ifpumvisible()==0|pclose|endif
"回车即选中当前项
inoremap<expr><CR>pumvisible()?"<C-y>":"<CR>"
"上下左右键的行为
inoremap<expr><Down>pumvisible()?"<C-n>":"<Down>"
inoremap<expr><Up>pumvisible()?"<C-p>":"<Up>"
inoremap<expr><PageDown>pumvisible()?"<PageDown><C-p><C-n>":"<PageDown>"
inoremap<expr><PageUp>pumvisible()?"<PageUp><C-p><C-n>":"<PageUp>"
如需自动补全多田熏,可安装AutoComplPop插件,安装后如需在补全是显示文档(预览),可加入设置:
C代码
letg:acp_completeoptPreview=1注释管理
经常要将一段代码注释掉或取消注释,而尤其对于某些只支持单行注释的语言来说,逐行加注释很麻烦,这时快速注释(或取消注释)代码的插件就显得很有用了。
常见的注释管理插件为The NERD Commenter,默认支持多种语言,使用方法也很简单:只需在可视(V)模式中选择一段代码,按下cc加逐行注释,cu取消注释,cm添加块注释。
如有其它需求,也可考虑comments、EnhCommentify等插件。缩进
使用自动缩进可能需要设置,vim中对自动缩进的详细设置办法见Vim代码缩进设置。
在不同的模式中调整缩进的方法不同:
插入模式
Ctrl-T增加缩进,Ctrl-D减小缩进。
命令模式
>>右缩进,<<左缩进,注意n<<或n>>是缩进多行,如4>>
可视模式
<、>用于左右缩进,n<、n>可做多节缩进,如2>。
另外,=可对选中的部分进行自动缩进;]p可以实现p的粘贴功能,并自动缩进。储世新代码浏览与跳转
代码跳转类似于IDE中的Ctrl+点击功能。与代码补全类似,代码浏览工具亦可分为基于文本分析的和基于代码理解的两类。简单代码跳转
在命令模式下可直接使用下述指令:
跳转到定义
gd到局部变量的定义,gD到全局变量的定义
搜索
*,#可对光标处的词向前/向后做全词搜索,g*,g#做相对应的非全词匹配搜索
代码块首尾
[[,]]可跳到当前代码块起始或结束的大括号处。
括号首尾
%可在配对的括号、块首尾之前跳转。
位置历史
Ctrl-O在历史记录中后台,Ctrl-I则为前进。基于代码理解的跳转
该功能依赖于ctags工具。[9]安装好ctags后,在存放代码的文件夹运行
ctags -R .
即可生成一个描述代码结构的tags文件。
提示:ctags的功能很强大,更详细的配置请参考其文档。
建议在~/.vimrc中添加如下配置以使Vim在父目录中寻找tags文件:
set tags=tags;/
设置好后,可在Vim中使用如下功能:Ctrl-]转至最佳匹配的相应Tag,Ctrl-T返回上一个匹配。如果有多个匹配,g Ctrl-]可显示所有备选的tags。如有需要,可互换Ctrl-]和g Ctrl-]:
"在普通和可视模式中,将<c-]>与g<c-]>互换nnoremap <c-]> g<c-]>vnoremap <c-]> g<c-]> nnoremap g<c-]> <c-]>vnoremap g<c-]> <c-]>就地编译和错误处理
使用:make可调用make命令编译程序,配合Vim内置的QuickFix功能,可以像IDE一样打开一个窗口展示编译错误和警告,通过它还可以方便地跳转到各编译错误的产生位置。
常用的命令有:cw[indow](如有错误打开quickfix窗口)、:cn(跳到下一个错误)、:cp(跳到前一个错误)等,具体可:help quickfix赵丹军。
如果想在有错时自动打开quickfix窗口:
" 编译后,如有错误则打开quickfix窗口。(光标仍停留在源码窗口)"" 注意:需要开启netsting autocmdautocmd QuickFixCmdPost [^l]* nested cwindowautocmd QuickFixCmdPost l* nested lwindow
默认情况下,:mak[e]会跳转到第一个错误,如果不想启用这个功能,请使用:make!。代码折叠
代码较长时可启用代码折叠功能,如按语法高亮元素折叠:
set foldmethod=syntax"默认情况下不折叠set foldlevel=99
随后即可使用z系列命令管理代码折叠。如za会翻转当前位置的折叠状态,zA会递归翻转当前层所有代码的折叠状态等。当然也可以把功能键映射到za:
map <F3> za查看文档
K键可用于查看当前函数的文档林达信。其它插件
近来仍被积极维护的代码托管在 GitHub 上的插件:
Fugitive
让 Vim 更好地与Git整合。
Powerline
炫丽实用的状态栏
Tagbar
比taglist更现代的代码结构浏览工具
The NERD tree
以树形结构浏览文件夹中的文件
Syntastic
语法检查
surround.vim
快速删除/修改光标周围配对的括号
其它常用插件[14]:
Project
方便管理工程中的文件
snipmate.vim
在编辑中实现模板展开
a.vim
在.cpp/.h等文件对中跳转
matchit.zip
增强%的功能
winmanager
将文件管理窗口和taglist堆叠起来。相关文档
配置基于Vim的Python编程环境
让vim自动判断中文编码参考资料
↑How to setup VIM properly for editing Python files - *.py (StackOverflow)
↑amix的vimrc
↑Python and vim: Make your own IDE (2009.2)
↑Python官网上的Vim介绍
↑Git Tools - Submodules
↑细说 Vim 7 之新特性-LinuxToy
↑VimTip 1228: Improve completion popup menu
↑Vim文档
↑Browsing programs with tags -- Vim Tips Wiki
↑Vim and Ctags tips and tricks
↑use :tjump instead of :tag vim on pressing ctrl-] (StackOverflow)
↑Automatically open the quickfix window on :make
↑LinuxTOY Xu Xiaodong 的VimEnv
↑手把手教你把Vim改装成一个IDE编程环境(图文)常用命令
对于入门vim基本命令可以参考简明 Vim 练级攻略,以下是本人关于移动光标、插入/修改、删除、复制、粘帖、撤销和恢复等常用命令
移动光标
对于在行内移动,通过使用f/F + 字符来移动到特定的字符,然后再使用.来重复执行命令;f表示向前移动,F表示向后移动。如果想直接移动到行首或行尾,使用^或$
对于在多行移动,就有多种选择:第一种是通过gg,G,行数 + G指定行数来移动,gg表示移动文件的第一行,G表示移动文件的最后一行,行数 + G表示移动到特定的行。第二种就是通过正则搜索的方式来移动,/string表示正向查找,?string表示反向查找,n查找下一个匹配的结果,N表示上一个匹配的结果,按up/down可以浏览搜索历史论他妈的 。第三种就是使用标记来移动,m + {a-z}标记位置(适用于单个文件,如果是多个文件,使用大写字母{A-Z}),`{mark}移动到标记位置的列,'{mark}移动到标记位置的行首,还有一些特殊的标记,'表示跳转前光标的位置
选择文本v不规则选择V按行选择Ctrl + V按列选择
插入/修改i在当前字符前面插入I在行首插入a在当前字符后面插入A在行尾插入o在当前行的下一行插入O在当前行的上一行插入r更改当前的字符R更改多个字符cw/caw更改单词cf + 字符更改从当前字符到指定字符c$更改从当前字符到行尾cc更改整行
删除x删除字符df + 字符删除从当前字符到指定字符dw/daw删除单词d$删除从当前光标到行尾dd删除一行
剪切与粘帖dd + pdelete一行,然后放在当前光标下方dd + Pdelete一行,然后放在当前光标上方dw + pdelete单词赵青楚,然后放在当前光标后面dw + Pdelete单词,然后放在当前光标前面p/P可接受计数前缀,重复粘贴
复制yw复制单词yf复制从当前字符到指定字符y$复制当前光标到行尾yy复制整行
撤销和恢复u撤销ctrl + r重做
重复操作数字+action表示执行某个操作多少次.重复上一个操作
宏录制q + 寄存器(a-z)开始录制录制动作q停止录制@ + 寄存器 / @@replay被录制的宏扩展阅读
Vim配置从零搭建和配置OSX开发环境将你的Vim 打造成轻巧强大的IDE
Vim插件vim中的杀手级插件: vundle谁说Vim不是IDE?(三)vim中的杀手级插件: YouCompleteMe
Vim入门和使用技巧简明 Vim 练级攻略vim配置文件
vim配置主要有以下优点:
1.按F5可以直接编译并执行C、C++、java代码以及执行shell脚本,按“F8”可进行C、C++代码的调试
2.自动插入文件头 ,新建C、C++源文件时自动插入表头:包括文件名、作者、联系方式、建立时间等,读者可根据需求自行更改
3.映射“Ctrl + A”为全选并复制快捷键,方便复制代码
4.按“F2”可以直接消除代码中的空行
5.“F3”可列出当前目录文件,打开树状文件目录
6. 支持鼠标选择、方向键移动
7. 代码高亮,自动缩进,显示行号,显示状态行
8.按“Ctrl + P”可自动补全
9.[]、{}、()、""、' '等都自动补全
10.其他功能读者可以研究以下文件
vim本来就是很强大,很方便的编辑器,加上我的代码后肯定会如虎添翼,或许读者使用其他编程语言,可以根据自己的需要进行修改,配置文件里面已经加上注释。
读者感兴趣的话直接复制下面的代码到文本文件,然后把文件改名为“ .vimrc” (不要忘记前面的“.”)小镇飞花,然后把文件放到用户文件夹的根目录下面即可。重新打开vim即可看到效果。
为方便管理,源码托管到了github,后期增加了好多新功能,
具体详见:https://github.com/ma6174/vim
这是在github上的vim配置的截图:
下面是精简的,没有插件的vim配置文件,保存到自己的.vimrc文件就能使用。
C代码
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"显示相关
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"setshortmess=atI"启动的时候不显示那个援助乌干达儿童的提示
"winpos55"设定窗口位置
"setlines=40columns=155"设定窗口大小
"setnu"显示行号
setgo="不要图形按钮
"colorasmanian2"设置背景主题
setguifont=Courier_New:h10:cANSI"设置字体
"syntaxon"语法高亮
autocmdInsertLeave*senocul"用浅色高亮当前行
autocmdInsertEnter*secul"用浅色高亮当前行
"setruler"显示标尺
setshowcmd"输入的命令显示出来,看的清楚些
"setcmdheight=1"命令行(在状态行下)的高度,设置为1
"setwhichwrap+=<,>,h,l"允许backspace和光标键跨越行边界(不建议)
"setscrolloff=3"光标移动到buffer的顶部和底部时保持3行距离
setnovisualbell"不要闪烁(不明白)
setstatusline=%F%m%r%h%w[FORMAT=%{&ff}][TYPE=%Y][POS=%l,%v][%p%%]\%{strftime("%d/%m/%y-\%H:%M")}"状态行显示的内容
setlaststatus=1"启动显示状态行(1),总是显示状态行(2)
setfoldenable"允许折叠
setfoldmethod=manual"手动折叠
"setbackground=dark"背景使用黑色
setnocompatible"去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
"显示中文帮助
ifversion>=603
sethelplang=cn
setencoding=utf-8
endif
"设置配色方案
"colorschememurphy
"字体
"if(has("gui_running"))
"setguifont=BitstreamVeraSansMono10
"endif
setfencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
settermencoding=utf-8
setencoding=utf-8
setfileencodings=ucs-bom,utf-8,cp936
setfileencoding=utf-8
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""新文件标题""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新建.c,.h,.sh,.java文件,自动插入文件头
autocmdBufNewFile*.cpp,*.[ch],*.sh,*.javaexec":callSetTitle()"
""定义函数SetTitle,自动插入文件头
funcSetTitle()
"如果文件类型为.sh文件
if&filetype=='sh'
callsetline(1,"#########################################################################")
callappend(line("."),"#FileName:".expand("%"))
callappend(line(".")+1,"#Author:ma6174")
callappend(line(".")+2,"#mail:ma6174@163.com")
callappend(line(".")+3,"#CreatedTime:".strftime("%c"))
callappend(line(".")+4,"#########################################################################")
callappend(line(".")+5,"#!/bin/bash")
callappend(line(".")+6,"")
else
callsetline(1,"")
callappend(line(".")+5,"")
endif
if&filetype=='cpp'
callappend(line(".")+6,"#include<iostream>")
callappend(line(".")+7,"usingnamespacestd;")
callappend(line(".")+8,"")
endif
if&filetype=='c'
callappend(line(".")+6,"#include<stdio.h>")
callappend(line(".")+7,"")
endif
"新建文件后,自动定位到文件末尾
autocmdBufNewFile*normalG
endfunc
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"键盘命令
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
nmap<leader>w:w!<cr>
nmap<leader>f:find<cr>
"映射全选+复制ctrl+a
map<C-A>ggVGY
map!<C-A><Esc>ggVGY
map<F12>gg=G
"选中状态下Ctrl+c复制
vmap<C-c>"+y
"去空行
nnoremap<F2>:g/^s*$/d<CR>
"比较文件
nnoremap<C-F2>:vertdiffsplit
"新建标签
map<M-F2>:tabnew<CR>
"列出当前目录文件
map<F3>:tabnew.<CR>
"打开树状文件目录
map<C-F3>e
"C,C++按F5编译运行
map<F5>:callCompileRunGcc()<CR>
func!CompileRunGcc()
exec"w"
if&filetype=='c'
exec"!g++%-o%<"
exec"!./%<"
elseif&filetype=='cpp'
exec"!g++%-o%<"
exec"!./%<"
elseif&filetype=='java'
exec"!javac%"
exec"!java%<"
elseif&filetype=='sh'
:!./%
endif
endfunc
"C,C++的调试
map<F8>:callRungdb()<CR>
func!Rungdb()
exec"w"
exec"!g++%-g-o%<"
exec"!gdb./%<"
endfunc
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""实用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"设置当文件被改动时自动载入
setautoread
"quickfix模式
autocmdFileTypec,cppmap<buffer><leader><space>:w<cr>:make<cr>
"代码补全
setcompleteopt=preview,menu
"允许插件
filetypepluginon
"共享剪贴板
setclipboard+=unnamed
"从不备份
setnobackup
"make运行
:setmakeprg=g++-Wall\%
"自动保存
setautowrite
setruler"打开状态栏标尺
setcursorline"突出显示当前行
setmagic"设置魔术
setguioptions-=T"隐藏工具栏
setguioptions-=m"隐藏菜单栏
"setstatusline=\%<%F[%1*%M%*%n%R%H]%=\%y\%0(%{&fileformat}\%{&encoding}\%c:%l/%L%)
"设置在状态行显示的信息
setfoldcolumn=0
setfoldmethod=indent
setfoldlevel=3
setfoldenable"开始折叠
"不要使用vi的键盘模式,而是vim自己的
setnocompatible
"语法高亮
setsyntax=on
"去掉输入错误的提示声音
setnoeb
"在处理未保存或只读文件的时候,弹出确认
setconfirm
"自动缩进
setautoindent
setcindent
"Tab键的宽度
settabstop=4
"统一缩进为4
setsofttabstop=4
setshiftwidth=4
"不要用空格代替制表符
setnoexpandtab
"在行和段开始处使用制表符
setsmarttab
"显示行号
setnumber
"历史记录数
sethistory=1000
"禁止生成临时文件
setnobackup
setnoswapfile
"搜索忽略大小写
setignorecase
"搜索逐字符高亮
sethlsearch
setincsearch
"行内替换
setgdefault
"编码设置
setenc=utf-8
setfencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
"语言设置
setlangmenu=zh_CN.UTF-8
sethelplang=cn
"我的状态行显示的内容(包括文件类型和解码)
"setstatusline=%F%m%r%h%w[FORMAT=%{&ff}][TYPE=%Y][POS=%l,%v][%p%%]\%{strftime("%d/%m/%y-\%H:%M")}
"setstatusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
"总是显示状态行
setlaststatus=2
"命令行(在状态行下)的高度,默认为1,这里是2
setcmdheight=2
"侦测文件类型
filetypeon
"载入文件类型插件
filetypepluginon
"为特定文件类型载入相关缩进文件
filetypeindenton
"保存全局变量
setviminfo+=!
"带有如下符号的单词不要被换行分割
setiskeyword+=_,$,@,%,#,-
"字符间插入的像素行数目
setlinespace=0
"增强模式中的命令行自动完成操作
setwildmenu
"使回格键(backspace)正常处理indent,eol,start等
setbackspace=2
"允许backspace和光标键跨越行边界
setwhichwrap+=<,>,h牡丹之歌简谱 ,l
"可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
setmouse=a
setselection=exclusive
setselectmode=mouse,key
"通过使用:commands命令,告诉我们文件的哪一行被改变过
setreport=0
"在被分割的窗口间显示空白,便于阅读
setfillchars=vert:,stl:,stlnc:
"高亮显示匹配的括号
setshowmatch
"匹配括号高亮的时间(单位是十分之一秒)
setmatchtime=1
"光标移动到buffer的顶部和底部时保持3行距离
setscrolloff=3
"为C程序提供自动缩进
setsmartindent
"高亮显示普通txt文件(需要txt.vim脚本)
auBufRead,BufNewFile*setfiletypetxt
"自动补全
:inoremap(()<ESC>i
:inoremap)<c-r>=ClosePair(')')<CR>
:inoremap{{<CR>}<ESC>O
:inoremap}<c-r>=ClosePair('}')<CR>
:inoremap[[]<ESC>i
:inoremap]<c-r>=ClosePair(']')<CR>
:inoremap"""<ESC>i
:inoremap'''<ESC>i
function!ClosePair(char)
ifgetline('.')[col('.')-1]==a:char
return"<Right>"
else
returna:char
endif
endfunction
filetypepluginindenton
"打开文件类型检测,加了这句才可以用智能补全
setcompleteopt=longest,menu
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"CTags的设定
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
letTlist_Sort_Type="name""按照名称排序
letTlist_Use_Right_Window=1"在右侧显示窗口
letTlist_Compart_Format=1"压缩方式
letTlist_Exist_OnlyWindow=1"如果只有一个buffer,kill窗口也kill掉buffer
letTlist_File_Fold_Auto_Close=0"不要关闭其他文件的tags
letTlist_Enable_Fold_Column=0"不要显示折叠树
autocmdFileTypejavasettags+=D: oolsjava ags
"autocmdFileTypeh,cpp,cc,csettags+=D: oolscpp ags
"letTlist_Show_One_File=1"不同时显示多个文件的tag,只显示当前文件的
"设置tags
settags=tags
"setautochdir
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"其他东东
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"默认打开Taglist
letTlist_Auto_Open=1
""""""""""""""""""""""""""""""
"Taglist(ctags)
""""""""""""""""""""""""""""""""
letTlist_Ctags_Cmd='/usr/bin/ctags'
letTlist_Show_One_File=1"不同时显示多个文件的tag,只显示当前文件的
letTlist_Exit_OnlyWindow=1"如果taglist窗口是最后一个窗口,则退出vim
letTlist_Use_Right_Window=1"在右侧窗口中显示taglist窗口
"minibufexpl插件的一般设置
letg:miniBufExplMapWindowNavVim=1
letg:miniBufExplMapWindowNavArrows=1
letg:miniBufExplMapCTabSwitchBufs=1
letg:miniBufExplModSelTarget=1
为了方便大家下载使用,我把它放到我的空间里了,两个命令就可以瞬间得到.vimrc文件
下载:vimrc
unzip -f vimrc.zip -d ~/简易安装方法:
打开终端,执行下面的命令就自动安装好了:
C代码
wget-qO-https://raw.github.com/ma6174/vim/master/setup.sh|sh-x或者自己手动安装:(以ubuntu为例)
安装vimsudo apt-get install vim
安装ctags:sudo apt-get install ctags
安装一些必备程序:sudo apt-get install xclip vim-gnome astyle python-setuptools
python代码格式化工具:sudo easy_install -ZU autopep8
sudo ln -s /usr/bin/ctags /usr/local/bin/ctags
clone配置文件:cd ~/ && git clone git://github.com/ma6174/vim.git
mv ~/vim ~/.vim
mv ~/.vim/.vimrc ~/
clone bundle 程序:git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
打开vim并执行bundle程序:BundleInstall
重新打开vim即可看到效果
http://justcoding.iteye.com/blog/2304779无插件Vim编程技巧博客分类:
Ubuntu / Mac / Github / Aptana / Nginx / Shell / Linux
相信大家看过《简明Vim教程》也玩了《Vim大冒险》 的游戏了,相信大家对Vim都有一个好的入门了。我在这里把我日常用Vim编程的一些技巧列出来给大家看看,希望对大家有用,另外,也是一个抛砖引玉的过 程,也希望大家把你们的技巧跟贴一下,我会更新到这篇文章中。另外,这篇文章里的这些技巧全都是vim原生态的,不需要你安装什么插件。我的Vim的版本是7.2。浏览代码
首先,我们先从浏览代码开始。有时候,我们需要看多个文件,所以,传统的做法是,我们开多个tty终端,每个tty里用Vim打开一个文件,然后来回切换。这很没有什么效率。我们希望在一个Vim里打开多个文件,甚至浏览程序目录。
浏览目录的命令很简单:(你也可以直接vim一个目录)
:E
注意,是大写。于是,你会看到下面这样的界面:
无插件Vim编程技巧
这个界面中,你可以用 j, k 键上下移动,然后回车,进入一个目录,或是找开一个文件。你可以看到上面有一堆命令:
【 – 】 到上级目录
【D】删除文件(大写)
【R】改文件名(大写)
【s】对文件排序(小写)
【x】执行文件
当然,打开的文件会把现有已打开的文件给冲掉——也就是说你只看到了一个文件。
如果你要改变当前浏览的目录,或是查看当前浏览的目录,你可以使用和shell一样的命令:
:cd <dir> – 改变当前目录
:pwd – 查看当前目录缓冲区
其实,你用:E 浏览打开的文件都没有被关闭,这些文件都在缓冲区中。你可以用下面的命令来查看缓冲区:
:ls
于是,在你的Vim下,你会看到如下界面:
无插件Vim编程技巧
你 可以看到Vim打开了四个文件,编号是4,5,6,7,如果你要切换打开的文件,这个时候,你不要按回车(按了也没事,只不过按了就看不到:ls 输出的buffer列表了),你可以使用下面的命令切换文件(buffer后面的4表示切到4号文件也就是src/http/ngx_http.c):
:buffer 4
或是:
:buffer src/http/ngx_http.c
注意,
你可以像在Shell中输入命令按Tab键补全一样补全Vim的命令。
也可以用像gdb一样用最前面的几个字符,只要没有冲突。如:buff
你还可以动用如下命令,快速切换:
:bnext缩写 :bn:bprevious 缩写 :bp:blast 缩写 :bl:bfirst缩写 :bf
上图中,我们还可以看到5有一个%a,这表示当前文件,相关的标记如下:
– (非活动的缓冲区)a (当前被激活缓冲区)h (隐藏的缓冲区)% (当前的缓冲区)# (交换缓冲区)= (只读缓冲区)+ (已经更改的缓冲区)窗口分屏浏览
相信你在《Vim的窗口分屏》一文中,你已经知道了怎么拆分窗口了。其实,我更多的不是用拆分窗口的命令,而是用浏览文件的命令来分隔窗口。如:
把当前窗口上下分屏姜超老婆,并在下面进行目录浏览:
:He 全称为 :Hexplore (在下边分屏浏览目录)
如果你要在上面,你就在 :He后面加个 !,
:He! (在上分屏浏览目录)
如果你要左右分屏的话,你可以这样:
:Ve 全称为 :Vexplore (在左边分屏间浏览目录,要在右边则是 :Ve!)
下图是分别用:He 和 :Ve搞出来的同时看三个文件:
无插件Vim编程技巧
在分屏间的跳转和切换在《Vim的窗口分屏》一文中提过了:先按Ctrl + W,然后按方向键:h j k l分屏同步移动
要让两个分屏中的文件同步移动,很简单,你需要到需要同步移动的两个屏中都输入如下命令(相当于使用“铁锁连环”):
:set scb
如果你需要解开,那么就输入下面的命令:
:set scb!
注:set scb 是set scrollbind 的简写。Tab页浏览目录
分屏可能会让你不爽,你可能更喜欢像Chrome这样的分页式的浏览,那么你可以用下面的命令:
:Te 全称是 :Texplorer
下图中,你可以看到我用Te命令打开了三页,就在顶端我们可以可以看到有三页,其中第一页Tab上的数字3表示那一页有3个文件。
无插件Vim编程技巧
我们要在多个Tabe页中切换,在normal模式下,你可以使用下面三个按键(注意没有冒号):
gt – 到下一个页
gT – 到前一个页
{i} gt – i是数字,到指定页,比如:5 gt 就是到第5页
你可以以使用 【:tabm {n}】来切换Tab页。
gvim应该是:Ctrl+PgDn 和 Ctrl+PgUp 来在各个页中切换。
如果你想看看你现在打开的窗口和Tab的情况,你可以使用下面的命令:
:tabs
于是你可以看到:
无插件Vim编程技巧
使用如下命令可以关闭tab:(当然,我更喜欢使用传统的:q, :wq来关闭)
:tabclose [i]– 如果后面指定了数字沸多里达克 ,那就关闭指定页,如果没有就关闭当前页
最后提一下,如果你在Shell命令行下,你可以使用 vim 的 -p 参数来用Tab页的方式打开多个文件,比如:
vim -p cool.cpp shell.cpp haoel.cppvim -p *.cpp
注:如果你想把buffer中的文件全转成tab的话,你可以使用下面的命令
:bufdo tab split保存会话
如果你用Tab或Window打开了好些文件的文件,还设置了各种滚屏同步,或是行号……,那么,你可以用下面的命令来保存会话:(你有兴趣你可以看看你的 mysession.vim文件内容,也就是一个批处理文件)
:mksession ~/.mysession.vim
如果文件重复,vim默认会报错,如果你想强行写入的话,你可以在mksession后加! :
:mksession! ~/.mysession.vim
于是下次,你可以这样打开这个会话:
vim -S ~/.mysession.vim
保存完会话后,你也没有必要一个一个Tab/Windows的去Close雷迪菜菜族。你可以简单地使用:
:qa – 退出全部
:wqa -保存全部并退出全部Quickfix
假如我们有一个hello.cpp文件和一个makefile,于是我们可以直接在vim下输入 :make , 于是就可以make这个hello.cpp文件,如果出错了,我们需要按回车返回,这个时候,我们可以使用下面的命令来把出错显到在vim的分屏中:
:cw
于是,就会出现下面右边的那个样子:(是不是看上去和我一样很帅?)
无插件Vim编程技巧
上图中左边是我的makefile,右边是我的错误百出的源代码,右边下面是quickfix窗屏。你可以看到quickfix窗屏指向的第一个错误已经定位到我们相就错误的文件行上了。
你可以使用像浏览文件那样用j, k在quckfix窗屏中上下移动到相应的错误上然后按回车,然后就可以在上面的窗屏里定位到相应的源文件的代码行。但是,如果是这样的话, 你要定位下一条错误还得用Ctrl +W 回到quickfix屏中来然后重复来过。
你可以使用下面的命令而不用回到quickfix中来:
:cp 跳到上一个错误
:cn 跳到下一个错误
:cl 列出所有错误
:cc 显示错误详细信息
下面我们来看另一个quickfix的功能。
如果你用过vim的cscope插件,你就知道cscope可以用来查找相当的代码,但cscope需要事先生成一个数据库,对一些简单的查找,其实,我们用vim的grep命令就可以了,不需要专门为之生成数据库。vim的grep命令和shell的几乎一样。
我们来看个例子:
比如我们正在浏览nginx的代码,这时,我想看看哪里用到了nginx的NGX_HTTP_VAR_INDEXED宏。于是,我可以在vim里输入如下的命令:
:grep -r –include=”*.[ch]”NGX_HTTP_VAR_INDEXED src/
上 面这个命令意思是递归查询src目录下所有的.c和.h文件,其中包括NGX_HTTP_VAR_INDEXED宏。然后,你就会看到vim到 shell里去执行并找到了相关的文件,按回车返回vim后,别忘了用 【:cw 】把grep的输出取回来,于是我们就有下面的样子:
无插件Vim编程技巧
然后同上面一样,你可以用 j,k 键移动quickfix里的光标到相应的行,然后按回车定位文件,或是使用【:cn】或【:cp】来移动到定位。(这样,你会把多个文件打开到缓冲区,别忘了【:ls】来查看缓冲区)
你看,到这里,一个小小的IDE就这样产生了,而且,最帅的时,我们连一点插件都没有装,也没有在.vimrc文件中配置过什么。关键字补全
我们还是坚持不用任何插件。我们来看看是怎么个自动补全的。
在insert模式下,我们可以按如下快捷键:
【Ctrl +N】 – 当你按下这它时,你会发现Vim就开始搜索你这个目录下的代码,搜索完成了就会出现一个下拉列表(居然是粉紫色的,真是丑死了)
下图是我输入了ngx_http_然后按ctrl+n出现的样子,它已经帮我补全了一个,但是我不想要这个。什么是人鱼线然后,在Vim的下方我们可以看到状态变成了“关键字补全”,然后后面有^N^P的提示,意思就是告诉你还有一个Ctrl+P.
无插件Vim编程技巧
【Ctrl + P】 – 接下来你可以按这个键,于是回到原点,然后你可以按上下光标键来选择相应的Word。
对于上面那个例子,我们按下了Ctrl+P后出现下面的这个样子。我们可以看到,光标回到了一开始我输入的位置,然后你可以干两件事,一个是继续输入(这可以帮助过滤关键词),另一个是用“光标键”上移或下移来选择下拉列表中的关键字,选好后回车,就补全了。
无插件Vim编程技巧
与此类似的,还有更多的补齐,都在Ctrl +X下面:
Ctrl + X 和 Ctrl + D 宏定义补齐
Ctrl + X 和 Ctrl + ] 是Tag 补齐
Ctrl + X 和 Ctrl + F 是文件名 补齐
Ctrl + X 和 Ctrl + I 也是关键词补齐,但是关键后会有个文件名,告诉你这个关键词在哪个文件中
Ctrl + X 和 Ctrl +V 是表达式补齐
Ctrl + X 和 Ctrl +L 这可以对整个行补齐,变态吧。其它技巧字符相关
【guu 】 – 把一行的文字变成全小写。或是【Vu】
【gUU】 – 把一行的文件变成全大写吴艳樱。或是【VU】
按【v】键进入选择模式,然后移动光标选择你要的文本,按【u】转小写蔡小豆,按【U】转大写
【ga】 – 查看光标处字符的ascii码
【g8】 – 查看光标处字符的utf-8编码
【gf】 – 打开光标处所指的文件 (这个命令在打到#include头文件时挺好用的,当然,仅限于有路径的)
【*】或【#】在当前文件中搜索当前光标的单词缩进相关
【>>】向右给它进当前行 【<<】向左缩进当前行
【=】 – 缩进当前行 (和上面不一样的是,它会对齐缩进)
【=%】 – 把光标位置移到语句块的括号上,然后按=%,缩进整个语句块(%是括号匹配)
【G=gg】 或是 【gg=G】 – 缩进整个文件(G是到文件结尾,gg是到文件开头)复制粘贴相关
按【v】 键进入选择模式,然后按h,j,k,l移动光标,选择文本,然后按 【y】 进行复制,按 【p】 进行粘贴。
【dd】剪切一行(前面加个数字可以剪切n行),【p】粘贴
【yy】复制一行(前面加个数字可以复制n行),【p】粘贴光标移动相关
【Ctrl + O】向后回退你的光标移动
【Ctrl + I 】向前追赶你的光标移动
这两个快捷键很有用,可以在Tab页和Windows中向前和向后trace你的光标键,这也方便你跳转光标。读取Shell命令相关
【:r!date】 插入日期
上面这个命令,:r 是:read的缩写,!是表明要运行一个shell命令,意思是我要把shell命令的输出读到vim里来。vim的终级插件
CentOS下:yum erase emacs
Ubuntu下:apt-get remove emacs
对了,以前本站也有一篇小短文《如何在vim中得到你最喜爱的IDE特性》你也可以看看。用Vim编程——配置与技巧博客分类:
Ubuntu / Mac / Github / Aptana / Nginx / Shell / Linux
本文介绍如何用强大的文本编辑器Vim编程。只要配置得当,效果堪比一个IDE。配置
基本配置:
C代码
"开启语法高亮
syntaxon
"依文件类型设置自动缩进
filetypeindentpluginon
"显示当前的行号列号:
setruler
"在状态栏显示正在输入的命令
setshowcmd
"关闭/打开配对括号高亮
"NoMatchParen
DoMatchParen
行号的显示与隐藏:
C代码
"显示行号:
setnumber
"为方便复制,用<F2>开启/关闭行号显示:
nnoremap<F2>:setnonumber!<CR>:setfoldcolumn=0<CR>
启用Modeline(即允许被编辑的文件以注释的形式设置Vim选项,详见Vim Wiki: Modeline magic):
C代码
setmodeline
如果终端使用的是深色背景:
C代码
"为深色背景调整配色
setbackground=dark插件管理
下文的配置很多都依赖于第三方开发的 Vim 插件。为了方便地安装和维护这些插件,推荐先安装一种插件管理工具,目前较为流行的是Vundle和pathogen。二者功能类似,但 Vundle 的配置更灵活, pathogen 则相对简洁。二者都能很好地与Git结合,安装插件十分方便。
如果你使用 Git 管理你的配置文件,那么还可以将 Pathogen 或 Vundle 与 Git 的 Submodule 功能管理插件结合,使得在多台电脑间同步插件及在本地更新插件变得十分便捷。
C代码
#在存放配置文件的主文件夹下,添加一个submodule
gitsubmoduleaddhttps://github.com/gmarik/vundle.git.vim/bundle/vundle
#用类似的办法添加多个插件后,以后升级插件只需:
gitsubmoduleupdate
#如果其它电脑checkout出配置文件后,要先:
gitsubmoduleinit
插件管理工具无需通过系统的包管理系统安装,只要将需要的文件放在~/.vim/目录中即可。这样,一套配置文件也可以方便地用在多个不同的系统环境中。代码补全
Vim 7已经内置了代码补全功能[6],补全操作可分为两种:
关键字补全
即简单地补全到文档中已有的词,快捷键为Ctrl-N或Ctrl-P。
智能补全
Vim 7中引入 Omni Complete,可根据语义补全,快捷键为Ctrl-X Ctrl-O。
Vim的补全菜单操作方式与一般IDE的方式不同,可加入如下设置:
C代码
"让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
setcompleteopt+=longest
"离开插入模式后自动关闭预览窗口
autocmdInsertLeave*ifpumvisible()==0|pclose|endif
"回车即选中当前项
inoremap<expr><CR>pumvisible()?"<C-y>":"<CR>"
"上下左右键的行为
inoremap<expr><Down>pumvisible()?"<C-n>":"<Down>"
inoremap<expr><Up>pumvisible()?"<C-p>":"<Up>"
inoremap<expr><PageDown>pumvisible()?"<PageDown><C-p><C-n>":"<PageDown>"
inoremap<expr><PageUp>pumvisible()?"<PageUp><C-p><C-n>":"<PageUp>"
如需自动补全多田熏,可安装AutoComplPop插件,安装后如需在补全是显示文档(预览),可加入设置:
C代码
letg:acp_completeoptPreview=1注释管理
经常要将一段代码注释掉或取消注释,而尤其对于某些只支持单行注释的语言来说,逐行加注释很麻烦,这时快速注释(或取消注释)代码的插件就显得很有用了。
常见的注释管理插件为The NERD Commenter,默认支持多种语言,使用方法也很简单:只需在可视(V)模式中选择一段代码,按下cc加逐行注释,cu取消注释,cm添加块注释。
如有其它需求,也可考虑comments、EnhCommentify等插件。缩进
使用自动缩进可能需要设置,vim中对自动缩进的详细设置办法见Vim代码缩进设置。
在不同的模式中调整缩进的方法不同:
插入模式
Ctrl-T增加缩进,Ctrl-D减小缩进。
命令模式
>>右缩进,<<左缩进,注意n<<或n>>是缩进多行,如4>>
可视模式
<、>用于左右缩进,n<、n>可做多节缩进,如2>。
另外,=可对选中的部分进行自动缩进;]p可以实现p的粘贴功能,并自动缩进。储世新代码浏览与跳转
代码跳转类似于IDE中的Ctrl+点击功能。与代码补全类似,代码浏览工具亦可分为基于文本分析的和基于代码理解的两类。简单代码跳转
在命令模式下可直接使用下述指令:
跳转到定义
gd到局部变量的定义,gD到全局变量的定义
搜索
*,#可对光标处的词向前/向后做全词搜索,g*,g#做相对应的非全词匹配搜索
代码块首尾
[[,]]可跳到当前代码块起始或结束的大括号处。
括号首尾
%可在配对的括号、块首尾之前跳转。
位置历史
Ctrl-O在历史记录中后台,Ctrl-I则为前进。基于代码理解的跳转
该功能依赖于ctags工具。[9]安装好ctags后,在存放代码的文件夹运行
ctags -R .
即可生成一个描述代码结构的tags文件。
提示:ctags的功能很强大,更详细的配置请参考其文档。
建议在~/.vimrc中添加如下配置以使Vim在父目录中寻找tags文件:
set tags=tags;/
设置好后,可在Vim中使用如下功能:Ctrl-]转至最佳匹配的相应Tag,Ctrl-T返回上一个匹配。如果有多个匹配,g Ctrl-]可显示所有备选的tags。如有需要,可互换Ctrl-]和g Ctrl-]:
"在普通和可视模式中,将<c-]>与g<c-]>互换nnoremap <c-]> g<c-]>vnoremap <c-]> g<c-]> nnoremap g<c-]> <c-]>vnoremap g<c-]> <c-]>就地编译和错误处理
使用:make可调用make命令编译程序,配合Vim内置的QuickFix功能,可以像IDE一样打开一个窗口展示编译错误和警告,通过它还可以方便地跳转到各编译错误的产生位置。
常用的命令有:cw[indow](如有错误打开quickfix窗口)、:cn(跳到下一个错误)、:cp(跳到前一个错误)等,具体可:help quickfix赵丹军。
如果想在有错时自动打开quickfix窗口:
" 编译后,如有错误则打开quickfix窗口。(光标仍停留在源码窗口)"" 注意:需要开启netsting autocmdautocmd QuickFixCmdPost [^l]* nested cwindowautocmd QuickFixCmdPost l* nested lwindow
默认情况下,:mak[e]会跳转到第一个错误,如果不想启用这个功能,请使用:make!。代码折叠
代码较长时可启用代码折叠功能,如按语法高亮元素折叠:
set foldmethod=syntax"默认情况下不折叠set foldlevel=99
随后即可使用z系列命令管理代码折叠。如za会翻转当前位置的折叠状态,zA会递归翻转当前层所有代码的折叠状态等。当然也可以把功能键映射到za:
map <F3> za查看文档
K键可用于查看当前函数的文档林达信。其它插件
近来仍被积极维护的代码托管在 GitHub 上的插件:
Fugitive
让 Vim 更好地与Git整合。
Powerline
炫丽实用的状态栏
Tagbar
比taglist更现代的代码结构浏览工具
The NERD tree
以树形结构浏览文件夹中的文件
Syntastic
语法检查
surround.vim
快速删除/修改光标周围配对的括号
其它常用插件[14]:
Project
方便管理工程中的文件
snipmate.vim
在编辑中实现模板展开
a.vim
在.cpp/.h等文件对中跳转
matchit.zip
增强%的功能
winmanager
将文件管理窗口和taglist堆叠起来。相关文档
配置基于Vim的Python编程环境
让vim自动判断中文编码参考资料
↑How to setup VIM properly for editing Python files - *.py (StackOverflow)
↑amix的vimrc
↑Python and vim: Make your own IDE (2009.2)
↑Python官网上的Vim介绍
↑Git Tools - Submodules
↑细说 Vim 7 之新特性-LinuxToy
↑VimTip 1228: Improve completion popup menu
↑Vim文档
↑Browsing programs with tags -- Vim Tips Wiki
↑Vim and Ctags tips and tricks
↑use :tjump instead of :tag vim on pressing ctrl-] (StackOverflow)
↑Automatically open the quickfix window on :make
↑LinuxTOY Xu Xiaodong 的VimEnv
↑手把手教你把Vim改装成一个IDE编程环境(图文)常用命令
对于入门vim基本命令可以参考简明 Vim 练级攻略,以下是本人关于移动光标、插入/修改、删除、复制、粘帖、撤销和恢复等常用命令
移动光标
对于在行内移动,通过使用f/F + 字符来移动到特定的字符,然后再使用.来重复执行命令;f表示向前移动,F表示向后移动。如果想直接移动到行首或行尾,使用^或$
对于在多行移动,就有多种选择:第一种是通过gg,G,行数 + G指定行数来移动,gg表示移动文件的第一行,G表示移动文件的最后一行,行数 + G表示移动到特定的行。第二种就是通过正则搜索的方式来移动,/string表示正向查找,?string表示反向查找,n查找下一个匹配的结果,N表示上一个匹配的结果,按up/down可以浏览搜索历史论他妈的 。第三种就是使用标记来移动,m + {a-z}标记位置(适用于单个文件,如果是多个文件,使用大写字母{A-Z}),`{mark}移动到标记位置的列,'{mark}移动到标记位置的行首,还有一些特殊的标记,'表示跳转前光标的位置
选择文本v不规则选择V按行选择Ctrl + V按列选择
插入/修改i在当前字符前面插入I在行首插入a在当前字符后面插入A在行尾插入o在当前行的下一行插入O在当前行的上一行插入r更改当前的字符R更改多个字符cw/caw更改单词cf + 字符更改从当前字符到指定字符c$更改从当前字符到行尾cc更改整行
删除x删除字符df + 字符删除从当前字符到指定字符dw/daw删除单词d$删除从当前光标到行尾dd删除一行
剪切与粘帖dd + pdelete一行,然后放在当前光标下方dd + Pdelete一行,然后放在当前光标上方dw + pdelete单词赵青楚,然后放在当前光标后面dw + Pdelete单词,然后放在当前光标前面p/P可接受计数前缀,重复粘贴
复制yw复制单词yf复制从当前字符到指定字符y$复制当前光标到行尾yy复制整行
撤销和恢复u撤销ctrl + r重做
重复操作数字+action表示执行某个操作多少次.重复上一个操作
宏录制q + 寄存器(a-z)开始录制录制动作q停止录制@ + 寄存器 / @@replay被录制的宏扩展阅读
Vim配置从零搭建和配置OSX开发环境将你的Vim 打造成轻巧强大的IDE
Vim插件vim中的杀手级插件: vundle谁说Vim不是IDE?(三)vim中的杀手级插件: YouCompleteMe
Vim入门和使用技巧简明 Vim 练级攻略vim配置文件
vim配置主要有以下优点:
1.按F5可以直接编译并执行C、C++、java代码以及执行shell脚本,按“F8”可进行C、C++代码的调试
2.自动插入文件头 ,新建C、C++源文件时自动插入表头:包括文件名、作者、联系方式、建立时间等,读者可根据需求自行更改
3.映射“Ctrl + A”为全选并复制快捷键,方便复制代码
4.按“F2”可以直接消除代码中的空行
5.“F3”可列出当前目录文件,打开树状文件目录
6. 支持鼠标选择、方向键移动
7. 代码高亮,自动缩进,显示行号,显示状态行
8.按“Ctrl + P”可自动补全
9.[]、{}、()、""、' '等都自动补全
10.其他功能读者可以研究以下文件
vim本来就是很强大,很方便的编辑器,加上我的代码后肯定会如虎添翼,或许读者使用其他编程语言,可以根据自己的需要进行修改,配置文件里面已经加上注释。
读者感兴趣的话直接复制下面的代码到文本文件,然后把文件改名为“ .vimrc” (不要忘记前面的“.”)小镇飞花,然后把文件放到用户文件夹的根目录下面即可。重新打开vim即可看到效果。
为方便管理,源码托管到了github,后期增加了好多新功能,
具体详见:https://github.com/ma6174/vim
这是在github上的vim配置的截图:
下面是精简的,没有插件的vim配置文件,保存到自己的.vimrc文件就能使用。
C代码
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"显示相关
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"setshortmess=atI"启动的时候不显示那个援助乌干达儿童的提示
"winpos55"设定窗口位置
"setlines=40columns=155"设定窗口大小
"setnu"显示行号
setgo="不要图形按钮
"colorasmanian2"设置背景主题
setguifont=Courier_New:h10:cANSI"设置字体
"syntaxon"语法高亮
autocmdInsertLeave*senocul"用浅色高亮当前行
autocmdInsertEnter*secul"用浅色高亮当前行
"setruler"显示标尺
setshowcmd"输入的命令显示出来,看的清楚些
"setcmdheight=1"命令行(在状态行下)的高度,设置为1
"setwhichwrap+=<,>,h,l"允许backspace和光标键跨越行边界(不建议)
"setscrolloff=3"光标移动到buffer的顶部和底部时保持3行距离
setnovisualbell"不要闪烁(不明白)
setstatusline=%F%m%r%h%w[FORMAT=%{&ff}][TYPE=%Y][POS=%l,%v][%p%%]\%{strftime("%d/%m/%y-\%H:%M")}"状态行显示的内容
setlaststatus=1"启动显示状态行(1),总是显示状态行(2)
setfoldenable"允许折叠
setfoldmethod=manual"手动折叠
"setbackground=dark"背景使用黑色
setnocompatible"去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
"显示中文帮助
ifversion>=603
sethelplang=cn
setencoding=utf-8
endif
"设置配色方案
"colorschememurphy
"字体
"if(has("gui_running"))
"setguifont=BitstreamVeraSansMono10
"endif
setfencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
settermencoding=utf-8
setencoding=utf-8
setfileencodings=ucs-bom,utf-8,cp936
setfileencoding=utf-8
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""新文件标题""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新建.c,.h,.sh,.java文件,自动插入文件头
autocmdBufNewFile*.cpp,*.[ch],*.sh,*.javaexec":callSetTitle()"
""定义函数SetTitle,自动插入文件头
funcSetTitle()
"如果文件类型为.sh文件
if&filetype=='sh'
callsetline(1,"#########################################################################")
callappend(line("."),"#FileName:".expand("%"))
callappend(line(".")+1,"#Author:ma6174")
callappend(line(".")+2,"#mail:ma6174@163.com")
callappend(line(".")+3,"#CreatedTime:".strftime("%c"))
callappend(line(".")+4,"#########################################################################")
callappend(line(".")+5,"#!/bin/bash")
callappend(line(".")+6,"")
else
callsetline(1,"")
callappend(line(".")+5,"")
endif
if&filetype=='cpp'
callappend(line(".")+6,"#include<iostream>")
callappend(line(".")+7,"usingnamespacestd;")
callappend(line(".")+8,"")
endif
if&filetype=='c'
callappend(line(".")+6,"#include<stdio.h>")
callappend(line(".")+7,"")
endif
"新建文件后,自动定位到文件末尾
autocmdBufNewFile*normalG
endfunc
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"键盘命令
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
nmap<leader>w:w!<cr>
nmap<leader>f:find<cr>
"映射全选+复制ctrl+a
map<C-A>ggVGY
map!<C-A><Esc>ggVGY
map<F12>gg=G
"选中状态下Ctrl+c复制
vmap<C-c>"+y
"去空行
nnoremap<F2>:g/^s*$/d<CR>
"比较文件
nnoremap<C-F2>:vertdiffsplit
"新建标签
map<M-F2>:tabnew<CR>
"列出当前目录文件
map<F3>:tabnew.<CR>
"打开树状文件目录
map<C-F3>e
"C,C++按F5编译运行
map<F5>:callCompileRunGcc()<CR>
func!CompileRunGcc()
exec"w"
if&filetype=='c'
exec"!g++%-o%<"
exec"!./%<"
elseif&filetype=='cpp'
exec"!g++%-o%<"
exec"!./%<"
elseif&filetype=='java'
exec"!javac%"
exec"!java%<"
elseif&filetype=='sh'
:!./%
endif
endfunc
"C,C++的调试
map<F8>:callRungdb()<CR>
func!Rungdb()
exec"w"
exec"!g++%-g-o%<"
exec"!gdb./%<"
endfunc
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""实用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"设置当文件被改动时自动载入
setautoread
"quickfix模式
autocmdFileTypec,cppmap<buffer><leader><space>:w<cr>:make<cr>
"代码补全
setcompleteopt=preview,menu
"允许插件
filetypepluginon
"共享剪贴板
setclipboard+=unnamed
"从不备份
setnobackup
"make运行
:setmakeprg=g++-Wall\%
"自动保存
setautowrite
setruler"打开状态栏标尺
setcursorline"突出显示当前行
setmagic"设置魔术
setguioptions-=T"隐藏工具栏
setguioptions-=m"隐藏菜单栏
"setstatusline=\%<%F[%1*%M%*%n%R%H]%=\%y\%0(%{&fileformat}\%{&encoding}\%c:%l/%L%)
"设置在状态行显示的信息
setfoldcolumn=0
setfoldmethod=indent
setfoldlevel=3
setfoldenable"开始折叠
"不要使用vi的键盘模式,而是vim自己的
setnocompatible
"语法高亮
setsyntax=on
"去掉输入错误的提示声音
setnoeb
"在处理未保存或只读文件的时候,弹出确认
setconfirm
"自动缩进
setautoindent
setcindent
"Tab键的宽度
settabstop=4
"统一缩进为4
setsofttabstop=4
setshiftwidth=4
"不要用空格代替制表符
setnoexpandtab
"在行和段开始处使用制表符
setsmarttab
"显示行号
setnumber
"历史记录数
sethistory=1000
"禁止生成临时文件
setnobackup
setnoswapfile
"搜索忽略大小写
setignorecase
"搜索逐字符高亮
sethlsearch
setincsearch
"行内替换
setgdefault
"编码设置
setenc=utf-8
setfencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
"语言设置
setlangmenu=zh_CN.UTF-8
sethelplang=cn
"我的状态行显示的内容(包括文件类型和解码)
"setstatusline=%F%m%r%h%w[FORMAT=%{&ff}][TYPE=%Y][POS=%l,%v][%p%%]\%{strftime("%d/%m/%y-\%H:%M")}
"setstatusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
"总是显示状态行
setlaststatus=2
"命令行(在状态行下)的高度,默认为1,这里是2
setcmdheight=2
"侦测文件类型
filetypeon
"载入文件类型插件
filetypepluginon
"为特定文件类型载入相关缩进文件
filetypeindenton
"保存全局变量
setviminfo+=!
"带有如下符号的单词不要被换行分割
setiskeyword+=_,$,@,%,#,-
"字符间插入的像素行数目
setlinespace=0
"增强模式中的命令行自动完成操作
setwildmenu
"使回格键(backspace)正常处理indent,eol,start等
setbackspace=2
"允许backspace和光标键跨越行边界
setwhichwrap+=<,>,h牡丹之歌简谱 ,l
"可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
setmouse=a
setselection=exclusive
setselectmode=mouse,key
"通过使用:commands命令,告诉我们文件的哪一行被改变过
setreport=0
"在被分割的窗口间显示空白,便于阅读
setfillchars=vert:,stl:,stlnc:
"高亮显示匹配的括号
setshowmatch
"匹配括号高亮的时间(单位是十分之一秒)
setmatchtime=1
"光标移动到buffer的顶部和底部时保持3行距离
setscrolloff=3
"为C程序提供自动缩进
setsmartindent
"高亮显示普通txt文件(需要txt.vim脚本)
auBufRead,BufNewFile*setfiletypetxt
"自动补全
:inoremap(()<ESC>i
:inoremap)<c-r>=ClosePair(')')<CR>
:inoremap{{<CR>}<ESC>O
:inoremap}<c-r>=ClosePair('}')<CR>
:inoremap[[]<ESC>i
:inoremap]<c-r>=ClosePair(']')<CR>
:inoremap"""<ESC>i
:inoremap'''<ESC>i
function!ClosePair(char)
ifgetline('.')[col('.')-1]==a:char
return"<Right>"
else
returna:char
endif
endfunction
filetypepluginindenton
"打开文件类型检测,加了这句才可以用智能补全
setcompleteopt=longest,menu
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"CTags的设定
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
letTlist_Sort_Type="name""按照名称排序
letTlist_Use_Right_Window=1"在右侧显示窗口
letTlist_Compart_Format=1"压缩方式
letTlist_Exist_OnlyWindow=1"如果只有一个buffer,kill窗口也kill掉buffer
letTlist_File_Fold_Auto_Close=0"不要关闭其他文件的tags
letTlist_Enable_Fold_Column=0"不要显示折叠树
autocmdFileTypejavasettags+=D: oolsjava ags
"autocmdFileTypeh,cpp,cc,csettags+=D: oolscpp ags
"letTlist_Show_One_File=1"不同时显示多个文件的tag,只显示当前文件的
"设置tags
settags=tags
"setautochdir
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"其他东东
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"默认打开Taglist
letTlist_Auto_Open=1
""""""""""""""""""""""""""""""
"Taglist(ctags)
""""""""""""""""""""""""""""""""
letTlist_Ctags_Cmd='/usr/bin/ctags'
letTlist_Show_One_File=1"不同时显示多个文件的tag,只显示当前文件的
letTlist_Exit_OnlyWindow=1"如果taglist窗口是最后一个窗口,则退出vim
letTlist_Use_Right_Window=1"在右侧窗口中显示taglist窗口
"minibufexpl插件的一般设置
letg:miniBufExplMapWindowNavVim=1
letg:miniBufExplMapWindowNavArrows=1
letg:miniBufExplMapCTabSwitchBufs=1
letg:miniBufExplModSelTarget=1
为了方便大家下载使用,我把它放到我的空间里了,两个命令就可以瞬间得到.vimrc文件
下载:vimrc
unzip -f vimrc.zip -d ~/简易安装方法:
打开终端,执行下面的命令就自动安装好了:
C代码
wget-qO-https://raw.github.com/ma6174/vim/master/setup.sh|sh-x或者自己手动安装:(以ubuntu为例)
安装vimsudo apt-get install vim
安装ctags:sudo apt-get install ctags
安装一些必备程序:sudo apt-get install xclip vim-gnome astyle python-setuptools
python代码格式化工具:sudo easy_install -ZU autopep8
sudo ln -s /usr/bin/ctags /usr/local/bin/ctags
clone配置文件:cd ~/ && git clone git://github.com/ma6174/vim.git
mv ~/vim ~/.vim
mv ~/.vim/.vimrc ~/
clone bundle 程序:git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
打开vim并执行bundle程序:BundleInstall
重新打开vim即可看到效果