Git时代的VIM不彻底使用教程

2012-11-27 By BeiYuu javascript

最近整理了VIM的配置,换上插件管理的神器—–Vundle,由他引起的VIM生态环境的改善,堪称完美。遂打算写一份简单的教程,分享Git时代VIM新世界的美丽动人之处。对VIM有基础的同窗,可直接跳至插件管理部分。 php

VIM的模式

第一次使用VIM,会以为无所适从,他并不像记事本,你敲什么键就显示什么,理解VIM的须要明白他的两种模式: css

  • 命令模式 (Command Mode)
  • 编辑模式 (Insert Mode)

命令模式下,能够作移动、编辑操做;编辑模式则用来输入。键入i,o,s,a等便可进入编辑模式,后面解释缘由。 html

模式的设计是VIM和其余编辑器最不一样的地方,优点和劣势也全基于此而生。 前端

基本操做

如下介绍的键盘操做,都是大小写敏感的,而且要在命令模式下完成,需注意: java

以字为单位的移动

  • h 向左移动一个字
  • j 向下移动一行
  • k 向上
  • l 向右

这四个键在右手最容易碰到几个位置,最为经常使用。 git

以词为单位的移动

  • w 下一個word w(ord)
  • W 下一個word(跳过标点)
  • b 前一個word b(ackward)
  • B 前一个word(跳过标点)
  • e 跳到当前word的尾端 e(nd)

行移动

  • 0 跳到当前行的开头 - ^ 跳到当前行第一个非空字符 - $ 跳到行尾

助记:0(第0个字符),^和$含义同正则表达式 github

段落移动

- { 上一段(以空白行分隔) - } 下一段(以空白行分隔) - % 跳到当前对应的括号上(适用各类配对符号) web

跳跃移动

  • /xxxx 搜索xxxx,而后能够用n下一个,N上一个移动 - # 向前搜索光标当前所在的字 - * 向后搜索光标当前所在的字
  • fx 在当前行移动到光标以后第一个字符x的位置 f(ind)x
  • gd 跳到光标所在位置词(word)的定义位置 g(o)d(efine)
  • gg 到文档顶部
  • G 到文档底部
  • :x 跳到第x行(x是行号)
  • ctrl+d 向下翻页 d(down)
  • ctrl+u 向上翻页 u(p)

基本编辑

修改

  • i 在光标当前位置向前插入 i(nsert)
  • I 在本行第一个字符前插入
  • a 在光标当前位置向后插入 a(fter)
  • A 在本行末尾插入
  • o 向下插入一行
  • O 向上插入一行
  • :w 保存
  • :q 退出
  • :wq 保存并退出

删除

  • x 删除当前字符
  • dd 删除当前行 d(elete)
  • dw 删除当前光标下的词 d(elete)w(ord)

复制粘贴

  • yy 复制当前行 y(ank)
  • yw 复制当前光标下的词 y(ank)w(ord)
  • p 粘贴 p(aste)
  • P 粘贴在当前位置以前

进阶操做

限于篇幅,在这里我仅介绍下我很是经常使用的几个操做。 正则表达式

重复操做

由于VIM全部的操做都是原子化的,因此把这些操做程序化就很是简单了:

  • 5w 至关于按五次w键;
  • 6j 下移6行,至关于按六次j;
  • 3J 大写J,原本是将下一行与当前行合并,加上数量,就是重复操做3次;
  • 6dw和d6w 结果是同样,就是删除6个word; - 剩下的无数状况,本身类推吧。

高效编辑

  • di" 光标在”“之间,则删除”“之间的内容
  • yi( 光标在()之间,则复制()之间的内容
  • vi[ 光标在之间,则选中之间的内容
  • 以上三种能够自由组合搭配,效率奇高,i(nner)
  • dtx 删除字符直到碰见光标以后的第一个x字符
  • ytx 复制字符直到碰见光标以后的第一个x字符

标记和宏(macro)

  • ma 将当前位置标记为a,26个字母都可作标记,mb、mc等等;
  • 'a 跳转到a标记的位置; - 这是一组很好的文档内标记方法,在文档中跳跃编辑时颇有用;
  • qa 将以后的全部键盘操做录制下来,直到再次在命令模式按下q,并存储在a中;
  • @a 执行刚刚记录在a里面的键盘操做;
  • @@ 执行上一次的macro操做;
  • 宏操做是VIM最为神奇的操做之一,须要慢慢体会其强大之处;

VIM的基本操做,能够挖掘的东西很是多,不只仅须要记忆,更须要本身去探索总结,熟练以后,效率会大幅度提高。后面会给出一些参考连接。

插件管理

Vundle

终于到这篇Blog我最想讨论的部分了。VIM的强大不只仅体如今操做的高效率,更有强大而充沛的插件作支援,插件丰富了以后,就面临查找和管理的问题。

在碰见Vundle以前,我用Pathogen管理插件。Pathogen还算方便,只须要把相应插件,放在bundle目录下便可,不须要再像之前那样逐个放置单独的文件到相应目录,大大节省了劳动力,管理起来也一目了然,以为还不错,至少比vimball那种须要执行命令安装的方式好一些。

我真但愿我早些碰见Vundle。Vundle受到Pathogen和Vimball的启发,因而有了如今的模样。Vundle的逻辑是这样的:

  • Vim Script选好你想要的插件;
  • 在VIM的配置文件中写一句 Bundle plugin_name;
  • 执行一下Vundle的初始化命令,插件就装好了; - 升级和卸载也是一样的简单;

完美的世界!

Vundle的配置

Vundle的安装很简单:

git clone http://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
而后写配置文件.vimrc

set nocompatible    " be iMproved
filetype off        " required!
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
" let Vundle manage Vundle
" required!
Bundle 'gmarik/vundle'
" vim-scripts repos
Bundle 'vim-plugin-foo'
Bundle 'vim-plugin-bar'
filetype plugin indent on    " required!

其中Bundle后面的内容,就是插件的名字,插件维护在Vim-Script.org

而后,打开VIM以后,能够输入如下命令:

"安装插件:
:BundleInstall
"更新插件:
:BundleInstall!
"卸载不在列表中的插件:
:BundleClean

如今大部分的插件都已经从Vim.org迁移到了Vim-Script.org,并且不少做者也认领了本身的插件,直接在这个Github的项目下更新,一个比Vim.org更科学更有效的生态环境,就这样完美的造成了。

在此很是严重的感谢vim-scripts.org的建立者Scott Bronson,和Vundle的做者gmarik。他们的创新和分享精神,让这个世界又美好了一些。

也感谢业界良心Github。Vim-Scripts.org整站就是用Github Pages创建维护的,对于我的来讲,这是很好的选择,有兴趣的同窗能够参看我以前的博客:使用Github Pages建独立博客

插件介绍

有了Vundle,再装插件就是件享受的事情了。我经常使用的插件有:

Bundle 'ctrlp.vim'
Bundle 'AutoClose'
Bundle 'ZenCoding.vim'
Bundle 'matchit.zip'
Bundle 'ShowTrailingWhitespace'
Bundle '_jsbeautify'
Bundle 'EasyMotion'
Bundle 'FencView.vim'
Bundle 'The-NERD-tree'
Bundle 'The-NERD-Commenter'
Bundle 'snipMate'

以上插件均可以在vim-script.org找到源码和详细的使用文档,简单说明下:

The NERDTree

这是我认为VIM最不能缺乏的插件,在VIM的编辑窗口树状显示文件目录,没什么好多说的,必需品。

ctrlp.vim

相比于Command-T之类的查找文件的插件,ctrlp.vim最大的好处在于,无需安装其余的包,只要他本身,就能够很好的工做了,恩,就是须要这样干净利落的解决问题。

ZenCoding.vim

ZenCoding是一个神级的插件,用他可让你一种神奇而无比爽快的感受写HTML、CSS,官网上有动画演示,你必定会心动的。

EasyMotion

最近看到别人介绍,开始使用的一个插件,用全新的方式在文档中高效的移动光标,和ZenCoding同样,属于革命性的方便好用,这里有教程,你必定也会心动的。

snipMate

又一个解放生产力的神奇,简单配置,就能够按照本身的风格快速输入大段代码。

其余

  • AutoClose 能够在你输入一个(或者”之类的配对符号时,自动帮你补全剩余半个;
  • matchit.zip 在()、”“、甚至HTML标签之间快速跳转;
  • ShowTrailingWhitespace 显示行末的空格;
  • jsbeautify JS代码格式化插件;
  • FencView.vim 自动识别文件编码;
  • The-NERD-Commenter NERD出品的快速给代码加注释插件,选中,ctrl+h便可注释多种语言代码;

.vimrc配置

贴一下个人vimrc配置,注释都有,仅供参考:

"必须的设置:
filetype off
filetype plugin indent on
"打开高亮
syntax enable
"不要兼容vi
set nocompatible
"使用color solarized
set background=dark
colorscheme solarized
"terminal下面的背景问题
let g:solarized_termtrans=1
let g:solarized_termcolors=256
let g:solarized_contrast="high"
let g:solarized_visibility="high"
set modelines=0
"tab键的设定
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
"一些其余的设定
"字符设置
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5
"set encoding=utf-8
set scrolloff=3
"新建文件编码
set fenc=utf-8
set autoindent
set hidden
"设置光标高亮显示
set cursorline
set cursorcolumn
set ttyfast
set ruler
set backspace=indent,eol,start
"set laststatus=2
"相对行号 要想相对行号起做用要放在显示行号后面
set relativenumber
"显示行号
"set number
"无限undo
"set undofile
"自动换行
set wrap
"禁止自动换行
"set nowrap
"GUI界面里的字体,默认有抗锯齿
set guifont=Inconsolata:h12
"自动载入配置文件不须要重启
"autocmd! bufwritepost _vimrc source %
"将-链接符也设置为单词
set isk+=-
"设置大小写敏感和聪明感知(小写全搜,大写彻底匹配)
set ignorecase
set smartcase
"set gdefault
set incsearch
set showmatch
set hlsearch
"加入html标签配对
"runtime macros/matchit.vim 
"如下设置用来是vim正确显示过长的行
"set textwidth=80
"set formatoptions=qrnl
"彩色显示第85行
set colorcolumn=85
"设置256色显示
set t_Co=256
"行号栏的宽度
set numberwidth=4
"初始窗口的宽度
"set columns=135
"初始窗口的高度
"set lines=50
"初始窗口的位置
"winpos 620 45 
"匹配括号的规则,增长针对html的<>
"set matchpairs=(:),{:},[:],<:>
"让退格,空格,上下箭头遇到行首行尾时自动移到下一行(包括insert模式)
set whichwrap=b,s,<,>,[,]
"插入模式下移动
inoremap <c-j> <down>
inoremap <c-k> <up>
inoremap <c-l> <right>
inoremap <c-h> <left>
"===================================================
"leader键的功能设置
"修改leader键为逗号
let mapleader=","
"esc的映射
imap jj <esc>
"屏蔽掉讨厌的F1键
inoremap <F1> <ESC>
nnoremap <F1> <ESC>
vnoremap <F1> <ESC>
"修改vim的正则表达
nnoremap / /\v
vnoremap / /\v
"使用tab键来代替%进行匹配跳转
nnoremap <tab> %
vnoremap <tab> %
"折叠html标签 ,fold tag
nnoremap <leader>ft vatzf
"使用,v来选择刚刚复制的段落,这样能够用来缩进
nnoremap <leader>v v`]
"使用,w来垂直分割窗口,这样能够同时查看多个文件,若是想水平分割则<c-w>s
nnoremap <leader>w <c-w>v<c-w>l
nnoremap <leader>wc <c-w>c
nnoremap <leader>ww <c-w>w
"使用<leader>t来控制Tab的切换
nnoremap <leader>t gt
nnoremap <leader>r gT
"使用<leader>空格来取消搜索高亮
nnoremap <leader><space> :noh<cr>
"html中的js加注释 取消注释
nmap <leader>h I//jj
nmap <leader>ch ^xx
"切换到当前目录
nmap <leader>q :execute "cd" expand("%:h")<CR>
"搜索替换
nmap <leader>s :,s///c
"取消粘贴缩进
nmap <leader>p :set paste<CR>
nmap <leader>pp :set nopaste<CR>
"文件类型切换
nmap <leader>fj :set ft=javascript<CR>
nmap <leader>fc :set ft=css<CR>
nmap <leader>fx :set ft=xml<CR>
nmap <leader>fm :set ft=mako<CR>
"设置隐藏gvim的菜单和工具栏 F2切换
set guioptions-=m
set guioptions-=T
"去除左右两边的滚动条
set go-=r
set go-=L
map <silent> <F2> :if &guioptions =~# 'T' <Bar>
        \set guioptions-=T <Bar>
        \set guioptions-=m <bar>
    \else <Bar>
        \set guioptions+=T <Bar>
        \set guioptions+=m <Bar>
    \endif<CR>
"===================================================
"插件的设置
"Indent Guides设置
let g:indent_guides_guide_size=1
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
" let Vundle manage Vundle
" required!
Bundle 'gmarik/vundle'
" vim-scripts repos
Bundle 'ctrlp.vim'
Bundle 'AutoClose'
Bundle 'ZenCoding.vim'
Bundle 'matchit.zip'
Bundle 'ShowTrailingWhitespace'
"jsbeautify的设置
Bundle '_jsbeautify'
nnoremap <leader>_ff :call g:Jsbeautify()<CR>  
"EasyMotion设置
Bundle 'EasyMotion'
let g:EasyMotion_leader_key = '<Leader><Leader>' 
"Fencview的初始设置
Bundle 'FencView.vim'
let g:fencview_autodetect=1
"NerdTree的设置 而且相对行号显示
Bundle 'The-NERD-tree'
nmap <leader>nt :NERDTree<cr>:set rnu<cr>
let NERDTreeShowBookmarks=1
let NERDTreeShowFiles=1
let NERDTreeShowHidden=1
let NERDTreeIgnore=['\.$','\~$']
let NERDTreeShowLineNumbers=1
let NERDTreeWinPos=1
"对NERD_commenter的设置
Bundle 'The-NERD-Commenter'
let NERDShutUp=1
"支持单行和多行的选择,//格式
map <c-h> ,c<space>

更多

VIM在一开始会以为很是不习惯,必定要坚持下去,收获的会更多,不只仅是在装大侠方面的哦~

关于VIM的使用,这篇博客仅仅介绍了很小的一部分,网络上还有大量朋友总结的心得,常学常有收获:

相关文章
相关标签/搜索