无插件Vim技巧

Posted 呼叫地瓜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无插件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编程技巧

你 可以看到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技巧

  • 无插件Vim编程技巧

我们要在多个Tabe页中切换,在normal模式下,你可以使用下面三个按键(注意没有冒号):

gt   – 到下一个页

gT  – 到前一个页

{i} gt   – i是数字,到指定页,比如:5 gt 就是到第5页

你可以以使用 【:tabm {n}】来切换Tab页。

gvim应该是:Ctrl+PgDn 和 Ctrl+PgUp 来在各个页中切换。

如果你想看看你现在打开的窗口和Tab的情况,你可以使用下面的命令:

:tabs

于是你可以看到:

  • 无插件Vim技巧

  • 无插件Vim编程技巧

使用如下命令可以关闭tab:(当然,我更喜欢使用传统的:q, :wq来关闭)

:tabclose [i] – 如果后面指定了数字,那就关闭指定页,如果没有就关闭当前页

最后提一下,如果你在Shell命令行下,你可以使用 vim 的 -p 参数来用Tab页的方式打开多个文件,比如:

vim -p cool.cpp shell.cpp haoel.cpp
vim -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代码  无插件Vim技巧

  1. "开启语法高亮  

  2. syntax on  

  3. "依文件类型设置自动缩进  

  4. filetype indent plugin on  

  5.    

  6. "显示当前的行号列号:  

  7. set ruler  

  8. "在状态栏显示正在输入的命令  

  9. set showcmd  

  10.    

  11. "关闭/打开配对括号高亮  

  12. "NoMatchParen  

  13. DoMatchParen  

 

行号的显示与隐藏:

C代码  无插件Vim技巧

  1. "显示行号:  

  2. set number  

  3. "为方便复制,用<F2>开启/关闭行号显示:  

  4. nnoremap <F2> :set nonumber!<CR>:set foldcolumn=0<CR>  

 

启用Modeline(即允许被编辑的文件以注释的形式设置Vim选项,详见Vim Wiki: Modeline magic):

C代码  无插件Vim技巧

  1. set modeline  

 

如果终端使用的是深色背景:

C代码  无插件Vim技巧

  1. "为深色背景调整配色  

  2. set background=dark  

 

插件管理

下文的配置很多都依赖于第三方开发的 Vim 插件。为了方便地安装和维护这些插件,推荐先安装一种插件管理工具,目前较为流行的是 Vundle 和 pathogen。二者功能类似,但 Vundle 的配置更灵活, pathogen 则相对简洁。二者都能很好地与Git结合,安装插件十分方便。

 

如果你使用 Git 管理你的配置文件,那么还可以将 Pathogen 或 Vundle 与 Git 的 Submodule 功能管理插件结合,使得在多台电脑间同步插件及在本地更新插件变得十分便捷。

C代码  无插件Vim技巧

  1. # 在存放配置文件的主文件夹下,添加一个 submodule  

  2. git submodule add https://github.com/gmarik/vundle.git .vim/bundle/vundle  

  3.    

  4. # 用类似的办法添加多个插件后,以后升级插件只需:  

  5. git submodule update  

  6.    

  7. # 如果其它电脑 checkout 出配置文件后,要先:  

  8. git submodule init  

 

插件管理工具无需通过系统的包管理系统安装,只要将需要的文件放在 ~/.vim/ 目录中即可。这样,一套配置文件也可以方便地用在多个不同的系统环境中。

 

代码补全

Vim 7已经内置了代码补全功能[6],补全操作可分为两种:

  • 关键字补全

  • 即简单地补全到文档中已有的词,快捷键为 Ctrl-N 或 Ctrl-P

  • 智能补全

  • Vim 7中引入 Omni Complete,可根据语义补全,快捷键为 Ctrl-X Ctrl-O

  • Vim的补全菜单操作方式与一般IDE的方式不同,可加入如下设置:

    C代码  无插件Vim技巧

    1. "让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)  

    2. set completeopt+=longest  

    3.    

    4. "离开插入模式后自动关闭预览窗口  

    5. autocmd InsertLeave * if pumvisible() == 0|pclose|endif  

    6.    

    7. "回车即选中当前项  

    8. inoremap <expr> <CR>       pumvisible() ? "<C-y>" : "<CR>"  

    9.    

    10. "上下左右键的行为  

    11. inoremap <expr> <Down>     pumvisible() ? "<C-n>" : "<Down>"  

    12. inoremap <expr> <Up>       pumvisible() ? "<C-p>" : "<Up>"  

    13. inoremap <expr> <PageDown> pumvisible() ? "<PageDown><C-p><C-n>" : "<PageDown>"  

    14. inoremap <expr> <PageUp>   pumvisible() ? "<PageUp><C-p><C-n>" : "<PageUp>"  

     

    如需自动补全,可安装AutoComplPop插件,安装后如需在补全是显示文档(预览),可加入设置:

    C代码  无插件Vim技巧

    1. let g: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 autocmd
    autocmd QuickFixCmdPost [^l]* nested cwindow
    autocmd 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自动判断中文编码

     

    参考资料

    1. ↑ How to setup VIM properly for editing Python files - *.py (StackOverflow)

    2. ↑ amix的vimrc

    3. ↑ Python and vim: Make your own IDE (2009.2)

    4. ↑ Python官网上的Vim介绍

    5. ↑ Git Tools - Submodules

    6. ↑ 细说 Vim 7 之新特性-LinuxToy

    7. ↑ VimTip 1228: Improve completion popup menu

    8. ↑ Vim文档

    9. ↑ Browsing programs with tags -- Vim Tips Wiki

    10. ↑ Vim and Ctags tips and tricks

    11. ↑ use :tjump instead of :tag vim on pressing ctrl-] (StackOverflow)

    12. ↑ Automatically open the quickfix window on :make

    13. ↑ LinuxTOY Xu Xiaodong 的VimEnv

    14. ↑ 手把手教你把Vim改装成一个IDE编程环境(图文)

     

    常用命令

    对于入门vim基本命令可以参考 简明 Vim 练级攻略,以下是本人关于移动光标、插入/修改、删除、复制、粘帖、撤销和恢复等常用命令

    • 移动光标

      1. 对于在行内移动,通过使用f/F + 字符来移动到特定的字符,然后再使用. 来重复执行命令;f表示向前移动,F表示向后移动。如果想直接移动到行首或行尾,使用^$

      2. 对于在多行移动,就有多种选择:第一种是通过ggG行数 + 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 + p delete单词,然后放在当前光标后面
      dw + P delete单词,然后放在当前光标前面
      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代码  

    1. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""  

    2.   

    3. " 显示相关    

    4.   

    5. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""  

    6.   

    7. "set shortmess=atI   " 启动的时候不显示那个援助乌干达儿童的提示    

    8.   

    9. "winpos 5 5          " 设定窗口位置    

    10.   

    11. "set lines=40 columns=155    " 设定窗口大小    

    12.   

    13. "set nu              " 显示行号    

    14.   

    15. set go=             " 不要图形按钮    

    16.   

    17. "color asmanian2     " 设置背景主题    

    18.   

    19. set guifont=Courier_New:h10:cANSI   " 设置字体    

    20.   

    21. "syntax on           " 语法高亮    

    22.   

    23. autocmd InsertLeave * se nocul  " 用浅色高亮当前行    

    24.   

    25. autocmd InsertEnter * se cul    " 用浅色高亮当前行    

    26.   

    27. "set ruler           " 显示标尺    

    28.   

    29. set showcmd         " 输入的命令显示出来,看的清楚些    

    30.   

    31. "set cmdheight=1     " 命令行(在状态行下)的高度,设置为1    

    32.   

    33. "set whichwrap+=<,>,h,l   " 允许backspace和光标键跨越行边界(不建议)    

    34.   

    35. "set scrolloff=3     " 光标移动到buffer的顶部和底部时保持3行距离    

    36.   

    37. set novisualbell    " 不要闪烁(不明白)    

    38.   

    39. set statusline=%F%m%r%h%w [FORMAT=%{&ff}] [TYPE=%Y] [POS=%l,%v][%p%%] %{strftime("%d/%m/%y - %H:%M")}   "状态行显示的内容    

    40.   

    41. set laststatus=1    " 启动显示状态行(1),总是显示状态行(2)    

    42.   

    43. set foldenable      " 允许折叠    

    44.   

    45. set foldmethod=manual   " 手动折叠    

    46.   

    47. "set background=dark "背景使用黑色   

    48.   

    49. set nocompatible  "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限    

    50.   

    51. " 显示中文帮助  

    52.   

    53. if version >= 603  

    54.   

    55.     set helplang=cn  

    56.   

    57.     set encoding=utf-8  

    58.   

    59. endif  

    60.   

    61. " 设置配色方案  

    62.   

    63. "colorscheme murphy  

    64.   

    65. "字体   

    66.   

    67. "if (has("gui_running"))   

    68.   

    69. "   set guifont=Bitstream Vera Sans Mono 10   

    70.   

    71. "endif   

    72.   

    73.   

    74.    

    75. set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936  

    76.   

    77. set termencoding=utf-8  

    78.   

    79. set encoding=utf-8  

    80.   

    81. set fileencodings=ucs-bom,utf-8,cp936  

    82.   

    83. set fileencoding=utf-8  

    84.   

    85.   

    86.   

    87. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""  

    88.   

    89. """""新文件标题""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""  

    90.   

    91. "新建.c,.h,.sh,.java文件,自动插入文件头   

    92.   

    93. autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()"   

    94.   

    95. ""定义函数SetTitle,自动插入文件头   

    96.   

    97. func SetTitle()   

    98.   

    99.     "如果文件类型为.sh文件   

    100.   

    101.     if &filetype == 'sh'   

    102.   

    103.         call setline(1,"#########################################################################")   

    104.   

    105.         call append(line("."), "# File Name: ".expand("%"))   

    106.   

    107.         call append(line(".")+1, "# Author: ma6174")   

    108.   

    109.         call append(line(".")+2, "# mail: ma6174@163.com")   

    110.   

    111.         call append(line(".")+3, "# Created Time: ".strftime("%c"))   

    112.   

    113.         call append(line(".")+4, "#########################################################################")   

    114.   

    115.         call append(line(".")+5, "#!/bin/bash")   

    116.   

    117.         call append(line(".")+6, "")   

    118.   

    119.     else   

    120.   

    121.         call setline(1, "/*************************************************************************")   

    122.   

    123.         call append(line("."), "    > File Name: ".expand("%"))   

    124.   

    125.         call append(line(".")+1, "    > Author: ma6174")   

    126.   

    127.         call append(line(".")+2, "    > Mail: ma6174@163.com ")   

    128.   

    129.         call append(line(".")+3, "    > Created Time: ".strftime("%c"))   

    130.   

    131.         call append(line(".")+4, " ************************************************************************/")   

    132.   

    133.         call append(line(".")+5, "")  

    134.   

    135.     endif  

    136.   

    137.     if &filetype == 'cpp'  

    138.   

    139.         call append(line(".")+6, "#include<iostream>")  

    140.   

    141.         call append(line(".")+7, "using namespace std;")  

    142.   

    143.         call append(line(".")+8, "")  

    144.   

    145.     endif  

    146.   

    147.     if &filetype == 'c'  

    148.   

    149.         call append(line(".")+6, "#include<stdio.h>")  

    150.   

    151.         call append(line(".")+7, "")  

    152.   

    153.     endif  

    154.   

    155.     "新建文件后,自动定位到文件末尾  

    156.   

    157.     autocmd BufNewFile * normal G  

    158.   

    159. endfunc   

    160.   

    161. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""  

    162.   

    163. "键盘命令  

    164.   

    165. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""  

    166.   

    167.   

    168.   

    169. nmap <leader>w :w!<cr>  

    170.   

    171. nmap <leader>f :find<cr>  

    172.   

    173.   

    174.   

    175. " 映射全选+复制 ctrl+a  

    176.   

    177. map <C-A> ggVGY  

    178.   

    179. map! <C-A> <Esc>ggVGY  

    180.   

    181. map <F12> gg=G  

    182.   

    183. " 选中状态下 Ctrl+c 复制  

    184.   

    185. vmap <C-c> "+y  

    186.   

    187. "去空行    

    188.   

    189. nnoremap <F2> :g/^s*$/d<CR>   

    190.   

    191. "比较文件    

    192.   

    193. nnoremap <C-F2> :vert diffsplit   

    194.   

    195. "新建标签    

    196.   

    197. map <M-F2> :tabnew<CR>    

    198.   

    199. "列出当前目录文件    

    200.   

    201. map <F3> :tabnew .<CR>    

    202.   

    203. "打开树状文件目录    

    204.   

    205. map <C-F3> e    

    206.   

    207. "C,C++ 按F5编译运行  

    208.   

    209. map <F5> :call CompileRunGcc()<CR>  

    210.   

    211. func! CompileRunGcc()  

    212.   

    213.     exec "w"  

    214.   

    215.     if &filetype == 'c'  

    216.   

    217.         exec "!g++ % -o %<"  

    218.   

    219.         exec "! ./%<"  

    220.   

    221.     elseif &filetype == 'cpp'  

    222.   

    223.         exec "!g++ % -o %<"  

    224.   

    225.         exec "! ./%<"  

    226.   

    227.     elseif &filetype == 'java'   

    228.   

    229.         exec "!javac %"   

    230.   

    231.         exec "!java %<"  

    232.   

    233.     elseif &filetype == 'sh'  

    234.   

    235.         :!./%  

    236.   

    237.     endif  

    238.   

    239. endfunc  

    240.   

    241. "C,C++的调试  

    242.   

    243. map <F8> :call Rungdb()<CR>  

    244.   

    245. func! Rungdb()  

    246.   

    247.     exec "w"  

    248.   

    249.     exec "!g++ % -g -o %<"  

    250.   

    251.     exec "!gdb ./%<"  

    252.   

    253. endfunc  

    254.   

    255. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""  

    256.   

    257. ""实用设置  

    258.   

    259. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""  

    260.   

    261. " 设置当文件被改动时自动载入  

    262.   

    263. set autoread  

    264.   

    265. " quickfix模式  

    266.   

    267. autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>  

    268.   

    269. "代码补全   

    270.   

    271. set completeopt=preview,menu   

    272.   

    273. "允许插件    

    274.   

    275. filetype plugin on  

    276.   

    277. "共享剪贴板    

    278.   

    279. set clipboard+=unnamed   

    280.   

    281. "从不备份    

    282.   

    283. set nobackup  

    284.   

    285. "make 运行  

    286.   

    287. :set makeprg=g++ -Wall  %  

    288.   

    289. "自动保存  

    290.   

    291. set autowrite  

    292.   

    293. set ruler                   " 打开状态栏标尺  

    294.   

    295. set cursorline              " 突出显示当前行  

    296.   

    297. set magic                   " 设置魔术  

    298.   

    299. set guioptions-=T           " 隐藏工具栏  

    300.   

    301. set guioptions-=m           " 隐藏菜单栏  

    302.   

    303. "set statusline= %<%F[%1*%M%*%n%R%H]%= %y %0(%{&fileformat} %{&encoding} %c:%l/%L%)  

    304.   

    305. " 设置在状态行显示的信息  

    306.   

    307. set foldcolumn=0  

    308.   

    309. set foldmethod=indent   

    310.   

    311. set foldlevel=3   

    312.   

    313. set foldenable              " 开始折叠  

    314.   

    315. " 不要使用vi的键盘模式,而是vim自己的  

    316.   

    317. set nocompatible  

    318.   

    319. " 语法高亮  

    320.   

    321. set syntax=on  

    322.   

    323. " 去掉输入错误的提示声音  

    324.   

    325. set noeb  

    326.   

    327. " 在处理未保存或只读文件的时候,弹出确认  

    328.   

    329. set confirm  

    330.   

    331. " 自动缩进  

    332.   

    333. set autoindent  

    334.   

    335. set cindent  

    336.   

    337. " Tab键的宽度  

    338.   

    339. set tabstop=4  

    340.   

    341. " 统一缩进为4  

    342.   

    343. set softtabstop=4  

    344.   

    345. set shiftwidth=4  

    346.   

    347. " 不要用空格代替制表符  

    348.   

    349. set noexpandtab  

    350.   

    351. " 在行和段开始处使用制表符  

    352.   

    353. set smarttab  

    354.   

    355. " 显示行号  

    356.   

    357. set number  

    358.   

    359. " 历史记录数  

    360.   

    361. set history=1000  

    362.   

    363. "禁止生成临时文件  

    364.   

    365. set nobackup  

    366.   

    367. set noswapfile  

    368.   

    369. "搜索忽略大小写  

    370.   

    371. set ignorecase  

    372.   

    373. "搜索逐字符高亮  

    374.   

    375. set hlsearch  

    376.   

    377. set incsearch  

    378.   

    379. "行内替换  

    380.   

    381. set gdefault  

    382.   

    383. "编码设置  

    384.   

    385. set enc=utf-8  

    386.   

    387. set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936  

    388.   

    389. "语言设置  

    390.   

    391. set langmenu=zh_CN.UTF-8  

    392.   

    393. set helplang=cn  

    394.   

    395. " 我的状态行显示的内容(包括文件类型和解码)  

    396.   

    397. "set statusline=%F%m%r%h%w [FORMAT=%{&ff}] [TYPE=%Y] [POS=%l,%v][%p%%] %{strftime("%d/%m/%y - %H:%M")}  

    398.   

    399. "set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]  

    400.   

    401. " 总是显示状态行  

    402.   

    403. set laststatus=2  

    404.   

    405. " 命令行(在状态行下)的高度,默认为1,这里是2  

    406.   

    407. set cmdheight=2  

    408.   

    409. " 侦测文件类型  

    410.   

    411. filetype on  

    412.   

    413. " 载入文件类型插件  

    414.   

    415. filetype plugin on  

    416.   

    417. " 为特定文件类型载入相关缩进文件  

    418.   

    419. filetype indent on  

    420.   

    421. " 保存全局变量  

    422.   

    423. set viminfo+=!  

    424.   

    425. " 带有如下符号的单词不要被换行分割  

    426.   

    427. set iskeyword+=_,$,@,%,#,-  

    428.   

    429. " 字符间插入的像素行数目  

    430.   

    431. set linespace=0  

    432.   

    433. " 增强模式中的命令行自动完成操作  

    434.   

    435. set wildmenu  

    436.   

    437. " 使回格键(backspace)正常处理indent, eol, start等  

    438.   

    439. set backspace=2  

    440.   

    441. " 允许backspace和光标键跨越行边界  

    442.   

    443. set whichwrap+=<,>,h,l  

    444.   

    445. " 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)  

    446.   

    447. set mouse=a  

    448.   

    449. set selection=exclusive  

    450.   

    451. set selectmode=mouse,key  

    452.   

    453. " 通过使用: commands命令,告诉我们文件的哪一行被改变过  

    454.   

    455. set report=0  

    456.   

    457. " 在被分割的窗口间显示空白,便于阅读  

    458.   

    459. set fillchars=vert: ,stl: ,stlnc:  

    460.   

    461. " 高亮显示匹配的括号  

    462.   

    463. set showmatch  

    464.   

    465. " 匹配括号高亮的时间(单位是十分之一秒)  

    466.   

    467. set matchtime=1  

    468.   

    469. " 光标移动到buffer的顶部和底部时保持3行距离  

    470.   

    471. set scrolloff=3  

    472.   

    473. " 为C程序提供自动缩进  

    474.   

    475. set smartindent  

    476.   

    477. " 高亮显示普通txt文件(需要txt.vim脚本)  

    478.   

    479. au BufRead,BufNewFile *  setfiletype txt  

    480.   

    481. "自动补全  

    482.   

    483. :inoremap ( ()<ESC>i  

    484.   

    485. :inoremap ) <c-r>=ClosePair(')')<CR>  

    486.   

    487. :inoremap { {<CR>}<ESC>O  

    488.   

    489. :inoremap } <c-r>=ClosePair('}')<CR>  

    490.   

    491. :inoremap [ []<ESC>i  

    492.   

    493. :inoremap ] <c-r>=ClosePair(']')<CR>  

    494.   

    495. :inoremap " ""<ESC>i  

    496.   

    497. :inoremap ' ''<ESC>i  

    498.   

    499. function! ClosePair(char)  

    500.   

    501.     if getline('.')[col('.') - 1] == a:char  

    502.   

    503.         return "<Right>"  

    504.   

    505.     else  

    506.   

    507.         return a:char  

    508.   

    509.     endif  

    510.   

    511. endfunction  

    512.   

    513. filetype plugin indent on   

    514.   

    515. "打开文件类型检测, 加了这句才可以用智能补全  

    516.   

    517. set completeopt=longest,menu  

    518.   

    519. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""  

    520.   

    521. " CTags的设定    

    522.   

    523. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""  

    524.   

    525. let Tlist_Sort_Type = "name"    " 按照名称排序    

    526.   

    527. let Tlist_Use_Right_Window = 1  " 在右侧显示窗口    

    528.   

    529. let Tlist_Compart_Format = 1    " 压缩方式    

    530.   

    531. let Tlist_Exist_OnlyWindow = 1  " 如果只有一个buffer,kill窗口也kill掉buffer    

    532.   

    533. let Tlist_File_Fold_Auto_Close = 0  " 不要关闭其他文件的tags    

    534.   

    535. let Tlist_Enable_Fold_Column = 0    " 不要显示折叠树    

    536.   

    537. autocmd FileType java set tags+=D: oolsjava ags    

    538.   

    539. "autocmd FileType h,cpp,cc,c set tags+=D: oolscpp ags    

    540.   

    541. "let Tlist_Show_One_File=1            "不同时显示多个文件的tag,只显示当前文件的  

    542.   

    543. "设置tags    

    544.   

    545. set tags=tags    

    546.   

    547. "set autochdir   

    548.   

    549.   

    550.   

    551. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""  

    552.   

    553. "其他东东  

    554.   

    555. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""  

    556.   

    557. "默认打开Taglist   

    558.   

    559. let Tlist_Auto_Open=1   

    560.   

    561. """"""""""""""""""""""""""""""   

    562.   

    563. " Tag list (ctags)   

    564.   

    565. """"""""""""""""""""""""""""""""   

    566.   

    567. let Tlist_Ctags_Cmd = '/usr/bin/ctags'   

    568.   

    569. let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的   

    570.   

    571. let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim   

    572.   

    573. let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口  

    574.   

    575. " minibufexpl插件的一般设置  

    576.   

    577. let g:miniBufExplMapWindowNavVim = 1  

    578.   

    579. let g:miniBufExplMapWindowNavArrows = 1  

    580.   

    581. let g:miniBufExplMapCTabSwitchBufs = 1  

    582. let g:miniBufExplModSelTarget = 1  

     

    为了方便大家下载使用,我把它放到我的空间里了,两个命令就可以瞬间得到.vimrc文件

    下载:vimrc

    unzip -f vimrc.zip -d ~/

     

    简易安装方法:

    打开终端,执行下面的命令就自动安装好了:

    C代码  

    1. wget -qO- https://raw.github.com/ma6174/vim/master/setup.sh | sh -x  

     

    或者自己手动安装:(以ubuntu为例)

    1. 安装vim sudo apt-get install vim

    2. 安装ctags:sudo apt-get install ctags

    3. 安装一些必备程序:sudo apt-get install xclip vim-gnome astyle python-setuptools

    4. python代码格式化工具:sudo easy_install -ZU autopep8

    5. sudo ln -s /usr/bin/ctags /usr/local/bin/ctags

    6. clone配置文件:cd ~/ && git clone git://github.com/ma6174/vim.git

    7. mv ~/vim ~/.vim

    8. mv ~/.vim/.vimrc ~/

    9. clone bundle 程序:git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

    10. 打开vim并执行bundle程序:BundleInstall

    11. 重新打开vim即可看到效果


以上是关于无插件Vim技巧的主要内容,如果未能解决你的问题,请参考以下文章

vim代码片段插件ultisnips的使用

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

IDEA Intellij中vim插件使用小技巧

IdeaVim插件使用技巧--JetBrains Plugin Vim