世界上有两个伟大的编辑器:一个是emacs,一个是vi。它们从诞生以来,一直在Unix/Linux世界得到最广泛的支持。

尽管过了几十年,在Windows平台上和跨平台上有层出不穷的后起之秀不断挑战它们的地位,比如编辑器界的Sublime Text,Ultra Editor,Notepad++,pspad,Atom,Visual Studio Code,IDE界的Eclipse, IntellJ IDEA, NetBeans等等,但是它们的地位从未动摇过。

写C#的最好IDE一定是Visual Studio,写Java还是IntellJ IDEA和Eclipse更方便。但是,对于其它语言和其它任务,比起层出不穷的后来者,一定是emacs和vim的支持是最广泛的。针对一个特定的任务,可能Sublime Text和Atom只有区区几种插件选择甚至是没有,但是在vim和emacs上可以找到好多页。

这两种编辑器的学习曲线确实是相对比较陡的,但是,一旦修炼成功,这样的付出是绝对值得的。造成学习困难的主要原因,其实是功能太多太强大。这个修炼需要花不少的精力和时间,想修成上仙甚至上神是不容易的,但是,只要坚持下去,最终一定可以做到。好了,废话不多说了,我们开始修炼之旅。

修仙之前,我们先享受一下凡人的生活。我们先看看如何利用各位上仙上神做好的法器,也就是写好的脚本。

使用vundle管理插件

做为人类,我们先不研究上仙上神们是如何摆放脚本位置的,我们统一通过vundle来管理其余插件。

首先我们下载Vundle,通过git命令,非常简单:

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

下面我们再通过修改~/.vimrc来配置一下,把下面原封不动抄到~/.vimrc就好:

set nocompatible              " be iMproved, required
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required
" To ignore plugin indent changes, instead use:
"filetype plugin on

我们只需要在call vundle#end()那一行之前,加上我们需要的plugin的内容就可以了。

下面我们开始vim plugin的寻宝之旅,第一站当然是官网!

vim插件宝库之官方网站

vim的第一集散地当然是官网:http://www.vim.org/scripts/index.php

比如我写C/C++比较多,我们就先拿c.vim来试试水。

官网上的插件的git库都放在这里:http://vim-scripts.org/vim/scripts.html

对于官网上的插件,我们直接使用vim-scripts.org上的目录名就好,比如c.vim,taglist.vim之类的,然后修改~/.vimrc文件:

set nocompatible              " be iMproved, required
filetype off                  " required                                                              

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim

Plugin 'c.vim'

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required
" To ignore plugin indent changes, instead use:
"filetype plugin on

重启vim,让新的然后我们运行:PluginInstall命令,c.vim插件就被自动安装上了。

我们试验一下c.vim的强大功能吧,我们创建一个新的C++文件,比如test2.cpp,运行:

vim test2.cpp

打开之后,发生了什么?c.vim插件已经按照模板自动帮我们生成的文档头:

/*
 * =====================================================================================
 *
 *       Filename:  test2.cpp
 *
 *    Description:
 *
 *        Version:  1.0
 *        Created:  2017/06/23 12时24分15秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  YOUR NAME (),
 *   Organization:
 *
 * =====================================================================================
 */
#include <stdlib.h>

比如我们要写一个for循环,试试输入\i0,vim会提示输入一个变量名,我们就用i吧,于是就生成了这样的代码块:

        for ( i = 0; i < n; i += 1 ) {
        }

更多的好玩的快捷键功能,可以参考这个:https://wolfgangmehner.github.io/vim-plugins/csupport/c-hotkeys.pdf

更完整的功能,可以参考文档:https://wolfgangmehner.github.io/vim-plugins/doc/csupport.html

也可以通过:help csupport在vim中查看。

vim插件宝库之github

除了官网之外,github上也是vim插件的大型集散地。很多官网上的插件,在github上也有镜像。

vundle对于github的支持也是很好的,比如NERD tree的地址是:https://github.com/scrooloose/nerdtree,我们可以省略github地址,直接输用户名和库名就可以了,例:

     Plugin 'scrooloose/nerdtree'

凡git库皆可支持

一般来说,官网和github上已经足够用了。但是,总是有一些特殊需求,比如公司内部使用之类的。这时候,我们只要附上git的地址就好,例:

Plugin 'git@gitlab.alibaba-inc.com:ziying.liuziying/studyvim.git'

本地目录

如果上面几种方式都不支持,比如是我们自己的写的插件,不想放到网上去,我们还可以指定本地目录的方式来使用插件。

例:

Plugin 'file:///home/gmarik/path/to/plugin'

Vundle简明手册

手动方式

就是将插件名写进.vimrc,然后通过:PluginInstall命令去安装

  • PluginList命令:列出已经安装的插件。

下面是我安装的一些插件:

" My Plugins
Plugin 'VundleVim/Vundle.vim'
Plugin 'd.vim'
Plugin 'taglist.vim'
Plugin 'scrooloose/nerdtree'
Plugin 'c.vim'
Plugin 'OmniCppComplete'
Plugin 'clang-complete'
Plugin 'AutoComplPop'
Plugin 'bufexplorer.zip'
Plugin 'SuperTab'
Plugin 'SrcExpl'
Plugin 'molokai'
Plugin 'omlet.vim'
Plugin 'cpp.vim'
Plugin 'thinca/vim-logcat'
Plugin 'vim-scripts/prop.vim'
Plugin 'mglb/vim-android-syntax'
  • PluginInstall命令:安装在.vimrc中指定的插件。如果要更新的话使用:PluginInstall! 或者:PluginUpdate命令

  • PluginClean:删除从.vimrc中删去的plugin

互动方式

:PluginSearch命令可以搜索字符串,搜索到之后,就可以直接点击i进行安装。

不过重启vim之后就没有了。希望每次启动后都有的话,还是写进.vimrc吧。

Vim技能修炼教程(1) - 使用vundle管理插件的更多相关文章

  1. Vim技能修炼教程(3) - 语法高亮进阶

    语法高亮进阶 首先我们复习一下上节学到的三个命令: * syntax match用于定义正则表达式和规则的对应 * highlight default定义配色方案 * highlight link将正 ...

  2. Vim技能修炼教程(2) - 语法高亮速成

    语法高亮速成 我们继续在人间修行Vim技能之旅.上一次我们学习了如何通过vundle安装插件,这次我们迅速向写插件的方向挺进. 我们先学习一个最简单的语法高亮插件的写法. 语法高亮基本上是由三部分组成 ...

  3. Vim技能修炼教程(10) - 代码跳转

    程序员功能 前面我们用了5讲的篇幅来讲基本编辑的基本功:第4讲是基本操作,第5讲是操作符,第6讲行编辑ex命令,第7讲可视模式,第8讲多窗口,第9讲缓冲区和标签页. 从这一讲开始,我们从通用功能向程序 ...

  4. Vim技能修炼教程(8) - 多窗口

    多窗口 如果一个vim只能开一个窗口,那肯定是有点low.尤其是写代码的时候,打开多个文件是经常的需求. 速成教程 横着切成两个 :split 文件名 上下切换窗口 Ctrl-W加上上下键,可以实现上 ...

  5. Vim技能修炼教程(4) - 基本功

    基本功 前面我们学会了插件管理器和如何实现语法高亮,相信大家已经从中体会到了vim插件的强大功能.现在,是时候回来补一补基本功了. Vi有三种主要模式,正常模式,插入模式和可视化模式.正常我们推荐的方 ...

  6. Vim技能修炼教程(17) - 编译自己的Vim

    编译自己的Vim 前面我们已经对Vim有比较丰富的了解了.我们也知道Vim有很多编译时的选项,很多功能依赖于这些编译选项.其中最重要的就是脚本语言的支持,很多发行版本是不全的.为了支持我们所需要的功能 ...

  7. Vim技能修炼教程(16) - 浮点数计算函数

    浮点数计算函数 这一节的所有函数,只有在vim编译时支持了+float时才有效. 三角函数 sin() : sine正弦函数 cos() : cosine余弦函数 tan() : tangent正切函 ...

  8. Vim技能修炼教程(15) - 时间和日期相关函数

    Vimscript武器库 前面我们走马观花地将Vimscript的大致语法过了一遍.下面我们开始深入看一下Vimscript都给我们准备了哪些武器.如果只用这些武器就够了,那么就太好了,只用Vimsc ...

  9. Vim技能修炼教程(14) - 写个ex命令吧

    写个ex命令吧 我们第二节开始就写了语法高亮的插件.这一节,我们学习第二种插件的写法,就是写个我们自己的ex命令. 自定义ex命令的命令是:command,我们在~/.vim/下建立一个plugin目 ...

随机推荐

  1. 定制Writable类

    以IntWritable为例介绍,定制writable的步骤 //继承 WritableComparable接口(继承了writable接口和comparable接口) public class In ...

  2. Linux后台运行命令,nohup和&的区别

    &的意思是在后台运行, 什么意思呢?  意思是说, 当你在执行 ./a.out & 的时候, 即使你用ctrl C,  那么a.out照样运行(因为对SIGINT信号免疫). 但是要注 ...

  3. Spring中Bean生命周期

    Spring中的bean生命周期是一个重要的点,只有理解Bean的生命周期,在开发中会对你理解代码是非常有用的.对于Bean的周期,个人认为可以分为四个阶段.第一阶段:Bean的实例化,在该阶段主要是 ...

  4. LeetCode——Median of Two Sorted Arrays

    Question There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median o ...

  5. layer弹出层的关闭及父页面的刷新问题

    当在主页面执行添加或修改时,用弹出层是比较好的选择,如何关闭弹出层并对父级页面进行操作呢 首先在父级页面中打开一个添加页面(弹出层) 在添加页面的表单提交函数中添加如下代码: function for ...

  6. Object.defineProperties——MEAN开发后台的Model层

    Object.defineProperties是什么?有什么用? 这个问题比较听起来可能比较难以理解,确实我也是在项目中遇到的才会去想.以前看到<高级程序设计>的时候,有这么一种东西,定义 ...

  7. HttpGet/HttpPost请求方法

    /// <summary> /// HttpGet请求 /// </summary> /// <param name="url">HttpGet ...

  8. 修饰器Decorator

    类的修饰 许多面向对象的语言都有修饰器(Decorator)函数,用来修改类的行为.目前,有一个提案将这项功能,引入了 ECMAScript. @testable class MyTestableCl ...

  9. Memcached stats sizes 命令

    Memcached stats sizes 命令用于显示所有item的大小和个数. 该信息返回两列,第一列是 item 的大小,第二列是 item 的个数. 语法: stats sizes 命令的基本 ...

  10. iOS 可变字符串NSMutableString的使用

    .创建一个可变字符串 NSMutableString * ms1 = [[NSMutableString alloc]init]; .可以通过类方法来创建 NSMutableString * ms2 ...